42 lines
1.6 KiB
TypeScript
42 lines
1.6 KiB
TypeScript
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
|