mermaid
Version:
Markdown-ish syntax for generating flowcharts, mindmaps, sequence diagrams, class diagrams, gantt charts, git graphs and more.
8 lines (7 loc) • 6.9 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../../src/diagrams/railroad/parser/abnfParser.ts", "../../../src/diagrams/railroad/abnfDiagram.ts"],
"sourcesContent": ["import {\n MermaidParseError,\n createRailroadAbnfServices,\n type RailroadAbnf,\n type AbnfAlternation,\n type AbnfConcatenation,\n type AbnfElement,\n type AbnfGroup,\n type AbnfNumVal,\n type AbnfOptionalGroup,\n type AbnfPrimary,\n type AbnfRule as LangiumAbnfRule,\n type AbnfRuleName,\n type AbnfStringLiteral,\n} from '@mermaid-js/parser';\n\nimport type { ParserDefinition } from '../../../diagram-api/types.js';\nimport { log } from '../../../logger.js';\nimport { populateCommonDb } from '../../common/populateCommonDb.js';\nimport { db } from '../railroadDb.js';\nimport type { ASTNode, RailroadRule } from '../railroadTypes.js';\n\nconst langiumParser = createRailroadAbnfServices().RailroadAbnf.parser.LangiumParser;\n\nconst transformAlternation = (alt: AbnfAlternation): ASTNode => {\n const alternatives = alt.alternatives.map(transformConcatenation);\n\n if (alternatives.length === 1) {\n return alternatives[0];\n }\n\n return {\n type: 'choice',\n alternatives,\n };\n};\n\nconst transformConcatenation = (concat: AbnfConcatenation): ASTNode => {\n const elements = concat.elements.map(transformElement);\n\n if (elements.length === 1) {\n return elements[0];\n }\n\n return {\n type: 'sequence',\n elements,\n };\n};\n\nconst parseRepeat = (repeat: string): { min: number; max: number } => {\n if (repeat.includes('*')) {\n const [minStr, maxStr] = repeat.split('*');\n const min = minStr ? parseInt(minStr, 10) : 0;\n const max = maxStr ? parseInt(maxStr, 10) : Infinity;\n return { min, max };\n }\n // Exact repeat: \"3\" means exactly 3\n const exact = parseInt(repeat, 10);\n return { min: exact, max: exact };\n};\n\nconst transformElement = (element: AbnfElement): ASTNode => {\n const inner = transformPrimary(element.primary);\n\n if (!element.repeat) {\n return inner;\n }\n\n const { min, max } = parseRepeat(element.repeat);\n\n if (min === 0 && max === 1) {\n return { type: 'optional', element: inner };\n }\n\n return {\n type: 'repetition',\n element: inner,\n min,\n max,\n };\n};\n\nconst transformPrimary = (primary: AbnfPrimary): ASTNode => {\n switch (primary.$type) {\n case 'AbnfStringLiteral':\n return {\n type: 'terminal',\n value: (primary as AbnfStringLiteral).value,\n };\n case 'AbnfNumVal':\n return {\n type: 'terminal',\n value: (primary as AbnfNumVal).value,\n };\n case 'AbnfRuleName':\n return {\n type: 'nonterminal',\n name: (primary as AbnfRuleName).name,\n };\n case 'AbnfGroup':\n return transformAlternation((primary as AbnfGroup).element);\n case 'AbnfOptionalGroup':\n return {\n type: 'optional',\n element: transformAlternation((primary as AbnfOptionalGroup).element),\n };\n default:\n throw new Error(`Unsupported ABNF primary node: ${primary.$type}`);\n }\n};\n\nconst transformRule = (rule: LangiumAbnfRule): RailroadRule => {\n return {\n name: rule.name,\n definition: transformAlternation(rule.definition),\n };\n};\n\nconst populateDb = (ast: RailroadAbnf): void => {\n populateCommonDb(ast, db);\n\n if (ast.title) {\n db.setTitle(ast.title);\n }\n\n ast.rules.map((rule) => db.addRule(transformRule(rule)));\n};\n\nexport const parser: ParserDefinition = {\n parse: (input: string): void => {\n db.clear();\n log.debug('[ABNF Parser] Starting Langium parse');\n\n const result = langiumParser.parse<RailroadAbnf>(input);\n if (result.lexerErrors.length > 0 || result.parserErrors.length > 0) {\n throw new MermaidParseError(result);\n }\n\n const ast = result.value;\n log.debug('[ABNF Parser] Parsed rules:', ast.rules.length);\n\n populateDb(ast);\n log.debug('[ABNF Parser] Parse complete');\n },\n parser: {\n yy: db,\n },\n};\n\nexport default parser;\n", "import type { DiagramDefinition } from '../../diagram-api/types.js';\nimport { parser } from './parser/abnfParser.js';\nimport { db } from './railroadDb.js';\nimport { renderer } from './railroadRenderer.js';\nimport { getStyles } from './styles.js';\n\nexport const diagram: DiagramDefinition = {\n parser,\n db,\n renderer,\n styles: getStyles,\n};\n"],
"mappings": "4uBAsBA,IAAMA,EAAgBC,EAA2B,EAAE,aAAa,OAAO,cAEjEC,EAAuBC,EAACC,GAAkC,CAC9D,IAAMC,EAAeD,EAAI,aAAa,IAAIE,CAAsB,EAEhE,OAAID,EAAa,SAAW,EACnBA,EAAa,CAAC,EAGhB,CACL,KAAM,SACN,aAAAA,CACF,CACF,EAX6B,wBAavBC,EAAyBH,EAACI,GAAuC,CACrE,IAAMC,EAAWD,EAAO,SAAS,IAAIE,CAAgB,EAErD,OAAID,EAAS,SAAW,EACfA,EAAS,CAAC,EAGZ,CACL,KAAM,WACN,SAAAA,CACF,CACF,EAX+B,0BAazBE,EAAcP,EAACQ,GAAiD,CACpE,GAAIA,EAAO,SAAS,GAAG,EAAG,CACxB,GAAM,CAACC,EAAQC,CAAM,EAAIF,EAAO,MAAM,GAAG,EACnCG,EAAMF,EAAS,SAASA,EAAQ,EAAE,EAAI,EACtCG,EAAMF,EAAS,SAASA,EAAQ,EAAE,EAAI,IAC5C,MAAO,CAAE,IAAAC,EAAK,IAAAC,CAAI,CACpB,CAEA,IAAMC,EAAQ,SAASL,EAAQ,EAAE,EACjC,MAAO,CAAE,IAAKK,EAAO,IAAKA,CAAM,CAClC,EAVoB,eAYdP,EAAmBN,EAACc,GAAkC,CAC1D,IAAMC,EAAQC,EAAiBF,EAAQ,OAAO,EAE9C,GAAI,CAACA,EAAQ,OACX,OAAOC,EAGT,GAAM,CAAE,IAAAJ,EAAK,IAAAC,CAAI,EAAIL,EAAYO,EAAQ,MAAM,EAE/C,OAAIH,IAAQ,GAAKC,IAAQ,EAChB,CAAE,KAAM,WAAY,QAASG,CAAM,EAGrC,CACL,KAAM,aACN,QAASA,EACT,IAAAJ,EACA,IAAAC,CACF,CACF,EAnByB,oBAqBnBI,EAAmBhB,EAACiB,GAAkC,CAC1D,OAAQA,EAAQ,MAAO,CACrB,IAAK,oBACH,MAAO,CACL,KAAM,WACN,MAAQA,EAA8B,KACxC,EACF,IAAK,aACH,MAAO,CACL,KAAM,WACN,MAAQA,EAAuB,KACjC,EACF,IAAK,eACH,MAAO,CACL,KAAM,cACN,KAAOA,EAAyB,IAClC,EACF,IAAK,YACH,OAAOlB,EAAsBkB,EAAsB,OAAO,EAC5D,IAAK,oBACH,MAAO,CACL,KAAM,WACN,QAASlB,EAAsBkB,EAA8B,OAAO,CACtE,EACF,QACE,MAAM,IAAI,MAAM,kCAAkCA,EAAQ,KAAK,EAAE,CACrE,CACF,EA3ByB,oBA6BnBC,EAAgBlB,EAACmB,IACd,CACL,KAAMA,EAAK,KACX,WAAYpB,EAAqBoB,EAAK,UAAU,CAClD,GAJoB,iBAOhBC,EAAapB,EAACqB,GAA4B,CAC9CC,EAAiBD,EAAKE,CAAE,EAEpBF,EAAI,OACNE,EAAG,SAASF,EAAI,KAAK,EAGvBA,EAAI,MAAM,IAAKF,GAASI,EAAG,QAAQL,EAAcC,CAAI,CAAC,CAAC,CACzD,EARmB,cAUNK,EAA2B,CACtC,MAAOxB,EAACyB,GAAwB,CAC9BF,EAAG,MAAM,EACTG,EAAI,MAAM,sCAAsC,EAEhD,IAAMC,EAAS9B,EAAc,MAAoB4B,CAAK,EACtD,GAAIE,EAAO,YAAY,OAAS,GAAKA,EAAO,aAAa,OAAS,EAChE,MAAM,IAAIC,EAAkBD,CAAM,EAGpC,IAAMN,EAAMM,EAAO,MACnBD,EAAI,MAAM,8BAA+BL,EAAI,MAAM,MAAM,EAEzDD,EAAWC,CAAG,EACdK,EAAI,MAAM,8BAA8B,CAC1C,EAdO,SAeP,OAAQ,CACN,GAAIH,CACN,CACF,EC9IO,IAAMM,EAA6B,CACxC,OAAAC,EACA,GAAAC,EACA,SAAAC,EACA,OAAQC,CACV",
"names": ["langiumParser", "createRailroadAbnfServices", "transformAlternation", "__name", "alt", "alternatives", "transformConcatenation", "concat", "elements", "transformElement", "parseRepeat", "repeat", "minStr", "maxStr", "min", "max", "exact", "element", "inner", "transformPrimary", "primary", "transformRule", "rule", "populateDb", "ast", "populateCommonDb", "db", "parser", "input", "log", "result", "MermaidParseError", "diagram", "parser", "db", "renderer", "getStyles"]
}