--- references: - "File: /packages/mermaid/src/diagrams/flowchart/flowDiagram.ts" - "File: /packages/mermaid/src/diagrams/flowchart/flowDb.ts" - "File: /packages/mermaid/src/diagrams/flowchart/flowDetector.ts" - "File: /packages/mermaid/src/diagrams/flowchart/flowDetector-v2.ts" - "File: /packages/mermaid/src/diagrams/flowchart/flowRenderer-v3-unified.ts" - "File: /packages/mermaid/src/diagrams/flowchart/styles.ts" - "File: /packages/mermaid/src/diagrams/flowchart/types.ts" - "File: /packages/mermaid/src/diagrams/flowchart/flowChartShapes.js" - "File: /packages/mermaid/src/diagrams/flowchart/parser/flowParser.ts" - "File: /packages/mermaid/src/diagrams/flowchart/elk/detector.ts" generationTime: 2025-07-23T10:31:53.266Z --- flowchart TD %% Entry Points and Detection Input["User Input Text"] --> Detection{Detection Phase} Detection --> flowDetector["flowDetector.ts
detector(txt, config)"] Detection --> flowDetectorV2["flowDetector-v2.ts
detector(txt, config)"] Detection --> elkDetector["elk/detector.ts
detector(txt, config)"] flowDetector --> |"Checks /^\s*graph/"| DetectLegacy{Legacy Flowchart?} flowDetectorV2 --> |"Checks /^\s*flowchart/"| DetectNew{New Flowchart?} elkDetector --> |"Checks /^\s*flowchart-elk/"| DetectElk{ELK Layout?} DetectLegacy --> |Yes| LoadDiagram DetectNew --> |Yes| LoadDiagram DetectElk --> |Yes| LoadDiagram %% Loading Phase LoadDiagram["loader() function"] --> flowDiagram["flowDiagram.ts
diagram object"] flowDiagram --> DiagramStructure{Diagram Components} DiagramStructure --> Parser["parser: flowParser"] DiagramStructure --> Database["db: new FlowDB()"] DiagramStructure --> Renderer["renderer: flowRenderer-v3-unified"] DiagramStructure --> Styles["styles: flowStyles"] DiagramStructure --> Init["init: (cnf: MermaidConfig)"] %% Parser Phase Parser --> flowParser["parser/flowParser.ts
newParser.parse(src)"] flowParser --> |"Preprocesses src"| RemoveWhitespace["Remove trailing whitespace
src.replace(/}\s*\n/g, '}\n')"] RemoveWhitespace --> flowJison["parser/flow.jison
flowJisonParser.parse(newSrc)"] flowJison --> ParseGraph["Parse Graph Structure"] ParseGraph --> ParseVertices["Parse Vertices"] ParseGraph --> ParseEdges["Parse Edges"] ParseGraph --> ParseSubgraphs["Parse Subgraphs"] ParseGraph --> ParseClasses["Parse Classes"] ParseGraph --> ParseStyles["Parse Styles"] %% Database Phase - FlowDB Class Database --> FlowDBClass["flowDb.ts
FlowDB class"] FlowDBClass --> DBInit["constructor()
- Initialize counters
- Bind methods
- Setup toolTips
- Call clear()"] DBInit --> DBMethods{FlowDB Methods} DBMethods --> addVertex["addVertex(id, textObj, type, style,
classes, dir, props, metadata)"] DBMethods --> addLink["addLink(_start[], _end[], linkData)"] DBMethods --> addSingleLink["addSingleLink(_start, _end, type, id)"] DBMethods --> setDirection["setDirection(dir)"] DBMethods --> addSubGraph["addSubGraph(nodes[], id, title)"] DBMethods --> addClass["addClass(id, style)"] DBMethods --> setClass["setClass(ids, className)"] DBMethods --> setTooltip["setTooltip(ids, tooltip)"] DBMethods --> setClickEvent["setClickEvent(id, functionName, args)"] DBMethods --> setClickFun["setClickFun(id, functionName, args)"] %% Vertex Processing addVertex --> VertexProcess{Vertex Processing} VertexProcess --> CreateVertex["Create FlowVertex object
- id, labelType, domId
- styles[], classes[]"] VertexProcess --> SanitizeText["sanitizeText(textObj.text)"] VertexProcess --> ParseMetadata["Parse YAML metadata
yaml.load(yamlData)"] VertexProcess --> SetVertexProps["Set vertex properties
- shape, label, icon, form
- pos, img, constraint, w, h"] %% Edge Processing addSingleLink --> EdgeProcess{Edge Processing} EdgeProcess --> CreateEdge["Create FlowEdge object
- start, end, type, text
- labelType, classes[]"] EdgeProcess --> ProcessLinkText["Process link text
- sanitizeText()
- strip quotes"] EdgeProcess --> SetEdgeProps["Set edge properties
- type, stroke, length"] EdgeProcess --> GenerateEdgeId["Generate edge ID
getEdgeId(start, end, counter)"] EdgeProcess --> ValidateEdgeLimit["Validate edge limit
maxEdges check"] %% Data Collection DBMethods --> GetData["getData()"] GetData --> CollectNodes["Collect nodes[] from vertices"] GetData --> CollectEdges["Collect edges[] from edges"] GetData --> ProcessSubGraphs["Process subgraphs
- parentDB Map
- subGraphDB Map"] GetData --> AddNodeFromVertex["addNodeFromVertex()
for each vertex"] GetData --> ProcessEdgeTypes["destructEdgeType()
arrowTypeStart, arrowTypeEnd"] %% Node Creation AddNodeFromVertex --> NodeCreation{Node Creation} NodeCreation --> FindExistingNode["findNode(nodes, vertex.id)"] NodeCreation --> CreateBaseNode["Create base node
- id, label, parentId
- cssStyles, cssClasses
- shape, domId, tooltip"] NodeCreation --> GetCompiledStyles["getCompiledStyles(classDefs)"] NodeCreation --> GetTypeFromVertex["getTypeFromVertex(vertex)"] %% Rendering Phase Renderer --> flowRendererV3["flowRenderer-v3-unified.ts
draw(text, id, version, diag)"] flowRendererV3 --> RenderInit["Initialize rendering
- getConfig()
- handle securityLevel
- getDiagramElement()"] RenderInit --> GetLayoutData["diag.db.getData()
as LayoutData"] GetLayoutData --> SetupLayoutData["Setup layout data
- type, layoutAlgorithm
- direction, spacing
- markers, diagramId"] SetupLayoutData --> CallRender["render(data4Layout, svg)"] CallRender --> SetupViewPort["setupViewPortForSVG(svg, padding)"] SetupViewPort --> ProcessLinks["Process vertex links
- create anchor elements
- handle click events"] %% Shape Rendering CallRender --> ShapeSystem["flowChartShapes.js
Shape Functions"] ShapeSystem --> ShapeFunctions{Shape Functions} ShapeFunctions --> question["question(parent, bbox, node)"] ShapeFunctions --> hexagon["hexagon(parent, bbox, node)"] ShapeFunctions --> rect_left_inv_arrow["rect_left_inv_arrow(parent, bbox, node)"] ShapeFunctions --> lean_right["lean_right(parent, bbox, node)"] ShapeFunctions --> lean_left["lean_left(parent, bbox, node)"] ShapeFunctions --> insertPolygonShape["insertPolygonShape(parent, w, h, points)"] ShapeFunctions --> intersectPolygon["intersectPolygon(node, points, point)"] ShapeFunctions --> intersectRect["intersectRect(node, point)"] %% Styling System Styles --> stylesTS["styles.ts
getStyles(options)"] stylesTS --> StyleOptions["FlowChartStyleOptions
- arrowheadColor, border2
- clusterBkg, mainBkg
- fontFamily, textColor"] StyleOptions --> GenerateCSS["Generate CSS styles
- .label, .cluster-label
- .node, .edgePath
- .flowchart-link, .edgeLabel"] GenerateCSS --> GetIconStyles["getIconStyles()"] %% Type System Parser --> TypeSystem["types.ts
Type Definitions"] TypeSystem --> FlowVertex["FlowVertex interface"] TypeSystem --> FlowEdge["FlowEdge interface"] TypeSystem --> FlowClass["FlowClass interface"] TypeSystem --> FlowSubGraph["FlowSubGraph interface"] TypeSystem --> FlowVertexTypeParam["FlowVertexTypeParam
Shape types"] %% Utility Functions DBMethods --> UtilityFunctions{Utility Functions} UtilityFunctions --> lookUpDomId["lookUpDomId(id)"] UtilityFunctions --> getClasses["getClasses()"] UtilityFunctions --> getDirection["getDirection()"] UtilityFunctions --> getVertices["getVertices()"] UtilityFunctions --> getEdges["getEdges()"] UtilityFunctions --> getSubGraphs["getSubGraphs()"] UtilityFunctions --> clear["clear()"] UtilityFunctions --> defaultConfig["defaultConfig()"] %% Event Handling ProcessLinks --> EventHandling{Event Handling} EventHandling --> setupToolTips["setupToolTips(element)"] EventHandling --> bindFunctions["bindFunctions(element)"] EventHandling --> runFunc["utils.runFunc(functionName, args)"] %% Common Database Functions DBMethods --> CommonDB["commonDb.js functions"] CommonDB --> setAccTitle["setAccTitle()"] CommonDB --> getAccTitle["getAccTitle()"] CommonDB --> setAccDescription["setAccDescription()"] CommonDB --> getAccDescription["getAccDescription()"] CommonDB --> setDiagramTitle["setDiagramTitle()"] CommonDB --> getDiagramTitle["getDiagramTitle()"] CommonDB --> commonClear["clear()"] %% Final Output ProcessLinks --> FinalSVG["Final SVG Output"] %% Layout Algorithm Selection SetupLayoutData --> LayoutAlgorithm{Layout Algorithm} LayoutAlgorithm --> Dagre["dagre
(default)"] LayoutAlgorithm --> DagreWrapper["dagre-wrapper
(v2 renderer)"] LayoutAlgorithm --> ELK["elk
(external package)"] %% Testing Components FlowDBClass --> TestFiles["Test Files"] TestFiles --> flowDbSpec["flowDb.spec.ts"] TestFiles --> flowChartShapesSpec["flowChartShapes.spec.js"] TestFiles --> ParserTests["parser/*.spec.js files
- flow-text.spec.js
- flow-edges.spec.js
- flow-style.spec.js
- subgraph.spec.js"] %% Configuration Init --> ConfigSetup["Configuration Setup"] ConfigSetup --> FlowchartConfig["cnf.flowchart config"] ConfigSetup --> ArrowMarkers["arrowMarkerAbsolute"] ConfigSetup --> LayoutConfig["layout config"] ConfigSetup --> SetConfig["setConfig() calls"]