import { StreamLanguage } from '@codemirror/language' /** Simple PlantUML stream parser for syntax highlighting in CodeMirror */ const plantumlParser = StreamLanguage.define({ name: 'plantuml', token(stream) { // Single-quote line comment (PlantUML) if (stream.match(/^'/)) { stream.skipToEnd() return 'comment' } // Double-quoted string if (stream.match(/^"/)) { let escaped = false while (!stream.eol()) { if (escaped) { escaped = false stream.next() continue } const ch = stream.next() if (ch === '\\') escaped = true else if (ch === '"') break } return 'string' } // @directives (@startuml, @enduml, etc.) if (stream.match(/^@\w+/)) return 'meta' // Skip whitespace if (stream.eatSpace()) return null // Arrows and connectors if (stream.match(/^->>?|<->?|<<--?|<-?>/)) return 'keyword' // Keywords (participant, actor, as, title, etc.) if (stream.match(/^(participant|actor|as|title|autonumber|left|right|of|over|activate|deactivate|destroy|create|group|opt|alt|else|loop|par|end|note|legend|skinparam|start|stop|if|endif|elseif|while|endwhile|repeat|until|switch|case|endswitch|class|interface|enum|package|namespace|abstract|static|extends|implements)\b/i)) return 'keyword' // Any other character (identifier, punctuation, etc.) stream.next() return null }, }) export const plantumlLanguage = plantumlParser