mermaid
Version:
Markdown-ish syntax for generating flowcharts, mindmaps, sequence diagrams, class diagrams, gantt charts, git graphs and more.
176 lines (173 loc) • 4.46 kB
JavaScript
import {
db,
getStyles,
renderer
} from "./chunk-MH3WDIKF.mjs";
import {
populateCommonDb
} from "./chunk-X67BZSRO.mjs";
import {
MermaidParseError
} from "./chunk-PP7T2VXU.mjs";
import "./chunk-VJXJ5QCJ.mjs";
import "./chunk-3GRS7R6R.mjs";
import "./chunk-G2A2OEYH.mjs";
import "./chunk-MULULVMI.mjs";
import "./chunk-O5H7SEHM.mjs";
import "./chunk-6WE5GGNG.mjs";
import "./chunk-KD5VN4N6.mjs";
import "./chunk-G6AM5BRH.mjs";
import {
createRailroadEbnfServices
} from "./chunk-J74O3ZRR.mjs";
import "./chunk-2JN552EF.mjs";
import "./chunk-Q77HCHBN.mjs";
import "./chunk-KIWDUUFH.mjs";
import "./chunk-JDESJKT4.mjs";
import "./chunk-ZEJ26CLT.mjs";
import "./chunk-YOWFEKIV.mjs";
import "./chunk-WLRJLAWP.mjs";
import "./chunk-VD2MO4BW.mjs";
import "./chunk-KMA2NSDO.mjs";
import {
log
} from "./chunk-OHNBJXQ2.mjs";
import {
__name
} from "./chunk-35ZOQMXA.mjs";
// src/diagrams/railroad/parser/ebnfParser.ts
var langiumParser = createRailroadEbnfServices().RailroadEbnf.parser.LangiumParser;
var transformChoice = /* @__PURE__ */ __name((choice) => {
const alternatives = choice.alternatives.map(transformSequence);
if (alternatives.length === 1) {
return alternatives[0];
}
return {
type: "choice",
alternatives
};
}, "transformChoice");
var transformSequence = /* @__PURE__ */ __name((sequence) => {
const elements = sequence.elements.map(transformTerm);
if (elements.length === 1) {
return elements[0];
}
return {
type: "sequence",
elements
};
}, "transformSequence");
var transformPrimary = /* @__PURE__ */ __name((primary) => {
switch (primary.$type) {
case "EbnfTerminal":
return {
type: "terminal",
value: primary.value
};
case "EbnfNonTerminal":
return {
type: "nonterminal",
name: primary.name
};
case "EbnfSpecial":
return {
type: "special",
text: primary.text
};
case "EbnfGroup":
return transformChoice(primary.element);
case "EbnfOptional":
return {
type: "optional",
element: transformChoice(primary.element)
};
case "EbnfRepetition":
return {
type: "repetition",
element: transformChoice(primary.element),
min: 0,
max: Infinity
};
default:
throw new Error(`Unsupported EBNF primary node: ${primary.$type}`);
}
}, "transformPrimary");
var transformPostfix = /* @__PURE__ */ __name((node, postfix) => {
switch (postfix.$type) {
case "EbnfOptionalPostfix":
return {
type: "optional",
element: node
};
case "EbnfZeroOrMorePostfix":
return {
type: "repetition",
element: node,
min: 0,
max: Infinity
};
case "EbnfOneOrMorePostfix":
return {
type: "repetition",
element: node,
min: 1,
max: Infinity
};
case "EbnfExceptionPostfix":
return {
type: "sequence",
elements: [
node,
{ type: "terminal", value: "-" },
transformPrimary(postfix.except)
]
};
default:
throw new Error(`Unsupported EBNF postfix node: ${postfix.$type}`);
}
}, "transformPostfix");
var transformTerm = /* @__PURE__ */ __name((term) => {
return term.postfixes.reduce((currentNode, postfix) => {
return transformPostfix(currentNode, postfix);
}, transformPrimary(term.base));
}, "transformTerm");
var transformRule = /* @__PURE__ */ __name((rule) => {
return {
name: rule.name,
definition: transformChoice(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("[EBNF 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("[EBNF Parser] Parsed rules:", ast.rules.length);
populateDb(ast);
log.debug("[EBNF Parser] Parse complete");
}, "parse"),
parser: {
yy: db
}
};
// src/diagrams/railroad/ebnfDiagram.ts
var diagram = {
parser,
db,
renderer,
styles: getStyles
};
export {
diagram
};