UNPKG

mermaid

Version:

Markdown-ish syntax for generating flowcharts, mindmaps, sequence diagrams, class diagrams, gantt charts, git graphs and more.

156 lines (153 loc) 4.06 kB
import { db, getStyles, renderer } from "./chunk-C3UDNE5T.mjs"; import { populateCommonDb } from "./chunk-6ZKBGPIT.mjs"; import { MermaidParseError } from "./chunk-5EDX277H.mjs"; import "./chunk-WKU43CU3.mjs"; import "./chunk-2HS3KVXU.mjs"; import "./chunk-XOOU5E5Q.mjs"; import "./chunk-SXDK7GA3.mjs"; import "./chunk-EQZMDKUZ.mjs"; import { createRailroadAbnfServices } from "./chunk-3MNNKFVW.mjs"; import "./chunk-X7XOBEZY.mjs"; import "./chunk-4H32FQV7.mjs"; import "./chunk-BDBCVAR5.mjs"; import "./chunk-ZD6PRSSI.mjs"; import "./chunk-FQ2WY6HO.mjs"; import "./chunk-MGNMQO6E.mjs"; import "./chunk-Z53TCUM2.mjs"; import "./chunk-AQRBQPRI.mjs"; import "./chunk-Z2I5LGMO.mjs"; import "./chunk-W5JXREIF.mjs"; import "./chunk-Y5RK4UJQ.mjs"; import "./chunk-AHS5MEEA.mjs"; import { log } from "./chunk-X5WJYYCX.mjs"; import { __name } from "./chunk-PTVI3W5X.mjs"; // src/diagrams/railroad/parser/abnfParser.ts var langiumParser = createRailroadAbnfServices().RailroadAbnf.parser.LangiumParser; var transformAlternation = /* @__PURE__ */ __name((alt) => { const alternatives = alt.alternatives.map(transformConcatenation); if (alternatives.length === 1) { return alternatives[0]; } return { type: "choice", alternatives }; }, "transformAlternation"); var transformConcatenation = /* @__PURE__ */ __name((concat) => { const elements = concat.elements.map(transformElement); if (elements.length === 1) { return elements[0]; } return { type: "sequence", elements }; }, "transformConcatenation"); var parseRepeat = /* @__PURE__ */ __name((repeat) => { if (repeat.includes("*")) { const [minStr, maxStr] = repeat.split("*"); const min = minStr ? parseInt(minStr, 10) : 0; const max = maxStr ? parseInt(maxStr, 10) : Infinity; return { min, max }; } const exact = parseInt(repeat, 10); return { min: exact, max: exact }; }, "parseRepeat"); var transformElement = /* @__PURE__ */ __name((element) => { const inner = transformPrimary(element.primary); if (!element.repeat) { return inner; } const { min, max } = parseRepeat(element.repeat); if (min === 0 && max === 1) { return { type: "optional", element: inner }; } return { type: "repetition", element: inner, min, max }; }, "transformElement"); var transformPrimary = /* @__PURE__ */ __name((primary) => { switch (primary.$type) { case "AbnfStringLiteral": return { type: "terminal", value: primary.value }; case "AbnfNumVal": return { type: "terminal", value: primary.value }; case "AbnfRuleName": return { type: "nonterminal", name: primary.name }; case "AbnfGroup": return transformAlternation(primary.element); case "AbnfOptionalGroup": return { type: "optional", element: transformAlternation(primary.element) }; default: throw new Error(`Unsupported ABNF primary node: ${primary.$type}`); } }, "transformPrimary"); var transformRule = /* @__PURE__ */ __name((rule) => { return { name: rule.name, definition: transformAlternation(rule.definition) }; }, "transformRule"); var populateDb = /* @__PURE__ */ __name((ast) => { populateCommonDb(ast, db); if (ast.title) { db.setTitle(ast.title); } ast.rules.map((rule) => db.addRule(transformRule(rule))); }, "populateDb"); var parser = { parse: /* @__PURE__ */ __name((input) => { db.clear(); log.debug("[ABNF Parser] Starting Langium parse"); const result = langiumParser.parse(input); if (result.lexerErrors.length > 0 || result.parserErrors.length > 0) { throw new MermaidParseError(result); } const ast = result.value; log.debug("[ABNF Parser] Parsed rules:", ast.rules.length); populateDb(ast); log.debug("[ABNF Parser] Parse complete"); }, "parse"), parser: { yy: db } }; // src/diagrams/railroad/abnfDiagram.ts var diagram = { parser, db, renderer, styles: getStyles }; export { diagram };