Skip to main content
Glama
kanban.jison•6.85 kB
/** mermaid * https://knsv.github.io/mermaid * (c) 2015 Knut Sveidqvist * MIT license. */ %lex %options case-insensitive %{ // Pre-lexer code can go here %} %x NODE %x NSTR %x NSTR2 %x ICON %x CLASS %x shapeData %x shapeDataStr %x shapeDataEndBracket %% \@\{ { // console.log('=> shapeData', yytext); this.pushState("shapeData"); yytext=""; return 'SHAPE_DATA' } <shapeData>["] { // console.log('=> shapeDataStr', yytext); this.pushState("shapeDataStr"); return 'SHAPE_DATA'; } <shapeDataStr>["] { // console.log('shapeData <==', yytext); this.popState(); return 'SHAPE_DATA'} <shapeDataStr>[^\"]+ { // console.log('shapeData', yytext); const re = /\n\s*/g; yytext = yytext.replace(re,"<br/>"); return 'SHAPE_DATA'} <shapeData>[^}^"]+ { // console.log('shapeData', yytext); return 'SHAPE_DATA'; } <shapeData>"}" { // console.log('<== root', yytext) this.popState(); } \s*\%\%.* {yy.getLogger().trace('Found comment',yytext); return 'SPACELINE';} // \%\%[^\n]*\n /* skip comments */ "kanban" {return 'KANBAN';} ":::" { this.begin('CLASS'); } <CLASS>.+ { this.popState();return 'CLASS'; } <CLASS>\n { this.popState();} // [\s]*"::icon(" { this.begin('ICON'); } "::icon(" { yy.getLogger().trace('Begin icon');this.begin('ICON'); } [\s]+[\n] {yy.getLogger().trace('SPACELINE');return 'SPACELINE' /* skip all whitespace */ ;} [\n]+ return 'NL'; <ICON>[^\)]+ { return 'ICON'; } <ICON>\) {yy.getLogger().trace('end icon');this.popState();} "-)" { yy.getLogger().trace('Exploding node'); this.begin('NODE');return 'NODE_DSTART'; } "(-" { yy.getLogger().trace('Cloud'); this.begin('NODE');return 'NODE_DSTART'; } "))" { yy.getLogger().trace('Explosion Bang'); this.begin('NODE');return 'NODE_DSTART'; } ")" { yy.getLogger().trace('Cloud Bang'); this.begin('NODE');return 'NODE_DSTART'; } "((" { this.begin('NODE');return 'NODE_DSTART'; } "{{" { this.begin('NODE');return 'NODE_DSTART'; } "(" { this.begin('NODE');return 'NODE_DSTART'; } "[" { this.begin('NODE');return 'NODE_DSTART'; } [\s]+ return 'SPACELIST' /* skip all whitespace */ ; // !(-\() return 'NODE_ID'; [^\(\[\n\)\{\}@]+ {return 'NODE_ID';} <<EOF>> return 'EOF'; <NODE>["][`] { this.begin("NSTR2");} <NSTR2>[^`"]+ { return "NODE_DESCR";} <NSTR2>[`]["] { this.popState();} <NODE>["] { yy.getLogger().trace('Starting NSTR');this.begin("NSTR");} <NSTR>[^"]+ { yy.getLogger().trace('description:', yytext); return "NODE_DESCR";} <NSTR>["] {this.popState();} <NODE>[\)]\) {this.popState();yy.getLogger().trace('node end ))');return "NODE_DEND";} <NODE>[\)] {this.popState();yy.getLogger().trace('node end )');return "NODE_DEND";} <NODE>[\]] {this.popState();yy.getLogger().trace('node end ...',yytext);return "NODE_DEND";} <NODE>"}}" {this.popState();yy.getLogger().trace('node end ((');return "NODE_DEND";} <NODE>"(-" {this.popState();yy.getLogger().trace('node end (-');return "NODE_DEND";} <NODE>"-)" {this.popState();yy.getLogger().trace('node end (-');return "NODE_DEND";} <NODE>"((" {this.popState();yy.getLogger().trace('node end ((');return "NODE_DEND";} <NODE>"(" {this.popState();yy.getLogger().trace('node end ((');return "NODE_DEND";} <NODE>[^\)\]\(\}]+ { yy.getLogger().trace('Long description:', yytext); return 'NODE_DESCR';} <NODE>.+(?!\(\() { yy.getLogger().trace('Long description:', yytext); return 'NODE_DESCR';} // [\[] return 'NODE_START'; // .+ return 'TXT' ; /lex %start start %% /* language grammar */ start // %{ : info document 'EOF' { return yy; } } : mindMap | spaceLines mindMap ; spaceLines : SPACELINE | spaceLines SPACELINE | spaceLines NL ; mindMap : KANBAN document { return yy; } | KANBAN NL document { return yy; } ; stop : NL {yy.getLogger().trace('Stop NL ');} | EOF {yy.getLogger().trace('Stop EOF ');} | SPACELINE | stop NL {yy.getLogger().trace('Stop NL2 ');} | stop EOF {yy.getLogger().trace('Stop EOF2 ');} ; document : document statement stop | statement stop ; statement : SPACELIST node shapeData { yy.getLogger().info('Node: ',$2.id);yy.addNode($1.length, $2.id, $2.descr, $2.type, $3); } | SPACELIST node { yy.getLogger().info('Node: ',$2.id);yy.addNode($1.length, $2.id, $2.descr, $2.type); } | SPACELIST ICON { yy.getLogger().trace('Icon: ',$2);yy.decorateNode({icon: $2}); } | SPACELIST CLASS { yy.decorateNode({class: $2}); } | SPACELINE { yy.getLogger().trace('SPACELIST');} | node shapeData { yy.getLogger().trace('Node: ',$1.id);yy.addNode(0, $1.id, $1.descr, $1.type, $2); } | node { yy.getLogger().trace('Node: ',$1.id);yy.addNode(0, $1.id, $1.descr, $1.type); } | ICON { yy.decorateNode({icon: $1}); } | CLASS { yy.decorateNode({class: $1}); } | SPACELIST ; node :nodeWithId |nodeWithoutId ; nodeWithoutId : NODE_DSTART NODE_DESCR NODE_DEND { yy.getLogger().trace("node found ..", $1); $$ = { id: $2, descr: $2, type: yy.getType($1, $3) }; } ; nodeWithId : NODE_ID { $$ = { id: $1, descr: $1, type: 0 }; } | NODE_ID NODE_DSTART NODE_DESCR NODE_DEND { yy.getLogger().trace("node found ..", $1); $$ = { id: $1, descr: $3, type: yy.getType($2, $4) }; } ; shapeData: shapeData SHAPE_DATA { $$ = $1 + $2; } | SHAPE_DATA { $$ = $1; } ; %%

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ai-of-mine/fast-mermaid-validator-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server