From adfeb093cb55d570c06998beff767ef7ac7b3a21 Mon Sep 17 00:00:00 2001 From: Prashant-7718 Date: Wed, 23 Jul 2025 18:55:25 +0530 Subject: [PATCH 1/9] chore: mermaid diagrams for flowchart, mindmap and mermaidAPI files --- docs/diagrams/flowchart-code-flow.mmd | 189 +++++++++++ docs/diagrams/mermaid-api-sequence.mmd | 307 ++++++++++++++++++ .../mindmap-implementation-sequence.mmd | 180 ++++++++++ .../src/docs/diagrams/flowchart-code-flow.mmd | 189 +++++++++++ .../docs/diagrams/mermaid-api-sequence.mmd | 307 ++++++++++++++++++ .../mindmap-implementation-sequence.mmd | 180 ++++++++++ 6 files changed, 1352 insertions(+) create mode 100644 docs/diagrams/flowchart-code-flow.mmd create mode 100644 docs/diagrams/mermaid-api-sequence.mmd create mode 100644 docs/diagrams/mindmap-implementation-sequence.mmd create mode 100644 packages/mermaid/src/docs/diagrams/flowchart-code-flow.mmd create mode 100644 packages/mermaid/src/docs/diagrams/mermaid-api-sequence.mmd create mode 100644 packages/mermaid/src/docs/diagrams/mindmap-implementation-sequence.mmd diff --git a/docs/diagrams/flowchart-code-flow.mmd b/docs/diagrams/flowchart-code-flow.mmd new file mode 100644 index 000000000..d306dac7b --- /dev/null +++ b/docs/diagrams/flowchart-code-flow.mmd @@ -0,0 +1,189 @@ +--- +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"] \ No newline at end of file diff --git a/docs/diagrams/mermaid-api-sequence.mmd b/docs/diagrams/mermaid-api-sequence.mmd new file mode 100644 index 000000000..ce7597525 --- /dev/null +++ b/docs/diagrams/mermaid-api-sequence.mmd @@ -0,0 +1,307 @@ +--- +references: + - "File: /packages/mermaid/src/mermaidAPI.ts" + - "File: /packages/mermaid/src/mermaid.ts" +generationTime: 2025-01-28T16:30:00.000Z +--- +sequenceDiagram + participant User as User/Browser + participant Mermaid as mermaid.ts + participant Queue as executionQueue + participant API as mermaidAPI.ts + participant Config as configApi + participant Preprocessor as preprocessDiagram + participant DiagramAPI as diagram-api + participant Diagram as Diagram.fromText + participant Renderer as diagram.renderer + participant Styles as Styling System + participant DOM as DOM/SVG + + Note over User, DOM: Mermaid Complete API Flow + + %% Initialization Phase + User->>+Mermaid: mermaid.initialize(config) + Mermaid->>+API: mermaidAPI.initialize(config) + + API->>API: assignWithDepth({}, userOptions) + API->>API: handle legacy fontFamily config + API->>Config: saveConfigFromInitialize(options) + + alt Theme Configuration Available + API->>API: check if theme in theme object + API->>API: set themeVariables from theme + else Default Theme + API->>API: use default theme variables + end + + API->>Config: setSiteConfig(options) or getSiteConfig() + API->>API: setLogLevel(config.logLevel) + API->>DiagramAPI: addDiagrams() + + API-->>-Mermaid: initialization complete + Mermaid-->>-User: ready to render + + %% Content Loaded Event + User->>DOM: document.load event + DOM->>+Mermaid: contentLoaded() + + opt startOnLoad is true + Mermaid->>Config: getConfig() + Config-->>Mermaid: { startOnLoad: true } + Mermaid->>Mermaid: run() + end + + Mermaid-->>-DOM: event handling complete + + %% Main Run Function + User->>+Mermaid: mermaid.run(options) + + Mermaid->>Mermaid: runThrowsErrors(options) + Mermaid->>Config: getConfig() + Config-->>Mermaid: configuration object + + alt nodes provided + Mermaid->>Mermaid: use provided nodes + else querySelector provided + Mermaid->>DOM: document.querySelectorAll(querySelector) + DOM-->>Mermaid: nodesToProcess + end + + Mermaid->>Mermaid: new InitIDGenerator(deterministicIds, seed) + + loop For each diagram element + Mermaid->>DOM: check element.getAttribute('data-processed') + + opt not processed + Mermaid->>DOM: element.setAttribute('data-processed', 'true') + Mermaid->>Mermaid: generate unique id + Mermaid->>DOM: get element.innerHTML + Mermaid->>Mermaid: entityDecode and clean text + Mermaid->>Mermaid: detectInit(txt) + + Mermaid->>Queue: render(id, txt, element) + end + end + + Mermaid-->>-User: processing initiated + + %% Render Function (Queued) + activate Queue + Queue->>+API: mermaidAPI.render(id, text, container) + + API->>DiagramAPI: addDiagrams() + API->>+Preprocessor: processAndSetConfigs(text) + + Preprocessor->>Preprocessor: preprocessDiagram(text) + Preprocessor->>Config: reset() + Preprocessor->>Config: addDirective(processed.config) + Preprocessor-->>-API: { code, config } + + API->>Config: getConfig() + Config-->>API: current configuration + + opt text length > maxTextSize + API->>API: text = MAX_TEXTLENGTH_EXCEEDED_MSG + end + + API->>API: setup id selectors and element IDs + API->>API: determine security level (sandbox/loose) + + %% DOM Setup + alt svgContainingElement provided + alt isSandboxed + API->>DOM: sandboxedIframe(select(svgContainingElement), iFrameID) + API->>DOM: select iframe contentDocument body + else + API->>DOM: select(svgContainingElement) + end + else no container + API->>API: removeExistingElements(document, id, divId, iFrameId) + alt isSandboxed + API->>DOM: sandboxedIframe(select('body'), iFrameID) + else + API->>DOM: select('body') + end + end + + API->>DOM: appendDivSvgG(root, id, enclosingDivID, fontFamily, XMLNS_XLINK_STD) + + %% Diagram Creation + API->>+Diagram: Diagram.fromText(text, { title: processed.title }) + + Diagram->>DiagramAPI: detect diagram type + Diagram->>DiagramAPI: load appropriate diagram + Diagram-->>-API: diagram instance + + opt parsing error occurred + API->>+Diagram: Diagram.fromText('error') + Diagram-->>-API: error diagram + API->>API: store parseEncounteredException + end + + %% Style Generation + API->>DOM: get svg element and firstChild + API->>Renderer: diag.renderer.getClasses(text, diag) + Renderer-->>API: diagramClassDefs + + API->>+Styles: createUserStyles(config, diagramType, diagramClassDefs, idSelector) + + Styles->>Styles: createCssStyles(config, classDefs) + + opt config.themeCSS defined + Styles->>Styles: append themeCSS + end + + opt fontFamily configured + Styles->>Styles: add CSS variables for fonts + end + + opt classDefs exist + loop For each styleClassDef + opt has styles + Styles->>Styles: cssImportantStyles for each CSS element + end + opt has textStyles + Styles->>Styles: cssImportantStyles for tspan elements + end + end + end + + Styles->>Styles: getStyles(graphType, userCSSstyles, themeVariables) + Styles->>Styles: serialize(compile(svgId{allStyles}), stringify) + Styles-->>-API: compiled CSS rules + + API->>DOM: create style element + API->>DOM: style.innerHTML = rules + API->>DOM: svg.insertBefore(style, firstChild) + + %% Diagram Rendering + API->>+Renderer: diag.renderer.draw(text, id, version, diag) + + Renderer->>Renderer: diagram-specific rendering logic + Renderer->>DOM: create SVG elements + Renderer->>DOM: apply positioning and styling + Renderer-->>-API: rendered diagram + + opt rendering error + alt suppressErrorRendering + API->>API: removeTempElements() + API->>Mermaid: throw error + else + API->>Renderer: errorRenderer.draw(text, id, version) + end + end + + %% Accessibility and Cleanup + API->>DOM: select svg element + API->>Diagram: diag.db.getAccTitle() + API->>Diagram: diag.db.getAccDescription() + API->>API: addA11yInfo(diagramType, svgNode, a11yTitle, a11yDescr) + + API->>DOM: set xmlns for foreignobject elements + API->>DOM: get innerHTML from enclosing div + + API->>+API: cleanUpSvgCode(svgCode, isSandboxed, arrowMarkerAbsolute) + + opt not useArrowMarkerUrls and not sandboxed + API->>API: replace marker-end URLs with anchors + end + + API->>API: decodeEntities(svgCode) + API->>API: replace
with
+ API-->>-API: cleaned SVG code + + alt isSandboxed + API->>+API: putIntoIFrame(svgCode, svgEl) + API->>API: calculate iframe height + API->>API: toBase64 encode SVG content + API->>API: create iframe with sandbox attributes + API-->>-API: iframe HTML + else not loose security + API->>API: DOMPurify.sanitize(svgCode, options) + end + + API->>API: attachFunctions() + API->>API: removeTempElements() + + opt parseEncounteredException + API->>Mermaid: throw parseEncounteredException + end + + API-->>-Queue: { diagramType, svg: svgCode, bindFunctions } + + %% Return to Web Integration + activate Mermaid + Queue-->>Mermaid: render result + Mermaid->>DOM: element.innerHTML = svg + + opt postRenderCallback + Mermaid->>User: postRenderCallback(id) + end + + opt bindFunctions exist + Mermaid->>DOM: bindFunctions(element) + end + deactivate Mermaid + + %% Parse Function Flow + User->>+Mermaid: mermaid.parse(text, parseOptions) + activate Queue + + Queue->>+API: mermaidAPI.parse(text, parseOptions) + + API->>DiagramAPI: addDiagrams() + API->>Preprocessor: processAndSetConfigs(text) + Preprocessor-->>API: { code, config } + API->>Diagram: getDiagramFromText(code) + Diagram-->>API: diagram instance + API-->>-Queue: { diagramType: diagram.type, config } + + Queue-->>-Mermaid: parse result + Mermaid-->>-User: ParseResult or false + + %% External Diagram Registration + User->>+Mermaid: registerExternalDiagrams(diagrams, options) + + Mermaid->>DiagramAPI: addDiagrams() + Mermaid->>DiagramAPI: registerLazyLoadedDiagrams(...diagrams) + + opt lazyLoad is false + Mermaid->>DiagramAPI: loadRegisteredDiagrams() + end + + Mermaid-->>-User: registration complete + + %% Error Handling + Note over Mermaid, API: Error Handling Throughout + alt Error occurs + API->>Mermaid: throw error + Mermaid->>+Mermaid: handleError(error, errors, parseError) + + Mermaid->>Mermaid: log.warn(error) + + alt isDetailedError + Mermaid->>User: parseError(error.str, error.hash) + else + Mermaid->>User: parseError(error) + end + + opt not suppressErrors + Mermaid->>User: throw error + end + + Mermaid-->>-User: error handled + end + + %% Configuration Details + Note over Config: Configuration Functions + Note right of Config: Functions:
- reset()
- getConfig()
- setConfig()
- getSiteConfig()
- updateSiteConfig()
- saveConfigFromInitialize() + + Note over Styles: CSS Generation + Note right of Styles: Features:
- createCssStyles()
- createUserStyles()
- cssImportantStyles()
- Theme integration
- Class definitions + + Note over API: Security Levels + Note right of API: Modes:
- sandbox: iframe isolation
- loose: minimal sanitization
- default: DOMPurify sanitization + + Note over API: Helper Functions + Note right of API: Utilities:
- cleanUpSvgCode()
- putIntoIFrame()
- appendDivSvgG()
- removeExistingElements() \ No newline at end of file diff --git a/docs/diagrams/mindmap-implementation-sequence.mmd b/docs/diagrams/mindmap-implementation-sequence.mmd new file mode 100644 index 000000000..335855380 --- /dev/null +++ b/docs/diagrams/mindmap-implementation-sequence.mmd @@ -0,0 +1,180 @@ +--- +references: + - "File: /packages/mermaid/src/diagrams/mindmap/mindmap-definition.ts" + - "File: /packages/mermaid/src/diagrams/mindmap/mindmapDb.ts" + - "File: /packages/mermaid/src/diagrams/mindmap/detector.ts" + - "File: /packages/mermaid/src/diagrams/mindmap/mindmapTypes.ts" + - "File: /packages/mermaid/src/diagrams/mindmap/mindmapRenderer.ts" + - "File: /packages/mermaid/src/diagrams/mindmap/styles.ts" + - "File: /packages/mermaid/src/diagrams/mindmap/svgDraw.ts" +generationTime: 2025-01-28T16:00:00.000Z +--- +sequenceDiagram + participant User as User Input Text + participant Detector as detector.ts + participant Loader as DiagramLoader + participant Definition as mindmap-definition.ts + participant Parser as parser/mindmap.jison + participant DB as MindmapDB + participant Renderer as mindmapRenderer.ts + participant Cytoscape as cytoscape.js + participant SVGDraw as svgDraw.ts + participant Styles as styles.ts + participant Output as Final SVG + + Note over User, Output: Mindmap Implementation Flow + + %% Detection Phase + User->>Detector: /^\s*mindmap/ text input + activate Detector + Detector->>Detector: detector(txt) validates pattern + Detector->>Loader: loader() function called + deactivate Detector + + activate Loader + Loader->>Definition: import mindmap-definition.js + deactivate Loader + + %% Core Structure Setup + activate Definition + Definition->>DB: get db() → new MindmapDB() + Definition->>Renderer: setup renderer + Definition->>Parser: setup parser + Definition->>Styles: setup styles + deactivate Definition + + %% Database Initialization + activate DB + Note over DB: MindmapDB Constructor + DB->>DB: initialize nodes array + DB->>DB: setup nodeType constants + DB->>DB: bind methods + DB->>DB: clear() state + + %% Parsing Phase + activate Parser + User->>Parser: mindmap syntax text + + loop For each node in hierarchy + Parser->>DB: addNode(level, id, descr, type) + activate DB + DB->>DB: sanitizeText(id, descr) + DB->>DB: getType(startStr, endStr) + Note right of DB: Shape Detection:
[ → RECT
( → ROUNDED_RECT
(( → CIRCLE
)) → BANG
{{ → HEXAGON + DB->>DB: getParent(level) + DB->>DB: create MindmapNode + DB->>DB: add to hierarchy + deactivate DB + end + + opt Icon/Class Decoration + Parser->>DB: decorateNode(decoration) + DB->>DB: set icon/class properties + end + deactivate Parser + + %% Data Preparation + Renderer->>DB: getData() for layout + activate DB + DB->>DB: collect all nodes + DB->>DB: build parent-child relationships + DB-->>Renderer: return node hierarchy + deactivate DB + + %% Rendering Pipeline + activate Renderer + Note over Renderer: Rendering Phase + + Renderer->>Cytoscape: initialize cytoscape + activate Cytoscape + + loop For each node in mindmap + Renderer->>Cytoscape: addNodes(mindmap, cy, conf, level) + Cytoscape->>Cytoscape: create node data + Cytoscape->>Cytoscape: set position (x, y) + end + + loop For parent-child relationships + Renderer->>Cytoscape: add edges + Cytoscape->>Cytoscape: create edge data + end + + Renderer->>Cytoscape: configure cose-bilkent layout + Cytoscape->>Cytoscape: calculate optimal positions + Cytoscape-->>Renderer: return positioned graph + deactivate Cytoscape + + %% SVG Generation + Renderer->>SVGDraw: drawNodes(db, svg, mindmap, section, conf) + activate SVGDraw + + loop For each node recursively + SVGDraw->>SVGDraw: select shape function + + alt Default Shape + SVGDraw->>SVGDraw: defaultBkg() - rounded rectangle + else Rectangle Shape + SVGDraw->>SVGDraw: rectBkg() - sharp corners + else Circle Shape + SVGDraw->>SVGDraw: circleBkg() - perfect circle + else Cloud Shape + SVGDraw->>SVGDraw: cloudBkg() - organic curves + else Bang Shape + SVGDraw->>SVGDraw: bangBkg() - explosion style + else Hexagon Shape + SVGDraw->>SVGDraw: hexagonBkg() - six sides + end + + SVGDraw->>SVGDraw: create SVG elements + SVGDraw->>SVGDraw: add text labels + SVGDraw->>SVGDraw: position node + + opt Node has children + SVGDraw->>SVGDraw: drawNodes() recursive call + end + end + deactivate SVGDraw + + %% Edge Rendering + Renderer->>Renderer: drawEdges(edgesEl, cy) + loop For each edge + Renderer->>Renderer: extract edge bounds + Renderer->>Renderer: draw SVG path + end + + %% Styling Application + Renderer->>Styles: getStyles(options) + activate Styles + + Styles->>Styles: genSections(options) + loop For THEME_COLOR_LIMIT sections + Styles->>Styles: generate color scale + Styles->>Styles: create CSS rules + Note right of Styles: .section-X fills
.edge-depth-X widths
.node-icon-X colors + end + + Styles->>Styles: apply theme integration + Styles-->>Renderer: return compiled CSS + deactivate Styles + + %% Final Assembly + Renderer->>Output: selectSvgElement() + Renderer->>Output: setupGraphViewbox() + Renderer->>Output: apply styles + Renderer->>Output: add interactive elements + deactivate Renderer + + activate Output + Note over Output: Final Mindmap Features + Output->>Output: responsive layout + Output->>Output: accessibility attributes + Output->>Output: hover effects + Output->>Output: click handling + Output-->>User: rendered mindmap + deactivate Output + + %% Configuration Details + Note over DB, Styles: Configuration Options + Note right of DB: Padding Calculations:
Base padding from config
RECT: ×2 padding
ROUNDED_RECT: ×2 padding
HEXAGON: ×2 padding + Note right of Styles: Section Management:
MAX_SECTIONS = 12
Dynamic color generation
Git theme integration + Note right of Renderer: Layout Parameters:
Cytoscape configuration
coseBilkent settings
Node spacing rules \ No newline at end of file diff --git a/packages/mermaid/src/docs/diagrams/flowchart-code-flow.mmd b/packages/mermaid/src/docs/diagrams/flowchart-code-flow.mmd new file mode 100644 index 000000000..d306dac7b --- /dev/null +++ b/packages/mermaid/src/docs/diagrams/flowchart-code-flow.mmd @@ -0,0 +1,189 @@ +--- +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"] \ No newline at end of file diff --git a/packages/mermaid/src/docs/diagrams/mermaid-api-sequence.mmd b/packages/mermaid/src/docs/diagrams/mermaid-api-sequence.mmd new file mode 100644 index 000000000..ce7597525 --- /dev/null +++ b/packages/mermaid/src/docs/diagrams/mermaid-api-sequence.mmd @@ -0,0 +1,307 @@ +--- +references: + - "File: /packages/mermaid/src/mermaidAPI.ts" + - "File: /packages/mermaid/src/mermaid.ts" +generationTime: 2025-01-28T16:30:00.000Z +--- +sequenceDiagram + participant User as User/Browser + participant Mermaid as mermaid.ts + participant Queue as executionQueue + participant API as mermaidAPI.ts + participant Config as configApi + participant Preprocessor as preprocessDiagram + participant DiagramAPI as diagram-api + participant Diagram as Diagram.fromText + participant Renderer as diagram.renderer + participant Styles as Styling System + participant DOM as DOM/SVG + + Note over User, DOM: Mermaid Complete API Flow + + %% Initialization Phase + User->>+Mermaid: mermaid.initialize(config) + Mermaid->>+API: mermaidAPI.initialize(config) + + API->>API: assignWithDepth({}, userOptions) + API->>API: handle legacy fontFamily config + API->>Config: saveConfigFromInitialize(options) + + alt Theme Configuration Available + API->>API: check if theme in theme object + API->>API: set themeVariables from theme + else Default Theme + API->>API: use default theme variables + end + + API->>Config: setSiteConfig(options) or getSiteConfig() + API->>API: setLogLevel(config.logLevel) + API->>DiagramAPI: addDiagrams() + + API-->>-Mermaid: initialization complete + Mermaid-->>-User: ready to render + + %% Content Loaded Event + User->>DOM: document.load event + DOM->>+Mermaid: contentLoaded() + + opt startOnLoad is true + Mermaid->>Config: getConfig() + Config-->>Mermaid: { startOnLoad: true } + Mermaid->>Mermaid: run() + end + + Mermaid-->>-DOM: event handling complete + + %% Main Run Function + User->>+Mermaid: mermaid.run(options) + + Mermaid->>Mermaid: runThrowsErrors(options) + Mermaid->>Config: getConfig() + Config-->>Mermaid: configuration object + + alt nodes provided + Mermaid->>Mermaid: use provided nodes + else querySelector provided + Mermaid->>DOM: document.querySelectorAll(querySelector) + DOM-->>Mermaid: nodesToProcess + end + + Mermaid->>Mermaid: new InitIDGenerator(deterministicIds, seed) + + loop For each diagram element + Mermaid->>DOM: check element.getAttribute('data-processed') + + opt not processed + Mermaid->>DOM: element.setAttribute('data-processed', 'true') + Mermaid->>Mermaid: generate unique id + Mermaid->>DOM: get element.innerHTML + Mermaid->>Mermaid: entityDecode and clean text + Mermaid->>Mermaid: detectInit(txt) + + Mermaid->>Queue: render(id, txt, element) + end + end + + Mermaid-->>-User: processing initiated + + %% Render Function (Queued) + activate Queue + Queue->>+API: mermaidAPI.render(id, text, container) + + API->>DiagramAPI: addDiagrams() + API->>+Preprocessor: processAndSetConfigs(text) + + Preprocessor->>Preprocessor: preprocessDiagram(text) + Preprocessor->>Config: reset() + Preprocessor->>Config: addDirective(processed.config) + Preprocessor-->>-API: { code, config } + + API->>Config: getConfig() + Config-->>API: current configuration + + opt text length > maxTextSize + API->>API: text = MAX_TEXTLENGTH_EXCEEDED_MSG + end + + API->>API: setup id selectors and element IDs + API->>API: determine security level (sandbox/loose) + + %% DOM Setup + alt svgContainingElement provided + alt isSandboxed + API->>DOM: sandboxedIframe(select(svgContainingElement), iFrameID) + API->>DOM: select iframe contentDocument body + else + API->>DOM: select(svgContainingElement) + end + else no container + API->>API: removeExistingElements(document, id, divId, iFrameId) + alt isSandboxed + API->>DOM: sandboxedIframe(select('body'), iFrameID) + else + API->>DOM: select('body') + end + end + + API->>DOM: appendDivSvgG(root, id, enclosingDivID, fontFamily, XMLNS_XLINK_STD) + + %% Diagram Creation + API->>+Diagram: Diagram.fromText(text, { title: processed.title }) + + Diagram->>DiagramAPI: detect diagram type + Diagram->>DiagramAPI: load appropriate diagram + Diagram-->>-API: diagram instance + + opt parsing error occurred + API->>+Diagram: Diagram.fromText('error') + Diagram-->>-API: error diagram + API->>API: store parseEncounteredException + end + + %% Style Generation + API->>DOM: get svg element and firstChild + API->>Renderer: diag.renderer.getClasses(text, diag) + Renderer-->>API: diagramClassDefs + + API->>+Styles: createUserStyles(config, diagramType, diagramClassDefs, idSelector) + + Styles->>Styles: createCssStyles(config, classDefs) + + opt config.themeCSS defined + Styles->>Styles: append themeCSS + end + + opt fontFamily configured + Styles->>Styles: add CSS variables for fonts + end + + opt classDefs exist + loop For each styleClassDef + opt has styles + Styles->>Styles: cssImportantStyles for each CSS element + end + opt has textStyles + Styles->>Styles: cssImportantStyles for tspan elements + end + end + end + + Styles->>Styles: getStyles(graphType, userCSSstyles, themeVariables) + Styles->>Styles: serialize(compile(svgId{allStyles}), stringify) + Styles-->>-API: compiled CSS rules + + API->>DOM: create style element + API->>DOM: style.innerHTML = rules + API->>DOM: svg.insertBefore(style, firstChild) + + %% Diagram Rendering + API->>+Renderer: diag.renderer.draw(text, id, version, diag) + + Renderer->>Renderer: diagram-specific rendering logic + Renderer->>DOM: create SVG elements + Renderer->>DOM: apply positioning and styling + Renderer-->>-API: rendered diagram + + opt rendering error + alt suppressErrorRendering + API->>API: removeTempElements() + API->>Mermaid: throw error + else + API->>Renderer: errorRenderer.draw(text, id, version) + end + end + + %% Accessibility and Cleanup + API->>DOM: select svg element + API->>Diagram: diag.db.getAccTitle() + API->>Diagram: diag.db.getAccDescription() + API->>API: addA11yInfo(diagramType, svgNode, a11yTitle, a11yDescr) + + API->>DOM: set xmlns for foreignobject elements + API->>DOM: get innerHTML from enclosing div + + API->>+API: cleanUpSvgCode(svgCode, isSandboxed, arrowMarkerAbsolute) + + opt not useArrowMarkerUrls and not sandboxed + API->>API: replace marker-end URLs with anchors + end + + API->>API: decodeEntities(svgCode) + API->>API: replace
with
+ API-->>-API: cleaned SVG code + + alt isSandboxed + API->>+API: putIntoIFrame(svgCode, svgEl) + API->>API: calculate iframe height + API->>API: toBase64 encode SVG content + API->>API: create iframe with sandbox attributes + API-->>-API: iframe HTML + else not loose security + API->>API: DOMPurify.sanitize(svgCode, options) + end + + API->>API: attachFunctions() + API->>API: removeTempElements() + + opt parseEncounteredException + API->>Mermaid: throw parseEncounteredException + end + + API-->>-Queue: { diagramType, svg: svgCode, bindFunctions } + + %% Return to Web Integration + activate Mermaid + Queue-->>Mermaid: render result + Mermaid->>DOM: element.innerHTML = svg + + opt postRenderCallback + Mermaid->>User: postRenderCallback(id) + end + + opt bindFunctions exist + Mermaid->>DOM: bindFunctions(element) + end + deactivate Mermaid + + %% Parse Function Flow + User->>+Mermaid: mermaid.parse(text, parseOptions) + activate Queue + + Queue->>+API: mermaidAPI.parse(text, parseOptions) + + API->>DiagramAPI: addDiagrams() + API->>Preprocessor: processAndSetConfigs(text) + Preprocessor-->>API: { code, config } + API->>Diagram: getDiagramFromText(code) + Diagram-->>API: diagram instance + API-->>-Queue: { diagramType: diagram.type, config } + + Queue-->>-Mermaid: parse result + Mermaid-->>-User: ParseResult or false + + %% External Diagram Registration + User->>+Mermaid: registerExternalDiagrams(diagrams, options) + + Mermaid->>DiagramAPI: addDiagrams() + Mermaid->>DiagramAPI: registerLazyLoadedDiagrams(...diagrams) + + opt lazyLoad is false + Mermaid->>DiagramAPI: loadRegisteredDiagrams() + end + + Mermaid-->>-User: registration complete + + %% Error Handling + Note over Mermaid, API: Error Handling Throughout + alt Error occurs + API->>Mermaid: throw error + Mermaid->>+Mermaid: handleError(error, errors, parseError) + + Mermaid->>Mermaid: log.warn(error) + + alt isDetailedError + Mermaid->>User: parseError(error.str, error.hash) + else + Mermaid->>User: parseError(error) + end + + opt not suppressErrors + Mermaid->>User: throw error + end + + Mermaid-->>-User: error handled + end + + %% Configuration Details + Note over Config: Configuration Functions + Note right of Config: Functions:
- reset()
- getConfig()
- setConfig()
- getSiteConfig()
- updateSiteConfig()
- saveConfigFromInitialize() + + Note over Styles: CSS Generation + Note right of Styles: Features:
- createCssStyles()
- createUserStyles()
- cssImportantStyles()
- Theme integration
- Class definitions + + Note over API: Security Levels + Note right of API: Modes:
- sandbox: iframe isolation
- loose: minimal sanitization
- default: DOMPurify sanitization + + Note over API: Helper Functions + Note right of API: Utilities:
- cleanUpSvgCode()
- putIntoIFrame()
- appendDivSvgG()
- removeExistingElements() \ No newline at end of file diff --git a/packages/mermaid/src/docs/diagrams/mindmap-implementation-sequence.mmd b/packages/mermaid/src/docs/diagrams/mindmap-implementation-sequence.mmd new file mode 100644 index 000000000..335855380 --- /dev/null +++ b/packages/mermaid/src/docs/diagrams/mindmap-implementation-sequence.mmd @@ -0,0 +1,180 @@ +--- +references: + - "File: /packages/mermaid/src/diagrams/mindmap/mindmap-definition.ts" + - "File: /packages/mermaid/src/diagrams/mindmap/mindmapDb.ts" + - "File: /packages/mermaid/src/diagrams/mindmap/detector.ts" + - "File: /packages/mermaid/src/diagrams/mindmap/mindmapTypes.ts" + - "File: /packages/mermaid/src/diagrams/mindmap/mindmapRenderer.ts" + - "File: /packages/mermaid/src/diagrams/mindmap/styles.ts" + - "File: /packages/mermaid/src/diagrams/mindmap/svgDraw.ts" +generationTime: 2025-01-28T16:00:00.000Z +--- +sequenceDiagram + participant User as User Input Text + participant Detector as detector.ts + participant Loader as DiagramLoader + participant Definition as mindmap-definition.ts + participant Parser as parser/mindmap.jison + participant DB as MindmapDB + participant Renderer as mindmapRenderer.ts + participant Cytoscape as cytoscape.js + participant SVGDraw as svgDraw.ts + participant Styles as styles.ts + participant Output as Final SVG + + Note over User, Output: Mindmap Implementation Flow + + %% Detection Phase + User->>Detector: /^\s*mindmap/ text input + activate Detector + Detector->>Detector: detector(txt) validates pattern + Detector->>Loader: loader() function called + deactivate Detector + + activate Loader + Loader->>Definition: import mindmap-definition.js + deactivate Loader + + %% Core Structure Setup + activate Definition + Definition->>DB: get db() → new MindmapDB() + Definition->>Renderer: setup renderer + Definition->>Parser: setup parser + Definition->>Styles: setup styles + deactivate Definition + + %% Database Initialization + activate DB + Note over DB: MindmapDB Constructor + DB->>DB: initialize nodes array + DB->>DB: setup nodeType constants + DB->>DB: bind methods + DB->>DB: clear() state + + %% Parsing Phase + activate Parser + User->>Parser: mindmap syntax text + + loop For each node in hierarchy + Parser->>DB: addNode(level, id, descr, type) + activate DB + DB->>DB: sanitizeText(id, descr) + DB->>DB: getType(startStr, endStr) + Note right of DB: Shape Detection:
[ → RECT
( → ROUNDED_RECT
(( → CIRCLE
)) → BANG
{{ → HEXAGON + DB->>DB: getParent(level) + DB->>DB: create MindmapNode + DB->>DB: add to hierarchy + deactivate DB + end + + opt Icon/Class Decoration + Parser->>DB: decorateNode(decoration) + DB->>DB: set icon/class properties + end + deactivate Parser + + %% Data Preparation + Renderer->>DB: getData() for layout + activate DB + DB->>DB: collect all nodes + DB->>DB: build parent-child relationships + DB-->>Renderer: return node hierarchy + deactivate DB + + %% Rendering Pipeline + activate Renderer + Note over Renderer: Rendering Phase + + Renderer->>Cytoscape: initialize cytoscape + activate Cytoscape + + loop For each node in mindmap + Renderer->>Cytoscape: addNodes(mindmap, cy, conf, level) + Cytoscape->>Cytoscape: create node data + Cytoscape->>Cytoscape: set position (x, y) + end + + loop For parent-child relationships + Renderer->>Cytoscape: add edges + Cytoscape->>Cytoscape: create edge data + end + + Renderer->>Cytoscape: configure cose-bilkent layout + Cytoscape->>Cytoscape: calculate optimal positions + Cytoscape-->>Renderer: return positioned graph + deactivate Cytoscape + + %% SVG Generation + Renderer->>SVGDraw: drawNodes(db, svg, mindmap, section, conf) + activate SVGDraw + + loop For each node recursively + SVGDraw->>SVGDraw: select shape function + + alt Default Shape + SVGDraw->>SVGDraw: defaultBkg() - rounded rectangle + else Rectangle Shape + SVGDraw->>SVGDraw: rectBkg() - sharp corners + else Circle Shape + SVGDraw->>SVGDraw: circleBkg() - perfect circle + else Cloud Shape + SVGDraw->>SVGDraw: cloudBkg() - organic curves + else Bang Shape + SVGDraw->>SVGDraw: bangBkg() - explosion style + else Hexagon Shape + SVGDraw->>SVGDraw: hexagonBkg() - six sides + end + + SVGDraw->>SVGDraw: create SVG elements + SVGDraw->>SVGDraw: add text labels + SVGDraw->>SVGDraw: position node + + opt Node has children + SVGDraw->>SVGDraw: drawNodes() recursive call + end + end + deactivate SVGDraw + + %% Edge Rendering + Renderer->>Renderer: drawEdges(edgesEl, cy) + loop For each edge + Renderer->>Renderer: extract edge bounds + Renderer->>Renderer: draw SVG path + end + + %% Styling Application + Renderer->>Styles: getStyles(options) + activate Styles + + Styles->>Styles: genSections(options) + loop For THEME_COLOR_LIMIT sections + Styles->>Styles: generate color scale + Styles->>Styles: create CSS rules + Note right of Styles: .section-X fills
.edge-depth-X widths
.node-icon-X colors + end + + Styles->>Styles: apply theme integration + Styles-->>Renderer: return compiled CSS + deactivate Styles + + %% Final Assembly + Renderer->>Output: selectSvgElement() + Renderer->>Output: setupGraphViewbox() + Renderer->>Output: apply styles + Renderer->>Output: add interactive elements + deactivate Renderer + + activate Output + Note over Output: Final Mindmap Features + Output->>Output: responsive layout + Output->>Output: accessibility attributes + Output->>Output: hover effects + Output->>Output: click handling + Output-->>User: rendered mindmap + deactivate Output + + %% Configuration Details + Note over DB, Styles: Configuration Options + Note right of DB: Padding Calculations:
Base padding from config
RECT: ×2 padding
ROUNDED_RECT: ×2 padding
HEXAGON: ×2 padding + Note right of Styles: Section Management:
MAX_SECTIONS = 12
Dynamic color generation
Git theme integration + Note right of Renderer: Layout Parameters:
Cytoscape configuration
coseBilkent settings
Node spacing rules \ No newline at end of file From 00a79353fc8dfd2dbee3992e6deceb34c52bddb0 Mon Sep 17 00:00:00 2001 From: Prashant-7718 Date: Thu, 24 Jul 2025 12:40:39 +0530 Subject: [PATCH 2/9] changeset added --- .changeset/dirty-heads-travel.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/dirty-heads-travel.md diff --git a/.changeset/dirty-heads-travel.md b/.changeset/dirty-heads-travel.md new file mode 100644 index 000000000..2a96554e0 --- /dev/null +++ b/.changeset/dirty-heads-travel.md @@ -0,0 +1,5 @@ +--- +'mermaid': minor +--- + +chore: mermaid diagrams for flowchart mindmap and mermaidAPI From da8ce0b93eeef1ab3e3b7cd0dc61afeaf92e3e29 Mon Sep 17 00:00:00 2001 From: Prashant-7718 Date: Thu, 24 Jul 2025 12:49:08 +0530 Subject: [PATCH 3/9] chore: removed unwanted files --- .../src/docs/diagrams/flowchart-code-flow.mmd | 189 ----------- .../docs/diagrams/mermaid-api-sequence.mmd | 307 ------------------ .../mindmap-implementation-sequence.mmd | 180 ---------- 3 files changed, 676 deletions(-) delete mode 100644 packages/mermaid/src/docs/diagrams/flowchart-code-flow.mmd delete mode 100644 packages/mermaid/src/docs/diagrams/mermaid-api-sequence.mmd delete mode 100644 packages/mermaid/src/docs/diagrams/mindmap-implementation-sequence.mmd diff --git a/packages/mermaid/src/docs/diagrams/flowchart-code-flow.mmd b/packages/mermaid/src/docs/diagrams/flowchart-code-flow.mmd deleted file mode 100644 index d306dac7b..000000000 --- a/packages/mermaid/src/docs/diagrams/flowchart-code-flow.mmd +++ /dev/null @@ -1,189 +0,0 @@ ---- -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"] \ No newline at end of file diff --git a/packages/mermaid/src/docs/diagrams/mermaid-api-sequence.mmd b/packages/mermaid/src/docs/diagrams/mermaid-api-sequence.mmd deleted file mode 100644 index ce7597525..000000000 --- a/packages/mermaid/src/docs/diagrams/mermaid-api-sequence.mmd +++ /dev/null @@ -1,307 +0,0 @@ ---- -references: - - "File: /packages/mermaid/src/mermaidAPI.ts" - - "File: /packages/mermaid/src/mermaid.ts" -generationTime: 2025-01-28T16:30:00.000Z ---- -sequenceDiagram - participant User as User/Browser - participant Mermaid as mermaid.ts - participant Queue as executionQueue - participant API as mermaidAPI.ts - participant Config as configApi - participant Preprocessor as preprocessDiagram - participant DiagramAPI as diagram-api - participant Diagram as Diagram.fromText - participant Renderer as diagram.renderer - participant Styles as Styling System - participant DOM as DOM/SVG - - Note over User, DOM: Mermaid Complete API Flow - - %% Initialization Phase - User->>+Mermaid: mermaid.initialize(config) - Mermaid->>+API: mermaidAPI.initialize(config) - - API->>API: assignWithDepth({}, userOptions) - API->>API: handle legacy fontFamily config - API->>Config: saveConfigFromInitialize(options) - - alt Theme Configuration Available - API->>API: check if theme in theme object - API->>API: set themeVariables from theme - else Default Theme - API->>API: use default theme variables - end - - API->>Config: setSiteConfig(options) or getSiteConfig() - API->>API: setLogLevel(config.logLevel) - API->>DiagramAPI: addDiagrams() - - API-->>-Mermaid: initialization complete - Mermaid-->>-User: ready to render - - %% Content Loaded Event - User->>DOM: document.load event - DOM->>+Mermaid: contentLoaded() - - opt startOnLoad is true - Mermaid->>Config: getConfig() - Config-->>Mermaid: { startOnLoad: true } - Mermaid->>Mermaid: run() - end - - Mermaid-->>-DOM: event handling complete - - %% Main Run Function - User->>+Mermaid: mermaid.run(options) - - Mermaid->>Mermaid: runThrowsErrors(options) - Mermaid->>Config: getConfig() - Config-->>Mermaid: configuration object - - alt nodes provided - Mermaid->>Mermaid: use provided nodes - else querySelector provided - Mermaid->>DOM: document.querySelectorAll(querySelector) - DOM-->>Mermaid: nodesToProcess - end - - Mermaid->>Mermaid: new InitIDGenerator(deterministicIds, seed) - - loop For each diagram element - Mermaid->>DOM: check element.getAttribute('data-processed') - - opt not processed - Mermaid->>DOM: element.setAttribute('data-processed', 'true') - Mermaid->>Mermaid: generate unique id - Mermaid->>DOM: get element.innerHTML - Mermaid->>Mermaid: entityDecode and clean text - Mermaid->>Mermaid: detectInit(txt) - - Mermaid->>Queue: render(id, txt, element) - end - end - - Mermaid-->>-User: processing initiated - - %% Render Function (Queued) - activate Queue - Queue->>+API: mermaidAPI.render(id, text, container) - - API->>DiagramAPI: addDiagrams() - API->>+Preprocessor: processAndSetConfigs(text) - - Preprocessor->>Preprocessor: preprocessDiagram(text) - Preprocessor->>Config: reset() - Preprocessor->>Config: addDirective(processed.config) - Preprocessor-->>-API: { code, config } - - API->>Config: getConfig() - Config-->>API: current configuration - - opt text length > maxTextSize - API->>API: text = MAX_TEXTLENGTH_EXCEEDED_MSG - end - - API->>API: setup id selectors and element IDs - API->>API: determine security level (sandbox/loose) - - %% DOM Setup - alt svgContainingElement provided - alt isSandboxed - API->>DOM: sandboxedIframe(select(svgContainingElement), iFrameID) - API->>DOM: select iframe contentDocument body - else - API->>DOM: select(svgContainingElement) - end - else no container - API->>API: removeExistingElements(document, id, divId, iFrameId) - alt isSandboxed - API->>DOM: sandboxedIframe(select('body'), iFrameID) - else - API->>DOM: select('body') - end - end - - API->>DOM: appendDivSvgG(root, id, enclosingDivID, fontFamily, XMLNS_XLINK_STD) - - %% Diagram Creation - API->>+Diagram: Diagram.fromText(text, { title: processed.title }) - - Diagram->>DiagramAPI: detect diagram type - Diagram->>DiagramAPI: load appropriate diagram - Diagram-->>-API: diagram instance - - opt parsing error occurred - API->>+Diagram: Diagram.fromText('error') - Diagram-->>-API: error diagram - API->>API: store parseEncounteredException - end - - %% Style Generation - API->>DOM: get svg element and firstChild - API->>Renderer: diag.renderer.getClasses(text, diag) - Renderer-->>API: diagramClassDefs - - API->>+Styles: createUserStyles(config, diagramType, diagramClassDefs, idSelector) - - Styles->>Styles: createCssStyles(config, classDefs) - - opt config.themeCSS defined - Styles->>Styles: append themeCSS - end - - opt fontFamily configured - Styles->>Styles: add CSS variables for fonts - end - - opt classDefs exist - loop For each styleClassDef - opt has styles - Styles->>Styles: cssImportantStyles for each CSS element - end - opt has textStyles - Styles->>Styles: cssImportantStyles for tspan elements - end - end - end - - Styles->>Styles: getStyles(graphType, userCSSstyles, themeVariables) - Styles->>Styles: serialize(compile(svgId{allStyles}), stringify) - Styles-->>-API: compiled CSS rules - - API->>DOM: create style element - API->>DOM: style.innerHTML = rules - API->>DOM: svg.insertBefore(style, firstChild) - - %% Diagram Rendering - API->>+Renderer: diag.renderer.draw(text, id, version, diag) - - Renderer->>Renderer: diagram-specific rendering logic - Renderer->>DOM: create SVG elements - Renderer->>DOM: apply positioning and styling - Renderer-->>-API: rendered diagram - - opt rendering error - alt suppressErrorRendering - API->>API: removeTempElements() - API->>Mermaid: throw error - else - API->>Renderer: errorRenderer.draw(text, id, version) - end - end - - %% Accessibility and Cleanup - API->>DOM: select svg element - API->>Diagram: diag.db.getAccTitle() - API->>Diagram: diag.db.getAccDescription() - API->>API: addA11yInfo(diagramType, svgNode, a11yTitle, a11yDescr) - - API->>DOM: set xmlns for foreignobject elements - API->>DOM: get innerHTML from enclosing div - - API->>+API: cleanUpSvgCode(svgCode, isSandboxed, arrowMarkerAbsolute) - - opt not useArrowMarkerUrls and not sandboxed - API->>API: replace marker-end URLs with anchors - end - - API->>API: decodeEntities(svgCode) - API->>API: replace
with
- API-->>-API: cleaned SVG code - - alt isSandboxed - API->>+API: putIntoIFrame(svgCode, svgEl) - API->>API: calculate iframe height - API->>API: toBase64 encode SVG content - API->>API: create iframe with sandbox attributes - API-->>-API: iframe HTML - else not loose security - API->>API: DOMPurify.sanitize(svgCode, options) - end - - API->>API: attachFunctions() - API->>API: removeTempElements() - - opt parseEncounteredException - API->>Mermaid: throw parseEncounteredException - end - - API-->>-Queue: { diagramType, svg: svgCode, bindFunctions } - - %% Return to Web Integration - activate Mermaid - Queue-->>Mermaid: render result - Mermaid->>DOM: element.innerHTML = svg - - opt postRenderCallback - Mermaid->>User: postRenderCallback(id) - end - - opt bindFunctions exist - Mermaid->>DOM: bindFunctions(element) - end - deactivate Mermaid - - %% Parse Function Flow - User->>+Mermaid: mermaid.parse(text, parseOptions) - activate Queue - - Queue->>+API: mermaidAPI.parse(text, parseOptions) - - API->>DiagramAPI: addDiagrams() - API->>Preprocessor: processAndSetConfigs(text) - Preprocessor-->>API: { code, config } - API->>Diagram: getDiagramFromText(code) - Diagram-->>API: diagram instance - API-->>-Queue: { diagramType: diagram.type, config } - - Queue-->>-Mermaid: parse result - Mermaid-->>-User: ParseResult or false - - %% External Diagram Registration - User->>+Mermaid: registerExternalDiagrams(diagrams, options) - - Mermaid->>DiagramAPI: addDiagrams() - Mermaid->>DiagramAPI: registerLazyLoadedDiagrams(...diagrams) - - opt lazyLoad is false - Mermaid->>DiagramAPI: loadRegisteredDiagrams() - end - - Mermaid-->>-User: registration complete - - %% Error Handling - Note over Mermaid, API: Error Handling Throughout - alt Error occurs - API->>Mermaid: throw error - Mermaid->>+Mermaid: handleError(error, errors, parseError) - - Mermaid->>Mermaid: log.warn(error) - - alt isDetailedError - Mermaid->>User: parseError(error.str, error.hash) - else - Mermaid->>User: parseError(error) - end - - opt not suppressErrors - Mermaid->>User: throw error - end - - Mermaid-->>-User: error handled - end - - %% Configuration Details - Note over Config: Configuration Functions - Note right of Config: Functions:
- reset()
- getConfig()
- setConfig()
- getSiteConfig()
- updateSiteConfig()
- saveConfigFromInitialize() - - Note over Styles: CSS Generation - Note right of Styles: Features:
- createCssStyles()
- createUserStyles()
- cssImportantStyles()
- Theme integration
- Class definitions - - Note over API: Security Levels - Note right of API: Modes:
- sandbox: iframe isolation
- loose: minimal sanitization
- default: DOMPurify sanitization - - Note over API: Helper Functions - Note right of API: Utilities:
- cleanUpSvgCode()
- putIntoIFrame()
- appendDivSvgG()
- removeExistingElements() \ No newline at end of file diff --git a/packages/mermaid/src/docs/diagrams/mindmap-implementation-sequence.mmd b/packages/mermaid/src/docs/diagrams/mindmap-implementation-sequence.mmd deleted file mode 100644 index 335855380..000000000 --- a/packages/mermaid/src/docs/diagrams/mindmap-implementation-sequence.mmd +++ /dev/null @@ -1,180 +0,0 @@ ---- -references: - - "File: /packages/mermaid/src/diagrams/mindmap/mindmap-definition.ts" - - "File: /packages/mermaid/src/diagrams/mindmap/mindmapDb.ts" - - "File: /packages/mermaid/src/diagrams/mindmap/detector.ts" - - "File: /packages/mermaid/src/diagrams/mindmap/mindmapTypes.ts" - - "File: /packages/mermaid/src/diagrams/mindmap/mindmapRenderer.ts" - - "File: /packages/mermaid/src/diagrams/mindmap/styles.ts" - - "File: /packages/mermaid/src/diagrams/mindmap/svgDraw.ts" -generationTime: 2025-01-28T16:00:00.000Z ---- -sequenceDiagram - participant User as User Input Text - participant Detector as detector.ts - participant Loader as DiagramLoader - participant Definition as mindmap-definition.ts - participant Parser as parser/mindmap.jison - participant DB as MindmapDB - participant Renderer as mindmapRenderer.ts - participant Cytoscape as cytoscape.js - participant SVGDraw as svgDraw.ts - participant Styles as styles.ts - participant Output as Final SVG - - Note over User, Output: Mindmap Implementation Flow - - %% Detection Phase - User->>Detector: /^\s*mindmap/ text input - activate Detector - Detector->>Detector: detector(txt) validates pattern - Detector->>Loader: loader() function called - deactivate Detector - - activate Loader - Loader->>Definition: import mindmap-definition.js - deactivate Loader - - %% Core Structure Setup - activate Definition - Definition->>DB: get db() → new MindmapDB() - Definition->>Renderer: setup renderer - Definition->>Parser: setup parser - Definition->>Styles: setup styles - deactivate Definition - - %% Database Initialization - activate DB - Note over DB: MindmapDB Constructor - DB->>DB: initialize nodes array - DB->>DB: setup nodeType constants - DB->>DB: bind methods - DB->>DB: clear() state - - %% Parsing Phase - activate Parser - User->>Parser: mindmap syntax text - - loop For each node in hierarchy - Parser->>DB: addNode(level, id, descr, type) - activate DB - DB->>DB: sanitizeText(id, descr) - DB->>DB: getType(startStr, endStr) - Note right of DB: Shape Detection:
[ → RECT
( → ROUNDED_RECT
(( → CIRCLE
)) → BANG
{{ → HEXAGON - DB->>DB: getParent(level) - DB->>DB: create MindmapNode - DB->>DB: add to hierarchy - deactivate DB - end - - opt Icon/Class Decoration - Parser->>DB: decorateNode(decoration) - DB->>DB: set icon/class properties - end - deactivate Parser - - %% Data Preparation - Renderer->>DB: getData() for layout - activate DB - DB->>DB: collect all nodes - DB->>DB: build parent-child relationships - DB-->>Renderer: return node hierarchy - deactivate DB - - %% Rendering Pipeline - activate Renderer - Note over Renderer: Rendering Phase - - Renderer->>Cytoscape: initialize cytoscape - activate Cytoscape - - loop For each node in mindmap - Renderer->>Cytoscape: addNodes(mindmap, cy, conf, level) - Cytoscape->>Cytoscape: create node data - Cytoscape->>Cytoscape: set position (x, y) - end - - loop For parent-child relationships - Renderer->>Cytoscape: add edges - Cytoscape->>Cytoscape: create edge data - end - - Renderer->>Cytoscape: configure cose-bilkent layout - Cytoscape->>Cytoscape: calculate optimal positions - Cytoscape-->>Renderer: return positioned graph - deactivate Cytoscape - - %% SVG Generation - Renderer->>SVGDraw: drawNodes(db, svg, mindmap, section, conf) - activate SVGDraw - - loop For each node recursively - SVGDraw->>SVGDraw: select shape function - - alt Default Shape - SVGDraw->>SVGDraw: defaultBkg() - rounded rectangle - else Rectangle Shape - SVGDraw->>SVGDraw: rectBkg() - sharp corners - else Circle Shape - SVGDraw->>SVGDraw: circleBkg() - perfect circle - else Cloud Shape - SVGDraw->>SVGDraw: cloudBkg() - organic curves - else Bang Shape - SVGDraw->>SVGDraw: bangBkg() - explosion style - else Hexagon Shape - SVGDraw->>SVGDraw: hexagonBkg() - six sides - end - - SVGDraw->>SVGDraw: create SVG elements - SVGDraw->>SVGDraw: add text labels - SVGDraw->>SVGDraw: position node - - opt Node has children - SVGDraw->>SVGDraw: drawNodes() recursive call - end - end - deactivate SVGDraw - - %% Edge Rendering - Renderer->>Renderer: drawEdges(edgesEl, cy) - loop For each edge - Renderer->>Renderer: extract edge bounds - Renderer->>Renderer: draw SVG path - end - - %% Styling Application - Renderer->>Styles: getStyles(options) - activate Styles - - Styles->>Styles: genSections(options) - loop For THEME_COLOR_LIMIT sections - Styles->>Styles: generate color scale - Styles->>Styles: create CSS rules - Note right of Styles: .section-X fills
.edge-depth-X widths
.node-icon-X colors - end - - Styles->>Styles: apply theme integration - Styles-->>Renderer: return compiled CSS - deactivate Styles - - %% Final Assembly - Renderer->>Output: selectSvgElement() - Renderer->>Output: setupGraphViewbox() - Renderer->>Output: apply styles - Renderer->>Output: add interactive elements - deactivate Renderer - - activate Output - Note over Output: Final Mindmap Features - Output->>Output: responsive layout - Output->>Output: accessibility attributes - Output->>Output: hover effects - Output->>Output: click handling - Output-->>User: rendered mindmap - deactivate Output - - %% Configuration Details - Note over DB, Styles: Configuration Options - Note right of DB: Padding Calculations:
Base padding from config
RECT: ×2 padding
ROUNDED_RECT: ×2 padding
HEXAGON: ×2 padding - Note right of Styles: Section Management:
MAX_SECTIONS = 12
Dynamic color generation
Git theme integration - Note right of Renderer: Layout Parameters:
Cytoscape configuration
coseBilkent settings
Node spacing rules \ No newline at end of file From 1a80854242ece986f2b4c85a05a310eccc41570b Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Thu, 24 Jul 2025 07:30:35 +0000 Subject: [PATCH 4/9] [autofix.ci] apply automated fixes --- docs/diagrams/flowchart-code-flow.mmd | 189 ----------- docs/diagrams/mermaid-api-sequence.mmd | 307 ------------------ .../mindmap-implementation-sequence.mmd | 180 ---------- 3 files changed, 676 deletions(-) delete mode 100644 docs/diagrams/flowchart-code-flow.mmd delete mode 100644 docs/diagrams/mermaid-api-sequence.mmd delete mode 100644 docs/diagrams/mindmap-implementation-sequence.mmd diff --git a/docs/diagrams/flowchart-code-flow.mmd b/docs/diagrams/flowchart-code-flow.mmd deleted file mode 100644 index d306dac7b..000000000 --- a/docs/diagrams/flowchart-code-flow.mmd +++ /dev/null @@ -1,189 +0,0 @@ ---- -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"] \ No newline at end of file diff --git a/docs/diagrams/mermaid-api-sequence.mmd b/docs/diagrams/mermaid-api-sequence.mmd deleted file mode 100644 index ce7597525..000000000 --- a/docs/diagrams/mermaid-api-sequence.mmd +++ /dev/null @@ -1,307 +0,0 @@ ---- -references: - - "File: /packages/mermaid/src/mermaidAPI.ts" - - "File: /packages/mermaid/src/mermaid.ts" -generationTime: 2025-01-28T16:30:00.000Z ---- -sequenceDiagram - participant User as User/Browser - participant Mermaid as mermaid.ts - participant Queue as executionQueue - participant API as mermaidAPI.ts - participant Config as configApi - participant Preprocessor as preprocessDiagram - participant DiagramAPI as diagram-api - participant Diagram as Diagram.fromText - participant Renderer as diagram.renderer - participant Styles as Styling System - participant DOM as DOM/SVG - - Note over User, DOM: Mermaid Complete API Flow - - %% Initialization Phase - User->>+Mermaid: mermaid.initialize(config) - Mermaid->>+API: mermaidAPI.initialize(config) - - API->>API: assignWithDepth({}, userOptions) - API->>API: handle legacy fontFamily config - API->>Config: saveConfigFromInitialize(options) - - alt Theme Configuration Available - API->>API: check if theme in theme object - API->>API: set themeVariables from theme - else Default Theme - API->>API: use default theme variables - end - - API->>Config: setSiteConfig(options) or getSiteConfig() - API->>API: setLogLevel(config.logLevel) - API->>DiagramAPI: addDiagrams() - - API-->>-Mermaid: initialization complete - Mermaid-->>-User: ready to render - - %% Content Loaded Event - User->>DOM: document.load event - DOM->>+Mermaid: contentLoaded() - - opt startOnLoad is true - Mermaid->>Config: getConfig() - Config-->>Mermaid: { startOnLoad: true } - Mermaid->>Mermaid: run() - end - - Mermaid-->>-DOM: event handling complete - - %% Main Run Function - User->>+Mermaid: mermaid.run(options) - - Mermaid->>Mermaid: runThrowsErrors(options) - Mermaid->>Config: getConfig() - Config-->>Mermaid: configuration object - - alt nodes provided - Mermaid->>Mermaid: use provided nodes - else querySelector provided - Mermaid->>DOM: document.querySelectorAll(querySelector) - DOM-->>Mermaid: nodesToProcess - end - - Mermaid->>Mermaid: new InitIDGenerator(deterministicIds, seed) - - loop For each diagram element - Mermaid->>DOM: check element.getAttribute('data-processed') - - opt not processed - Mermaid->>DOM: element.setAttribute('data-processed', 'true') - Mermaid->>Mermaid: generate unique id - Mermaid->>DOM: get element.innerHTML - Mermaid->>Mermaid: entityDecode and clean text - Mermaid->>Mermaid: detectInit(txt) - - Mermaid->>Queue: render(id, txt, element) - end - end - - Mermaid-->>-User: processing initiated - - %% Render Function (Queued) - activate Queue - Queue->>+API: mermaidAPI.render(id, text, container) - - API->>DiagramAPI: addDiagrams() - API->>+Preprocessor: processAndSetConfigs(text) - - Preprocessor->>Preprocessor: preprocessDiagram(text) - Preprocessor->>Config: reset() - Preprocessor->>Config: addDirective(processed.config) - Preprocessor-->>-API: { code, config } - - API->>Config: getConfig() - Config-->>API: current configuration - - opt text length > maxTextSize - API->>API: text = MAX_TEXTLENGTH_EXCEEDED_MSG - end - - API->>API: setup id selectors and element IDs - API->>API: determine security level (sandbox/loose) - - %% DOM Setup - alt svgContainingElement provided - alt isSandboxed - API->>DOM: sandboxedIframe(select(svgContainingElement), iFrameID) - API->>DOM: select iframe contentDocument body - else - API->>DOM: select(svgContainingElement) - end - else no container - API->>API: removeExistingElements(document, id, divId, iFrameId) - alt isSandboxed - API->>DOM: sandboxedIframe(select('body'), iFrameID) - else - API->>DOM: select('body') - end - end - - API->>DOM: appendDivSvgG(root, id, enclosingDivID, fontFamily, XMLNS_XLINK_STD) - - %% Diagram Creation - API->>+Diagram: Diagram.fromText(text, { title: processed.title }) - - Diagram->>DiagramAPI: detect diagram type - Diagram->>DiagramAPI: load appropriate diagram - Diagram-->>-API: diagram instance - - opt parsing error occurred - API->>+Diagram: Diagram.fromText('error') - Diagram-->>-API: error diagram - API->>API: store parseEncounteredException - end - - %% Style Generation - API->>DOM: get svg element and firstChild - API->>Renderer: diag.renderer.getClasses(text, diag) - Renderer-->>API: diagramClassDefs - - API->>+Styles: createUserStyles(config, diagramType, diagramClassDefs, idSelector) - - Styles->>Styles: createCssStyles(config, classDefs) - - opt config.themeCSS defined - Styles->>Styles: append themeCSS - end - - opt fontFamily configured - Styles->>Styles: add CSS variables for fonts - end - - opt classDefs exist - loop For each styleClassDef - opt has styles - Styles->>Styles: cssImportantStyles for each CSS element - end - opt has textStyles - Styles->>Styles: cssImportantStyles for tspan elements - end - end - end - - Styles->>Styles: getStyles(graphType, userCSSstyles, themeVariables) - Styles->>Styles: serialize(compile(svgId{allStyles}), stringify) - Styles-->>-API: compiled CSS rules - - API->>DOM: create style element - API->>DOM: style.innerHTML = rules - API->>DOM: svg.insertBefore(style, firstChild) - - %% Diagram Rendering - API->>+Renderer: diag.renderer.draw(text, id, version, diag) - - Renderer->>Renderer: diagram-specific rendering logic - Renderer->>DOM: create SVG elements - Renderer->>DOM: apply positioning and styling - Renderer-->>-API: rendered diagram - - opt rendering error - alt suppressErrorRendering - API->>API: removeTempElements() - API->>Mermaid: throw error - else - API->>Renderer: errorRenderer.draw(text, id, version) - end - end - - %% Accessibility and Cleanup - API->>DOM: select svg element - API->>Diagram: diag.db.getAccTitle() - API->>Diagram: diag.db.getAccDescription() - API->>API: addA11yInfo(diagramType, svgNode, a11yTitle, a11yDescr) - - API->>DOM: set xmlns for foreignobject elements - API->>DOM: get innerHTML from enclosing div - - API->>+API: cleanUpSvgCode(svgCode, isSandboxed, arrowMarkerAbsolute) - - opt not useArrowMarkerUrls and not sandboxed - API->>API: replace marker-end URLs with anchors - end - - API->>API: decodeEntities(svgCode) - API->>API: replace
with
- API-->>-API: cleaned SVG code - - alt isSandboxed - API->>+API: putIntoIFrame(svgCode, svgEl) - API->>API: calculate iframe height - API->>API: toBase64 encode SVG content - API->>API: create iframe with sandbox attributes - API-->>-API: iframe HTML - else not loose security - API->>API: DOMPurify.sanitize(svgCode, options) - end - - API->>API: attachFunctions() - API->>API: removeTempElements() - - opt parseEncounteredException - API->>Mermaid: throw parseEncounteredException - end - - API-->>-Queue: { diagramType, svg: svgCode, bindFunctions } - - %% Return to Web Integration - activate Mermaid - Queue-->>Mermaid: render result - Mermaid->>DOM: element.innerHTML = svg - - opt postRenderCallback - Mermaid->>User: postRenderCallback(id) - end - - opt bindFunctions exist - Mermaid->>DOM: bindFunctions(element) - end - deactivate Mermaid - - %% Parse Function Flow - User->>+Mermaid: mermaid.parse(text, parseOptions) - activate Queue - - Queue->>+API: mermaidAPI.parse(text, parseOptions) - - API->>DiagramAPI: addDiagrams() - API->>Preprocessor: processAndSetConfigs(text) - Preprocessor-->>API: { code, config } - API->>Diagram: getDiagramFromText(code) - Diagram-->>API: diagram instance - API-->>-Queue: { diagramType: diagram.type, config } - - Queue-->>-Mermaid: parse result - Mermaid-->>-User: ParseResult or false - - %% External Diagram Registration - User->>+Mermaid: registerExternalDiagrams(diagrams, options) - - Mermaid->>DiagramAPI: addDiagrams() - Mermaid->>DiagramAPI: registerLazyLoadedDiagrams(...diagrams) - - opt lazyLoad is false - Mermaid->>DiagramAPI: loadRegisteredDiagrams() - end - - Mermaid-->>-User: registration complete - - %% Error Handling - Note over Mermaid, API: Error Handling Throughout - alt Error occurs - API->>Mermaid: throw error - Mermaid->>+Mermaid: handleError(error, errors, parseError) - - Mermaid->>Mermaid: log.warn(error) - - alt isDetailedError - Mermaid->>User: parseError(error.str, error.hash) - else - Mermaid->>User: parseError(error) - end - - opt not suppressErrors - Mermaid->>User: throw error - end - - Mermaid-->>-User: error handled - end - - %% Configuration Details - Note over Config: Configuration Functions - Note right of Config: Functions:
- reset()
- getConfig()
- setConfig()
- getSiteConfig()
- updateSiteConfig()
- saveConfigFromInitialize() - - Note over Styles: CSS Generation - Note right of Styles: Features:
- createCssStyles()
- createUserStyles()
- cssImportantStyles()
- Theme integration
- Class definitions - - Note over API: Security Levels - Note right of API: Modes:
- sandbox: iframe isolation
- loose: minimal sanitization
- default: DOMPurify sanitization - - Note over API: Helper Functions - Note right of API: Utilities:
- cleanUpSvgCode()
- putIntoIFrame()
- appendDivSvgG()
- removeExistingElements() \ No newline at end of file diff --git a/docs/diagrams/mindmap-implementation-sequence.mmd b/docs/diagrams/mindmap-implementation-sequence.mmd deleted file mode 100644 index 335855380..000000000 --- a/docs/diagrams/mindmap-implementation-sequence.mmd +++ /dev/null @@ -1,180 +0,0 @@ ---- -references: - - "File: /packages/mermaid/src/diagrams/mindmap/mindmap-definition.ts" - - "File: /packages/mermaid/src/diagrams/mindmap/mindmapDb.ts" - - "File: /packages/mermaid/src/diagrams/mindmap/detector.ts" - - "File: /packages/mermaid/src/diagrams/mindmap/mindmapTypes.ts" - - "File: /packages/mermaid/src/diagrams/mindmap/mindmapRenderer.ts" - - "File: /packages/mermaid/src/diagrams/mindmap/styles.ts" - - "File: /packages/mermaid/src/diagrams/mindmap/svgDraw.ts" -generationTime: 2025-01-28T16:00:00.000Z ---- -sequenceDiagram - participant User as User Input Text - participant Detector as detector.ts - participant Loader as DiagramLoader - participant Definition as mindmap-definition.ts - participant Parser as parser/mindmap.jison - participant DB as MindmapDB - participant Renderer as mindmapRenderer.ts - participant Cytoscape as cytoscape.js - participant SVGDraw as svgDraw.ts - participant Styles as styles.ts - participant Output as Final SVG - - Note over User, Output: Mindmap Implementation Flow - - %% Detection Phase - User->>Detector: /^\s*mindmap/ text input - activate Detector - Detector->>Detector: detector(txt) validates pattern - Detector->>Loader: loader() function called - deactivate Detector - - activate Loader - Loader->>Definition: import mindmap-definition.js - deactivate Loader - - %% Core Structure Setup - activate Definition - Definition->>DB: get db() → new MindmapDB() - Definition->>Renderer: setup renderer - Definition->>Parser: setup parser - Definition->>Styles: setup styles - deactivate Definition - - %% Database Initialization - activate DB - Note over DB: MindmapDB Constructor - DB->>DB: initialize nodes array - DB->>DB: setup nodeType constants - DB->>DB: bind methods - DB->>DB: clear() state - - %% Parsing Phase - activate Parser - User->>Parser: mindmap syntax text - - loop For each node in hierarchy - Parser->>DB: addNode(level, id, descr, type) - activate DB - DB->>DB: sanitizeText(id, descr) - DB->>DB: getType(startStr, endStr) - Note right of DB: Shape Detection:
[ → RECT
( → ROUNDED_RECT
(( → CIRCLE
)) → BANG
{{ → HEXAGON - DB->>DB: getParent(level) - DB->>DB: create MindmapNode - DB->>DB: add to hierarchy - deactivate DB - end - - opt Icon/Class Decoration - Parser->>DB: decorateNode(decoration) - DB->>DB: set icon/class properties - end - deactivate Parser - - %% Data Preparation - Renderer->>DB: getData() for layout - activate DB - DB->>DB: collect all nodes - DB->>DB: build parent-child relationships - DB-->>Renderer: return node hierarchy - deactivate DB - - %% Rendering Pipeline - activate Renderer - Note over Renderer: Rendering Phase - - Renderer->>Cytoscape: initialize cytoscape - activate Cytoscape - - loop For each node in mindmap - Renderer->>Cytoscape: addNodes(mindmap, cy, conf, level) - Cytoscape->>Cytoscape: create node data - Cytoscape->>Cytoscape: set position (x, y) - end - - loop For parent-child relationships - Renderer->>Cytoscape: add edges - Cytoscape->>Cytoscape: create edge data - end - - Renderer->>Cytoscape: configure cose-bilkent layout - Cytoscape->>Cytoscape: calculate optimal positions - Cytoscape-->>Renderer: return positioned graph - deactivate Cytoscape - - %% SVG Generation - Renderer->>SVGDraw: drawNodes(db, svg, mindmap, section, conf) - activate SVGDraw - - loop For each node recursively - SVGDraw->>SVGDraw: select shape function - - alt Default Shape - SVGDraw->>SVGDraw: defaultBkg() - rounded rectangle - else Rectangle Shape - SVGDraw->>SVGDraw: rectBkg() - sharp corners - else Circle Shape - SVGDraw->>SVGDraw: circleBkg() - perfect circle - else Cloud Shape - SVGDraw->>SVGDraw: cloudBkg() - organic curves - else Bang Shape - SVGDraw->>SVGDraw: bangBkg() - explosion style - else Hexagon Shape - SVGDraw->>SVGDraw: hexagonBkg() - six sides - end - - SVGDraw->>SVGDraw: create SVG elements - SVGDraw->>SVGDraw: add text labels - SVGDraw->>SVGDraw: position node - - opt Node has children - SVGDraw->>SVGDraw: drawNodes() recursive call - end - end - deactivate SVGDraw - - %% Edge Rendering - Renderer->>Renderer: drawEdges(edgesEl, cy) - loop For each edge - Renderer->>Renderer: extract edge bounds - Renderer->>Renderer: draw SVG path - end - - %% Styling Application - Renderer->>Styles: getStyles(options) - activate Styles - - Styles->>Styles: genSections(options) - loop For THEME_COLOR_LIMIT sections - Styles->>Styles: generate color scale - Styles->>Styles: create CSS rules - Note right of Styles: .section-X fills
.edge-depth-X widths
.node-icon-X colors - end - - Styles->>Styles: apply theme integration - Styles-->>Renderer: return compiled CSS - deactivate Styles - - %% Final Assembly - Renderer->>Output: selectSvgElement() - Renderer->>Output: setupGraphViewbox() - Renderer->>Output: apply styles - Renderer->>Output: add interactive elements - deactivate Renderer - - activate Output - Note over Output: Final Mindmap Features - Output->>Output: responsive layout - Output->>Output: accessibility attributes - Output->>Output: hover effects - Output->>Output: click handling - Output-->>User: rendered mindmap - deactivate Output - - %% Configuration Details - Note over DB, Styles: Configuration Options - Note right of DB: Padding Calculations:
Base padding from config
RECT: ×2 padding
ROUNDED_RECT: ×2 padding
HEXAGON: ×2 padding - Note right of Styles: Section Management:
MAX_SECTIONS = 12
Dynamic color generation
Git theme integration - Note right of Renderer: Layout Parameters:
Cytoscape configuration
coseBilkent settings
Node spacing rules \ No newline at end of file From 10752f13570f018be2e47fe42c1078431206c896 Mon Sep 17 00:00:00 2001 From: Prashant-7718 Date: Thu, 24 Jul 2025 14:03:50 +0530 Subject: [PATCH 5/9] added mermaid files --- docs/diagrams/flowchart-code-flow.mmd | 189 +++++++++++ docs/diagrams/mermaid-api-sequence.mmd | 307 ++++++++++++++++++ .../mindmap-implementation-sequence.mmd | 180 ++++++++++ 3 files changed, 676 insertions(+) create mode 100644 docs/diagrams/flowchart-code-flow.mmd create mode 100644 docs/diagrams/mermaid-api-sequence.mmd create mode 100644 docs/diagrams/mindmap-implementation-sequence.mmd diff --git a/docs/diagrams/flowchart-code-flow.mmd b/docs/diagrams/flowchart-code-flow.mmd new file mode 100644 index 000000000..d306dac7b --- /dev/null +++ b/docs/diagrams/flowchart-code-flow.mmd @@ -0,0 +1,189 @@ +--- +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"] \ No newline at end of file diff --git a/docs/diagrams/mermaid-api-sequence.mmd b/docs/diagrams/mermaid-api-sequence.mmd new file mode 100644 index 000000000..ce7597525 --- /dev/null +++ b/docs/diagrams/mermaid-api-sequence.mmd @@ -0,0 +1,307 @@ +--- +references: + - "File: /packages/mermaid/src/mermaidAPI.ts" + - "File: /packages/mermaid/src/mermaid.ts" +generationTime: 2025-01-28T16:30:00.000Z +--- +sequenceDiagram + participant User as User/Browser + participant Mermaid as mermaid.ts + participant Queue as executionQueue + participant API as mermaidAPI.ts + participant Config as configApi + participant Preprocessor as preprocessDiagram + participant DiagramAPI as diagram-api + participant Diagram as Diagram.fromText + participant Renderer as diagram.renderer + participant Styles as Styling System + participant DOM as DOM/SVG + + Note over User, DOM: Mermaid Complete API Flow + + %% Initialization Phase + User->>+Mermaid: mermaid.initialize(config) + Mermaid->>+API: mermaidAPI.initialize(config) + + API->>API: assignWithDepth({}, userOptions) + API->>API: handle legacy fontFamily config + API->>Config: saveConfigFromInitialize(options) + + alt Theme Configuration Available + API->>API: check if theme in theme object + API->>API: set themeVariables from theme + else Default Theme + API->>API: use default theme variables + end + + API->>Config: setSiteConfig(options) or getSiteConfig() + API->>API: setLogLevel(config.logLevel) + API->>DiagramAPI: addDiagrams() + + API-->>-Mermaid: initialization complete + Mermaid-->>-User: ready to render + + %% Content Loaded Event + User->>DOM: document.load event + DOM->>+Mermaid: contentLoaded() + + opt startOnLoad is true + Mermaid->>Config: getConfig() + Config-->>Mermaid: { startOnLoad: true } + Mermaid->>Mermaid: run() + end + + Mermaid-->>-DOM: event handling complete + + %% Main Run Function + User->>+Mermaid: mermaid.run(options) + + Mermaid->>Mermaid: runThrowsErrors(options) + Mermaid->>Config: getConfig() + Config-->>Mermaid: configuration object + + alt nodes provided + Mermaid->>Mermaid: use provided nodes + else querySelector provided + Mermaid->>DOM: document.querySelectorAll(querySelector) + DOM-->>Mermaid: nodesToProcess + end + + Mermaid->>Mermaid: new InitIDGenerator(deterministicIds, seed) + + loop For each diagram element + Mermaid->>DOM: check element.getAttribute('data-processed') + + opt not processed + Mermaid->>DOM: element.setAttribute('data-processed', 'true') + Mermaid->>Mermaid: generate unique id + Mermaid->>DOM: get element.innerHTML + Mermaid->>Mermaid: entityDecode and clean text + Mermaid->>Mermaid: detectInit(txt) + + Mermaid->>Queue: render(id, txt, element) + end + end + + Mermaid-->>-User: processing initiated + + %% Render Function (Queued) + activate Queue + Queue->>+API: mermaidAPI.render(id, text, container) + + API->>DiagramAPI: addDiagrams() + API->>+Preprocessor: processAndSetConfigs(text) + + Preprocessor->>Preprocessor: preprocessDiagram(text) + Preprocessor->>Config: reset() + Preprocessor->>Config: addDirective(processed.config) + Preprocessor-->>-API: { code, config } + + API->>Config: getConfig() + Config-->>API: current configuration + + opt text length > maxTextSize + API->>API: text = MAX_TEXTLENGTH_EXCEEDED_MSG + end + + API->>API: setup id selectors and element IDs + API->>API: determine security level (sandbox/loose) + + %% DOM Setup + alt svgContainingElement provided + alt isSandboxed + API->>DOM: sandboxedIframe(select(svgContainingElement), iFrameID) + API->>DOM: select iframe contentDocument body + else + API->>DOM: select(svgContainingElement) + end + else no container + API->>API: removeExistingElements(document, id, divId, iFrameId) + alt isSandboxed + API->>DOM: sandboxedIframe(select('body'), iFrameID) + else + API->>DOM: select('body') + end + end + + API->>DOM: appendDivSvgG(root, id, enclosingDivID, fontFamily, XMLNS_XLINK_STD) + + %% Diagram Creation + API->>+Diagram: Diagram.fromText(text, { title: processed.title }) + + Diagram->>DiagramAPI: detect diagram type + Diagram->>DiagramAPI: load appropriate diagram + Diagram-->>-API: diagram instance + + opt parsing error occurred + API->>+Diagram: Diagram.fromText('error') + Diagram-->>-API: error diagram + API->>API: store parseEncounteredException + end + + %% Style Generation + API->>DOM: get svg element and firstChild + API->>Renderer: diag.renderer.getClasses(text, diag) + Renderer-->>API: diagramClassDefs + + API->>+Styles: createUserStyles(config, diagramType, diagramClassDefs, idSelector) + + Styles->>Styles: createCssStyles(config, classDefs) + + opt config.themeCSS defined + Styles->>Styles: append themeCSS + end + + opt fontFamily configured + Styles->>Styles: add CSS variables for fonts + end + + opt classDefs exist + loop For each styleClassDef + opt has styles + Styles->>Styles: cssImportantStyles for each CSS element + end + opt has textStyles + Styles->>Styles: cssImportantStyles for tspan elements + end + end + end + + Styles->>Styles: getStyles(graphType, userCSSstyles, themeVariables) + Styles->>Styles: serialize(compile(svgId{allStyles}), stringify) + Styles-->>-API: compiled CSS rules + + API->>DOM: create style element + API->>DOM: style.innerHTML = rules + API->>DOM: svg.insertBefore(style, firstChild) + + %% Diagram Rendering + API->>+Renderer: diag.renderer.draw(text, id, version, diag) + + Renderer->>Renderer: diagram-specific rendering logic + Renderer->>DOM: create SVG elements + Renderer->>DOM: apply positioning and styling + Renderer-->>-API: rendered diagram + + opt rendering error + alt suppressErrorRendering + API->>API: removeTempElements() + API->>Mermaid: throw error + else + API->>Renderer: errorRenderer.draw(text, id, version) + end + end + + %% Accessibility and Cleanup + API->>DOM: select svg element + API->>Diagram: diag.db.getAccTitle() + API->>Diagram: diag.db.getAccDescription() + API->>API: addA11yInfo(diagramType, svgNode, a11yTitle, a11yDescr) + + API->>DOM: set xmlns for foreignobject elements + API->>DOM: get innerHTML from enclosing div + + API->>+API: cleanUpSvgCode(svgCode, isSandboxed, arrowMarkerAbsolute) + + opt not useArrowMarkerUrls and not sandboxed + API->>API: replace marker-end URLs with anchors + end + + API->>API: decodeEntities(svgCode) + API->>API: replace
with
+ API-->>-API: cleaned SVG code + + alt isSandboxed + API->>+API: putIntoIFrame(svgCode, svgEl) + API->>API: calculate iframe height + API->>API: toBase64 encode SVG content + API->>API: create iframe with sandbox attributes + API-->>-API: iframe HTML + else not loose security + API->>API: DOMPurify.sanitize(svgCode, options) + end + + API->>API: attachFunctions() + API->>API: removeTempElements() + + opt parseEncounteredException + API->>Mermaid: throw parseEncounteredException + end + + API-->>-Queue: { diagramType, svg: svgCode, bindFunctions } + + %% Return to Web Integration + activate Mermaid + Queue-->>Mermaid: render result + Mermaid->>DOM: element.innerHTML = svg + + opt postRenderCallback + Mermaid->>User: postRenderCallback(id) + end + + opt bindFunctions exist + Mermaid->>DOM: bindFunctions(element) + end + deactivate Mermaid + + %% Parse Function Flow + User->>+Mermaid: mermaid.parse(text, parseOptions) + activate Queue + + Queue->>+API: mermaidAPI.parse(text, parseOptions) + + API->>DiagramAPI: addDiagrams() + API->>Preprocessor: processAndSetConfigs(text) + Preprocessor-->>API: { code, config } + API->>Diagram: getDiagramFromText(code) + Diagram-->>API: diagram instance + API-->>-Queue: { diagramType: diagram.type, config } + + Queue-->>-Mermaid: parse result + Mermaid-->>-User: ParseResult or false + + %% External Diagram Registration + User->>+Mermaid: registerExternalDiagrams(diagrams, options) + + Mermaid->>DiagramAPI: addDiagrams() + Mermaid->>DiagramAPI: registerLazyLoadedDiagrams(...diagrams) + + opt lazyLoad is false + Mermaid->>DiagramAPI: loadRegisteredDiagrams() + end + + Mermaid-->>-User: registration complete + + %% Error Handling + Note over Mermaid, API: Error Handling Throughout + alt Error occurs + API->>Mermaid: throw error + Mermaid->>+Mermaid: handleError(error, errors, parseError) + + Mermaid->>Mermaid: log.warn(error) + + alt isDetailedError + Mermaid->>User: parseError(error.str, error.hash) + else + Mermaid->>User: parseError(error) + end + + opt not suppressErrors + Mermaid->>User: throw error + end + + Mermaid-->>-User: error handled + end + + %% Configuration Details + Note over Config: Configuration Functions + Note right of Config: Functions:
- reset()
- getConfig()
- setConfig()
- getSiteConfig()
- updateSiteConfig()
- saveConfigFromInitialize() + + Note over Styles: CSS Generation + Note right of Styles: Features:
- createCssStyles()
- createUserStyles()
- cssImportantStyles()
- Theme integration
- Class definitions + + Note over API: Security Levels + Note right of API: Modes:
- sandbox: iframe isolation
- loose: minimal sanitization
- default: DOMPurify sanitization + + Note over API: Helper Functions + Note right of API: Utilities:
- cleanUpSvgCode()
- putIntoIFrame()
- appendDivSvgG()
- removeExistingElements() \ No newline at end of file diff --git a/docs/diagrams/mindmap-implementation-sequence.mmd b/docs/diagrams/mindmap-implementation-sequence.mmd new file mode 100644 index 000000000..335855380 --- /dev/null +++ b/docs/diagrams/mindmap-implementation-sequence.mmd @@ -0,0 +1,180 @@ +--- +references: + - "File: /packages/mermaid/src/diagrams/mindmap/mindmap-definition.ts" + - "File: /packages/mermaid/src/diagrams/mindmap/mindmapDb.ts" + - "File: /packages/mermaid/src/diagrams/mindmap/detector.ts" + - "File: /packages/mermaid/src/diagrams/mindmap/mindmapTypes.ts" + - "File: /packages/mermaid/src/diagrams/mindmap/mindmapRenderer.ts" + - "File: /packages/mermaid/src/diagrams/mindmap/styles.ts" + - "File: /packages/mermaid/src/diagrams/mindmap/svgDraw.ts" +generationTime: 2025-01-28T16:00:00.000Z +--- +sequenceDiagram + participant User as User Input Text + participant Detector as detector.ts + participant Loader as DiagramLoader + participant Definition as mindmap-definition.ts + participant Parser as parser/mindmap.jison + participant DB as MindmapDB + participant Renderer as mindmapRenderer.ts + participant Cytoscape as cytoscape.js + participant SVGDraw as svgDraw.ts + participant Styles as styles.ts + participant Output as Final SVG + + Note over User, Output: Mindmap Implementation Flow + + %% Detection Phase + User->>Detector: /^\s*mindmap/ text input + activate Detector + Detector->>Detector: detector(txt) validates pattern + Detector->>Loader: loader() function called + deactivate Detector + + activate Loader + Loader->>Definition: import mindmap-definition.js + deactivate Loader + + %% Core Structure Setup + activate Definition + Definition->>DB: get db() → new MindmapDB() + Definition->>Renderer: setup renderer + Definition->>Parser: setup parser + Definition->>Styles: setup styles + deactivate Definition + + %% Database Initialization + activate DB + Note over DB: MindmapDB Constructor + DB->>DB: initialize nodes array + DB->>DB: setup nodeType constants + DB->>DB: bind methods + DB->>DB: clear() state + + %% Parsing Phase + activate Parser + User->>Parser: mindmap syntax text + + loop For each node in hierarchy + Parser->>DB: addNode(level, id, descr, type) + activate DB + DB->>DB: sanitizeText(id, descr) + DB->>DB: getType(startStr, endStr) + Note right of DB: Shape Detection:
[ → RECT
( → ROUNDED_RECT
(( → CIRCLE
)) → BANG
{{ → HEXAGON + DB->>DB: getParent(level) + DB->>DB: create MindmapNode + DB->>DB: add to hierarchy + deactivate DB + end + + opt Icon/Class Decoration + Parser->>DB: decorateNode(decoration) + DB->>DB: set icon/class properties + end + deactivate Parser + + %% Data Preparation + Renderer->>DB: getData() for layout + activate DB + DB->>DB: collect all nodes + DB->>DB: build parent-child relationships + DB-->>Renderer: return node hierarchy + deactivate DB + + %% Rendering Pipeline + activate Renderer + Note over Renderer: Rendering Phase + + Renderer->>Cytoscape: initialize cytoscape + activate Cytoscape + + loop For each node in mindmap + Renderer->>Cytoscape: addNodes(mindmap, cy, conf, level) + Cytoscape->>Cytoscape: create node data + Cytoscape->>Cytoscape: set position (x, y) + end + + loop For parent-child relationships + Renderer->>Cytoscape: add edges + Cytoscape->>Cytoscape: create edge data + end + + Renderer->>Cytoscape: configure cose-bilkent layout + Cytoscape->>Cytoscape: calculate optimal positions + Cytoscape-->>Renderer: return positioned graph + deactivate Cytoscape + + %% SVG Generation + Renderer->>SVGDraw: drawNodes(db, svg, mindmap, section, conf) + activate SVGDraw + + loop For each node recursively + SVGDraw->>SVGDraw: select shape function + + alt Default Shape + SVGDraw->>SVGDraw: defaultBkg() - rounded rectangle + else Rectangle Shape + SVGDraw->>SVGDraw: rectBkg() - sharp corners + else Circle Shape + SVGDraw->>SVGDraw: circleBkg() - perfect circle + else Cloud Shape + SVGDraw->>SVGDraw: cloudBkg() - organic curves + else Bang Shape + SVGDraw->>SVGDraw: bangBkg() - explosion style + else Hexagon Shape + SVGDraw->>SVGDraw: hexagonBkg() - six sides + end + + SVGDraw->>SVGDraw: create SVG elements + SVGDraw->>SVGDraw: add text labels + SVGDraw->>SVGDraw: position node + + opt Node has children + SVGDraw->>SVGDraw: drawNodes() recursive call + end + end + deactivate SVGDraw + + %% Edge Rendering + Renderer->>Renderer: drawEdges(edgesEl, cy) + loop For each edge + Renderer->>Renderer: extract edge bounds + Renderer->>Renderer: draw SVG path + end + + %% Styling Application + Renderer->>Styles: getStyles(options) + activate Styles + + Styles->>Styles: genSections(options) + loop For THEME_COLOR_LIMIT sections + Styles->>Styles: generate color scale + Styles->>Styles: create CSS rules + Note right of Styles: .section-X fills
.edge-depth-X widths
.node-icon-X colors + end + + Styles->>Styles: apply theme integration + Styles-->>Renderer: return compiled CSS + deactivate Styles + + %% Final Assembly + Renderer->>Output: selectSvgElement() + Renderer->>Output: setupGraphViewbox() + Renderer->>Output: apply styles + Renderer->>Output: add interactive elements + deactivate Renderer + + activate Output + Note over Output: Final Mindmap Features + Output->>Output: responsive layout + Output->>Output: accessibility attributes + Output->>Output: hover effects + Output->>Output: click handling + Output-->>User: rendered mindmap + deactivate Output + + %% Configuration Details + Note over DB, Styles: Configuration Options + Note right of DB: Padding Calculations:
Base padding from config
RECT: ×2 padding
ROUNDED_RECT: ×2 padding
HEXAGON: ×2 padding + Note right of Styles: Section Management:
MAX_SECTIONS = 12
Dynamic color generation
Git theme integration + Note right of Renderer: Layout Parameters:
Cytoscape configuration
coseBilkent settings
Node spacing rules \ No newline at end of file From 9c92da487f558923f474a644234fa69e64dbc70e Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Thu, 24 Jul 2025 08:39:03 +0000 Subject: [PATCH 6/9] [autofix.ci] apply automated fixes --- docs/diagrams/flowchart-code-flow.mmd | 189 ----------- docs/diagrams/mermaid-api-sequence.mmd | 307 ------------------ .../mindmap-implementation-sequence.mmd | 180 ---------- 3 files changed, 676 deletions(-) delete mode 100644 docs/diagrams/flowchart-code-flow.mmd delete mode 100644 docs/diagrams/mermaid-api-sequence.mmd delete mode 100644 docs/diagrams/mindmap-implementation-sequence.mmd diff --git a/docs/diagrams/flowchart-code-flow.mmd b/docs/diagrams/flowchart-code-flow.mmd deleted file mode 100644 index d306dac7b..000000000 --- a/docs/diagrams/flowchart-code-flow.mmd +++ /dev/null @@ -1,189 +0,0 @@ ---- -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"] \ No newline at end of file diff --git a/docs/diagrams/mermaid-api-sequence.mmd b/docs/diagrams/mermaid-api-sequence.mmd deleted file mode 100644 index ce7597525..000000000 --- a/docs/diagrams/mermaid-api-sequence.mmd +++ /dev/null @@ -1,307 +0,0 @@ ---- -references: - - "File: /packages/mermaid/src/mermaidAPI.ts" - - "File: /packages/mermaid/src/mermaid.ts" -generationTime: 2025-01-28T16:30:00.000Z ---- -sequenceDiagram - participant User as User/Browser - participant Mermaid as mermaid.ts - participant Queue as executionQueue - participant API as mermaidAPI.ts - participant Config as configApi - participant Preprocessor as preprocessDiagram - participant DiagramAPI as diagram-api - participant Diagram as Diagram.fromText - participant Renderer as diagram.renderer - participant Styles as Styling System - participant DOM as DOM/SVG - - Note over User, DOM: Mermaid Complete API Flow - - %% Initialization Phase - User->>+Mermaid: mermaid.initialize(config) - Mermaid->>+API: mermaidAPI.initialize(config) - - API->>API: assignWithDepth({}, userOptions) - API->>API: handle legacy fontFamily config - API->>Config: saveConfigFromInitialize(options) - - alt Theme Configuration Available - API->>API: check if theme in theme object - API->>API: set themeVariables from theme - else Default Theme - API->>API: use default theme variables - end - - API->>Config: setSiteConfig(options) or getSiteConfig() - API->>API: setLogLevel(config.logLevel) - API->>DiagramAPI: addDiagrams() - - API-->>-Mermaid: initialization complete - Mermaid-->>-User: ready to render - - %% Content Loaded Event - User->>DOM: document.load event - DOM->>+Mermaid: contentLoaded() - - opt startOnLoad is true - Mermaid->>Config: getConfig() - Config-->>Mermaid: { startOnLoad: true } - Mermaid->>Mermaid: run() - end - - Mermaid-->>-DOM: event handling complete - - %% Main Run Function - User->>+Mermaid: mermaid.run(options) - - Mermaid->>Mermaid: runThrowsErrors(options) - Mermaid->>Config: getConfig() - Config-->>Mermaid: configuration object - - alt nodes provided - Mermaid->>Mermaid: use provided nodes - else querySelector provided - Mermaid->>DOM: document.querySelectorAll(querySelector) - DOM-->>Mermaid: nodesToProcess - end - - Mermaid->>Mermaid: new InitIDGenerator(deterministicIds, seed) - - loop For each diagram element - Mermaid->>DOM: check element.getAttribute('data-processed') - - opt not processed - Mermaid->>DOM: element.setAttribute('data-processed', 'true') - Mermaid->>Mermaid: generate unique id - Mermaid->>DOM: get element.innerHTML - Mermaid->>Mermaid: entityDecode and clean text - Mermaid->>Mermaid: detectInit(txt) - - Mermaid->>Queue: render(id, txt, element) - end - end - - Mermaid-->>-User: processing initiated - - %% Render Function (Queued) - activate Queue - Queue->>+API: mermaidAPI.render(id, text, container) - - API->>DiagramAPI: addDiagrams() - API->>+Preprocessor: processAndSetConfigs(text) - - Preprocessor->>Preprocessor: preprocessDiagram(text) - Preprocessor->>Config: reset() - Preprocessor->>Config: addDirective(processed.config) - Preprocessor-->>-API: { code, config } - - API->>Config: getConfig() - Config-->>API: current configuration - - opt text length > maxTextSize - API->>API: text = MAX_TEXTLENGTH_EXCEEDED_MSG - end - - API->>API: setup id selectors and element IDs - API->>API: determine security level (sandbox/loose) - - %% DOM Setup - alt svgContainingElement provided - alt isSandboxed - API->>DOM: sandboxedIframe(select(svgContainingElement), iFrameID) - API->>DOM: select iframe contentDocument body - else - API->>DOM: select(svgContainingElement) - end - else no container - API->>API: removeExistingElements(document, id, divId, iFrameId) - alt isSandboxed - API->>DOM: sandboxedIframe(select('body'), iFrameID) - else - API->>DOM: select('body') - end - end - - API->>DOM: appendDivSvgG(root, id, enclosingDivID, fontFamily, XMLNS_XLINK_STD) - - %% Diagram Creation - API->>+Diagram: Diagram.fromText(text, { title: processed.title }) - - Diagram->>DiagramAPI: detect diagram type - Diagram->>DiagramAPI: load appropriate diagram - Diagram-->>-API: diagram instance - - opt parsing error occurred - API->>+Diagram: Diagram.fromText('error') - Diagram-->>-API: error diagram - API->>API: store parseEncounteredException - end - - %% Style Generation - API->>DOM: get svg element and firstChild - API->>Renderer: diag.renderer.getClasses(text, diag) - Renderer-->>API: diagramClassDefs - - API->>+Styles: createUserStyles(config, diagramType, diagramClassDefs, idSelector) - - Styles->>Styles: createCssStyles(config, classDefs) - - opt config.themeCSS defined - Styles->>Styles: append themeCSS - end - - opt fontFamily configured - Styles->>Styles: add CSS variables for fonts - end - - opt classDefs exist - loop For each styleClassDef - opt has styles - Styles->>Styles: cssImportantStyles for each CSS element - end - opt has textStyles - Styles->>Styles: cssImportantStyles for tspan elements - end - end - end - - Styles->>Styles: getStyles(graphType, userCSSstyles, themeVariables) - Styles->>Styles: serialize(compile(svgId{allStyles}), stringify) - Styles-->>-API: compiled CSS rules - - API->>DOM: create style element - API->>DOM: style.innerHTML = rules - API->>DOM: svg.insertBefore(style, firstChild) - - %% Diagram Rendering - API->>+Renderer: diag.renderer.draw(text, id, version, diag) - - Renderer->>Renderer: diagram-specific rendering logic - Renderer->>DOM: create SVG elements - Renderer->>DOM: apply positioning and styling - Renderer-->>-API: rendered diagram - - opt rendering error - alt suppressErrorRendering - API->>API: removeTempElements() - API->>Mermaid: throw error - else - API->>Renderer: errorRenderer.draw(text, id, version) - end - end - - %% Accessibility and Cleanup - API->>DOM: select svg element - API->>Diagram: diag.db.getAccTitle() - API->>Diagram: diag.db.getAccDescription() - API->>API: addA11yInfo(diagramType, svgNode, a11yTitle, a11yDescr) - - API->>DOM: set xmlns for foreignobject elements - API->>DOM: get innerHTML from enclosing div - - API->>+API: cleanUpSvgCode(svgCode, isSandboxed, arrowMarkerAbsolute) - - opt not useArrowMarkerUrls and not sandboxed - API->>API: replace marker-end URLs with anchors - end - - API->>API: decodeEntities(svgCode) - API->>API: replace
with
- API-->>-API: cleaned SVG code - - alt isSandboxed - API->>+API: putIntoIFrame(svgCode, svgEl) - API->>API: calculate iframe height - API->>API: toBase64 encode SVG content - API->>API: create iframe with sandbox attributes - API-->>-API: iframe HTML - else not loose security - API->>API: DOMPurify.sanitize(svgCode, options) - end - - API->>API: attachFunctions() - API->>API: removeTempElements() - - opt parseEncounteredException - API->>Mermaid: throw parseEncounteredException - end - - API-->>-Queue: { diagramType, svg: svgCode, bindFunctions } - - %% Return to Web Integration - activate Mermaid - Queue-->>Mermaid: render result - Mermaid->>DOM: element.innerHTML = svg - - opt postRenderCallback - Mermaid->>User: postRenderCallback(id) - end - - opt bindFunctions exist - Mermaid->>DOM: bindFunctions(element) - end - deactivate Mermaid - - %% Parse Function Flow - User->>+Mermaid: mermaid.parse(text, parseOptions) - activate Queue - - Queue->>+API: mermaidAPI.parse(text, parseOptions) - - API->>DiagramAPI: addDiagrams() - API->>Preprocessor: processAndSetConfigs(text) - Preprocessor-->>API: { code, config } - API->>Diagram: getDiagramFromText(code) - Diagram-->>API: diagram instance - API-->>-Queue: { diagramType: diagram.type, config } - - Queue-->>-Mermaid: parse result - Mermaid-->>-User: ParseResult or false - - %% External Diagram Registration - User->>+Mermaid: registerExternalDiagrams(diagrams, options) - - Mermaid->>DiagramAPI: addDiagrams() - Mermaid->>DiagramAPI: registerLazyLoadedDiagrams(...diagrams) - - opt lazyLoad is false - Mermaid->>DiagramAPI: loadRegisteredDiagrams() - end - - Mermaid-->>-User: registration complete - - %% Error Handling - Note over Mermaid, API: Error Handling Throughout - alt Error occurs - API->>Mermaid: throw error - Mermaid->>+Mermaid: handleError(error, errors, parseError) - - Mermaid->>Mermaid: log.warn(error) - - alt isDetailedError - Mermaid->>User: parseError(error.str, error.hash) - else - Mermaid->>User: parseError(error) - end - - opt not suppressErrors - Mermaid->>User: throw error - end - - Mermaid-->>-User: error handled - end - - %% Configuration Details - Note over Config: Configuration Functions - Note right of Config: Functions:
- reset()
- getConfig()
- setConfig()
- getSiteConfig()
- updateSiteConfig()
- saveConfigFromInitialize() - - Note over Styles: CSS Generation - Note right of Styles: Features:
- createCssStyles()
- createUserStyles()
- cssImportantStyles()
- Theme integration
- Class definitions - - Note over API: Security Levels - Note right of API: Modes:
- sandbox: iframe isolation
- loose: minimal sanitization
- default: DOMPurify sanitization - - Note over API: Helper Functions - Note right of API: Utilities:
- cleanUpSvgCode()
- putIntoIFrame()
- appendDivSvgG()
- removeExistingElements() \ No newline at end of file diff --git a/docs/diagrams/mindmap-implementation-sequence.mmd b/docs/diagrams/mindmap-implementation-sequence.mmd deleted file mode 100644 index 335855380..000000000 --- a/docs/diagrams/mindmap-implementation-sequence.mmd +++ /dev/null @@ -1,180 +0,0 @@ ---- -references: - - "File: /packages/mermaid/src/diagrams/mindmap/mindmap-definition.ts" - - "File: /packages/mermaid/src/diagrams/mindmap/mindmapDb.ts" - - "File: /packages/mermaid/src/diagrams/mindmap/detector.ts" - - "File: /packages/mermaid/src/diagrams/mindmap/mindmapTypes.ts" - - "File: /packages/mermaid/src/diagrams/mindmap/mindmapRenderer.ts" - - "File: /packages/mermaid/src/diagrams/mindmap/styles.ts" - - "File: /packages/mermaid/src/diagrams/mindmap/svgDraw.ts" -generationTime: 2025-01-28T16:00:00.000Z ---- -sequenceDiagram - participant User as User Input Text - participant Detector as detector.ts - participant Loader as DiagramLoader - participant Definition as mindmap-definition.ts - participant Parser as parser/mindmap.jison - participant DB as MindmapDB - participant Renderer as mindmapRenderer.ts - participant Cytoscape as cytoscape.js - participant SVGDraw as svgDraw.ts - participant Styles as styles.ts - participant Output as Final SVG - - Note over User, Output: Mindmap Implementation Flow - - %% Detection Phase - User->>Detector: /^\s*mindmap/ text input - activate Detector - Detector->>Detector: detector(txt) validates pattern - Detector->>Loader: loader() function called - deactivate Detector - - activate Loader - Loader->>Definition: import mindmap-definition.js - deactivate Loader - - %% Core Structure Setup - activate Definition - Definition->>DB: get db() → new MindmapDB() - Definition->>Renderer: setup renderer - Definition->>Parser: setup parser - Definition->>Styles: setup styles - deactivate Definition - - %% Database Initialization - activate DB - Note over DB: MindmapDB Constructor - DB->>DB: initialize nodes array - DB->>DB: setup nodeType constants - DB->>DB: bind methods - DB->>DB: clear() state - - %% Parsing Phase - activate Parser - User->>Parser: mindmap syntax text - - loop For each node in hierarchy - Parser->>DB: addNode(level, id, descr, type) - activate DB - DB->>DB: sanitizeText(id, descr) - DB->>DB: getType(startStr, endStr) - Note right of DB: Shape Detection:
[ → RECT
( → ROUNDED_RECT
(( → CIRCLE
)) → BANG
{{ → HEXAGON - DB->>DB: getParent(level) - DB->>DB: create MindmapNode - DB->>DB: add to hierarchy - deactivate DB - end - - opt Icon/Class Decoration - Parser->>DB: decorateNode(decoration) - DB->>DB: set icon/class properties - end - deactivate Parser - - %% Data Preparation - Renderer->>DB: getData() for layout - activate DB - DB->>DB: collect all nodes - DB->>DB: build parent-child relationships - DB-->>Renderer: return node hierarchy - deactivate DB - - %% Rendering Pipeline - activate Renderer - Note over Renderer: Rendering Phase - - Renderer->>Cytoscape: initialize cytoscape - activate Cytoscape - - loop For each node in mindmap - Renderer->>Cytoscape: addNodes(mindmap, cy, conf, level) - Cytoscape->>Cytoscape: create node data - Cytoscape->>Cytoscape: set position (x, y) - end - - loop For parent-child relationships - Renderer->>Cytoscape: add edges - Cytoscape->>Cytoscape: create edge data - end - - Renderer->>Cytoscape: configure cose-bilkent layout - Cytoscape->>Cytoscape: calculate optimal positions - Cytoscape-->>Renderer: return positioned graph - deactivate Cytoscape - - %% SVG Generation - Renderer->>SVGDraw: drawNodes(db, svg, mindmap, section, conf) - activate SVGDraw - - loop For each node recursively - SVGDraw->>SVGDraw: select shape function - - alt Default Shape - SVGDraw->>SVGDraw: defaultBkg() - rounded rectangle - else Rectangle Shape - SVGDraw->>SVGDraw: rectBkg() - sharp corners - else Circle Shape - SVGDraw->>SVGDraw: circleBkg() - perfect circle - else Cloud Shape - SVGDraw->>SVGDraw: cloudBkg() - organic curves - else Bang Shape - SVGDraw->>SVGDraw: bangBkg() - explosion style - else Hexagon Shape - SVGDraw->>SVGDraw: hexagonBkg() - six sides - end - - SVGDraw->>SVGDraw: create SVG elements - SVGDraw->>SVGDraw: add text labels - SVGDraw->>SVGDraw: position node - - opt Node has children - SVGDraw->>SVGDraw: drawNodes() recursive call - end - end - deactivate SVGDraw - - %% Edge Rendering - Renderer->>Renderer: drawEdges(edgesEl, cy) - loop For each edge - Renderer->>Renderer: extract edge bounds - Renderer->>Renderer: draw SVG path - end - - %% Styling Application - Renderer->>Styles: getStyles(options) - activate Styles - - Styles->>Styles: genSections(options) - loop For THEME_COLOR_LIMIT sections - Styles->>Styles: generate color scale - Styles->>Styles: create CSS rules - Note right of Styles: .section-X fills
.edge-depth-X widths
.node-icon-X colors - end - - Styles->>Styles: apply theme integration - Styles-->>Renderer: return compiled CSS - deactivate Styles - - %% Final Assembly - Renderer->>Output: selectSvgElement() - Renderer->>Output: setupGraphViewbox() - Renderer->>Output: apply styles - Renderer->>Output: add interactive elements - deactivate Renderer - - activate Output - Note over Output: Final Mindmap Features - Output->>Output: responsive layout - Output->>Output: accessibility attributes - Output->>Output: hover effects - Output->>Output: click handling - Output-->>User: rendered mindmap - deactivate Output - - %% Configuration Details - Note over DB, Styles: Configuration Options - Note right of DB: Padding Calculations:
Base padding from config
RECT: ×2 padding
ROUNDED_RECT: ×2 padding
HEXAGON: ×2 padding - Note right of Styles: Section Management:
MAX_SECTIONS = 12
Dynamic color generation
Git theme integration - Note right of Renderer: Layout Parameters:
Cytoscape configuration
coseBilkent settings
Node spacing rules \ No newline at end of file From 326e4e369388b6330bd34460353414f01034d039 Mon Sep 17 00:00:00 2001 From: Prashant-7718 Date: Thu, 24 Jul 2025 14:16:18 +0530 Subject: [PATCH 7/9] added mermaid files for documentation --- docs/diagrams/flowchart-code-flow.mmd | 189 +++++++++++ docs/diagrams/mermaid-api-sequence.mmd | 307 ++++++++++++++++++ .../mindmap-implementation-sequence.mmd | 180 ++++++++++ .../src/docs/diagrams/flowchart-code-flow.mmd | 189 +++++++++++ .../docs/diagrams/mermaid-api-sequence.mmd | 307 ++++++++++++++++++ .../mindmap-implementation-sequence.mmd | 180 ++++++++++ 6 files changed, 1352 insertions(+) create mode 100644 docs/diagrams/flowchart-code-flow.mmd create mode 100644 docs/diagrams/mermaid-api-sequence.mmd create mode 100644 docs/diagrams/mindmap-implementation-sequence.mmd create mode 100644 packages/mermaid/src/docs/diagrams/flowchart-code-flow.mmd create mode 100644 packages/mermaid/src/docs/diagrams/mermaid-api-sequence.mmd create mode 100644 packages/mermaid/src/docs/diagrams/mindmap-implementation-sequence.mmd diff --git a/docs/diagrams/flowchart-code-flow.mmd b/docs/diagrams/flowchart-code-flow.mmd new file mode 100644 index 000000000..d306dac7b --- /dev/null +++ b/docs/diagrams/flowchart-code-flow.mmd @@ -0,0 +1,189 @@ +--- +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"] \ No newline at end of file diff --git a/docs/diagrams/mermaid-api-sequence.mmd b/docs/diagrams/mermaid-api-sequence.mmd new file mode 100644 index 000000000..ce7597525 --- /dev/null +++ b/docs/diagrams/mermaid-api-sequence.mmd @@ -0,0 +1,307 @@ +--- +references: + - "File: /packages/mermaid/src/mermaidAPI.ts" + - "File: /packages/mermaid/src/mermaid.ts" +generationTime: 2025-01-28T16:30:00.000Z +--- +sequenceDiagram + participant User as User/Browser + participant Mermaid as mermaid.ts + participant Queue as executionQueue + participant API as mermaidAPI.ts + participant Config as configApi + participant Preprocessor as preprocessDiagram + participant DiagramAPI as diagram-api + participant Diagram as Diagram.fromText + participant Renderer as diagram.renderer + participant Styles as Styling System + participant DOM as DOM/SVG + + Note over User, DOM: Mermaid Complete API Flow + + %% Initialization Phase + User->>+Mermaid: mermaid.initialize(config) + Mermaid->>+API: mermaidAPI.initialize(config) + + API->>API: assignWithDepth({}, userOptions) + API->>API: handle legacy fontFamily config + API->>Config: saveConfigFromInitialize(options) + + alt Theme Configuration Available + API->>API: check if theme in theme object + API->>API: set themeVariables from theme + else Default Theme + API->>API: use default theme variables + end + + API->>Config: setSiteConfig(options) or getSiteConfig() + API->>API: setLogLevel(config.logLevel) + API->>DiagramAPI: addDiagrams() + + API-->>-Mermaid: initialization complete + Mermaid-->>-User: ready to render + + %% Content Loaded Event + User->>DOM: document.load event + DOM->>+Mermaid: contentLoaded() + + opt startOnLoad is true + Mermaid->>Config: getConfig() + Config-->>Mermaid: { startOnLoad: true } + Mermaid->>Mermaid: run() + end + + Mermaid-->>-DOM: event handling complete + + %% Main Run Function + User->>+Mermaid: mermaid.run(options) + + Mermaid->>Mermaid: runThrowsErrors(options) + Mermaid->>Config: getConfig() + Config-->>Mermaid: configuration object + + alt nodes provided + Mermaid->>Mermaid: use provided nodes + else querySelector provided + Mermaid->>DOM: document.querySelectorAll(querySelector) + DOM-->>Mermaid: nodesToProcess + end + + Mermaid->>Mermaid: new InitIDGenerator(deterministicIds, seed) + + loop For each diagram element + Mermaid->>DOM: check element.getAttribute('data-processed') + + opt not processed + Mermaid->>DOM: element.setAttribute('data-processed', 'true') + Mermaid->>Mermaid: generate unique id + Mermaid->>DOM: get element.innerHTML + Mermaid->>Mermaid: entityDecode and clean text + Mermaid->>Mermaid: detectInit(txt) + + Mermaid->>Queue: render(id, txt, element) + end + end + + Mermaid-->>-User: processing initiated + + %% Render Function (Queued) + activate Queue + Queue->>+API: mermaidAPI.render(id, text, container) + + API->>DiagramAPI: addDiagrams() + API->>+Preprocessor: processAndSetConfigs(text) + + Preprocessor->>Preprocessor: preprocessDiagram(text) + Preprocessor->>Config: reset() + Preprocessor->>Config: addDirective(processed.config) + Preprocessor-->>-API: { code, config } + + API->>Config: getConfig() + Config-->>API: current configuration + + opt text length > maxTextSize + API->>API: text = MAX_TEXTLENGTH_EXCEEDED_MSG + end + + API->>API: setup id selectors and element IDs + API->>API: determine security level (sandbox/loose) + + %% DOM Setup + alt svgContainingElement provided + alt isSandboxed + API->>DOM: sandboxedIframe(select(svgContainingElement), iFrameID) + API->>DOM: select iframe contentDocument body + else + API->>DOM: select(svgContainingElement) + end + else no container + API->>API: removeExistingElements(document, id, divId, iFrameId) + alt isSandboxed + API->>DOM: sandboxedIframe(select('body'), iFrameID) + else + API->>DOM: select('body') + end + end + + API->>DOM: appendDivSvgG(root, id, enclosingDivID, fontFamily, XMLNS_XLINK_STD) + + %% Diagram Creation + API->>+Diagram: Diagram.fromText(text, { title: processed.title }) + + Diagram->>DiagramAPI: detect diagram type + Diagram->>DiagramAPI: load appropriate diagram + Diagram-->>-API: diagram instance + + opt parsing error occurred + API->>+Diagram: Diagram.fromText('error') + Diagram-->>-API: error diagram + API->>API: store parseEncounteredException + end + + %% Style Generation + API->>DOM: get svg element and firstChild + API->>Renderer: diag.renderer.getClasses(text, diag) + Renderer-->>API: diagramClassDefs + + API->>+Styles: createUserStyles(config, diagramType, diagramClassDefs, idSelector) + + Styles->>Styles: createCssStyles(config, classDefs) + + opt config.themeCSS defined + Styles->>Styles: append themeCSS + end + + opt fontFamily configured + Styles->>Styles: add CSS variables for fonts + end + + opt classDefs exist + loop For each styleClassDef + opt has styles + Styles->>Styles: cssImportantStyles for each CSS element + end + opt has textStyles + Styles->>Styles: cssImportantStyles for tspan elements + end + end + end + + Styles->>Styles: getStyles(graphType, userCSSstyles, themeVariables) + Styles->>Styles: serialize(compile(svgId{allStyles}), stringify) + Styles-->>-API: compiled CSS rules + + API->>DOM: create style element + API->>DOM: style.innerHTML = rules + API->>DOM: svg.insertBefore(style, firstChild) + + %% Diagram Rendering + API->>+Renderer: diag.renderer.draw(text, id, version, diag) + + Renderer->>Renderer: diagram-specific rendering logic + Renderer->>DOM: create SVG elements + Renderer->>DOM: apply positioning and styling + Renderer-->>-API: rendered diagram + + opt rendering error + alt suppressErrorRendering + API->>API: removeTempElements() + API->>Mermaid: throw error + else + API->>Renderer: errorRenderer.draw(text, id, version) + end + end + + %% Accessibility and Cleanup + API->>DOM: select svg element + API->>Diagram: diag.db.getAccTitle() + API->>Diagram: diag.db.getAccDescription() + API->>API: addA11yInfo(diagramType, svgNode, a11yTitle, a11yDescr) + + API->>DOM: set xmlns for foreignobject elements + API->>DOM: get innerHTML from enclosing div + + API->>+API: cleanUpSvgCode(svgCode, isSandboxed, arrowMarkerAbsolute) + + opt not useArrowMarkerUrls and not sandboxed + API->>API: replace marker-end URLs with anchors + end + + API->>API: decodeEntities(svgCode) + API->>API: replace
with
+ API-->>-API: cleaned SVG code + + alt isSandboxed + API->>+API: putIntoIFrame(svgCode, svgEl) + API->>API: calculate iframe height + API->>API: toBase64 encode SVG content + API->>API: create iframe with sandbox attributes + API-->>-API: iframe HTML + else not loose security + API->>API: DOMPurify.sanitize(svgCode, options) + end + + API->>API: attachFunctions() + API->>API: removeTempElements() + + opt parseEncounteredException + API->>Mermaid: throw parseEncounteredException + end + + API-->>-Queue: { diagramType, svg: svgCode, bindFunctions } + + %% Return to Web Integration + activate Mermaid + Queue-->>Mermaid: render result + Mermaid->>DOM: element.innerHTML = svg + + opt postRenderCallback + Mermaid->>User: postRenderCallback(id) + end + + opt bindFunctions exist + Mermaid->>DOM: bindFunctions(element) + end + deactivate Mermaid + + %% Parse Function Flow + User->>+Mermaid: mermaid.parse(text, parseOptions) + activate Queue + + Queue->>+API: mermaidAPI.parse(text, parseOptions) + + API->>DiagramAPI: addDiagrams() + API->>Preprocessor: processAndSetConfigs(text) + Preprocessor-->>API: { code, config } + API->>Diagram: getDiagramFromText(code) + Diagram-->>API: diagram instance + API-->>-Queue: { diagramType: diagram.type, config } + + Queue-->>-Mermaid: parse result + Mermaid-->>-User: ParseResult or false + + %% External Diagram Registration + User->>+Mermaid: registerExternalDiagrams(diagrams, options) + + Mermaid->>DiagramAPI: addDiagrams() + Mermaid->>DiagramAPI: registerLazyLoadedDiagrams(...diagrams) + + opt lazyLoad is false + Mermaid->>DiagramAPI: loadRegisteredDiagrams() + end + + Mermaid-->>-User: registration complete + + %% Error Handling + Note over Mermaid, API: Error Handling Throughout + alt Error occurs + API->>Mermaid: throw error + Mermaid->>+Mermaid: handleError(error, errors, parseError) + + Mermaid->>Mermaid: log.warn(error) + + alt isDetailedError + Mermaid->>User: parseError(error.str, error.hash) + else + Mermaid->>User: parseError(error) + end + + opt not suppressErrors + Mermaid->>User: throw error + end + + Mermaid-->>-User: error handled + end + + %% Configuration Details + Note over Config: Configuration Functions + Note right of Config: Functions:
- reset()
- getConfig()
- setConfig()
- getSiteConfig()
- updateSiteConfig()
- saveConfigFromInitialize() + + Note over Styles: CSS Generation + Note right of Styles: Features:
- createCssStyles()
- createUserStyles()
- cssImportantStyles()
- Theme integration
- Class definitions + + Note over API: Security Levels + Note right of API: Modes:
- sandbox: iframe isolation
- loose: minimal sanitization
- default: DOMPurify sanitization + + Note over API: Helper Functions + Note right of API: Utilities:
- cleanUpSvgCode()
- putIntoIFrame()
- appendDivSvgG()
- removeExistingElements() \ No newline at end of file diff --git a/docs/diagrams/mindmap-implementation-sequence.mmd b/docs/diagrams/mindmap-implementation-sequence.mmd new file mode 100644 index 000000000..335855380 --- /dev/null +++ b/docs/diagrams/mindmap-implementation-sequence.mmd @@ -0,0 +1,180 @@ +--- +references: + - "File: /packages/mermaid/src/diagrams/mindmap/mindmap-definition.ts" + - "File: /packages/mermaid/src/diagrams/mindmap/mindmapDb.ts" + - "File: /packages/mermaid/src/diagrams/mindmap/detector.ts" + - "File: /packages/mermaid/src/diagrams/mindmap/mindmapTypes.ts" + - "File: /packages/mermaid/src/diagrams/mindmap/mindmapRenderer.ts" + - "File: /packages/mermaid/src/diagrams/mindmap/styles.ts" + - "File: /packages/mermaid/src/diagrams/mindmap/svgDraw.ts" +generationTime: 2025-01-28T16:00:00.000Z +--- +sequenceDiagram + participant User as User Input Text + participant Detector as detector.ts + participant Loader as DiagramLoader + participant Definition as mindmap-definition.ts + participant Parser as parser/mindmap.jison + participant DB as MindmapDB + participant Renderer as mindmapRenderer.ts + participant Cytoscape as cytoscape.js + participant SVGDraw as svgDraw.ts + participant Styles as styles.ts + participant Output as Final SVG + + Note over User, Output: Mindmap Implementation Flow + + %% Detection Phase + User->>Detector: /^\s*mindmap/ text input + activate Detector + Detector->>Detector: detector(txt) validates pattern + Detector->>Loader: loader() function called + deactivate Detector + + activate Loader + Loader->>Definition: import mindmap-definition.js + deactivate Loader + + %% Core Structure Setup + activate Definition + Definition->>DB: get db() → new MindmapDB() + Definition->>Renderer: setup renderer + Definition->>Parser: setup parser + Definition->>Styles: setup styles + deactivate Definition + + %% Database Initialization + activate DB + Note over DB: MindmapDB Constructor + DB->>DB: initialize nodes array + DB->>DB: setup nodeType constants + DB->>DB: bind methods + DB->>DB: clear() state + + %% Parsing Phase + activate Parser + User->>Parser: mindmap syntax text + + loop For each node in hierarchy + Parser->>DB: addNode(level, id, descr, type) + activate DB + DB->>DB: sanitizeText(id, descr) + DB->>DB: getType(startStr, endStr) + Note right of DB: Shape Detection:
[ → RECT
( → ROUNDED_RECT
(( → CIRCLE
)) → BANG
{{ → HEXAGON + DB->>DB: getParent(level) + DB->>DB: create MindmapNode + DB->>DB: add to hierarchy + deactivate DB + end + + opt Icon/Class Decoration + Parser->>DB: decorateNode(decoration) + DB->>DB: set icon/class properties + end + deactivate Parser + + %% Data Preparation + Renderer->>DB: getData() for layout + activate DB + DB->>DB: collect all nodes + DB->>DB: build parent-child relationships + DB-->>Renderer: return node hierarchy + deactivate DB + + %% Rendering Pipeline + activate Renderer + Note over Renderer: Rendering Phase + + Renderer->>Cytoscape: initialize cytoscape + activate Cytoscape + + loop For each node in mindmap + Renderer->>Cytoscape: addNodes(mindmap, cy, conf, level) + Cytoscape->>Cytoscape: create node data + Cytoscape->>Cytoscape: set position (x, y) + end + + loop For parent-child relationships + Renderer->>Cytoscape: add edges + Cytoscape->>Cytoscape: create edge data + end + + Renderer->>Cytoscape: configure cose-bilkent layout + Cytoscape->>Cytoscape: calculate optimal positions + Cytoscape-->>Renderer: return positioned graph + deactivate Cytoscape + + %% SVG Generation + Renderer->>SVGDraw: drawNodes(db, svg, mindmap, section, conf) + activate SVGDraw + + loop For each node recursively + SVGDraw->>SVGDraw: select shape function + + alt Default Shape + SVGDraw->>SVGDraw: defaultBkg() - rounded rectangle + else Rectangle Shape + SVGDraw->>SVGDraw: rectBkg() - sharp corners + else Circle Shape + SVGDraw->>SVGDraw: circleBkg() - perfect circle + else Cloud Shape + SVGDraw->>SVGDraw: cloudBkg() - organic curves + else Bang Shape + SVGDraw->>SVGDraw: bangBkg() - explosion style + else Hexagon Shape + SVGDraw->>SVGDraw: hexagonBkg() - six sides + end + + SVGDraw->>SVGDraw: create SVG elements + SVGDraw->>SVGDraw: add text labels + SVGDraw->>SVGDraw: position node + + opt Node has children + SVGDraw->>SVGDraw: drawNodes() recursive call + end + end + deactivate SVGDraw + + %% Edge Rendering + Renderer->>Renderer: drawEdges(edgesEl, cy) + loop For each edge + Renderer->>Renderer: extract edge bounds + Renderer->>Renderer: draw SVG path + end + + %% Styling Application + Renderer->>Styles: getStyles(options) + activate Styles + + Styles->>Styles: genSections(options) + loop For THEME_COLOR_LIMIT sections + Styles->>Styles: generate color scale + Styles->>Styles: create CSS rules + Note right of Styles: .section-X fills
.edge-depth-X widths
.node-icon-X colors + end + + Styles->>Styles: apply theme integration + Styles-->>Renderer: return compiled CSS + deactivate Styles + + %% Final Assembly + Renderer->>Output: selectSvgElement() + Renderer->>Output: setupGraphViewbox() + Renderer->>Output: apply styles + Renderer->>Output: add interactive elements + deactivate Renderer + + activate Output + Note over Output: Final Mindmap Features + Output->>Output: responsive layout + Output->>Output: accessibility attributes + Output->>Output: hover effects + Output->>Output: click handling + Output-->>User: rendered mindmap + deactivate Output + + %% Configuration Details + Note over DB, Styles: Configuration Options + Note right of DB: Padding Calculations:
Base padding from config
RECT: ×2 padding
ROUNDED_RECT: ×2 padding
HEXAGON: ×2 padding + Note right of Styles: Section Management:
MAX_SECTIONS = 12
Dynamic color generation
Git theme integration + Note right of Renderer: Layout Parameters:
Cytoscape configuration
coseBilkent settings
Node spacing rules \ No newline at end of file diff --git a/packages/mermaid/src/docs/diagrams/flowchart-code-flow.mmd b/packages/mermaid/src/docs/diagrams/flowchart-code-flow.mmd new file mode 100644 index 000000000..d306dac7b --- /dev/null +++ b/packages/mermaid/src/docs/diagrams/flowchart-code-flow.mmd @@ -0,0 +1,189 @@ +--- +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"] \ No newline at end of file diff --git a/packages/mermaid/src/docs/diagrams/mermaid-api-sequence.mmd b/packages/mermaid/src/docs/diagrams/mermaid-api-sequence.mmd new file mode 100644 index 000000000..ce7597525 --- /dev/null +++ b/packages/mermaid/src/docs/diagrams/mermaid-api-sequence.mmd @@ -0,0 +1,307 @@ +--- +references: + - "File: /packages/mermaid/src/mermaidAPI.ts" + - "File: /packages/mermaid/src/mermaid.ts" +generationTime: 2025-01-28T16:30:00.000Z +--- +sequenceDiagram + participant User as User/Browser + participant Mermaid as mermaid.ts + participant Queue as executionQueue + participant API as mermaidAPI.ts + participant Config as configApi + participant Preprocessor as preprocessDiagram + participant DiagramAPI as diagram-api + participant Diagram as Diagram.fromText + participant Renderer as diagram.renderer + participant Styles as Styling System + participant DOM as DOM/SVG + + Note over User, DOM: Mermaid Complete API Flow + + %% Initialization Phase + User->>+Mermaid: mermaid.initialize(config) + Mermaid->>+API: mermaidAPI.initialize(config) + + API->>API: assignWithDepth({}, userOptions) + API->>API: handle legacy fontFamily config + API->>Config: saveConfigFromInitialize(options) + + alt Theme Configuration Available + API->>API: check if theme in theme object + API->>API: set themeVariables from theme + else Default Theme + API->>API: use default theme variables + end + + API->>Config: setSiteConfig(options) or getSiteConfig() + API->>API: setLogLevel(config.logLevel) + API->>DiagramAPI: addDiagrams() + + API-->>-Mermaid: initialization complete + Mermaid-->>-User: ready to render + + %% Content Loaded Event + User->>DOM: document.load event + DOM->>+Mermaid: contentLoaded() + + opt startOnLoad is true + Mermaid->>Config: getConfig() + Config-->>Mermaid: { startOnLoad: true } + Mermaid->>Mermaid: run() + end + + Mermaid-->>-DOM: event handling complete + + %% Main Run Function + User->>+Mermaid: mermaid.run(options) + + Mermaid->>Mermaid: runThrowsErrors(options) + Mermaid->>Config: getConfig() + Config-->>Mermaid: configuration object + + alt nodes provided + Mermaid->>Mermaid: use provided nodes + else querySelector provided + Mermaid->>DOM: document.querySelectorAll(querySelector) + DOM-->>Mermaid: nodesToProcess + end + + Mermaid->>Mermaid: new InitIDGenerator(deterministicIds, seed) + + loop For each diagram element + Mermaid->>DOM: check element.getAttribute('data-processed') + + opt not processed + Mermaid->>DOM: element.setAttribute('data-processed', 'true') + Mermaid->>Mermaid: generate unique id + Mermaid->>DOM: get element.innerHTML + Mermaid->>Mermaid: entityDecode and clean text + Mermaid->>Mermaid: detectInit(txt) + + Mermaid->>Queue: render(id, txt, element) + end + end + + Mermaid-->>-User: processing initiated + + %% Render Function (Queued) + activate Queue + Queue->>+API: mermaidAPI.render(id, text, container) + + API->>DiagramAPI: addDiagrams() + API->>+Preprocessor: processAndSetConfigs(text) + + Preprocessor->>Preprocessor: preprocessDiagram(text) + Preprocessor->>Config: reset() + Preprocessor->>Config: addDirective(processed.config) + Preprocessor-->>-API: { code, config } + + API->>Config: getConfig() + Config-->>API: current configuration + + opt text length > maxTextSize + API->>API: text = MAX_TEXTLENGTH_EXCEEDED_MSG + end + + API->>API: setup id selectors and element IDs + API->>API: determine security level (sandbox/loose) + + %% DOM Setup + alt svgContainingElement provided + alt isSandboxed + API->>DOM: sandboxedIframe(select(svgContainingElement), iFrameID) + API->>DOM: select iframe contentDocument body + else + API->>DOM: select(svgContainingElement) + end + else no container + API->>API: removeExistingElements(document, id, divId, iFrameId) + alt isSandboxed + API->>DOM: sandboxedIframe(select('body'), iFrameID) + else + API->>DOM: select('body') + end + end + + API->>DOM: appendDivSvgG(root, id, enclosingDivID, fontFamily, XMLNS_XLINK_STD) + + %% Diagram Creation + API->>+Diagram: Diagram.fromText(text, { title: processed.title }) + + Diagram->>DiagramAPI: detect diagram type + Diagram->>DiagramAPI: load appropriate diagram + Diagram-->>-API: diagram instance + + opt parsing error occurred + API->>+Diagram: Diagram.fromText('error') + Diagram-->>-API: error diagram + API->>API: store parseEncounteredException + end + + %% Style Generation + API->>DOM: get svg element and firstChild + API->>Renderer: diag.renderer.getClasses(text, diag) + Renderer-->>API: diagramClassDefs + + API->>+Styles: createUserStyles(config, diagramType, diagramClassDefs, idSelector) + + Styles->>Styles: createCssStyles(config, classDefs) + + opt config.themeCSS defined + Styles->>Styles: append themeCSS + end + + opt fontFamily configured + Styles->>Styles: add CSS variables for fonts + end + + opt classDefs exist + loop For each styleClassDef + opt has styles + Styles->>Styles: cssImportantStyles for each CSS element + end + opt has textStyles + Styles->>Styles: cssImportantStyles for tspan elements + end + end + end + + Styles->>Styles: getStyles(graphType, userCSSstyles, themeVariables) + Styles->>Styles: serialize(compile(svgId{allStyles}), stringify) + Styles-->>-API: compiled CSS rules + + API->>DOM: create style element + API->>DOM: style.innerHTML = rules + API->>DOM: svg.insertBefore(style, firstChild) + + %% Diagram Rendering + API->>+Renderer: diag.renderer.draw(text, id, version, diag) + + Renderer->>Renderer: diagram-specific rendering logic + Renderer->>DOM: create SVG elements + Renderer->>DOM: apply positioning and styling + Renderer-->>-API: rendered diagram + + opt rendering error + alt suppressErrorRendering + API->>API: removeTempElements() + API->>Mermaid: throw error + else + API->>Renderer: errorRenderer.draw(text, id, version) + end + end + + %% Accessibility and Cleanup + API->>DOM: select svg element + API->>Diagram: diag.db.getAccTitle() + API->>Diagram: diag.db.getAccDescription() + API->>API: addA11yInfo(diagramType, svgNode, a11yTitle, a11yDescr) + + API->>DOM: set xmlns for foreignobject elements + API->>DOM: get innerHTML from enclosing div + + API->>+API: cleanUpSvgCode(svgCode, isSandboxed, arrowMarkerAbsolute) + + opt not useArrowMarkerUrls and not sandboxed + API->>API: replace marker-end URLs with anchors + end + + API->>API: decodeEntities(svgCode) + API->>API: replace
with
+ API-->>-API: cleaned SVG code + + alt isSandboxed + API->>+API: putIntoIFrame(svgCode, svgEl) + API->>API: calculate iframe height + API->>API: toBase64 encode SVG content + API->>API: create iframe with sandbox attributes + API-->>-API: iframe HTML + else not loose security + API->>API: DOMPurify.sanitize(svgCode, options) + end + + API->>API: attachFunctions() + API->>API: removeTempElements() + + opt parseEncounteredException + API->>Mermaid: throw parseEncounteredException + end + + API-->>-Queue: { diagramType, svg: svgCode, bindFunctions } + + %% Return to Web Integration + activate Mermaid + Queue-->>Mermaid: render result + Mermaid->>DOM: element.innerHTML = svg + + opt postRenderCallback + Mermaid->>User: postRenderCallback(id) + end + + opt bindFunctions exist + Mermaid->>DOM: bindFunctions(element) + end + deactivate Mermaid + + %% Parse Function Flow + User->>+Mermaid: mermaid.parse(text, parseOptions) + activate Queue + + Queue->>+API: mermaidAPI.parse(text, parseOptions) + + API->>DiagramAPI: addDiagrams() + API->>Preprocessor: processAndSetConfigs(text) + Preprocessor-->>API: { code, config } + API->>Diagram: getDiagramFromText(code) + Diagram-->>API: diagram instance + API-->>-Queue: { diagramType: diagram.type, config } + + Queue-->>-Mermaid: parse result + Mermaid-->>-User: ParseResult or false + + %% External Diagram Registration + User->>+Mermaid: registerExternalDiagrams(diagrams, options) + + Mermaid->>DiagramAPI: addDiagrams() + Mermaid->>DiagramAPI: registerLazyLoadedDiagrams(...diagrams) + + opt lazyLoad is false + Mermaid->>DiagramAPI: loadRegisteredDiagrams() + end + + Mermaid-->>-User: registration complete + + %% Error Handling + Note over Mermaid, API: Error Handling Throughout + alt Error occurs + API->>Mermaid: throw error + Mermaid->>+Mermaid: handleError(error, errors, parseError) + + Mermaid->>Mermaid: log.warn(error) + + alt isDetailedError + Mermaid->>User: parseError(error.str, error.hash) + else + Mermaid->>User: parseError(error) + end + + opt not suppressErrors + Mermaid->>User: throw error + end + + Mermaid-->>-User: error handled + end + + %% Configuration Details + Note over Config: Configuration Functions + Note right of Config: Functions:
- reset()
- getConfig()
- setConfig()
- getSiteConfig()
- updateSiteConfig()
- saveConfigFromInitialize() + + Note over Styles: CSS Generation + Note right of Styles: Features:
- createCssStyles()
- createUserStyles()
- cssImportantStyles()
- Theme integration
- Class definitions + + Note over API: Security Levels + Note right of API: Modes:
- sandbox: iframe isolation
- loose: minimal sanitization
- default: DOMPurify sanitization + + Note over API: Helper Functions + Note right of API: Utilities:
- cleanUpSvgCode()
- putIntoIFrame()
- appendDivSvgG()
- removeExistingElements() \ No newline at end of file diff --git a/packages/mermaid/src/docs/diagrams/mindmap-implementation-sequence.mmd b/packages/mermaid/src/docs/diagrams/mindmap-implementation-sequence.mmd new file mode 100644 index 000000000..335855380 --- /dev/null +++ b/packages/mermaid/src/docs/diagrams/mindmap-implementation-sequence.mmd @@ -0,0 +1,180 @@ +--- +references: + - "File: /packages/mermaid/src/diagrams/mindmap/mindmap-definition.ts" + - "File: /packages/mermaid/src/diagrams/mindmap/mindmapDb.ts" + - "File: /packages/mermaid/src/diagrams/mindmap/detector.ts" + - "File: /packages/mermaid/src/diagrams/mindmap/mindmapTypes.ts" + - "File: /packages/mermaid/src/diagrams/mindmap/mindmapRenderer.ts" + - "File: /packages/mermaid/src/diagrams/mindmap/styles.ts" + - "File: /packages/mermaid/src/diagrams/mindmap/svgDraw.ts" +generationTime: 2025-01-28T16:00:00.000Z +--- +sequenceDiagram + participant User as User Input Text + participant Detector as detector.ts + participant Loader as DiagramLoader + participant Definition as mindmap-definition.ts + participant Parser as parser/mindmap.jison + participant DB as MindmapDB + participant Renderer as mindmapRenderer.ts + participant Cytoscape as cytoscape.js + participant SVGDraw as svgDraw.ts + participant Styles as styles.ts + participant Output as Final SVG + + Note over User, Output: Mindmap Implementation Flow + + %% Detection Phase + User->>Detector: /^\s*mindmap/ text input + activate Detector + Detector->>Detector: detector(txt) validates pattern + Detector->>Loader: loader() function called + deactivate Detector + + activate Loader + Loader->>Definition: import mindmap-definition.js + deactivate Loader + + %% Core Structure Setup + activate Definition + Definition->>DB: get db() → new MindmapDB() + Definition->>Renderer: setup renderer + Definition->>Parser: setup parser + Definition->>Styles: setup styles + deactivate Definition + + %% Database Initialization + activate DB + Note over DB: MindmapDB Constructor + DB->>DB: initialize nodes array + DB->>DB: setup nodeType constants + DB->>DB: bind methods + DB->>DB: clear() state + + %% Parsing Phase + activate Parser + User->>Parser: mindmap syntax text + + loop For each node in hierarchy + Parser->>DB: addNode(level, id, descr, type) + activate DB + DB->>DB: sanitizeText(id, descr) + DB->>DB: getType(startStr, endStr) + Note right of DB: Shape Detection:
[ → RECT
( → ROUNDED_RECT
(( → CIRCLE
)) → BANG
{{ → HEXAGON + DB->>DB: getParent(level) + DB->>DB: create MindmapNode + DB->>DB: add to hierarchy + deactivate DB + end + + opt Icon/Class Decoration + Parser->>DB: decorateNode(decoration) + DB->>DB: set icon/class properties + end + deactivate Parser + + %% Data Preparation + Renderer->>DB: getData() for layout + activate DB + DB->>DB: collect all nodes + DB->>DB: build parent-child relationships + DB-->>Renderer: return node hierarchy + deactivate DB + + %% Rendering Pipeline + activate Renderer + Note over Renderer: Rendering Phase + + Renderer->>Cytoscape: initialize cytoscape + activate Cytoscape + + loop For each node in mindmap + Renderer->>Cytoscape: addNodes(mindmap, cy, conf, level) + Cytoscape->>Cytoscape: create node data + Cytoscape->>Cytoscape: set position (x, y) + end + + loop For parent-child relationships + Renderer->>Cytoscape: add edges + Cytoscape->>Cytoscape: create edge data + end + + Renderer->>Cytoscape: configure cose-bilkent layout + Cytoscape->>Cytoscape: calculate optimal positions + Cytoscape-->>Renderer: return positioned graph + deactivate Cytoscape + + %% SVG Generation + Renderer->>SVGDraw: drawNodes(db, svg, mindmap, section, conf) + activate SVGDraw + + loop For each node recursively + SVGDraw->>SVGDraw: select shape function + + alt Default Shape + SVGDraw->>SVGDraw: defaultBkg() - rounded rectangle + else Rectangle Shape + SVGDraw->>SVGDraw: rectBkg() - sharp corners + else Circle Shape + SVGDraw->>SVGDraw: circleBkg() - perfect circle + else Cloud Shape + SVGDraw->>SVGDraw: cloudBkg() - organic curves + else Bang Shape + SVGDraw->>SVGDraw: bangBkg() - explosion style + else Hexagon Shape + SVGDraw->>SVGDraw: hexagonBkg() - six sides + end + + SVGDraw->>SVGDraw: create SVG elements + SVGDraw->>SVGDraw: add text labels + SVGDraw->>SVGDraw: position node + + opt Node has children + SVGDraw->>SVGDraw: drawNodes() recursive call + end + end + deactivate SVGDraw + + %% Edge Rendering + Renderer->>Renderer: drawEdges(edgesEl, cy) + loop For each edge + Renderer->>Renderer: extract edge bounds + Renderer->>Renderer: draw SVG path + end + + %% Styling Application + Renderer->>Styles: getStyles(options) + activate Styles + + Styles->>Styles: genSections(options) + loop For THEME_COLOR_LIMIT sections + Styles->>Styles: generate color scale + Styles->>Styles: create CSS rules + Note right of Styles: .section-X fills
.edge-depth-X widths
.node-icon-X colors + end + + Styles->>Styles: apply theme integration + Styles-->>Renderer: return compiled CSS + deactivate Styles + + %% Final Assembly + Renderer->>Output: selectSvgElement() + Renderer->>Output: setupGraphViewbox() + Renderer->>Output: apply styles + Renderer->>Output: add interactive elements + deactivate Renderer + + activate Output + Note over Output: Final Mindmap Features + Output->>Output: responsive layout + Output->>Output: accessibility attributes + Output->>Output: hover effects + Output->>Output: click handling + Output-->>User: rendered mindmap + deactivate Output + + %% Configuration Details + Note over DB, Styles: Configuration Options + Note right of DB: Padding Calculations:
Base padding from config
RECT: ×2 padding
ROUNDED_RECT: ×2 padding
HEXAGON: ×2 padding + Note right of Styles: Section Management:
MAX_SECTIONS = 12
Dynamic color generation
Git theme integration + Note right of Renderer: Layout Parameters:
Cytoscape configuration
coseBilkent settings
Node spacing rules \ No newline at end of file From 999b8365082782d1664d444028b42353b3f24c17 Mon Sep 17 00:00:00 2001 From: Prashant-7718 Date: Thu, 24 Jul 2025 14:46:34 +0530 Subject: [PATCH 8/9] updated changeset --- .changeset/dirty-heads-travel.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/dirty-heads-travel.md b/.changeset/dirty-heads-travel.md index 2a96554e0..0f253239e 100644 --- a/.changeset/dirty-heads-travel.md +++ b/.changeset/dirty-heads-travel.md @@ -2,4 +2,4 @@ 'mermaid': minor --- -chore: mermaid diagrams for flowchart mindmap and mermaidAPI +chore: Mermaid diagrams for flowchart mindmap and mermaidAPI From 694844050a9e68d5fbed33d34b3595a58dab2aa9 Mon Sep 17 00:00:00 2001 From: Prashant-7718 Date: Tue, 29 Jul 2025 13:34:18 +0530 Subject: [PATCH 9/9] removed changeset --- .changeset/dirty-heads-travel.md | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 .changeset/dirty-heads-travel.md diff --git a/.changeset/dirty-heads-travel.md b/.changeset/dirty-heads-travel.md deleted file mode 100644 index 0f253239e..000000000 --- a/.changeset/dirty-heads-travel.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'mermaid': minor ---- - -chore: Mermaid diagrams for flowchart mindmap and mermaidAPI