diff --git a/cypress/platform/knsv.html b/cypress/platform/knsv.html
index da0106a2d..c644d585e 100644
--- a/cypress/platform/knsv.html
+++ b/cypress/platform/knsv.html
@@ -67,7 +67,7 @@
commit
commit
-
+
sequenceDiagram
title: My Sequence Diagram Title
accTitle: My Acc Sequence Diagram
@@ -139,7 +139,7 @@ requirementDiagram
test_req - contains -> test_req3
test_req <- copies - test_entity2
-
+
stateDiagram
state Active {
Idle
@@ -165,8 +165,7 @@ stateDiagram
end
end
end
- B ->> A: Return
-
+ B ->> A: Return
classDiagram
accTitle: My class diagram
diff --git a/src/Diagram.js b/src/Diagram.js
index 512778520..ba7988140 100644
--- a/src/Diagram.js
+++ b/src/Diagram.js
@@ -80,10 +80,20 @@ class Diagram {
break;
case 'sequenceDiagram':
case 'sequence':
+ cnf.sequence.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;
+ if (cnf.sequenceDiagram) {
+ // backwards compatibility
+ sequenceRenderer.setConf(Object.assign(cnf.sequence, cnf.sequenceDiagram));
+ console.error(
+ '`mermaid config.sequenceDiagram` has been renamed to `config.sequence`. Please update your mermaid config.'
+ );
+ }
this.parser = sequenceParser;
this.parser.parser.yy = sequenceDb;
this.db = sequenceDb;
+ this.db.setWrap(cnf.wrap);
this.renderer = sequenceRenderer;
+ this.txt = this.txt + '\n';
break;
case 'gantt':
this.parser = ganttParser;
diff --git a/src/diagrams/c4/c4Renderer.js b/src/diagrams/c4/c4Renderer.js
index 7d821f87d..acd39fa47 100644
--- a/src/diagrams/c4/c4Renderer.js
+++ b/src/diagrams/c4/c4Renderer.js
@@ -25,7 +25,7 @@ parser.yy = c4Db;
let conf = {};
class Bounds {
- constructor() {
+ constructor(diagObj) {
this.name = '';
this.data = {};
this.data.startx = undefined;
@@ -41,7 +41,7 @@ class Bounds {
this.nextData.stopy = undefined;
this.nextData.cnt = 0;
- setConf(parser.yy.getConfig());
+ setConf(diagObj.db.getConfig());
}
setData(startx, stopx, starty, stopy) {
@@ -96,7 +96,7 @@ class Bounds {
this.updateVal(this.nextData, 'stopy', _stopy, Math.max);
}
- init() {
+ init(diagObj) {
this.name = '';
this.data = {
startx: undefined,
@@ -112,7 +112,7 @@ class Bounds {
stopy: undefined,
cnt: 0,
};
- setConf(parser.yy.getConfig());
+ setConf(diagObj.db.getConfig());
}
bumpLastMargin(margin) {
@@ -411,13 +411,13 @@ let getIntersectPoints = function (fromNode, endNode) {
return { startPoint: startPoint, endPoint: endPoint };
};
-export const drawRels = function (diagram, rels, getC4ShapeObj) {
+export const drawRels = function (diagram, rels, getC4ShapeObj, diagObj) {
let i = 0;
for (let rel of rels) {
i = i + 1;
let relTextWrap = rel.wrap && conf.wrap;
let relConf = messageFont(conf);
- let diagramType = parser.yy.getC4Type();
+ let diagramType = diagObj.db.getC4Type();
if (diagramType === 'C4Dynamic') rel.label.text = i + ': ' + rel.label.text;
let textLimitWidth = calculateTextWidth(rel.label.text, relConf);
calcC4ShapeTextWH('label', rel, relTextWrap, relConf, textLimitWidth);
@@ -446,9 +446,10 @@ export const drawRels = function (diagram, rels, getC4ShapeObj) {
* @param parentBoundaryAlias
* @param parentBounds
* @param currentBoundarys
+ * @param diagObj
*/
-function drawInsideBoundary(diagram, parentBoundaryAlias, parentBounds, currentBoundarys) {
- let currentBounds = new Bounds();
+function drawInsideBoundary(diagram, parentBoundaryAlias, parentBounds, currentBoundarys, diagObj) {
+ let currentBounds = new Bounds(diagObj);
// Calculate the width limit of the boundar. label/type 的长度,
currentBounds.data.widthLimit =
parentBounds.data.widthLimit / Math.min(c4BoundaryInRow, currentBoundarys.length);
@@ -527,8 +528,8 @@ function drawInsideBoundary(diagram, parentBoundaryAlias, parentBounds, currentB
currentBounds.setData(_x, _x, _y, _y);
}
currentBounds.name = currentBoundary.alias;
- let currentPersonOrSystemArray = parser.yy.getC4ShapeArray(currentBoundary.alias);
- let currentPersonOrSystemKeys = parser.yy.getC4ShapeKeys(currentBoundary.alias);
+ let currentPersonOrSystemArray = diagObj.db.getC4ShapeArray(currentBoundary.alias);
+ let currentPersonOrSystemKeys = diagObj.db.getC4ShapeKeys(currentBoundary.alias);
if (currentPersonOrSystemKeys.length > 0) {
drawC4ShapeArray(
@@ -539,13 +540,19 @@ function drawInsideBoundary(diagram, parentBoundaryAlias, parentBounds, currentB
);
}
parentBoundaryAlias = currentBoundary.alias;
- let nextCurrentBoundarys = parser.yy.getBoundarys(parentBoundaryAlias);
+ let nextCurrentBoundarys = diagObj.db.getBoundarys(parentBoundaryAlias);
if (nextCurrentBoundarys.length > 0) {
// draw boundary inside currentBoundary
// bounds.init();
// parentBoundaryWidthLimit = bounds.data.stopx - bounds.startx;
- drawInsideBoundary(diagram, parentBoundaryAlias, currentBounds, nextCurrentBoundarys);
+ drawInsideBoundary(
+ diagram,
+ parentBoundaryAlias,
+ currentBounds,
+ nextCurrentBoundarys,
+ diagObj
+ );
}
// draw boundary
if (currentBoundary.alias !== 'global') drawBoundary(diagram, currentBoundary, currentBounds);
@@ -566,9 +573,12 @@ function drawInsideBoundary(diagram, parentBoundaryAlias, parentBounds, currentB
* Draws a sequenceDiagram in the tag with id: id based on the graph definition in text.
*
* @param {any} text
+ * @param _text
* @param {any} id
+ * @param _version
+ * @param diagObj
*/
-export const draw = function (text, id) {
+export const draw = function (_text, id, _version, diagObj) {
conf = configApi.getConfig().c4;
const securityLevel = configApi.getConfig().securityLevel;
// Handle root and Document for when rendering in sanbox mode
@@ -580,13 +590,10 @@ export const draw = function (text, id) {
securityLevel === 'sandbox'
? select(sandboxElement.nodes()[0].contentDocument.body)
: select('body');
- const doc = securityLevel === 'sandbox' ? sandboxElement.nodes()[0].contentDocument : document;
- let db = parser.yy;
+ let db = diagObj.db;
- parser.yy.clear();
- parser.yy.setWrap(conf.wrap);
- parser.parse(text + '\n');
+ diagObj.db.setWrap(conf.wrap);
c4ShapeInRow = db.getC4ShapeInRow();
c4BoundaryInRow = db.getC4BoundaryInRow();
@@ -600,7 +607,7 @@ export const draw = function (text, id) {
svgDraw.insertDatabaseIcon(diagram);
svgDraw.insertClockIcon(diagram);
- let screenBounds = new Bounds();
+ let screenBounds = new Bounds(diagObj);
screenBounds.setData(
conf.diagramMarginX,
@@ -613,12 +620,12 @@ export const draw = function (text, id) {
globalBoundaryMaxX = conf.diagramMarginX;
globalBoundaryMaxY = conf.diagramMarginY;
- const title = parser.yy.getTitle();
- const c4type = parser.yy.getC4Type();
- let currentBoundarys = parser.yy.getBoundarys('');
+ const title = diagObj.db.getTitle();
+ const c4type = diagObj.db.getC4Type();
+ let currentBoundarys = diagObj.db.getBoundarys('');
// switch (c4type) {
// case 'C4Context':
- drawInsideBoundary(diagram, '', screenBounds, currentBoundarys);
+ drawInsideBoundary(diagram, '', screenBounds, currentBoundarys, diagObj);
// break;
// }
@@ -628,7 +635,7 @@ export const draw = function (text, id) {
svgDraw.insertArrowCrossHead(diagram);
svgDraw.insertArrowFilledHead(diagram);
- drawRels(diagram, parser.yy.getRels(), parser.yy.getC4Shape);
+ drawRels(diagram, diagObj.db.getRels(), diagObj.db.getC4Shape, diagObj);
screenBounds.data.stopx = globalBoundaryMaxX;
screenBounds.data.stopy = globalBoundaryMaxY;
diff --git a/src/diagrams/sequence/sequenceRenderer.js b/src/diagrams/sequence/sequenceRenderer.js
index d83d9dc2b..809e3164f 100644
--- a/src/diagrams/sequence/sequenceRenderer.js
+++ b/src/diagrams/sequence/sequenceRenderer.js
@@ -1,15 +1,13 @@
import { select, selectAll } from 'd3';
import svgDraw, { drawText, fixLifeLineHeights } from './svgDraw';
import { log } from '../../logger';
-import { parser } from './parser/sequenceDiagram';
+// import { parser } from './parser/sequenceDiagram';
import common from '../common/common';
-import sequenceDb from './sequenceDb';
+// import sequenceDb from './sequenceDb';
import * as configApi from '../../config';
import utils, { assignWithDepth, configureSvgSize } from '../../utils';
import addSVGAccessibilityFields from '../../accessibility';
-parser.yy = sequenceDb;
-
let conf = {};
export const bounds = {
@@ -86,7 +84,7 @@ export const bounds = {
stopy: undefined,
};
this.verticalPos = 0;
- setConf(parser.yy.getConfig());
+ setConf(configApi.getConfig());
},
updateVal: function (obj, key, val, fun) {
if (typeof obj[key] === 'undefined') {
@@ -327,8 +325,9 @@ const boundMessage = function (diagram, msgModel) {
* @param {any} diagram - The parent of the message element
* @param {any} msgModel - The model containing fields describing a message
* @param {float} lineStarty - The Y coordinate at which the message line starts
+ * @param diagObj
*/
-const drawMessage = function (diagram, msgModel, lineStarty) {
+const drawMessage = function (diagram, msgModel, lineStarty, diagObj) {
const { startx, stopx, starty, message, type, sequenceIndex, sequenceVisible } = msgModel;
let textDims = utils.calculateTextDimensions(message, messageFont(conf));
const textObj = svgDraw.getTextObj();
@@ -394,10 +393,10 @@ const drawMessage = function (diagram, msgModel, lineStarty) {
// Make an SVG Container
// Draw the line
if (
- type === parser.yy.LINETYPE.DOTTED ||
- type === parser.yy.LINETYPE.DOTTED_CROSS ||
- type === parser.yy.LINETYPE.DOTTED_POINT ||
- type === parser.yy.LINETYPE.DOTTED_OPEN
+ type === diagObj.db.LINETYPE.DOTTED ||
+ type === diagObj.db.LINETYPE.DOTTED_CROSS ||
+ type === diagObj.db.LINETYPE.DOTTED_POINT ||
+ type === diagObj.db.LINETYPE.DOTTED_OPEN
) {
line.style('stroke-dasharray', '3, 3');
line.attr('class', 'messageLine1');
@@ -420,14 +419,14 @@ const drawMessage = function (diagram, msgModel, lineStarty) {
line.attr('stroke-width', 2);
line.attr('stroke', 'none'); // handled by theme/css anyway
line.style('fill', 'none'); // remove any fill colour
- if (type === parser.yy.LINETYPE.SOLID || type === parser.yy.LINETYPE.DOTTED) {
+ if (type === diagObj.db.LINETYPE.SOLID || type === diagObj.db.LINETYPE.DOTTED) {
line.attr('marker-end', 'url(' + url + '#arrowhead)');
}
- if (type === parser.yy.LINETYPE.SOLID_POINT || type === parser.yy.LINETYPE.DOTTED_POINT) {
+ if (type === diagObj.db.LINETYPE.SOLID_POINT || type === diagObj.db.LINETYPE.DOTTED_POINT) {
line.attr('marker-end', 'url(' + url + '#filled-head)');
}
- if (type === parser.yy.LINETYPE.SOLID_CROSS || type === parser.yy.LINETYPE.DOTTED_CROSS) {
+ if (type === diagObj.db.LINETYPE.SOLID_CROSS || type === diagObj.db.LINETYPE.DOTTED_CROSS) {
line.attr('marker-end', 'url(' + url + '#crosshead)');
}
@@ -581,10 +580,13 @@ function adjustLoopHeightForWrap(loopWidths, msg, preMargin, postMargin, addLoop
/**
* Draws a sequenceDiagram in the tag with id: id based on the graph definition in text.
*
- * @param {any} text
- * @param {any} id
+ * @param {any} text The text of the diagram
+ * @param _text
+ * @param {any} id The id of the diagram which will be used as a DOM element id¨
+ * @param {any} _version Mermaid version from package.json
+ * @param {any} diagObj A stanard diagram containing the db and the text and type etc of the diagram
*/
-export const draw = function (text, id) {
+export const draw = function (_text, id, _version, diagObj) {
conf = configApi.getConfig().sequence;
const securityLevel = configApi.getConfig().securityLevel;
// Handle root and Document for when rendering in sanbox mode
@@ -592,28 +594,25 @@ export const draw = function (text, id) {
if (securityLevel === 'sandbox') {
sandboxElement = select('#i' + id);
}
+
const root =
securityLevel === 'sandbox'
? select(sandboxElement.nodes()[0].contentDocument.body)
: select('body');
const doc = securityLevel === 'sandbox' ? sandboxElement.nodes()[0].contentDocument : document;
-
- parser.yy.clear();
- parser.yy.setWrap(conf.wrap);
- parser.parse(text + '\n');
bounds.init();
- log.debug(`C:${JSON.stringify(conf, null, 2)}`);
+ log.debug(diagObj.db);
const diagram =
securityLevel === 'sandbox' ? root.select(`[id="${id}"]`) : select(`[id="${id}"]`);
// Fetch data from the parsing
- const actors = parser.yy.getActors();
- const actorKeys = parser.yy.getActorKeys();
- const messages = parser.yy.getMessages();
- const title = parser.yy.getDiagramTitle();
+ const actors = diagObj.db.getActors();
+ const actorKeys = diagObj.db.getActorKeys();
+ const messages = diagObj.db.getMessages();
+ const title = diagObj.db.getDiagramTitle();
- const maxMessageWidthPerActor = getMaxMessageWidthPerActor(actors, messages);
+ const maxMessageWidthPerActor = getMaxMessageWidthPerActor(actors, messages, diagObj);
conf.height = calculateActorMargins(actors, maxMessageWidthPerActor);
svgDraw.insertComputerIcon(diagram);
@@ -621,7 +620,7 @@ export const draw = function (text, id) {
svgDraw.insertClockIcon(diagram);
drawActors(diagram, actors, actorKeys, 0, conf, messages);
- const loopWidths = calculateLoopBounds(messages, actors, maxMessageWidthPerActor);
+ const loopWidths = calculateLoopBounds(messages, actors, maxMessageWidthPerActor, diagObj);
// The arrow head definition is attached to the svg once
svgDraw.insertArrowHead(diagram);
@@ -658,17 +657,17 @@ export const draw = function (text, id) {
let loopModel, noteModel, msgModel;
switch (msg.type) {
- case parser.yy.LINETYPE.NOTE:
+ case diagObj.db.LINETYPE.NOTE:
noteModel = msg.noteModel;
drawNote(diagram, noteModel);
break;
- case parser.yy.LINETYPE.ACTIVE_START:
+ case diagObj.db.LINETYPE.ACTIVE_START:
bounds.newActivation(msg, diagram, actors);
break;
- case parser.yy.LINETYPE.ACTIVE_END:
+ case diagObj.db.LINETYPE.ACTIVE_END:
activeEnd(msg, bounds.getVerticalPos());
break;
- case parser.yy.LINETYPE.LOOP_START:
+ case diagObj.db.LINETYPE.LOOP_START:
adjustLoopHeightForWrap(
loopWidths,
msg,
@@ -677,24 +676,24 @@ export const draw = function (text, id) {
(message) => bounds.newLoop(message)
);
break;
- case parser.yy.LINETYPE.LOOP_END:
+ case diagObj.db.LINETYPE.LOOP_END:
loopModel = bounds.endLoop();
svgDraw.drawLoop(diagram, loopModel, 'loop', conf);
bounds.bumpVerticalPos(loopModel.stopy - bounds.getVerticalPos());
bounds.models.addLoop(loopModel);
break;
- case parser.yy.LINETYPE.RECT_START:
+ case diagObj.db.LINETYPE.RECT_START:
adjustLoopHeightForWrap(loopWidths, msg, conf.boxMargin, conf.boxMargin, (message) =>
bounds.newLoop(undefined, message.message)
);
break;
- case parser.yy.LINETYPE.RECT_END:
+ case diagObj.db.LINETYPE.RECT_END:
loopModel = bounds.endLoop();
svgDraw.drawBackgroundRect(diagram, loopModel);
bounds.models.addLoop(loopModel);
bounds.bumpVerticalPos(loopModel.stopy - bounds.getVerticalPos());
break;
- case parser.yy.LINETYPE.OPT_START:
+ case diagObj.db.LINETYPE.OPT_START:
adjustLoopHeightForWrap(
loopWidths,
msg,
@@ -703,13 +702,13 @@ export const draw = function (text, id) {
(message) => bounds.newLoop(message)
);
break;
- case parser.yy.LINETYPE.OPT_END:
+ case diagObj.db.LINETYPE.OPT_END:
loopModel = bounds.endLoop();
svgDraw.drawLoop(diagram, loopModel, 'opt', conf);
bounds.bumpVerticalPos(loopModel.stopy - bounds.getVerticalPos());
bounds.models.addLoop(loopModel);
break;
- case parser.yy.LINETYPE.ALT_START:
+ case diagObj.db.LINETYPE.ALT_START:
adjustLoopHeightForWrap(
loopWidths,
msg,
@@ -718,7 +717,7 @@ export const draw = function (text, id) {
(message) => bounds.newLoop(message)
);
break;
- case parser.yy.LINETYPE.ALT_ELSE:
+ case diagObj.db.LINETYPE.ALT_ELSE:
adjustLoopHeightForWrap(
loopWidths,
msg,
@@ -727,13 +726,13 @@ export const draw = function (text, id) {
(message) => bounds.addSectionToLoop(message)
);
break;
- case parser.yy.LINETYPE.ALT_END:
+ case diagObj.db.LINETYPE.ALT_END:
loopModel = bounds.endLoop();
svgDraw.drawLoop(diagram, loopModel, 'alt', conf);
bounds.bumpVerticalPos(loopModel.stopy - bounds.getVerticalPos());
bounds.models.addLoop(loopModel);
break;
- case parser.yy.LINETYPE.PAR_START:
+ case diagObj.db.LINETYPE.PAR_START:
adjustLoopHeightForWrap(
loopWidths,
msg,
@@ -742,7 +741,7 @@ export const draw = function (text, id) {
(message) => bounds.newLoop(message)
);
break;
- case parser.yy.LINETYPE.PAR_AND:
+ case diagObj.db.LINETYPE.PAR_AND:
adjustLoopHeightForWrap(
loopWidths,
msg,
@@ -751,19 +750,19 @@ export const draw = function (text, id) {
(message) => bounds.addSectionToLoop(message)
);
break;
- case parser.yy.LINETYPE.PAR_END:
+ case diagObj.db.LINETYPE.PAR_END:
loopModel = bounds.endLoop();
svgDraw.drawLoop(diagram, loopModel, 'par', conf);
bounds.bumpVerticalPos(loopModel.stopy - bounds.getVerticalPos());
bounds.models.addLoop(loopModel);
break;
- case parser.yy.LINETYPE.AUTONUMBER:
+ case diagObj.db.LINETYPE.AUTONUMBER:
sequenceIndex = msg.message.start || sequenceIndex;
sequenceIndexStep = msg.message.step || sequenceIndexStep;
- if (msg.message.visible) parser.yy.enableSequenceNumbers();
- else parser.yy.disableSequenceNumbers();
+ if (msg.message.visible) diagObj.db.enableSequenceNumbers();
+ else diagObj.db.disableSequenceNumbers();
break;
- case parser.yy.LINETYPE.CRITICAL_START:
+ case diagObj.db.LINETYPE.CRITICAL_START:
adjustLoopHeightForWrap(
loopWidths,
msg,
@@ -772,7 +771,7 @@ export const draw = function (text, id) {
(message) => bounds.newLoop(message)
);
break;
- case parser.yy.LINETYPE.CRITICAL_OPTION:
+ case diagObj.db.LINETYPE.CRITICAL_OPTION:
adjustLoopHeightForWrap(
loopWidths,
msg,
@@ -781,13 +780,13 @@ export const draw = function (text, id) {
(message) => bounds.addSectionToLoop(message)
);
break;
- case parser.yy.LINETYPE.CRITICAL_END:
+ case diagObj.db.LINETYPE.CRITICAL_END:
loopModel = bounds.endLoop();
svgDraw.drawLoop(diagram, loopModel, 'critical', conf);
bounds.bumpVerticalPos(loopModel.stopy - bounds.getVerticalPos());
bounds.models.addLoop(loopModel);
break;
- case parser.yy.LINETYPE.BREAK_START:
+ case diagObj.db.LINETYPE.BREAK_START:
adjustLoopHeightForWrap(
loopWidths,
msg,
@@ -796,7 +795,7 @@ export const draw = function (text, id) {
(message) => bounds.newLoop(message)
);
break;
- case parser.yy.LINETYPE.BREAK_END:
+ case diagObj.db.LINETYPE.BREAK_END:
loopModel = bounds.endLoop();
svgDraw.drawLoop(diagram, loopModel, 'break', conf);
bounds.bumpVerticalPos(loopModel.stopy - bounds.getVerticalPos());
@@ -808,7 +807,7 @@ export const draw = function (text, id) {
msgModel = msg.msgModel;
msgModel.starty = bounds.getVerticalPos();
msgModel.sequenceIndex = sequenceIndex;
- msgModel.sequenceVisible = parser.yy.showSequenceNumbers();
+ msgModel.sequenceVisible = diagObj.db.showSequenceNumbers();
let lineStarty = boundMessage(diagram, msgModel);
messagesToDraw.push({ messageModel: msgModel, lineStarty: lineStarty });
bounds.models.addMessage(msgModel);
@@ -820,21 +819,21 @@ export const draw = function (text, id) {
// Increment sequence counter if msg.type is a line (and not another event like activation or note, etc)
if (
[
- parser.yy.LINETYPE.SOLID_OPEN,
- parser.yy.LINETYPE.DOTTED_OPEN,
- parser.yy.LINETYPE.SOLID,
- parser.yy.LINETYPE.DOTTED,
- parser.yy.LINETYPE.SOLID_CROSS,
- parser.yy.LINETYPE.DOTTED_CROSS,
- parser.yy.LINETYPE.SOLID_POINT,
- parser.yy.LINETYPE.DOTTED_POINT,
+ diagObj.db.LINETYPE.SOLID_OPEN,
+ diagObj.db.LINETYPE.DOTTED_OPEN,
+ diagObj.db.LINETYPE.SOLID,
+ diagObj.db.LINETYPE.DOTTED,
+ diagObj.db.LINETYPE.SOLID_CROSS,
+ diagObj.db.LINETYPE.DOTTED_CROSS,
+ diagObj.db.LINETYPE.SOLID_POINT,
+ diagObj.db.LINETYPE.DOTTED_POINT,
].includes(msg.type)
) {
sequenceIndex = sequenceIndex + sequenceIndexStep;
}
});
- messagesToDraw.forEach((e) => drawMessage(diagram, e.messageModel, e.lineStarty));
+ messagesToDraw.forEach((e) => drawMessage(diagram, e.messageModel, e.lineStarty, diagObj));
if (conf.mirrorActors) {
// Draw actors below diagram
@@ -895,7 +894,7 @@ export const draw = function (text, id) {
(height + extraVertForTitle)
);
- addSVGAccessibilityFields(parser.yy, diagram, id);
+ addSVGAccessibilityFields(diagObj.db, diagram, id);
log.debug(`models:`, bounds.models);
};
@@ -907,9 +906,10 @@ export const draw = function (text, id) {
*
* @param {any} actors - The actors map
* @param {Array} messages - A list of message objects to iterate
+ * @param diagObj
* @returns {any}
*/
-const getMaxMessageWidthPerActor = function (actors, messages) {
+const getMaxMessageWidthPerActor = function (actors, messages, diagObj) {
const maxMessageWidthPerActor = {};
messages.forEach(function (msg) {
@@ -917,12 +917,12 @@ const getMaxMessageWidthPerActor = function (actors, messages) {
const actor = actors[msg.to];
// If this is the first actor, and the message is left of it, no need to calculate the margin
- if (msg.placement === parser.yy.PLACEMENT.LEFTOF && !actor.prevActor) {
+ if (msg.placement === diagObj.db.PLACEMENT.LEFTOF && !actor.prevActor) {
return;
}
// If this is the last actor, and the message is right of it, no need to calculate the margin
- if (msg.placement === parser.yy.PLACEMENT.RIGHTOF && !actor.nextActor) {
+ if (msg.placement === diagObj.db.PLACEMENT.RIGHTOF && !actor.nextActor) {
return;
}
@@ -972,17 +972,17 @@ const getMaxMessageWidthPerActor = function (actors, messages) {
maxMessageWidthPerActor[msg.to] || 0,
messageWidth / 2
);
- } else if (msg.placement === parser.yy.PLACEMENT.RIGHTOF) {
+ } else if (msg.placement === diagObj.db.PLACEMENT.RIGHTOF) {
maxMessageWidthPerActor[msg.from] = Math.max(
maxMessageWidthPerActor[msg.from] || 0,
messageWidth
);
- } else if (msg.placement === parser.yy.PLACEMENT.LEFTOF) {
+ } else if (msg.placement === diagObj.db.PLACEMENT.LEFTOF) {
maxMessageWidthPerActor[actor.prevActor] = Math.max(
maxMessageWidthPerActor[actor.prevActor] || 0,
messageWidth
);
- } else if (msg.placement === parser.yy.PLACEMENT.OVER) {
+ } else if (msg.placement === diagObj.db.PLACEMENT.OVER) {
if (actor.prevActor) {
maxMessageWidthPerActor[actor.prevActor] = Math.max(
maxMessageWidthPerActor[actor.prevActor] || 0,
@@ -1070,7 +1070,7 @@ const calculateActorMargins = function (actors, actorToMessageWidth) {
return Math.max(maxHeight, conf.height);
};
-const buildNoteModel = function (msg, actors) {
+const buildNoteModel = function (msg, actors, diagObj) {
let startx = actors[msg.from].x;
let stopx = actors[msg.to].x;
let shouldWrap = msg.wrap && msg.message;
@@ -1090,7 +1090,7 @@ const buildNoteModel = function (msg, actors) {
stopy: 0,
message: msg.message,
};
- if (msg.placement === parser.yy.PLACEMENT.RIGHTOF) {
+ if (msg.placement === diagObj.db.PLACEMENT.RIGHTOF) {
noteModel.width = shouldWrap
? Math.max(conf.width, textDimensions.width)
: Math.max(
@@ -1098,7 +1098,7 @@ const buildNoteModel = function (msg, actors) {
textDimensions.width + 2 * conf.noteMargin
);
noteModel.startx = startx + (actors[msg.from].width + conf.actorMargin) / 2;
- } else if (msg.placement === parser.yy.PLACEMENT.LEFTOF) {
+ } else if (msg.placement === diagObj.db.PLACEMENT.LEFTOF) {
noteModel.width = shouldWrap
? Math.max(conf.width, textDimensions.width + 2 * conf.noteMargin)
: Math.max(
@@ -1139,18 +1139,18 @@ const buildNoteModel = function (msg, actors) {
return noteModel;
};
-const buildMessageModel = function (msg, actors) {
+const buildMessageModel = function (msg, actors, diagObj) {
let process = false;
if (
[
- parser.yy.LINETYPE.SOLID_OPEN,
- parser.yy.LINETYPE.DOTTED_OPEN,
- parser.yy.LINETYPE.SOLID,
- parser.yy.LINETYPE.DOTTED,
- parser.yy.LINETYPE.SOLID_CROSS,
- parser.yy.LINETYPE.DOTTED_CROSS,
- parser.yy.LINETYPE.SOLID_POINT,
- parser.yy.LINETYPE.DOTTED_POINT,
+ diagObj.db.LINETYPE.SOLID_OPEN,
+ diagObj.db.LINETYPE.DOTTED_OPEN,
+ diagObj.db.LINETYPE.SOLID,
+ diagObj.db.LINETYPE.DOTTED,
+ diagObj.db.LINETYPE.SOLID_CROSS,
+ diagObj.db.LINETYPE.DOTTED_CROSS,
+ diagObj.db.LINETYPE.SOLID_POINT,
+ diagObj.db.LINETYPE.DOTTED_POINT,
].includes(msg.type)
) {
process = true;
@@ -1192,7 +1192,7 @@ const buildMessageModel = function (msg, actors) {
};
};
-const calculateLoopBounds = function (messages, actors) {
+const calculateLoopBounds = function (messages, actors, _maxWidthPerActor, diagObj) {
const loops = {};
const stack = [];
let current, noteModel, msgModel;
@@ -1200,12 +1200,12 @@ const calculateLoopBounds = function (messages, actors) {
messages.forEach(function (msg) {
msg.id = utils.random({ length: 10 });
switch (msg.type) {
- case parser.yy.LINETYPE.LOOP_START:
- case parser.yy.LINETYPE.ALT_START:
- case parser.yy.LINETYPE.OPT_START:
- case parser.yy.LINETYPE.PAR_START:
- case parser.yy.LINETYPE.CRITICAL_START:
- case parser.yy.LINETYPE.BREAK_START:
+ case diagObj.db.LINETYPE.LOOP_START:
+ case diagObj.db.LINETYPE.ALT_START:
+ case diagObj.db.LINETYPE.OPT_START:
+ case diagObj.db.LINETYPE.PAR_START:
+ case diagObj.db.LINETYPE.CRITICAL_START:
+ case diagObj.db.LINETYPE.BREAK_START:
stack.push({
id: msg.id,
msg: msg.message,
@@ -1214,9 +1214,9 @@ const calculateLoopBounds = function (messages, actors) {
width: 0,
});
break;
- case parser.yy.LINETYPE.ALT_ELSE:
- case parser.yy.LINETYPE.PAR_AND:
- case parser.yy.LINETYPE.CRITICAL_OPTION:
+ case diagObj.db.LINETYPE.ALT_ELSE:
+ case diagObj.db.LINETYPE.PAR_AND:
+ case diagObj.db.LINETYPE.CRITICAL_OPTION:
if (msg.message) {
current = stack.pop();
loops[current.id] = current;
@@ -1224,16 +1224,16 @@ const calculateLoopBounds = function (messages, actors) {
stack.push(current);
}
break;
- case parser.yy.LINETYPE.LOOP_END:
- case parser.yy.LINETYPE.ALT_END:
- case parser.yy.LINETYPE.OPT_END:
- case parser.yy.LINETYPE.PAR_END:
- case parser.yy.LINETYPE.CRITICAL_END:
- case parser.yy.LINETYPE.BREAK_END:
+ case diagObj.db.LINETYPE.LOOP_END:
+ case diagObj.db.LINETYPE.ALT_END:
+ case diagObj.db.LINETYPE.OPT_END:
+ case diagObj.db.LINETYPE.PAR_END:
+ case diagObj.db.LINETYPE.CRITICAL_END:
+ case diagObj.db.LINETYPE.BREAK_END:
current = stack.pop();
loops[current.id] = current;
break;
- case parser.yy.LINETYPE.ACTIVE_START:
+ case diagObj.db.LINETYPE.ACTIVE_START:
{
const actorRect = actors[msg.from ? msg.from.actor : msg.to.actor];
const stackedSize = actorActivations(msg.from ? msg.from.actor : msg.to.actor).length;
@@ -1248,7 +1248,7 @@ const calculateLoopBounds = function (messages, actors) {
bounds.activations.push(toAdd);
}
break;
- case parser.yy.LINETYPE.ACTIVE_END:
+ case diagObj.db.LINETYPE.ACTIVE_END:
{
const lastActorActivationIdx = bounds.activations
.map((a) => a.actor)
@@ -1259,7 +1259,7 @@ const calculateLoopBounds = function (messages, actors) {
}
const isNote = msg.placement !== undefined;
if (isNote) {
- noteModel = buildNoteModel(msg, actors);
+ noteModel = buildNoteModel(msg, actors, diagObj);
msg.noteModel = noteModel;
stack.forEach((stk) => {
current = stk;
@@ -1269,7 +1269,7 @@ const calculateLoopBounds = function (messages, actors) {
Math.max(current.width, Math.abs(current.from - current.to)) - conf.labelBoxWidth;
});
} else {
- msgModel = buildMessageModel(msg, actors);
+ msgModel = buildMessageModel(msg, actors, diagObj);
msg.msgModel = msgModel;
if (msgModel.startx && msgModel.stopx && stack.length > 0) {
stack.forEach((stk) => {
diff --git a/src/mermaidAPI.js b/src/mermaidAPI.js
index 77aebf554..f94ec96f0 100644
--- a/src/mermaidAPI.js
+++ b/src/mermaidAPI.js
@@ -361,8 +361,8 @@ const render = function (id, _txt, cb, container) {
try {
switch (graphType) {
case 'c4':
- c4Renderer.setConf(cnf.c4);
- c4Renderer.draw(txt, id, pkg.version, diag);
+ diag.renderer.setConf(cnf.c4);
+ diag.renderer.draw(txt, id, pkg.version, diag);
break;
case 'gitGraph':
gitGraphRenderer.draw(txt, id, pkg.version, diag);
@@ -378,17 +378,8 @@ const render = function (id, _txt, cb, container) {
flowRendererV2.draw(txt, id, pkg.version, diag);
break;
case 'sequence':
- cnf.sequence.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;
- if (cnf.sequenceDiagram) {
- // backwards compatibility
- sequenceRenderer.setConf(Object.assign(cnf.sequence, cnf.sequenceDiagram));
- console.error(
- '`mermaid config.sequenceDiagram` has been renamed to `config.sequence`. Please update your mermaid config.'
- );
- } else {
- sequenceRenderer.setConf(cnf.sequence);
- }
- sequenceRenderer.draw(txt, id, pkg.version, diag);
+ diag.renderer.setConf(cnf.sequence);
+ diag.renderer.draw(txt, id, pkg.version, diag);
break;
case 'gantt':
cnf.gantt.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;