diff options
| author | Ruben Beltran del Rio <jj@r.bdr.sh> | 2025-12-18 15:13:52 +0100 |
|---|---|---|
| committer | Ruben Beltran del Rio <jj@r.bdr.sh> | 2025-12-18 17:07:20 +0100 |
| commit | 1b55fdad5984841334e864db942693cfef10e645 (patch) | |
| tree | 656a0aaf4058e54cd20d423b150cc82907c1e12b /QuickLook/QuickLookTextEditor.swift | |
| parent | 86e296f3b194979de41715ddffe8af262c23c4ba (diff) | |
Add sharing
Diffstat (limited to 'QuickLook/QuickLookTextEditor.swift')
| -rw-r--r-- | QuickLook/QuickLookTextEditor.swift | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/QuickLook/QuickLookTextEditor.swift b/QuickLook/QuickLookTextEditor.swift new file mode 100644 index 0000000..0501f6b --- /dev/null +++ b/QuickLook/QuickLookTextEditor.swift @@ -0,0 +1,78 @@ +import SwiftUI +import TreeSitterWmap +import SwiftTreeSitter +import SwiftTreeSitterLayer + +struct QuickLookTextEditor: NSViewRepresentable { + let content: String + + func makeNSView(context: Context) -> NSScrollView { + let scrollView = NSTextView.scrollableTextView() + let textView = scrollView.documentView as! NSTextView + + // Configure the scroll view + scrollView.hasVerticalScroller = true + scrollView.hasHorizontalScroller = true + scrollView.autohidesScrollers = false + + // Configure the text view for read-only display + textView.isEditable = false + textView.isSelectable = true + textView.backgroundColor = NSColor.textBackgroundColor + textView.font = NSFont.monospacedSystemFont(ofSize: 13, weight: .regular) + textView.string = content + textView.isVerticallyResizable = true + textView.isHorizontallyResizable = true + textView.textContainer?.widthTracksTextView = false + textView.textContainer?.containerSize = NSSize( + width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude) + + // Apply syntax highlighting using tree-sitter + if let textStorage = textView.textStorage { + applyTreeSitterHighlighting(textStorage: textStorage, content: content) + } + + return scrollView + } + + func updateNSView(_ nsView: NSScrollView, context: Context) { + // No updates needed for read-only view + } + + private func applyTreeSitterHighlighting(textStorage: NSTextStorage, content: String) { + // Set up tree-sitter language layer + guard let wmapConfiguration = try? LanguageConfiguration(tree_sitter_wmap(), name: "wmap") + else { return } + + let languageConfiguration = LanguageLayer.Configuration(languageProvider: { name in + switch name { + case "wmap": return wmapConfiguration + default: return nil + } + }) + + guard + let rootLayer = try? LanguageLayer( + languageConfig: wmapConfiguration, configuration: languageConfiguration) + else { return } + + // Update layer with content + rootLayer.replaceContent(with: content) + + // Set default text color + let fullRange = NSRange(location: 0, length: textStorage.length) + textStorage.addAttribute(.foregroundColor, value: NSColor.textColor, range: fullRange) + + // Apply tree-sitter highlighting + guard + let highlights = try? rootLayer.highlights( + in: fullRange, provider: content.predicateTextProvider) + else { return } + + for highlight in highlights { + let color = NSColor.Theme.Syntax.colorForSyntax(highlight.name) + textStorage.addAttribute(.foregroundColor, value: color, range: highlight.range) + } + } + +} |