Skip to content

Commit 4201e47

Browse files
committed
fix: Arrow markers in flowchart-elk
1 parent 46a5b95 commit 4201e47

File tree

1 file changed

+66
-23
lines changed

1 file changed

+66
-23
lines changed

packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js

+66-23
Original file line numberDiff line numberDiff line change
@@ -569,8 +569,9 @@ export const addEdges = function (edges, diagObj, graph, svg) {
569569
* @param edgeData
570570
* @param diagramType
571571
* @param arrowMarkerAbsolute
572+
* @param id
572573
*/
573-
const addMarkersToEdge = function (svgPath, edgeData, diagramType, arrowMarkerAbsolute) {
574+
const addMarkersToEdge = function (svgPath, edgeData, diagramType, arrowMarkerAbsolute, id) {
574575
let url = '';
575576
// Check configuration for absolute path
576577
if (arrowMarkerAbsolute) {
@@ -587,61 +588,103 @@ const addMarkersToEdge = function (svgPath, edgeData, diagramType, arrowMarkerAb
587588
// look in edge data and decide which marker to use
588589
switch (edgeData.arrowTypeStart) {
589590
case 'arrow_cross':
590-
svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-crossStart' + ')');
591+
svgPath.attr(
592+
'marker-start',
593+
'url(' + url + '#' + id + '_' + diagramType + '-crossStart' + ')'
594+
);
591595
break;
592596
case 'arrow_point':
593-
svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-pointStart' + ')');
597+
svgPath.attr(
598+
'marker-start',
599+
'url(' + url + '#' + id + '_' + diagramType + '-pointStart' + ')'
600+
);
594601
break;
595602
case 'arrow_barb':
596-
svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-barbStart' + ')');
603+
svgPath.attr(
604+
'marker-start',
605+
'url(' + url + '#' + id + '_' + diagramType + '-barbStart' + ')'
606+
);
597607
break;
598608
case 'arrow_circle':
599-
svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-circleStart' + ')');
609+
svgPath.attr(
610+
'marker-start',
611+
'url(' + url + '#' + id + '_' + diagramType + '-circleStart' + ')'
612+
);
600613
break;
601614
case 'aggregation':
602-
svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-aggregationStart' + ')');
615+
svgPath.attr(
616+
'marker-start',
617+
'url(' + url + '#' + id + '_' + diagramType + '-aggregationStart' + ')'
618+
);
603619
break;
604620
case 'extension':
605-
svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-extensionStart' + ')');
621+
svgPath.attr(
622+
'marker-start',
623+
'url(' + url + '#' + id + '_' + diagramType + '-extensionStart' + ')'
624+
);
606625
break;
607626
case 'composition':
608-
svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-compositionStart' + ')');
627+
svgPath.attr(
628+
'marker-start',
629+
'url(' + url + '#' + id + '_' + diagramType + '-compositionStart' + ')'
630+
);
609631
break;
610632
case 'dependency':
611-
svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-dependencyStart' + ')');
633+
svgPath.attr(
634+
'marker-start',
635+
'url(' + url + '#' + id + '_' + diagramType + '-dependencyStart' + ')'
636+
);
612637
break;
613638
case 'lollipop':
614-
svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-lollipopStart' + ')');
639+
svgPath.attr(
640+
'marker-start',
641+
'url(' + url + '#' + id + '_' + diagramType + '-lollipopStart' + ')'
642+
);
615643
break;
616644
default:
617645
}
618646
switch (edgeData.arrowTypeEnd) {
619647
case 'arrow_cross':
620-
svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-crossEnd' + ')');
648+
svgPath.attr('marker-end', 'url(' + url + '#' + id + '_' + diagramType + '-crossEnd' + ')');
621649
break;
622650
case 'arrow_point':
623-
svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-pointEnd' + ')');
651+
svgPath.attr('marker-end', 'url(' + url + '#' + id + '_' + diagramType + '-pointEnd' + ')');
624652
break;
625653
case 'arrow_barb':
626-
svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-barbEnd' + ')');
654+
svgPath.attr('marker-end', 'url(' + url + '#' + id + '_' + diagramType + '-barbEnd' + ')');
627655
break;
628656
case 'arrow_circle':
629-
svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-circleEnd' + ')');
657+
svgPath.attr('marker-end', 'url(' + url + '#' + id + '_' + diagramType + '-circleEnd' + ')');
630658
break;
631659
case 'aggregation':
632-
svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-aggregationEnd' + ')');
660+
svgPath.attr(
661+
'marker-end',
662+
'url(' + url + '#' + id + '_' + diagramType + '-aggregationEnd' + ')'
663+
);
633664
break;
634665
case 'extension':
635-
svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-extensionEnd' + ')');
666+
svgPath.attr(
667+
'marker-end',
668+
'url(' + url + '#' + id + '_' + diagramType + '-extensionEnd' + ')'
669+
);
636670
break;
637671
case 'composition':
638-
svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-compositionEnd' + ')');
672+
svgPath.attr(
673+
'marker-end',
674+
'url(' + url + '#' + id + '_' + diagramType + '-compositionEnd' + ')'
675+
);
639676
break;
640677
case 'dependency':
641-
svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-dependencyEnd' + ')');
678+
svgPath.attr(
679+
'marker-end',
680+
'url(' + url + '#' + id + '_' + diagramType + '-dependencyEnd' + ')'
681+
);
642682
break;
643683
case 'lollipop':
644-
svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-lollipopEnd' + ')');
684+
svgPath.attr(
685+
'marker-end',
686+
'url(' + url + '#' + id + '_' + diagramType + '-lollipopEnd' + ')'
687+
);
645688
break;
646689
default:
647690
}
@@ -692,7 +735,7 @@ const calcOffset = function (src, dest, parentLookupDb) {
692735
return { x: ancestorOffset.posX, y: ancestorOffset.posY };
693736
};
694737

