Skip to content

Commit 9a96f8b

Browse files
authored
Merge pull request #1315 from rmedaer/feature/multiline-sequence-message-alignment
Feature/Multiline sequence message alignment
2 parents 9e75993 + cbdb2e6 commit 9a96f8b

File tree

3 files changed

+41
-10
lines changed

3 files changed

+41
-10
lines changed

docs/mermaidAPI.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,14 @@ margin around notes.
174174
Space between messages.
175175
**Default value 35**.
176176

177+
### messageAlign
178+
179+
Multiline message alignment. Possible values are:
180+
181+
- left
182+
- center **default**
183+
- right
184+
177185
### mirrorActors
178186

179187
mirror actors under diagram.

src/diagrams/sequence/sequenceRenderer.js

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ const conf = {
2424
noteMargin: 10,
2525
// Space between messages
2626
messageMargin: 35,
27+
// Multiline message alignment
28+
messageAlign: 'center',
2729
// mirror actors under diagram
2830
mirrorActors: false,
2931
// Depending on css styling this might need adjustment
@@ -230,26 +232,38 @@ const drawMessage = function(elem, startx, stopx, verticalPos, msg, sequenceInde
230232
const g = elem.append('g');
231233
const txtCenter = startx + (stopx - startx) / 2;
232234

233-
let textElem;
235+
let textElems = [];
234236
let counterBreaklines = 0;
235237
let breaklineOffset = 17;
236238
const breaklines = msg.message.split(/<br\s*\/?>/gi);
237239
for (const breakline of breaklines) {
238-
textElem = g
239-
.append('text') // text label for the x axis
240-
.attr('x', txtCenter)
241-
.attr('y', verticalPos - 7 + counterBreaklines * breaklineOffset)
242-
.style('text-anchor', 'middle')
243-
.attr('class', 'messageText')
244-
.text(breakline.trim());
240+
textElems.push(
241+
g
242+
.append('text') // text label for the x axis
243+
.attr('x', txtCenter)
244+
.attr('y', verticalPos - 7 + counterBreaklines * breaklineOffset)
245+
.style('text-anchor', 'middle')
246+
.attr('class', 'messageText')
247+
.text(breakline.trim())
248+
);
245249
counterBreaklines++;
246250
}
247251
const offsetLineCounter = counterBreaklines - 1;
248252
const totalOffset = offsetLineCounter * breaklineOffset;
249253

250-
bounds.bumpVerticalPos(totalOffset);
254+
let textWidths = textElems.map(function(textElem) {
255+
return (textElem._groups || textElem)[0][0].getBBox().width;
256+
});
257+
let textWidth = Math.max(...textWidths);
258+
for (const textElem of textElems) {
259+
if (conf.messageAlign === 'left') {
260+
textElem.attr('x', txtCenter - textWidth / 2).style('text-anchor', 'start');
261+
} else if (conf.messageAlign === 'right') {
262+
textElem.attr('x', txtCenter + textWidth / 2).style('text-anchor', 'end');
263+
}
264+
}
251265

252-
let textWidth = (textElem._groups || textElem)[0][0].getBBox().width;
266+
bounds.bumpVerticalPos(totalOffset);
253267

254268
let line;
255269
if (startx === stopx) {

src/mermaidAPI.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,14 @@ const config = {
229229
*/
230230
messageMargin: 35,
231231

232+
/**
233+
* Multiline message alignment. Possible values are:
234+
* * left
235+
* * center **default**
236+
* * right
237+
*/
238+
messageAlign: 'center',
239+
232240
/**
233241
* mirror actors under diagram.
234242
* **Default value true**.
@@ -809,6 +817,7 @@ export default mermaidAPI;
809817
* boxTextMargin:5,
810818
* noteMargin:10,
811819
* messageMargin:35,
820+
* messageAlign:'center',
812821
* mirrorActors:true,
813822
* bottomMarginAdj:1,
814823
* useMaxWidth:true,

0 commit comments

Comments
 (0)