diff --git a/packages/mermaid/src/dagre-wrapper/edges.js b/packages/mermaid/src/dagre-wrapper/edges.js index 5f37009c9..f945caf94 100644 --- a/packages/mermaid/src/dagre-wrapper/edges.js +++ b/packages/mermaid/src/dagre-wrapper/edges.js @@ -4,7 +4,7 @@ import { createText } from '../rendering-util/createText.js'; import { line, curveBasis, select } from 'd3'; import { getConfig } from '../diagram-api/diagramAPI.js'; import utils from '../utils.js'; -import { evaluate } from '../diagrams/common/common.js'; +import { evaluate, getUrl } from '../diagrams/common/common.js'; import { getLineFunctionsWithOffset } from '../utils/lineWithOffset.js'; import { getSubGraphTitleMargins } from '../utils/subGraphTitleMargins.js'; import { addEdgeMarkers } from './edgeMarker.js'; @@ -440,15 +440,7 @@ export const insertEdge = function (elem, e, edge, clusterDb, diagramType, graph let url = ''; // // TODO: Can we load this config only from the rendered graph type? if (getConfig().flowchart.arrowMarkerAbsolute || getConfig().state.arrowMarkerAbsolute) { - url = - window.location.protocol + - '//' + - window.location.host + - window.location.pathname + - window.location.search; - url = url.replace(/\\/g, '\\\\'); - url = url.replace(/\(/g, '\\('); - url = url.replace(/\)/g, '\\)'); + url = getUrl(true); } addEdgeMarkers(svgPath, edge, url, id, diagramType); diff --git a/packages/mermaid/src/diagrams/class/svgDraw.js b/packages/mermaid/src/diagrams/class/svgDraw.js index 28e7955a1..ecea2b1de 100644 --- a/packages/mermaid/src/diagrams/class/svgDraw.js +++ b/packages/mermaid/src/diagrams/class/svgDraw.js @@ -1,7 +1,7 @@ import { line, curveBasis } from 'd3'; import utils from '../../utils.js'; import { log } from '../../logger.js'; -import { parseGenericTypes } from '../common/common.js'; +import { parseGenericTypes, getUrl } from '../common/common.js'; let edgeCount = 0; export const drawEdge = function (elem, path, relation, conf, diagObj) { @@ -42,15 +42,7 @@ export const drawEdge = function (elem, path, relation, conf, diagObj) { .attr('class', 'relation'); let url = ''; if (conf.arrowMarkerAbsolute) { - url = - window.location.protocol + - '//' + - window.location.host + - window.location.pathname + - window.location.search; - url = url.replace(/\\/g, '\\\\'); - url = url.replace(/\(/g, '\\('); - url = url.replace(/\)/g, '\\)'); + url = getUrl(true); } if (relation.relation.lineType == 1) { diff --git a/packages/mermaid/src/diagrams/common/common.ts b/packages/mermaid/src/diagrams/common/common.ts index fc5ae1aa3..bddf501ad 100644 --- a/packages/mermaid/src/diagrams/common/common.ts +++ b/packages/mermaid/src/diagrams/common/common.ts @@ -158,9 +158,8 @@ const getUrl = (useAbsolute: boolean): string => { window.location.host + window.location.pathname + window.location.search; - url = url.replace(/\\/g, '\\\\'); - url = url.replaceAll(/\(/g, '\\('); - url = url.replaceAll(/\)/g, '\\)'); + + url = CSS.escape(url); } return url; diff --git a/packages/mermaid/src/diagrams/er/erRenderer.js b/packages/mermaid/src/diagrams/er/erRenderer.js index 5ee51ccc9..a6f7745aa 100644 --- a/packages/mermaid/src/diagrams/er/erRenderer.js +++ b/packages/mermaid/src/diagrams/er/erRenderer.js @@ -6,7 +6,7 @@ import { log } from '../../logger.js'; import utils from '../../utils.js'; import erMarkers from './erMarkers.js'; import { configureSvgSize } from '../../setupGraphViewbox.js'; -import { parseGenericTypes } from '../common/common.js'; +import { parseGenericTypes, getUrl } from '../common/common.js'; import { v5 as uuid5 } from 'uuid'; /** Regex used to remove chars from the entity name so the result can be used in an id */ @@ -451,15 +451,7 @@ const drawRelationshipFromLayout = function (svg, rel, g, insert, diagObj) { // TODO: Understand this better let url = ''; if (conf.arrowMarkerAbsolute) { - url = - window.location.protocol + - '//' + - window.location.host + - window.location.pathname + - window.location.search; - url = url.replace(/\\/g, '\\\\'); // Escape backslashes - url = url.replace(/\(/g, '\\('); - url = url.replace(/\)/g, '\\)'); + url = getUrl(true); } // Decide which start and end markers it needs. It may be possible to be more concise here diff --git a/packages/mermaid/src/diagrams/sequence/sequenceRenderer.ts b/packages/mermaid/src/diagrams/sequence/sequenceRenderer.ts index 9e126ca82..cfba92b79 100644 --- a/packages/mermaid/src/diagrams/sequence/sequenceRenderer.ts +++ b/packages/mermaid/src/diagrams/sequence/sequenceRenderer.ts @@ -3,6 +3,7 @@ import { select } from 'd3'; import svgDraw, { drawKatex, ACTOR_TYPE_WIDTH, drawText, fixLifeLineHeights } from './svgDraw.js'; import { log } from '../../logger.js'; import common, { calculateMathMLDimensions, hasKatex } from '../common/common.js'; +import { getUrl } from '../common/common.js'; import * as svgDrawCommon from '../common/svgDrawCommon.js'; import { getConfig } from '../../diagram-api/diagramAPI.js'; import assignWithDepth from '../../assignWithDepth.js'; @@ -449,15 +450,7 @@ const drawMessage = async function (diagram, msgModel, lineStartY: number, diagO let url = ''; if (conf.arrowMarkerAbsolute) { - url = - window.location.protocol + - '//' + - window.location.host + - window.location.pathname + - window.location.search; - url = url.replace(/\\/g, '\\\\'); - url = url.replace(/\(/g, '\\('); - url = url.replace(/\)/g, '\\)'); + url = getUrl(true); } line.attr('stroke-width', 2); diff --git a/packages/mermaid/src/diagrams/state/shapes.js b/packages/mermaid/src/diagrams/state/shapes.js index 7087f940b..43913070c 100644 --- a/packages/mermaid/src/diagrams/state/shapes.js +++ b/packages/mermaid/src/diagrams/state/shapes.js @@ -1,7 +1,7 @@ import { line, curveBasis } from 'd3'; import { StateDB } from './stateDb.js'; import utils from '../../utils.js'; -import common from '../common/common.js'; +import common, {getUrl} from '../common/common.js'; import { getConfig } from '../../diagram-api/diagramAPI.js'; import { log } from '../../logger.js'; @@ -444,15 +444,7 @@ export const drawEdge = function (elem, path, relation) { .attr('class', 'transition'); let url = ''; if (getConfig().state.arrowMarkerAbsolute) { - url = - window.location.protocol + - '//' + - window.location.host + - window.location.pathname + - window.location.search; - url = url.replace(/\\/g, '\\\\'); - url = url.replace(/\(/g, '\\('); - url = url.replace(/\)/g, '\\)'); + url = getUrl(true); } svgPath.attr( diff --git a/packages/mermaid/src/rendering-util/rendering-elements/edges.js b/packages/mermaid/src/rendering-util/rendering-elements/edges.js index cca660935..a97668d5f 100644 --- a/packages/mermaid/src/rendering-util/rendering-elements/edges.js +++ b/packages/mermaid/src/rendering-util/rendering-elements/edges.js @@ -1,5 +1,5 @@ import { getConfig } from '../../diagram-api/diagramAPI.js'; -import { evaluate } from '../../diagrams/common/common.js'; +import { evaluate, getUrl } from '../../diagrams/common/common.js'; import { log } from '../../logger.js'; import { createText } from '../createText.js'; import utils from '../../utils.js'; @@ -631,13 +631,7 @@ export const insertEdge = function (elem, edge, clusterDb, diagramType, startNod let url = ''; if (getConfig().flowchart.arrowMarkerAbsolute || getConfig().state.arrowMarkerAbsolute) { - url = - window.location.protocol + - '//' + - window.location.host + - window.location.pathname + - window.location.search; - url = url.replace(/\\/g, '\\\\').replace(/\(/g, '\\(').replace(/\)/g, '\\)'); + url = getUrl(true); } log.info('arrowTypeStart', edge.arrowTypeStart); log.info('arrowTypeEnd', edge.arrowTypeEnd);