695-
const insertEdge = function (edgesEl, edge, edgeData, diagObj, parentLookupDb) {
738+
const insertEdge = function (edgesEl, edge, edgeData, diagObj, parentLookupDb, id) {
696739
const offset = calcOffset(edge.sourceId, edge.targetId, parentLookupDb);
697740

698741
const src = edge.sections[0].startPoint;
@@ -723,7 +766,7 @@ const insertEdge = function (edgesEl, edge, edgeData, diagObj, parentLookupDb) {
723766
'transform',
724767
`translate(${edge.labels[0].x + offset.x}, ${edge.labels[0].y + offset.y})`
725768
);
726-
addMarkersToEdge(edgePath, edgeData, diagObj.type, diagObj.arrowMarkerAbsolute);
769+
addMarkersToEdge(edgePath, edgeData, diagObj.type, diagObj.arrowMarkerAbsolute, id);
727770
};
728771

729772
/**
@@ -816,7 +859,7 @@ export const draw = async function (text, id, _version, diagObj) {
816859
const markers = ['point', 'circle', 'cross'];
817860

818861
// Add the marker definitions to the svg as marker tags
819-
insertMarkers(svg, markers, diagObj.type, diagObj.arrowMarkerAbsolute);
862+
insertMarkers(svg, markers, diagObj.type, id);
820863

821864
// Fetch the vertices/nodes and edges/links from the parsed graph definition
822865
const vert = diagObj.db.getVertices();
@@ -895,7 +938,7 @@ export const draw = async function (text, id, _version, diagObj) {
895938
drawNodes(0, 0, g.children, svg, subGraphsEl, diagObj, 0);
896939
log.info('after layout', g);
897940
g.edges?.map((edge) => {
898-
insertEdge(edgesEl, edge, edge.edgeData, diagObj, parentLookupDb);
941+
insertEdge(edgesEl, edge, edge.edgeData, diagObj, parentLookupDb, id);
899942
});
900943
setupGraphViewbox({}, svg, conf.diagramPadding, conf.useMaxWidth);
901944
// Remove element after layout

0 commit comments

Comments
 (0)