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) } } }