diff --git a/cypress/integration/rendering/flowchart.spec.js b/cypress/integration/rendering/flowchart.spec.js index 40713ac4e..2516a9edf 100644 --- a/cypress/integration/rendering/flowchart.spec.js +++ b/cypress/integration/rendering/flowchart.spec.js @@ -973,4 +973,24 @@ graph TD } ); }); + it('#5824: should be able to string and markdown labels (#5824)', () => { + imgSnapshotTest( + ` +flowchart TB + mermaid{"What is\nyourmermaid version?"} --> v10["<11"] --"\`<**1**1\`"--> fine["No bug"] + mermaid --> v11[">= v11"] -- ">= v11" --> broken["Affected by https://github.com/mermaid-js/mermaid/issues/5824"] + subgraph subgraph1["\`How to fix **fix**\`"] + broken --> B["B"] + end + githost["Github, Gitlab, BitBucket, etc."] + githost2["\`Github, Gitlab, BitBucket, etc.\`"] + a["1."] + b["- x"] + `, + { + flowchart: { htmlLabels: true }, + securityLevel: 'loose', + } + ); + }); }); diff --git a/cypress/platform/knsv2.html b/cypress/platform/knsv2.html index eb5528844..5e5f013da 100644 --- a/cypress/platform/knsv2.html +++ b/cypress/platform/knsv2.html @@ -311,21 +311,21 @@ flowchart LR n8@{ shape: rect} -
+--- -config: - layout: elk +title: https://github.com/mermaid-js/mermaid/issues/5824 --- -flowchart LR - subgraph s1["Untitled subgraph"] - n1["Evaluate"] - n2["Option 1"] - end - n1 -- One --> n2 - - - - +%% 6048, 5824 +flowchart TB + mermaid{"What is\nyourmermaid version?"} --> v10["<11"] --"`<**1**1`"--> fine["No bug"] + mermaid --> v11[">= v11"] -- ">= v11" --> broken["Affected by https://github.com/mermaid-js/mermaid/issues/5824"] + subgraph subgraph1["`How to fix **fix**`"] + broken --> B["B"] + end + githost["Github, Gitlab, BitBucket, etc."] + githost2["`Github, Gitlab, BitBucket, etc.`"] + a["1."] + b["- x"]--- diff --git a/packages/mermaid/src/diagrams/flowchart/flowDb.ts b/packages/mermaid/src/diagrams/flowchart/flowDb.ts index 632633730..190312c7f 100644 --- a/packages/mermaid/src/diagrams/flowchart/flowDb.ts +++ b/packages/mermaid/src/diagrams/flowchart/flowDb.ts @@ -1012,6 +1012,7 @@ You have to call mermaid.initialize.` const baseNode = { id: vertex.id, label: vertex.text, + labelType: vertex.labelType, labelStyle: '', parentId, padding: config.flowchart?.padding || 8, @@ -1119,6 +1120,7 @@ You have to call mermaid.initialize.` end: rawEdge.end, type: rawEdge.type ?? 'normal', label: rawEdge.text, + labelType: rawEdge.labelType, labelpos: 'c', thickness: rawEdge.stroke, minlen: rawEdge.length, diff --git a/packages/mermaid/src/rendering-util/rendering-elements/edges.js b/packages/mermaid/src/rendering-util/rendering-elements/edges.js index db48e313c..550618dd1 100644 --- a/packages/mermaid/src/rendering-util/rendering-elements/edges.js +++ b/packages/mermaid/src/rendering-util/rendering-elements/edges.js @@ -43,12 +43,16 @@ export const getLabelStyles = (styleArray) => { export const insertEdgeLabel = async (elem, edge) => { let useHtmlLabels = evaluate(getConfig().flowchart.htmlLabels); - const labelElement = await createText(elem, edge.label, { - style: getLabelStyles(edge.labelStyle), - useHtmlLabels, - addSvgBackground: true, - isNode: false, - }); + const labelElement = + edge.labelType === 'markdown' + ? await createText(elem, edge.label, { + style: getLabelStyles(edge.labelStyle), + useHtmlLabels, + addSvgBackground: true, + isNode: false, + }) + : await createLabel(edge.label, getLabelStyles(edge.labelStyle), undefined, false); + log.info('abc82', edge, edge.labelType); // Create outer g, edgeLabel, this will be positioned after graph layout diff --git a/packages/mermaid/src/rendering-util/rendering-elements/shapes/util.ts b/packages/mermaid/src/rendering-util/rendering-elements/shapes/util.ts index 52471ecc0..ac6dfddbf 100644 --- a/packages/mermaid/src/rendering-util/rendering-elements/shapes/util.ts +++ b/packages/mermaid/src/rendering-util/rendering-elements/shapes/util.ts @@ -1,3 +1,4 @@ +import createLabel from '../createLabel.js'; import { createText } from '../../createText.js'; import type { Node } from '../../types.js'; import { getConfig } from '../../../diagram-api/diagramAPI.js'; @@ -40,14 +41,26 @@ export const labelHelper = async( label = typeof node.label === 'string' ? node.label : node.label[0]; } - const text = await createText(labelEl, sanitizeText(decodeEntities(label), getConfig()), { - useHtmlLabels, - width: node.width || getConfig().flowchart?.wrappingWidth, - // @ts-expect-error -- This is currently not used. Should this be `classes` instead? - cssClasses: 'markdown-node-label', - style: node.labelStyle, - addSvgBackground: !!node.icon || !!node.img, - }); + let text; + if (node.labelType !== 'string') { + text = await createText(labelEl, sanitizeText(decodeEntities(label), getConfig()), { + useHtmlLabels, + width: node.width || getConfig().flowchart?.wrappingWidth, + // @ts-expect-error -- This is currently not used. Should this be `classes` instead? + cssClasses: 'markdown-node-label', + style: node.labelStyle, + addSvgBackground: !!node.icon || !!node.img, + }); + } else { + const labelElement = await createLabel( + sanitizeText(decodeEntities(label), getConfig()), + node.labelStyle, + false, + true + ); + text = labelEl.node()?.appendChild(labelElement); + } + // Get the size of the label let bbox = text.getBBox(); const halfPadding = (node?.padding ?? 0) / 2;