+extension MapTextEditorController: NSTextStorageDelegate {
+ override func textStorageDidProcessEditing(_ obj: Notification) {
+ if let textStorage = obj.object as? NSTextStorage {
+ debouncer.debounce {
+ DispatchQueue.main.async {
+ self.colorizeText(textStorage: textStorage)
+ }
+ }
+ }
+ }
+
+ private func colorizeText(textStorage: NSTextStorage) {
+ let range = NSMakeRange(0, textStorage.length)
+ var matches = vertexRegex.matches(in: textStorage.string, options: [], range: range)
+ let colors = MapColor.colorForScheme(colorScheme)
+
+ for match in matches {
+ textStorage.addAttributes([.foregroundColor: colors.syntax.vertex], range: match.range(at: 1))
+ textStorage.addAttributes([.foregroundColor: colors.syntax.number], range: match.range(at: 2))
+ textStorage.addAttributes([.foregroundColor: colors.syntax.number], range: match.range(at: 3))
+ textStorage.addAttributes([.foregroundColor: colors.syntax.option], range: match.range(at: 4))
+ }
+
+ matches = edgeRegex.matches(in: textStorage.string, options: [], range: range)
+
+ for match in matches {
+ textStorage.addAttributes([.foregroundColor: colors.syntax.vertex], range: match.range(at: 1))
+ let arrowRange = match.range(at: 2)
+ textStorage.addAttributes(
+ [.foregroundColor: colors.syntax.symbol],
+ range: NSMakeRange(arrowRange.lowerBound - 1, arrowRange.length + 1))
+ textStorage.addAttributes([.foregroundColor: colors.syntax.vertex], range: match.range(at: 3))
+ }
+
+ matches = opportunityRegex.matches(in: textStorage.string, options: [], range: range)
+
+ for match in matches {
+ textStorage.addAttributes([.foregroundColor: colors.syntax.option], range: match.range(at: 1))
+ textStorage.addAttributes([.foregroundColor: colors.syntax.vertex], range: match.range(at: 2))
+ textStorage.addAttributes([.foregroundColor: colors.syntax.symbol], range: match.range(at: 3))
+ textStorage.addAttributes([.foregroundColor: colors.syntax.number], range: match.range(at: 4))
+ }
+
+ matches = blockerRegex.matches(in: textStorage.string, options: [], range: range)
+
+ for match in matches {
+ textStorage.addAttributes([.foregroundColor: colors.syntax.option], range: match.range(at: 1))
+ textStorage.addAttributes([.foregroundColor: colors.syntax.vertex], range: match.range(at: 2))
+ }
+
+ matches = stageRegex.matches(in: textStorage.string, options: [], range: range)
+
+ for match in matches {
+ textStorage.addAttributes([.foregroundColor: colors.syntax.option], range: match.range(at: 1))
+ textStorage.addAttributes([.foregroundColor: colors.syntax.number], range: match.range(at: 2))
+ }
+ }
+}
+