Merge branch 'develop' of https://github.com/designsforhealth/mermaid into designsforhealth-develop
This commit is contained in:
commit
1c0b167c95
|
@ -52,6 +52,26 @@ context('Sequence diagram', () => {
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
it('should handle line breaks and wrap annotations', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice
|
||||||
|
participant Bob
|
||||||
|
participant John as John<br/>Second Line
|
||||||
|
Alice ->> Bob: Hello Bob, how are you?
|
||||||
|
Bob-->>John: How about you John?
|
||||||
|
Note right of John: John thinks a long<br/>long time, so long<br/>that the text does<br/>not fit on a row.
|
||||||
|
Bob-->Alice: Checking with John...
|
||||||
|
Note over John:wrap: John looks like he's still thinking, so Bob prods him a bit.
|
||||||
|
Bob-x John: Hey John -<br/>we're still waiting to know<br/>how you're doing
|
||||||
|
Note over John:nowrap: John's trying hard not to break his train of thought.
|
||||||
|
Bob-x John:wrap: John! Are you still debating about how you're doing? How long does it take??
|
||||||
|
Note over John: After a few more moments, John<br/>finally snaps out of it.
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
})
|
||||||
it('should render loops with a slight margin', () => {
|
it('should render loops with a slight margin', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
|
|
|
@ -449,8 +449,13 @@ Bob-->>John: How about you John?
|
||||||
end
|
end
|
||||||
Bob--x Alice: I am good thanks!
|
Bob--x Alice: I am good thanks!
|
||||||
Bob-x John: I am good thanks!
|
Bob-x John: I am good thanks!
|
||||||
Note right of John: Bob thinks a long<br/>long time, so long<br/>that the text does<br/>not fit on a row.
|
Note right of John: John thinks a long<br/>long time, so long<br/>that the text does<br/>not fit on a row.
|
||||||
Bob-->Alice: Checking with John...
|
Bob-->Alice: Checking with John...
|
||||||
|
Note over John:wrap: John looks like he's still thinking, so Bob prods him a bit.
|
||||||
|
Bob-x John: Hey John - we're still waiting to know<br/>how you're doing
|
||||||
|
Note over John:nowrap: John's trying hard not to break his train of thought.
|
||||||
|
Bob-x John:wrap: John! Are you still debating about how you're doing? How long does it take??
|
||||||
|
Note over John: After a few more moments, John<br/>finally snaps out of it.
|
||||||
end
|
end
|
||||||
alt either this
|
alt either this
|
||||||
Alice->>John: Yes
|
Alice->>John: Yes
|
||||||
|
|
|
@ -17226,9 +17226,7 @@ __webpack_require__.r(__webpack_exports__);
|
||||||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "apply", function() { return apply; });
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "apply", function() { return apply; });
|
||||||
/* harmony import */ var _mermaidAPI__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../mermaidAPI */ "./src/mermaidAPI.js");
|
/* harmony import */ var _mermaidAPI__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../mermaidAPI */ "./src/mermaidAPI.js");
|
||||||
/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../config */ "./src/config.js");
|
/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../config */ "./src/config.js");
|
||||||
/* harmony import */ var _common_common__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../common/common */ "./src/diagrams/common/common.js");
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
|
||||||
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -17376,9 +17374,9 @@ var parseMessage = function parseMessage(str) {
|
||||||
|
|
||||||
var message = {
|
var message = {
|
||||||
text: _str.replace(/^[:]?(?:no)?wrap:/, '').trim(),
|
text: _str.replace(/^[:]?(?:no)?wrap:/, '').trim(),
|
||||||
wrap: _str.match(/^[:]?(?:no)?wrap:/) === null ? _common_common__WEBPACK_IMPORTED_MODULE_2__["default"].hasBreaks(_str) || undefined : _str.match(/^[:]?wrap:/) !== null ? true : _str.match(/^[:]?nowrap:/) !== null ? false : undefined
|
wrap: _str.match(/^[:]?wrap:/) !== null ? true : _str.match(/^[:]?nowrap:/) !== null ? false : undefined
|
||||||
};
|
};
|
||||||
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('parseMessage:', message);
|
_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].debug('parseMessage:', message);
|
||||||
return message;
|
return message;
|
||||||
};
|
};
|
||||||
var LINETYPE = {
|
var LINETYPE = {
|
||||||
|
@ -17818,7 +17816,6 @@ var drawNote = function drawNote(elem, noteModel) {
|
||||||
textObj.anchor = conf.noteAlign;
|
textObj.anchor = conf.noteAlign;
|
||||||
textObj.textMargin = conf.noteMargin;
|
textObj.textMargin = conf.noteMargin;
|
||||||
textObj.valign = conf.noteAlign;
|
textObj.valign = conf.noteAlign;
|
||||||
textObj.wrap = true;
|
|
||||||
var textElem = Object(_svgDraw__WEBPACK_IMPORTED_MODULE_1__["drawText"])(g, textObj);
|
var textElem = Object(_svgDraw__WEBPACK_IMPORTED_MODULE_1__["drawText"])(g, textObj);
|
||||||
var textHeight = Math.round(textElem.map(function (te) {
|
var textHeight = Math.round(textElem.map(function (te) {
|
||||||
return (te._groups || te)[0][0].getBBox().height;
|
return (te._groups || te)[0][0].getBBox().height;
|
||||||
|
@ -17871,8 +17868,7 @@ var drawMessage = function drawMessage(g, msgModel) {
|
||||||
starty = msgModel.starty,
|
starty = msgModel.starty,
|
||||||
message = msgModel.message,
|
message = msgModel.message,
|
||||||
type = msgModel.type,
|
type = msgModel.type,
|
||||||
sequenceIndex = msgModel.sequenceIndex,
|
sequenceIndex = msgModel.sequenceIndex;
|
||||||
wrap = msgModel.wrap;
|
|
||||||
var lines = _common_common__WEBPACK_IMPORTED_MODULE_4__["default"].splitBreaks(message).length;
|
var lines = _common_common__WEBPACK_IMPORTED_MODULE_4__["default"].splitBreaks(message).length;
|
||||||
var textDims = _utils__WEBPACK_IMPORTED_MODULE_7__["default"].calculateTextDimensions(message, messageFont(conf));
|
var textDims = _utils__WEBPACK_IMPORTED_MODULE_7__["default"].calculateTextDimensions(message, messageFont(conf));
|
||||||
var lineHeight = textDims.height / lines;
|
var lineHeight = textDims.height / lines;
|
||||||
|
@ -17892,7 +17888,6 @@ var drawMessage = function drawMessage(g, msgModel) {
|
||||||
textObj.valign = conf.messageAlign;
|
textObj.valign = conf.messageAlign;
|
||||||
textObj.textMargin = conf.wrapPadding;
|
textObj.textMargin = conf.wrapPadding;
|
||||||
textObj.tspan = false;
|
textObj.tspan = false;
|
||||||
textObj.wrap = wrap;
|
|
||||||
Object(_svgDraw__WEBPACK_IMPORTED_MODULE_1__["drawText"])(g, textObj);
|
Object(_svgDraw__WEBPACK_IMPORTED_MODULE_1__["drawText"])(g, textObj);
|
||||||
var totalOffset = textDims.height - 10;
|
var totalOffset = textDims.height - 10;
|
||||||
var textWidth = textDims.width;
|
var textWidth = textDims.width;
|
||||||
|
@ -18408,12 +18403,12 @@ var buildMessageModel = function buildMessageModel(msg, actors) {
|
||||||
var toIdx = fromBounds[0] < toBounds[0] ? 0 : 1;
|
var toIdx = fromBounds[0] < toBounds[0] ? 0 : 1;
|
||||||
var allBounds = fromBounds.concat(toBounds);
|
var allBounds = fromBounds.concat(toBounds);
|
||||||
var boundedWidth = Math.abs(toBounds[toIdx] - fromBounds[fromIdx]);
|
var boundedWidth = Math.abs(toBounds[toIdx] - fromBounds[fromIdx]);
|
||||||
var msgDims = _utils__WEBPACK_IMPORTED_MODULE_7__["default"].calculateTextDimensions(msg.message, messageFont(conf));
|
|
||||||
|
|
||||||
if (msg.wrap && msg.message) {
|
if (msg.wrap && msg.message) {
|
||||||
msg.message = _utils__WEBPACK_IMPORTED_MODULE_7__["default"].wrapLabel(msg.message, Math.max(boundedWidth + 2 * conf.wrapPadding, conf.width), messageFont(conf));
|
msg.message = _utils__WEBPACK_IMPORTED_MODULE_7__["default"].wrapLabel(msg.message, Math.max(boundedWidth + 2 * conf.wrapPadding, conf.width), messageFont(conf));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var msgDims = _utils__WEBPACK_IMPORTED_MODULE_7__["default"].calculateTextDimensions(msg.message, messageFont(conf));
|
||||||
return {
|
return {
|
||||||
width: Math.max(msg.wrap ? 0 : msgDims.width + 2 * conf.wrapPadding, boundedWidth + 2 * conf.wrapPadding, conf.width),
|
width: Math.max(msg.wrap ? 0 : msgDims.width + 2 * conf.wrapPadding, boundedWidth + 2 * conf.wrapPadding, conf.width),
|
||||||
height: 0,
|
height: 0,
|
||||||
|
@ -18605,7 +18600,7 @@ var drawRect = function drawRect(elem, rectData) {
|
||||||
var drawText = function drawText(elem, textData) {
|
var drawText = function drawText(elem, textData) {
|
||||||
var prevTextHeight = 0,
|
var prevTextHeight = 0,
|
||||||
textHeight = 0;
|
textHeight = 0;
|
||||||
var lines = textData.wrap ? textData.text.split(_common_common__WEBPACK_IMPORTED_MODULE_0__["default"].lineBreakRegex) : [textData.text.replace(_common_common__WEBPACK_IMPORTED_MODULE_0__["default"].lineBreakRegex, ' ')];
|
var lines = textData.text.split(_common_common__WEBPACK_IMPORTED_MODULE_0__["default"].lineBreakRegex);
|
||||||
var textElems = [];
|
var textElems = [];
|
||||||
var dy = 0;
|
var dy = 0;
|
||||||
|
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -30304,7 +30304,7 @@ function addHtmlLabel(root, node) {
|
||||||
var client = div.node().getBoundingClientRect();
|
var client = div.node().getBoundingClientRect();
|
||||||
fo
|
fo
|
||||||
.attr("width", client.width)
|
.attr("width", client.width)
|
||||||
.attr("height", client.height);
|
.attr("height", client.height);
|
||||||
|
|
||||||
return fo;
|
return fo;
|
||||||
}
|
}
|
||||||
|
@ -65588,9 +65588,7 @@ __webpack_require__.r(__webpack_exports__);
|
||||||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "apply", function() { return apply; });
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "apply", function() { return apply; });
|
||||||
/* harmony import */ var _mermaidAPI__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../mermaidAPI */ "./src/mermaidAPI.js");
|
/* harmony import */ var _mermaidAPI__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../mermaidAPI */ "./src/mermaidAPI.js");
|
||||||
/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../config */ "./src/config.js");
|
/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../config */ "./src/config.js");
|
||||||
/* harmony import */ var _common_common__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../common/common */ "./src/diagrams/common/common.js");
|
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
|
||||||
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -65738,9 +65736,9 @@ var parseMessage = function parseMessage(str) {
|
||||||
|
|
||||||
var message = {
|
var message = {
|
||||||
text: _str.replace(/^[:]?(?:no)?wrap:/, '').trim(),
|
text: _str.replace(/^[:]?(?:no)?wrap:/, '').trim(),
|
||||||
wrap: _str.match(/^[:]?(?:no)?wrap:/) === null ? _common_common__WEBPACK_IMPORTED_MODULE_2__["default"].hasBreaks(_str) || undefined : _str.match(/^[:]?wrap:/) !== null ? true : _str.match(/^[:]?nowrap:/) !== null ? false : undefined
|
wrap: _str.match(/^[:]?wrap:/) !== null ? true : _str.match(/^[:]?nowrap:/) !== null ? false : undefined
|
||||||
};
|
};
|
||||||
_logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('parseMessage:', message);
|
_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].debug('parseMessage:', message);
|
||||||
return message;
|
return message;
|
||||||
};
|
};
|
||||||
var LINETYPE = {
|
var LINETYPE = {
|
||||||
|
@ -66179,7 +66177,6 @@ var drawNote = function drawNote(elem, noteModel) {
|
||||||
textObj.anchor = conf.noteAlign;
|
textObj.anchor = conf.noteAlign;
|
||||||
textObj.textMargin = conf.noteMargin;
|
textObj.textMargin = conf.noteMargin;
|
||||||
textObj.valign = conf.noteAlign;
|
textObj.valign = conf.noteAlign;
|
||||||
textObj.wrap = true;
|
|
||||||
var textElem = Object(_svgDraw__WEBPACK_IMPORTED_MODULE_1__["drawText"])(g, textObj);
|
var textElem = Object(_svgDraw__WEBPACK_IMPORTED_MODULE_1__["drawText"])(g, textObj);
|
||||||
var textHeight = Math.round(textElem.map(function (te) {
|
var textHeight = Math.round(textElem.map(function (te) {
|
||||||
return (te._groups || te)[0][0].getBBox().height;
|
return (te._groups || te)[0][0].getBBox().height;
|
||||||
|
@ -66232,8 +66229,7 @@ var drawMessage = function drawMessage(g, msgModel) {
|
||||||
starty = msgModel.starty,
|
starty = msgModel.starty,
|
||||||
message = msgModel.message,
|
message = msgModel.message,
|
||||||
type = msgModel.type,
|
type = msgModel.type,
|
||||||
sequenceIndex = msgModel.sequenceIndex,
|
sequenceIndex = msgModel.sequenceIndex;
|
||||||
wrap = msgModel.wrap;
|
|
||||||
var lines = _common_common__WEBPACK_IMPORTED_MODULE_4__["default"].splitBreaks(message).length;
|
var lines = _common_common__WEBPACK_IMPORTED_MODULE_4__["default"].splitBreaks(message).length;
|
||||||
var textDims = _utils__WEBPACK_IMPORTED_MODULE_7__["default"].calculateTextDimensions(message, messageFont(conf));
|
var textDims = _utils__WEBPACK_IMPORTED_MODULE_7__["default"].calculateTextDimensions(message, messageFont(conf));
|
||||||
var lineHeight = textDims.height / lines;
|
var lineHeight = textDims.height / lines;
|
||||||
|
@ -66253,7 +66249,6 @@ var drawMessage = function drawMessage(g, msgModel) {
|
||||||
textObj.valign = conf.messageAlign;
|
textObj.valign = conf.messageAlign;
|
||||||
textObj.textMargin = conf.wrapPadding;
|
textObj.textMargin = conf.wrapPadding;
|
||||||
textObj.tspan = false;
|
textObj.tspan = false;
|
||||||
textObj.wrap = wrap;
|
|
||||||
Object(_svgDraw__WEBPACK_IMPORTED_MODULE_1__["drawText"])(g, textObj);
|
Object(_svgDraw__WEBPACK_IMPORTED_MODULE_1__["drawText"])(g, textObj);
|
||||||
var totalOffset = textDims.height - 10;
|
var totalOffset = textDims.height - 10;
|
||||||
var textWidth = textDims.width;
|
var textWidth = textDims.width;
|
||||||
|
@ -66769,12 +66764,12 @@ var buildMessageModel = function buildMessageModel(msg, actors) {
|
||||||
var toIdx = fromBounds[0] < toBounds[0] ? 0 : 1;
|
var toIdx = fromBounds[0] < toBounds[0] ? 0 : 1;
|
||||||
var allBounds = fromBounds.concat(toBounds);
|
var allBounds = fromBounds.concat(toBounds);
|
||||||
var boundedWidth = Math.abs(toBounds[toIdx] - fromBounds[fromIdx]);
|
var boundedWidth = Math.abs(toBounds[toIdx] - fromBounds[fromIdx]);
|
||||||
var msgDims = _utils__WEBPACK_IMPORTED_MODULE_7__["default"].calculateTextDimensions(msg.message, messageFont(conf));
|
|
||||||
|
|
||||||
if (msg.wrap && msg.message) {
|
if (msg.wrap && msg.message) {
|
||||||
msg.message = _utils__WEBPACK_IMPORTED_MODULE_7__["default"].wrapLabel(msg.message, Math.max(boundedWidth + 2 * conf.wrapPadding, conf.width), messageFont(conf));
|
msg.message = _utils__WEBPACK_IMPORTED_MODULE_7__["default"].wrapLabel(msg.message, Math.max(boundedWidth + 2 * conf.wrapPadding, conf.width), messageFont(conf));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var msgDims = _utils__WEBPACK_IMPORTED_MODULE_7__["default"].calculateTextDimensions(msg.message, messageFont(conf));
|
||||||
return {
|
return {
|
||||||
width: Math.max(msg.wrap ? 0 : msgDims.width + 2 * conf.wrapPadding, boundedWidth + 2 * conf.wrapPadding, conf.width),
|
width: Math.max(msg.wrap ? 0 : msgDims.width + 2 * conf.wrapPadding, boundedWidth + 2 * conf.wrapPadding, conf.width),
|
||||||
height: 0,
|
height: 0,
|
||||||
|
@ -66966,7 +66961,7 @@ var drawRect = function drawRect(elem, rectData) {
|
||||||
var drawText = function drawText(elem, textData) {
|
var drawText = function drawText(elem, textData) {
|
||||||
var prevTextHeight = 0,
|
var prevTextHeight = 0,
|
||||||
textHeight = 0;
|
textHeight = 0;
|
||||||
var lines = textData.wrap ? textData.text.split(_common_common__WEBPACK_IMPORTED_MODULE_0__["default"].lineBreakRegex) : [textData.text.replace(_common_common__WEBPACK_IMPORTED_MODULE_0__["default"].lineBreakRegex, ' ')];
|
var lines = textData.text.split(_common_common__WEBPACK_IMPORTED_MODULE_0__["default"].lineBreakRegex);
|
||||||
var textElems = [];
|
var textElems = [];
|
||||||
var dy = 0;
|
var dy = 0;
|
||||||
|
|
||||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1,6 +1,5 @@
|
||||||
import mermaidAPI from '../../mermaidAPI';
|
import mermaidAPI from '../../mermaidAPI';
|
||||||
import * as configApi from '../../config';
|
import * as configApi from '../../config';
|
||||||
import common from '../common/common';
|
|
||||||
import { logger } from '../../logger';
|
import { logger } from '../../logger';
|
||||||
|
|
||||||
let prevActor = undefined;
|
let prevActor = undefined;
|
||||||
|
@ -138,9 +137,7 @@ export const parseMessage = function(str) {
|
||||||
const message = {
|
const message = {
|
||||||
text: _str.replace(/^[:]?(?:no)?wrap:/, '').trim(),
|
text: _str.replace(/^[:]?(?:no)?wrap:/, '').trim(),
|
||||||
wrap:
|
wrap:
|
||||||
_str.match(/^[:]?(?:no)?wrap:/) === null
|
_str.match(/^[:]?wrap:/) !== null
|
||||||
? common.hasBreaks(_str) || undefined
|
|
||||||
: _str.match(/^[:]?wrap:/) !== null
|
|
||||||
? true
|
? true
|
||||||
: _str.match(/^[:]?nowrap:/) !== null
|
: _str.match(/^[:]?nowrap:/) !== null
|
||||||
? false
|
? false
|
||||||
|
|
|
@ -442,6 +442,87 @@ note right of 1: multiline<br \t/>text
|
||||||
expect(messages[6].message).toBe('multiline<br \t/>text');
|
expect(messages[6].message).toBe('multiline<br \t/>text');
|
||||||
expect(messages[7].message).toBe('multiline<br \t/>text');
|
expect(messages[7].message).toBe('multiline<br \t/>text');
|
||||||
});
|
});
|
||||||
|
it('it should handle notes and messages without wrap specified', function () {
|
||||||
|
const str = `
|
||||||
|
sequenceDiagram
|
||||||
|
participant 1
|
||||||
|
participant 2
|
||||||
|
participant 3
|
||||||
|
participant 4
|
||||||
|
1->>2: single-line text
|
||||||
|
note right of 2: single-line text
|
||||||
|
2->>3:nowrap: single-line text
|
||||||
|
note right of 3:nowrap: single-line text
|
||||||
|
3->>4: multiline<br/>text
|
||||||
|
note right of 4: multiline<br/>text
|
||||||
|
4->>1:nowrap: multiline<br/>text
|
||||||
|
note right of 1:nowrap: multiline<br/>text
|
||||||
|
`;
|
||||||
|
|
||||||
|
mermaidAPI.parse(str);
|
||||||
|
|
||||||
|
const messages = parser.yy.getMessages();
|
||||||
|
expect(messages[0].message).toBe('single-line text');
|
||||||
|
expect(messages[1].message).toBe('single-line text');
|
||||||
|
expect(messages[2].message).toBe('single-line text');
|
||||||
|
expect(messages[3].message).toBe('single-line text');
|
||||||
|
expect(messages[4].message).toBe('multiline<br/>text');
|
||||||
|
expect(messages[5].message).toBe('multiline<br/>text');
|
||||||
|
expect(messages[6].message).toBe('multiline<br/>text');
|
||||||
|
expect(messages[7].message).toBe('multiline<br/>text');
|
||||||
|
|
||||||
|
// wrap indicates whether wrap is specified
|
||||||
|
expect(messages[0].wrap).toBe(false);
|
||||||
|
expect(messages[1].wrap).toBe(false);
|
||||||
|
expect(messages[2].wrap).toBe(false);
|
||||||
|
expect(messages[3].wrap).toBe(false);
|
||||||
|
expect(messages[4].wrap).toBe(false);
|
||||||
|
expect(messages[5].wrap).toBe(false);
|
||||||
|
expect(messages[6].wrap).toBe(false);
|
||||||
|
expect(messages[7].wrap).toBe(false);
|
||||||
|
})
|
||||||
|
it('it should handle notes and messages with wrap specified', function () {
|
||||||
|
const str = `
|
||||||
|
sequenceDiagram
|
||||||
|
participant 1
|
||||||
|
participant 2
|
||||||
|
participant 3
|
||||||
|
participant 4
|
||||||
|
1->>2:wrap: single-line text
|
||||||
|
note right of 2:wrap: single-line text
|
||||||
|
2->>3:wrap: multiline<br/>text
|
||||||
|
note right of 3:wrap: multiline<br/>text
|
||||||
|
`;
|
||||||
|
|
||||||
|
mermaidAPI.parse(str);
|
||||||
|
|
||||||
|
const messages = parser.yy.getMessages();
|
||||||
|
expect(messages[0].message).toBe('single-line text');
|
||||||
|
expect(messages[1].message).toBe('single-line text');
|
||||||
|
expect(messages[2].message).toBe('multiline<br/>text');
|
||||||
|
expect(messages[3].message).toBe('multiline<br/>text');
|
||||||
|
expect(messages[0].wrap).toBe(true);
|
||||||
|
expect(messages[1].wrap).toBe(true);
|
||||||
|
expect(messages[2].wrap).toBe(true);
|
||||||
|
expect(messages[3].wrap).toBe(true);
|
||||||
|
})
|
||||||
|
it('it should handle notes and messages with nowrap or line breaks', function () {
|
||||||
|
const str = `
|
||||||
|
sequenceDiagram
|
||||||
|
participant 1
|
||||||
|
participant 2
|
||||||
|
1->>2: single-line text
|
||||||
|
note right of 2: single-line text
|
||||||
|
`;
|
||||||
|
|
||||||
|
mermaidAPI.parse(str);
|
||||||
|
|
||||||
|
const messages = parser.yy.getMessages();
|
||||||
|
expect(messages[0].message).toBe('single-line text');
|
||||||
|
expect(messages[1].message).toBe('single-line text');
|
||||||
|
expect(messages[0].wrap).toBe(false);
|
||||||
|
expect(messages[1].wrap).toBe(false);
|
||||||
|
})
|
||||||
it('it should handle notes over a single actor', function() {
|
it('it should handle notes over a single actor', function() {
|
||||||
const str = `
|
const str = `
|
||||||
sequenceDiagram
|
sequenceDiagram
|
||||||
|
|
|
@ -226,7 +226,6 @@ const drawNote = function(elem, noteModel) {
|
||||||
textObj.anchor = conf.noteAlign;
|
textObj.anchor = conf.noteAlign;
|
||||||
textObj.textMargin = conf.noteMargin;
|
textObj.textMargin = conf.noteMargin;
|
||||||
textObj.valign = conf.noteAlign;
|
textObj.valign = conf.noteAlign;
|
||||||
textObj.wrap = true;
|
|
||||||
|
|
||||||
let textElem = drawText(g, textObj);
|
let textElem = drawText(g, textObj);
|
||||||
|
|
||||||
|
@ -272,7 +271,7 @@ const actorFont = cnf => {
|
||||||
*/
|
*/
|
||||||
const drawMessage = function(g, msgModel) {
|
const drawMessage = function(g, msgModel) {
|
||||||
bounds.bumpVerticalPos(10);
|
bounds.bumpVerticalPos(10);
|
||||||
const { startx, stopx, starty, message, type, sequenceIndex, wrap } = msgModel;
|
const { startx, stopx, starty, message, type, sequenceIndex } = msgModel;
|
||||||
const lines = common.splitBreaks(message).length;
|
const lines = common.splitBreaks(message).length;
|
||||||
let textDims = utils.calculateTextDimensions(message, messageFont(conf));
|
let textDims = utils.calculateTextDimensions(message, messageFont(conf));
|
||||||
const lineHeight = textDims.height / lines;
|
const lineHeight = textDims.height / lines;
|
||||||
|
@ -293,7 +292,6 @@ const drawMessage = function(g, msgModel) {
|
||||||
textObj.valign = conf.messageAlign;
|
textObj.valign = conf.messageAlign;
|
||||||
textObj.textMargin = conf.wrapPadding;
|
textObj.textMargin = conf.wrapPadding;
|
||||||
textObj.tspan = false;
|
textObj.tspan = false;
|
||||||
textObj.wrap = wrap;
|
|
||||||
|
|
||||||
drawText(g, textObj);
|
drawText(g, textObj);
|
||||||
|
|
||||||
|
@ -971,7 +969,6 @@ const buildMessageModel = function(msg, actors) {
|
||||||
const toIdx = fromBounds[0] < toBounds[0] ? 0 : 1;
|
const toIdx = fromBounds[0] < toBounds[0] ? 0 : 1;
|
||||||
const allBounds = fromBounds.concat(toBounds);
|
const allBounds = fromBounds.concat(toBounds);
|
||||||
const boundedWidth = Math.abs(toBounds[toIdx] - fromBounds[fromIdx]);
|
const boundedWidth = Math.abs(toBounds[toIdx] - fromBounds[fromIdx]);
|
||||||
const msgDims = utils.calculateTextDimensions(msg.message, messageFont(conf));
|
|
||||||
if (msg.wrap && msg.message) {
|
if (msg.wrap && msg.message) {
|
||||||
msg.message = utils.wrapLabel(
|
msg.message = utils.wrapLabel(
|
||||||
msg.message,
|
msg.message,
|
||||||
|
@ -979,6 +976,8 @@ const buildMessageModel = function(msg, actors) {
|
||||||
messageFont(conf)
|
messageFont(conf)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
const msgDims = utils.calculateTextDimensions(msg.message, messageFont(conf));
|
||||||
|
|
||||||
return {
|
return {
|
||||||
width: Math.max(
|
width: Math.max(
|
||||||
msg.wrap ? 0 : msgDims.width + 2 * conf.wrapPadding,
|
msg.wrap ? 0 : msgDims.width + 2 * conf.wrapPadding,
|
||||||
|
|
|
@ -21,9 +21,7 @@ export const drawRect = function(elem, rectData) {
|
||||||
export const drawText = function(elem, textData) {
|
export const drawText = function(elem, textData) {
|
||||||
let prevTextHeight = 0,
|
let prevTextHeight = 0,
|
||||||
textHeight = 0;
|
textHeight = 0;
|
||||||
const lines = textData.wrap
|
const lines = textData.text.split(common.lineBreakRegex);
|
||||||
? textData.text.split(common.lineBreakRegex)
|
|
||||||
: [textData.text.replace(common.lineBreakRegex, ' ')];
|
|
||||||
|
|
||||||
let textElems = [];
|
let textElems = [];
|
||||||
let dy = 0;
|
let dy = 0;
|
||||||
|
|
|
@ -49,6 +49,58 @@ describe('svgDraw', function() {
|
||||||
expect(rect.attr).not.toHaveBeenCalledWith('class', expect.anything());
|
expect(rect.attr).not.toHaveBeenCalledWith('class', expect.anything());
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
describe('drawText', function() {
|
||||||
|
it('it should append a single element', function() {
|
||||||
|
const svg = MockD3('svg');
|
||||||
|
svgDraw.drawText(svg, {
|
||||||
|
x: 10,
|
||||||
|
y: 10,
|
||||||
|
dy: '1em',
|
||||||
|
text: 'One fine text message',
|
||||||
|
class: 'noteText',
|
||||||
|
fontFamily: 'courier',
|
||||||
|
fontSize: '10px',
|
||||||
|
fontWeight: '500',
|
||||||
|
});
|
||||||
|
expect(svg.__children.length).toBe(1);
|
||||||
|
const text = svg.__children[0];
|
||||||
|
expect(text.__name).toBe('text');
|
||||||
|
expect(text.attr).toHaveBeenCalledWith('x', 10);
|
||||||
|
expect(text.attr).toHaveBeenCalledWith('y', 10);
|
||||||
|
expect(text.attr).toHaveBeenCalledWith('dy', '1em');
|
||||||
|
expect(text.attr).toHaveBeenCalledWith('class', 'noteText');
|
||||||
|
expect(text.text).toHaveBeenCalledWith('One fine text message');
|
||||||
|
expect(text.style).toHaveBeenCalledWith('font-family', 'courier');
|
||||||
|
expect(text.style).toHaveBeenCalledWith('font-size', '10px');
|
||||||
|
expect(text.style).toHaveBeenCalledWith('font-weight', '500');
|
||||||
|
});
|
||||||
|
it('it should append a multiple elements', function() {
|
||||||
|
const svg = MockD3('svg');
|
||||||
|
svgDraw.drawText(svg, {
|
||||||
|
x: 10,
|
||||||
|
y: 10,
|
||||||
|
text: 'One fine text message<br>with multiple<br>fine lines',
|
||||||
|
});
|
||||||
|
expect(svg.__children.length).toBe(3);
|
||||||
|
const text1 = svg.__children[0];
|
||||||
|
expect(text1.__name).toBe('text');
|
||||||
|
expect(text1.attr).toHaveBeenCalledWith('x', 10);
|
||||||
|
expect(text1.attr).toHaveBeenCalledWith('y', 10);
|
||||||
|
expect(text1.text).toHaveBeenCalledWith('One fine text message');
|
||||||
|
|
||||||
|
const text2 = svg.__children[1];
|
||||||
|
expect(text2.__name).toBe('text');
|
||||||
|
expect(text2.attr).toHaveBeenCalledWith('x', 10);
|
||||||
|
expect(text2.attr).toHaveBeenCalledWith('y', 10);
|
||||||
|
expect(text2.text).toHaveBeenCalledWith('with multiple');
|
||||||
|
|
||||||
|
const text3 = svg.__children[2];
|
||||||
|
expect(text3.__name).toBe('text');
|
||||||
|
expect(text3.attr).toHaveBeenCalledWith('x', 10);
|
||||||
|
expect(text3.attr).toHaveBeenCalledWith('y', 10);
|
||||||
|
expect(text3.text).toHaveBeenCalledWith('fine lines');
|
||||||
|
});
|
||||||
|
});
|
||||||
describe('drawBackgroundRect', function() {
|
describe('drawBackgroundRect', function() {
|
||||||
it('it should append a rect before the previous element within a given bound', function() {
|
it('it should append a rect before the previous element within a given bound', function() {
|
||||||
const svg = MockD3('svg');
|
const svg = MockD3('svg');
|
||||||
|
|
Loading…
Reference in New Issue