mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-09-23 01:09:42 +02:00
Merge branch 'develop' of https://github.com/designsforhealth/mermaid into designsforhealth-develop
This commit is contained in:
@@ -1,6 +1,5 @@
|
||||
import mermaidAPI from '../../mermaidAPI';
|
||||
import * as configApi from '../../config';
|
||||
import common from '../common/common';
|
||||
import { logger } from '../../logger';
|
||||
|
||||
let prevActor = undefined;
|
||||
@@ -138,9 +137,7 @@ export const parseMessage = function(str) {
|
||||
const message = {
|
||||
text: _str.replace(/^[:]?(?:no)?wrap:/, '').trim(),
|
||||
wrap:
|
||||
_str.match(/^[:]?(?:no)?wrap:/) === null
|
||||
? common.hasBreaks(_str) || undefined
|
||||
: _str.match(/^[:]?wrap:/) !== null
|
||||
_str.match(/^[:]?wrap:/) !== null
|
||||
? true
|
||||
: _str.match(/^[:]?nowrap:/) !== null
|
||||
? false
|
||||
|
@@ -442,6 +442,87 @@ note right of 1: multiline<br \t/>text
|
||||
expect(messages[6].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() {
|
||||
const str = `
|
||||
sequenceDiagram
|
||||
|
@@ -226,7 +226,6 @@ const drawNote = function(elem, noteModel) {
|
||||
textObj.anchor = conf.noteAlign;
|
||||
textObj.textMargin = conf.noteMargin;
|
||||
textObj.valign = conf.noteAlign;
|
||||
textObj.wrap = true;
|
||||
|
||||
let textElem = drawText(g, textObj);
|
||||
|
||||
@@ -272,7 +271,7 @@ const actorFont = cnf => {
|
||||
*/
|
||||
const drawMessage = function(g, msgModel) {
|
||||
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;
|
||||
let textDims = utils.calculateTextDimensions(message, messageFont(conf));
|
||||
const lineHeight = textDims.height / lines;
|
||||
@@ -293,7 +292,6 @@ const drawMessage = function(g, msgModel) {
|
||||
textObj.valign = conf.messageAlign;
|
||||
textObj.textMargin = conf.wrapPadding;
|
||||
textObj.tspan = false;
|
||||
textObj.wrap = wrap;
|
||||
|
||||
drawText(g, textObj);
|
||||
|
||||
@@ -971,7 +969,6 @@ const buildMessageModel = function(msg, actors) {
|
||||
const toIdx = fromBounds[0] < toBounds[0] ? 0 : 1;
|
||||
const allBounds = fromBounds.concat(toBounds);
|
||||
const boundedWidth = Math.abs(toBounds[toIdx] - fromBounds[fromIdx]);
|
||||
const msgDims = utils.calculateTextDimensions(msg.message, messageFont(conf));
|
||||
if (msg.wrap && msg.message) {
|
||||
msg.message = utils.wrapLabel(
|
||||
msg.message,
|
||||
@@ -979,6 +976,8 @@ const buildMessageModel = function(msg, actors) {
|
||||
messageFont(conf)
|
||||
);
|
||||
}
|
||||
const msgDims = utils.calculateTextDimensions(msg.message, messageFont(conf));
|
||||
|
||||
return {
|
||||
width: Math.max(
|
||||
msg.wrap ? 0 : msgDims.width + 2 * conf.wrapPadding,
|
||||
|
@@ -21,9 +21,7 @@ export const drawRect = function(elem, rectData) {
|
||||
export const drawText = function(elem, textData) {
|
||||
let prevTextHeight = 0,
|
||||
textHeight = 0;
|
||||
const lines = textData.wrap
|
||||
? textData.text.split(common.lineBreakRegex)
|
||||
: [textData.text.replace(common.lineBreakRegex, ' ')];
|
||||
const lines = textData.text.split(common.lineBreakRegex);
|
||||
|
||||
let textElems = [];
|
||||
let dy = 0;
|
||||
|
@@ -49,6 +49,58 @@ describe('svgDraw', function() {
|
||||
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() {
|
||||
it('it should append a rect before the previous element within a given bound', function() {
|
||||
const svg = MockD3('svg');
|
||||
|
Reference in New Issue
Block a user