mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-08-31 22:26:53 +02:00
259 lines
6.8 KiB
JavaScript
259 lines
6.8 KiB
JavaScript
/** Setup arrow head and define the marker. The result is appended to the svg. */
|
|
|
|
import { log } from '../logger';
|
|
|
|
// Only add the number of markers that the diagram needs
|
|
const insertMarkers = (elem, markerArray, type, id) => {
|
|
markerArray.forEach((markerName) => {
|
|
markers[markerName](elem, type, id);
|
|
});
|
|
};
|
|
|
|
const extension = (elem, type, id) => {
|
|
log.trace('Making markers for ', id);
|
|
elem
|
|
.append('defs')
|
|
.append('marker')
|
|
.attr('id', type + '-extensionStart')
|
|
.attr('class', 'marker extension ' + type)
|
|
.attr('refX', 0)
|
|
.attr('refY', 7)
|
|
.attr('markerWidth', 190)
|
|
.attr('markerHeight', 240)
|
|
.attr('orient', 'auto')
|
|
.append('path')
|
|
.attr('d', 'M 1,7 L18,13 V 1 Z');
|
|
|
|
elem
|
|
.append('defs')
|
|
.append('marker')
|
|
.attr('id', type + '-extensionEnd')
|
|
.attr('class', 'marker extension ' + type)
|
|
.attr('refX', 19)
|
|
.attr('refY', 7)
|
|
.attr('markerWidth', 20)
|
|
.attr('markerHeight', 28)
|
|
.attr('orient', 'auto')
|
|
.append('path')
|
|
.attr('d', 'M 1,1 V 13 L18,7 Z'); // this is actual shape for arrowhead
|
|
};
|
|
|
|
const composition = (elem, type) => {
|
|
elem
|
|
.append('defs')
|
|
.append('marker')
|
|
.attr('id', type + '-compositionStart')
|
|
.attr('class', 'marker composition ' + type)
|
|
.attr('refX', 0)
|
|
.attr('refY', 7)
|
|
.attr('markerWidth', 190)
|
|
.attr('markerHeight', 240)
|
|
.attr('orient', 'auto')
|
|
.append('path')
|
|
.attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');
|
|
|
|
elem
|
|
.append('defs')
|
|
.append('marker')
|
|
.attr('id', type + '-compositionEnd')
|
|
.attr('class', 'marker composition ' + type)
|
|
.attr('refX', 19)
|
|
.attr('refY', 7)
|
|
.attr('markerWidth', 20)
|
|
.attr('markerHeight', 28)
|
|
.attr('orient', 'auto')
|
|
.append('path')
|
|
.attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');
|
|
};
|
|
const aggregation = (elem, type) => {
|
|
elem
|
|
.append('defs')
|
|
.append('marker')
|
|
.attr('id', type + '-aggregationStart')
|
|
.attr('class', 'marker aggregation ' + type)
|
|
.attr('refX', 0)
|
|
.attr('refY', 7)
|
|
.attr('markerWidth', 190)
|
|
.attr('markerHeight', 240)
|
|
.attr('orient', 'auto')
|
|
.append('path')
|
|
.attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');
|
|
|
|
elem
|
|
.append('defs')
|
|
.append('marker')
|
|
.attr('id', type + '-aggregationEnd')
|
|
.attr('class', 'marker aggregation ' + type)
|
|
.attr('refX', 19)
|
|
.attr('refY', 7)
|
|
.attr('markerWidth', 20)
|
|
.attr('markerHeight', 28)
|
|
.attr('orient', 'auto')
|
|
.append('path')
|
|
.attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');
|
|
};
|
|
const dependency = (elem, type) => {
|
|
elem
|
|
.append('defs')
|
|
.append('marker')
|
|
.attr('id', type + '-dependencyStart')
|
|
.attr('class', 'marker dependency ' + type)
|
|
.attr('refX', 0)
|
|
.attr('refY', 7)
|
|
.attr('markerWidth', 190)
|
|
.attr('markerHeight', 240)
|
|
.attr('orient', 'auto')
|
|
.append('path')
|
|
.attr('d', 'M 5,7 L9,13 L1,7 L9,1 Z');
|
|
|
|
elem
|
|
.append('defs')
|
|
.append('marker')
|
|
.attr('id', type + '-dependencyEnd')
|
|
.attr('class', 'marker dependency ' + type)
|
|
.attr('refX', 19)
|
|
.attr('refY', 7)
|
|
.attr('markerWidth', 20)
|
|
.attr('markerHeight', 28)
|
|
.attr('orient', 'auto')
|
|
.append('path')
|
|
.attr('d', 'M 18,7 L9,13 L14,7 L9,1 Z');
|
|
};
|
|
const point = (elem, type) => {
|
|
elem
|
|
.append('marker')
|
|
.attr('id', type + '-pointEnd')
|
|
.attr('class', 'marker ' + type)
|
|
.attr('viewBox', '0 0 10 10')
|
|
.attr('refX', 9)
|
|
.attr('refY', 5)
|
|
.attr('markerUnits', 'userSpaceOnUse')
|
|
.attr('markerWidth', 12)
|
|
.attr('markerHeight', 12)
|
|
.attr('orient', 'auto')
|
|
.append('path')
|
|
.attr('d', 'M 0 0 L 10 5 L 0 10 z')
|
|
.attr('class', 'arrowMarkerPath')
|
|
.style('stroke-width', 1)
|
|
.style('stroke-dasharray', '1,0');
|
|
elem
|
|
.append('marker')
|
|
.attr('id', type + '-pointStart')
|
|
.attr('class', 'marker ' + type)
|
|
.attr('viewBox', '0 0 10 10')
|
|
.attr('refX', 0)
|
|
.attr('refY', 5)
|
|
.attr('markerUnits', 'userSpaceOnUse')
|
|
.attr('markerWidth', 12)
|
|
.attr('markerHeight', 12)
|
|
.attr('orient', 'auto')
|
|
.append('path')
|
|
.attr('d', 'M 0 5 L 10 10 L 10 0 z')
|
|
.attr('class', 'arrowMarkerPath')
|
|
.style('stroke-width', 1)
|
|
.style('stroke-dasharray', '1,0');
|
|
};
|
|
const circle = (elem, type) => {
|
|
elem
|
|
.append('marker')
|
|
.attr('id', type + '-circleEnd')
|
|
.attr('class', 'marker ' + type)
|
|
.attr('viewBox', '0 0 10 10')
|
|
.attr('refX', 11)
|
|
.attr('refY', 5)
|
|
.attr('markerUnits', 'userSpaceOnUse')
|
|
.attr('markerWidth', 11)
|
|
.attr('markerHeight', 11)
|
|
.attr('orient', 'auto')
|
|
.append('circle')
|
|
.attr('cx', '5')
|
|
.attr('cy', '5')
|
|
.attr('r', '5')
|
|
.attr('class', 'arrowMarkerPath')
|
|
.style('stroke-width', 1)
|
|
.style('stroke-dasharray', '1,0');
|
|
|
|
elem
|
|
.append('marker')
|
|
.attr('id', type + '-circleStart')
|
|
.attr('class', 'marker ' + type)
|
|
.attr('viewBox', '0 0 10 10')
|
|
.attr('refX', -1)
|
|
.attr('refY', 5)
|
|
.attr('markerUnits', 'userSpaceOnUse')
|
|
.attr('markerWidth', 11)
|
|
.attr('markerHeight', 11)
|
|
.attr('orient', 'auto')
|
|
.append('circle')
|
|
.attr('cx', '5')
|
|
.attr('cy', '5')
|
|
.attr('r', '5')
|
|
.attr('class', 'arrowMarkerPath')
|
|
.style('stroke-width', 1)
|
|
.style('stroke-dasharray', '1,0');
|
|
};
|
|
const cross = (elem, type) => {
|
|
elem
|
|
.append('marker')
|
|
.attr('id', type + '-crossEnd')
|
|
.attr('class', 'marker cross ' + type)
|
|
.attr('viewBox', '0 0 11 11')
|
|
.attr('refX', 12)
|
|
.attr('refY', 5.2)
|
|
.attr('markerUnits', 'userSpaceOnUse')
|
|
.attr('markerWidth', 11)
|
|
.attr('markerHeight', 11)
|
|
.attr('orient', 'auto')
|
|
.append('path')
|
|
// .attr('stroke', 'black')
|
|
.attr('d', 'M 1,1 l 9,9 M 10,1 l -9,9')
|
|
.attr('class', 'arrowMarkerPath')
|
|
.style('stroke-width', 2)
|
|
.style('stroke-dasharray', '1,0');
|
|
|
|
elem
|
|
.append('marker')
|
|
.attr('id', type + '-crossStart')
|
|
.attr('class', 'marker cross ' + type)
|
|
.attr('viewBox', '0 0 11 11')
|
|
.attr('refX', -1)
|
|
.attr('refY', 5.2)
|
|
.attr('markerUnits', 'userSpaceOnUse')
|
|
.attr('markerWidth', 11)
|
|
.attr('markerHeight', 11)
|
|
.attr('orient', 'auto')
|
|
.append('path')
|
|
// .attr('stroke', 'black')
|
|
.attr('d', 'M 1,1 l 9,9 M 10,1 l -9,9')
|
|
.attr('class', 'arrowMarkerPath')
|
|
.style('stroke-width', 2)
|
|
.style('stroke-dasharray', '1,0');
|
|
};
|
|
const barb = (elem, type) => {
|
|
elem
|
|
.append('defs')
|
|
.append('marker')
|
|
.attr('id', type + '-barbEnd')
|
|
.attr('refX', 19)
|
|
.attr('refY', 7)
|
|
.attr('markerWidth', 20)
|
|
.attr('markerHeight', 14)
|
|
.attr('markerUnits', 'strokeWidth')
|
|
.attr('orient', 'auto')
|
|
.append('path')
|
|
.attr('d', 'M 19,7 L9,13 L14,7 L9,1 Z');
|
|
};
|
|
|
|
// TODO rename the class diagram markers to something shape descriptive and semantic free
|
|
const markers = {
|
|
extension,
|
|
composition,
|
|
aggregation,
|
|
dependency,
|
|
point,
|
|
circle,
|
|
cross,
|
|
barb,
|
|
};
|
|
export default insertMarkers;
|