mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-09-01 22:56:51 +02:00
Merge branch 'develop' into bug/4912_gitgraph-merge-routing-colouring
This commit is contained in:
16
README.md
16
README.md
@@ -44,6 +44,22 @@ Try Live Editor previews of future releases: <a href="https://develop.git.mermai
|
|||||||
|
|
||||||
<a href="https://mermaid-js.github.io/mermaid/landing/"><img src="https://github.com/mermaid-js/mermaid/blob/master/docs/intro/img/book-banner-post-release.jpg" alt="Explore Mermaid.js in depth, with real-world examples, tips & tricks from the creator... The first official book on Mermaid is available for purchase. Check it out!"></a>
|
<a href="https://mermaid-js.github.io/mermaid/landing/"><img src="https://github.com/mermaid-js/mermaid/blob/master/docs/intro/img/book-banner-post-release.jpg" alt="Explore Mermaid.js in depth, with real-world examples, tips & tricks from the creator... The first official book on Mermaid is available for purchase. Check it out!"></a>
|
||||||
|
|
||||||
|
## Table of content
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Expand contents</summary>
|
||||||
|
|
||||||
|
- [About](#about)
|
||||||
|
- [Examples](#examples)
|
||||||
|
- [Release](#release)
|
||||||
|
- [Related projects](#related-projects)
|
||||||
|
- [Contributors](#contributors)
|
||||||
|
- [Security and safe diagrams](#security-and-safe-diagrams)
|
||||||
|
- [Reporting vulnerabilities](#reporting-vulnerabilities)
|
||||||
|
- [Appreciation](#appreciation)
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
## About
|
## About
|
||||||
|
|
||||||
<!-- <Main description> -->
|
<!-- <Main description> -->
|
||||||
|
@@ -164,6 +164,13 @@
|
|||||||
end
|
end
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
|
<pre class="mermaid">
|
||||||
|
sequenceDiagram
|
||||||
|
actor Alice
|
||||||
|
actor John
|
||||||
|
Alice-xJohn: Hello John, how are you?
|
||||||
|
John--xAlice: Great!
|
||||||
|
</pre>
|
||||||
<script type="module">
|
<script type="module">
|
||||||
import mermaid from './mermaid.esm.mjs';
|
import mermaid from './mermaid.esm.mjs';
|
||||||
mermaid.initialize({
|
mermaid.initialize({
|
||||||
|
@@ -4,7 +4,7 @@
|
|||||||
"version": "10.2.4",
|
"version": "10.2.4",
|
||||||
"description": "Markdownish syntax for generating flowcharts, sequence diagrams, class diagrams, gantt charts and git graphs.",
|
"description": "Markdownish syntax for generating flowcharts, sequence diagrams, class diagrams, gantt charts and git graphs.",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"packageManager": "pnpm@8.10.2",
|
"packageManager": "pnpm@8.10.4",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"diagram",
|
"diagram",
|
||||||
"markdown",
|
"markdown",
|
||||||
|
@@ -681,3 +681,82 @@ describe('given text representing a method, ', function () {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('given text representing an attribute', () => {
|
||||||
|
describe('when the attribute has no modifiers', () => {
|
||||||
|
it('should parse the display text correctly', () => {
|
||||||
|
const str = 'name String';
|
||||||
|
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('name String');
|
||||||
|
expect(displayDetails.cssStyle).toBe('');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when the attribute has public "+" modifier', () => {
|
||||||
|
it('should parse the display text correctly', () => {
|
||||||
|
const str = '+name String';
|
||||||
|
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('+name String');
|
||||||
|
expect(displayDetails.cssStyle).toBe('');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when the attribute has protected "#" modifier', () => {
|
||||||
|
it('should parse the display text correctly', () => {
|
||||||
|
const str = '#name String';
|
||||||
|
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('#name String');
|
||||||
|
expect(displayDetails.cssStyle).toBe('');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when the attribute has private "-" modifier', () => {
|
||||||
|
it('should parse the display text correctly', () => {
|
||||||
|
const str = '-name String';
|
||||||
|
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('-name String');
|
||||||
|
expect(displayDetails.cssStyle).toBe('');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when the attribute has internal "~" modifier', () => {
|
||||||
|
it('should parse the display text correctly', () => {
|
||||||
|
const str = '~name String';
|
||||||
|
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('~name String');
|
||||||
|
expect(displayDetails.cssStyle).toBe('');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when the attribute has static "$" modifier', () => {
|
||||||
|
it('should parse the display text correctly and apply static css style', () => {
|
||||||
|
const str = 'name String$';
|
||||||
|
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('name String');
|
||||||
|
expect(displayDetails.cssStyle).toBe(staticCssStyle);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when the attribute has abstract "*" modifier', () => {
|
||||||
|
it('should parse the display text correctly and apply abstract css style', () => {
|
||||||
|
const str = 'name String*';
|
||||||
|
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('name String');
|
||||||
|
expect(displayDetails.cssStyle).toBe(abstractCssStyle);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
@@ -106,7 +106,7 @@ export class ClassMember {
|
|||||||
this.visibility = firstChar as Visibility;
|
this.visibility = firstChar as Visibility;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lastChar.match(/[*?]/)) {
|
if (lastChar.match(/[$*]/)) {
|
||||||
potentialClassifier = lastChar;
|
potentialClassifier = lastChar;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -201,6 +201,13 @@ export const updateLinkInterpolate = function (positions, interp) {
|
|||||||
*/
|
*/
|
||||||
export const updateLink = function (positions, style) {
|
export const updateLink = function (positions, style) {
|
||||||
positions.forEach(function (pos) {
|
positions.forEach(function (pos) {
|
||||||
|
if (pos >= edges.length) {
|
||||||
|
throw new Error(
|
||||||
|
`The index ${pos} for linkStyle is out of bounds. Valid indices for linkStyle are between 0 and ${
|
||||||
|
edges.length - 1
|
||||||
|
}. (Help: Ensure that the index is within the range of existing edges.)`
|
||||||
|
);
|
||||||
|
}
|
||||||
if (pos === 'default') {
|
if (pos === 'default') {
|
||||||
edges.defaultStyle = style;
|
edges.defaultStyle = style;
|
||||||
} else {
|
} else {
|
||||||
|
@@ -286,6 +286,30 @@ describe('[Style] when parsing', () => {
|
|||||||
expect(edges[0].type).toBe('arrow_point');
|
expect(edges[0].type).toBe('arrow_point');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should handle style definitions within number of edges', function () {
|
||||||
|
expect(() =>
|
||||||
|
flow.parser
|
||||||
|
.parse(
|
||||||
|
`graph TD
|
||||||
|
A-->B
|
||||||
|
linkStyle 1 stroke-width:1px;`
|
||||||
|
)
|
||||||
|
.toThrow(
|
||||||
|
'The index 1 for linkStyle is out of bounds. Valid indices for linkStyle are between 0 and 0. (Help: Ensure that the index is within the range of existing edges.)'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle style definitions within number of edges', function () {
|
||||||
|
const res = flow.parser.parse(`graph TD
|
||||||
|
A-->B
|
||||||
|
linkStyle 0 stroke-width:1px;`);
|
||||||
|
|
||||||
|
const edges = flow.parser.yy.getEdges();
|
||||||
|
|
||||||
|
expect(edges[0].style[0]).toBe('stroke-width:1px');
|
||||||
|
});
|
||||||
|
|
||||||
it('should handle multi-numbered style definitions with more then 1 digit in a row', function () {
|
it('should handle multi-numbered style definitions with more then 1 digit in a row', function () {
|
||||||
const res = flow.parser.parse(
|
const res = flow.parser.parse(
|
||||||
'graph TD\n' +
|
'graph TD\n' +
|
||||||
|
@@ -829,6 +829,11 @@ export const draw = function (_text: string, id: string, _version: string, diagO
|
|||||||
bounds.insert(activationData.startx, verticalPos - 10, activationData.stopx, verticalPos);
|
bounds.insert(activationData.startx, verticalPos - 10, activationData.stopx, verticalPos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log.debug('createdActors', createdActors);
|
||||||
|
log.debug('destroyedActors', destroyedActors);
|
||||||
|
|
||||||
|
drawActors(diagram, actors, actorKeys, false);
|
||||||
|
|
||||||
// Draw the messages/signals
|
// Draw the messages/signals
|
||||||
let sequenceIndex = 1;
|
let sequenceIndex = 1;
|
||||||
let sequenceIndexStep = 1;
|
let sequenceIndexStep = 1;
|
||||||
@@ -1028,14 +1033,12 @@ export const draw = function (_text: string, id: string, _version: string, diagO
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
log.debug('createdActors', createdActors);
|
|
||||||
log.debug('destroyedActors', destroyedActors);
|
|
||||||
|
|
||||||
drawActors(diagram, actors, actorKeys, false);
|
|
||||||
messagesToDraw.forEach((e) => drawMessage(diagram, e.messageModel, e.lineStartY, diagObj));
|
messagesToDraw.forEach((e) => drawMessage(diagram, e.messageModel, e.lineStartY, diagObj));
|
||||||
|
|
||||||
if (conf.mirrorActors) {
|
if (conf.mirrorActors) {
|
||||||
drawActors(diagram, actors, actorKeys, true);
|
drawActors(diagram, actors, actorKeys, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
backgrounds.forEach((e) => svgDraw.drawBackgroundRect(diagram, e));
|
backgrounds.forEach((e) => svgDraw.drawBackgroundRect(diagram, e));
|
||||||
fixLifeLineHeights(diagram, actors, actorKeys, conf);
|
fixLifeLineHeights(diagram, actors, actorKeys, conf);
|
||||||
|
|
||||||
|
@@ -324,7 +324,7 @@ const drawActorTypeParticipant = function (elem, actor, conf, isFooter) {
|
|||||||
const center = actor.x + actor.width / 2;
|
const center = actor.x + actor.width / 2;
|
||||||
const centerY = actorY + 5;
|
const centerY = actorY + 5;
|
||||||
|
|
||||||
const boxpluslineGroup = elem.append('g').lower();
|
const boxpluslineGroup = elem.append('g');
|
||||||
var g = boxpluslineGroup;
|
var g = boxpluslineGroup;
|
||||||
|
|
||||||
if (!isFooter) {
|
if (!isFooter) {
|
||||||
|
Reference in New Issue
Block a user