aboutsummaryrefslogtreecommitdiff
path: root/QuickLook/QuickLookTextEditor.swift
diff options
context:
space:
mode:
Diffstat (limited to 'QuickLook/QuickLookTextEditor.swift')
-rw-r--r--QuickLook/QuickLookTextEditor.swift78
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)
+ }
+ }
+
+}