mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-10-09 17:19:45 +02:00
Compare commits
262 Commits
@mermaid-j
...
11abfc9ae5
Author | SHA1 | Date | |
---|---|---|---|
![]() |
11abfc9ae5 | ||
![]() |
81b0ffb92a | ||
![]() |
dd36046e23 | ||
![]() |
1507435e15 | ||
![]() |
68c01b76bf | ||
![]() |
28717e108d | ||
![]() |
688d9b383d | ||
![]() |
e68424d748 | ||
![]() |
204a9a338f | ||
![]() |
6a6a39ff33 | ||
![]() |
b296db9a33 | ||
![]() |
01ce84d8ee | ||
![]() |
f48e663d4c | ||
![]() |
a4aa2bd355 | ||
![]() |
b51b9d50c2 | ||
![]() |
b61780f735 | ||
![]() |
d93d9a521d | ||
![]() |
c99bce6bab | ||
![]() |
074f18dfb8 | ||
![]() |
d7308b0f43 | ||
![]() |
2f1860386a | ||
![]() |
f0bca7da55 | ||
![]() |
6fcdf5bfcc | ||
![]() |
e2ce0450c1 | ||
![]() |
c95c64139d | ||
![]() |
4ab98c2ec7 | ||
![]() |
aeb51e56e2 | ||
![]() |
a7f12f1baa | ||
![]() |
2a8653de2b | ||
![]() |
a92c3bb251 | ||
![]() |
3677abe9e5 | ||
![]() |
ddcd8a5e73 | ||
![]() |
e464d080ef | ||
![]() |
1a9b94ca2d | ||
![]() |
95847ad236 | ||
![]() |
e0152fb873 | ||
![]() |
e4b33a1d99 | ||
![]() |
2298b96d8e | ||
![]() |
5db83365b6 | ||
![]() |
e27a9da61d | ||
![]() |
03cf10003f | ||
![]() |
8e31fdb611 | ||
![]() |
5dd748148f | ||
![]() |
895f9d43ff | ||
![]() |
fb890a2be8 | ||
![]() |
5986189a52 | ||
![]() |
1988dfc956 | ||
![]() |
e48b0ba61d | ||
![]() |
1a4b8662cf | ||
![]() |
6083463c8e | ||
![]() |
1a14e331ea | ||
![]() |
ebb6680eba | ||
![]() |
6d1d46f88a | ||
![]() |
435790f931 | ||
![]() |
ffe9c1090e | ||
![]() |
a476e99d4c | ||
![]() |
0cc0b63e52 | ||
![]() |
694844050a | ||
![]() |
1be1620000 | ||
![]() |
c36cd05c45 | ||
![]() |
341a81a113 | ||
![]() |
8a62b4cace | ||
![]() |
b7a591b8d3 | ||
![]() |
8bb29fc879 | ||
![]() |
e073c80019 | ||
![]() |
01aaef39b4 | ||
![]() |
3d640fc620 | ||
![]() |
724197c910 | ||
![]() |
6180c5f2ff | ||
![]() |
a9f7a94ae3 | ||
![]() |
3ffe9618ae | ||
![]() |
da539c1fa1 | ||
![]() |
5e8aa2dccf | ||
![]() |
ac04172cf8 | ||
![]() |
cf5b4b89a8 | ||
![]() |
1c269e0432 | ||
![]() |
ccafc20917 | ||
![]() |
999b836508 | ||
![]() |
326e4e3693 | ||
![]() |
9c92da487f | ||
![]() |
10752f1357 | ||
![]() |
1a80854242 | ||
![]() |
fc9c600a31 | ||
![]() |
da8ce0b93e | ||
![]() |
00a79353fc | ||
![]() |
1ceeca1ef1 | ||
![]() |
94890390ef | ||
![]() |
d5cb4eaa59 | ||
![]() |
adfeb093cb | ||
![]() |
425fb7ee33 | ||
![]() |
366d217928 | ||
![]() |
b94f1336ab | ||
![]() |
020c6d66e0 | ||
![]() |
cd6f8e5a24 | ||
![]() |
cfc2551bdc | ||
![]() |
000308c8f5 | ||
![]() |
6039a8b930 | ||
![]() |
cd282f2245 | ||
![]() |
a27d90fe9c | ||
![]() |
64bf34b9ab | ||
![]() |
9faf2f9fb2 | ||
![]() |
f683b03645 | ||
![]() |
9cef40d164 | ||
![]() |
04612e078a | ||
![]() |
af585bdcc7 | ||
![]() |
37bfa2aa75 | ||
![]() |
54640ce476 | ||
![]() |
47b4c56b2b | ||
![]() |
6b1b0bf151 | ||
![]() |
7ba332ad4a | ||
![]() |
412d2a09d3 | ||
![]() |
7886fed8b2 | ||
![]() |
af3d5b6528 | ||
![]() |
404286a90d | ||
![]() |
827a9af790 | ||
![]() |
95733b6295 | ||
![]() |
8b86d617e7 | ||
![]() |
cc2112c7aa | ||
![]() |
767754f4fb | ||
![]() |
cff59c58b4 | ||
![]() |
ac976245ad | ||
![]() |
5b241bbb97 | ||
![]() |
7e5e47843b | ||
![]() |
9e2cd1a926 | ||
![]() |
abf2227faf | ||
![]() |
7db942b0e1 | ||
![]() |
70041c806f | ||
![]() |
77e2703f72 | ||
![]() |
771801b366 | ||
![]() |
a9a0a9b2de | ||
![]() |
1e5e835c41 | ||
![]() |
1f3f8da0f7 | ||
![]() |
b11f40e8ce | ||
![]() |
1fe045e638 | ||
![]() |
1c750ffc70 | ||
![]() |
b0ec93f29c | ||
![]() |
6b071c135a | ||
![]() |
42a3c3487f | ||
![]() |
d7b8ed2c5a | ||
![]() |
96c21c7e54 | ||
![]() |
e95e4d155a | ||
![]() |
688170558c | ||
![]() |
832f012e10 | ||
![]() |
2e2e8c4152 | ||
![]() |
6ff6e08c4b | ||
![]() |
d7f1f12549 | ||
![]() |
6e56869566 | ||
![]() |
d3e2be35be | ||
![]() |
852cb35f0a | ||
![]() |
260a045da0 | ||
![]() |
a28965064d | ||
![]() |
355eeeb9cc | ||
![]() |
5449d6a447 | ||
![]() |
34e91f8b65 | ||
![]() |
627ee1f34d | ||
![]() |
28840ebd84 | ||
![]() |
4145879003 | ||
![]() |
e097b480d5 | ||
![]() |
f76e27db70 | ||
![]() |
3e3ae08930 | ||
![]() |
966c112eb1 | ||
![]() |
55527e70c2 | ||
![]() |
447d1cf988 | ||
![]() |
003d1c7a70 | ||
![]() |
daf8d8d3be | ||
![]() |
d7a55b422b | ||
![]() |
12e3d31437 | ||
![]() |
ad024b01d6 | ||
![]() |
c12aea588c | ||
![]() |
9dfbf1166d | ||
![]() |
98bf9b4cb4 | ||
![]() |
e9ce8cf4da | ||
![]() |
d90634bf2b | ||
![]() |
90707e8062 | ||
![]() |
7e23f984e6 | ||
![]() |
b3a12237c0 | ||
![]() |
fad6676d18 | ||
![]() |
637680d4d9 | ||
![]() |
5f6f5110fd | ||
![]() |
af47269342 | ||
![]() |
d3c0893937 | ||
![]() |
75ef9bc681 | ||
![]() |
45edc91591 | ||
![]() |
f4edd19371 | ||
![]() |
b611a13e04 | ||
![]() |
7a38eb715d | ||
![]() |
2715ddb338 | ||
![]() |
ca2eca58c9 | ||
![]() |
b4fae2d096 | ||
![]() |
6dd9af0dd4 | ||
![]() |
3151241559 | ||
![]() |
dda9c9b46e | ||
![]() |
cdd1a70b67 | ||
![]() |
12c94a177b | ||
![]() |
d8bd4dea93 | ||
![]() |
6deb476182 | ||
![]() |
ed297ee235 | ||
![]() |
03c1201fcb | ||
![]() |
3ca317c5a0 | ||
![]() |
4d83263388 | ||
![]() |
254e5cbd51 | ||
![]() |
a58dd3c6ce | ||
![]() |
10b7bb568f | ||
![]() |
79ba50216a | ||
![]() |
71b04f93b0 | ||
![]() |
27185f62e4 | ||
![]() |
9655d07adf | ||
![]() |
939da082b2 | ||
![]() |
e70be4f155 | ||
![]() |
8314554eb5 | ||
![]() |
b7c03dc27e | ||
![]() |
6621f6ddb2 | ||
![]() |
c7f2f609a9 | ||
![]() |
4c3de3a1ec | ||
![]() |
f0445b74d1 | ||
![]() |
ba52eef257 | ||
![]() |
c13ce2a5c0 | ||
![]() |
d2463f41b5 | ||
![]() |
eadb343292 | ||
![]() |
e7208622f7 | ||
![]() |
fbae611406 | ||
![]() |
34027bc589 | ||
![]() |
f2eef37599 | ||
![]() |
954f6cc8fc | ||
![]() |
19884294bc | ||
![]() |
e6b63fd70a | ||
![]() |
8a84ede164 | ||
![]() |
d79b7b2d97 | ||
![]() |
844f879f63 | ||
![]() |
cf789d2c91 | ||
![]() |
4936ef5c30 | ||
![]() |
f006718e56 | ||
![]() |
d720776918 | ||
![]() |
f43398dd44 | ||
![]() |
43ad451940 | ||
![]() |
94c099caa1 | ||
![]() |
3e6f680df2 | ||
![]() |
2e5d955e77 | ||
![]() |
7733faf6c4 | ||
![]() |
b053a88993 | ||
![]() |
7c77c46ede | ||
![]() |
da6937f474 | ||
![]() |
cbb496da79 | ||
![]() |
43e66a6089 | ||
![]() |
5acbd7e762 | ||
![]() |
febae345fc | ||
![]() |
28bdbbca1a | ||
![]() |
4b896fa22e | ||
![]() |
a25ee49edd | ||
![]() |
695b5b2fb2 | ||
![]() |
9b77af540b | ||
![]() |
7829138fb2 | ||
![]() |
7e7a4fc665 | ||
![]() |
34e6112fea | ||
![]() |
0c759d0075 | ||
![]() |
5b7c1aad9e | ||
![]() |
865c453547 | ||
![]() |
c0b14021b7 | ||
![]() |
1e3ea13323 | ||
![]() |
4c8c48cde9 | ||
![]() |
c8e50276e8 | ||
![]() |
1e6419a63f |
@@ -33,4 +33,14 @@ export const packageOptions = {
|
|||||||
packageName: 'mermaid-layout-elk',
|
packageName: 'mermaid-layout-elk',
|
||||||
file: 'layouts.ts',
|
file: 'layouts.ts',
|
||||||
},
|
},
|
||||||
|
'mermaid-layout-tidy-tree': {
|
||||||
|
name: 'mermaid-layout-tidy-tree',
|
||||||
|
packageName: 'mermaid-layout-tidy-tree',
|
||||||
|
file: 'index.ts',
|
||||||
|
},
|
||||||
|
examples: {
|
||||||
|
name: 'mermaid-examples',
|
||||||
|
packageName: 'examples',
|
||||||
|
file: 'index.ts',
|
||||||
|
},
|
||||||
} as const satisfies Record<string, PackageOptions>;
|
} as const satisfies Record<string, PackageOptions>;
|
||||||
|
5
.changeset/beige-peas-shave.md
Normal file
5
.changeset/beige-peas-shave.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
'@mermaid-js/mermaid-zenuml': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
Fixed a critical bug that the ZenUML diagram is not rendered.
|
7
.changeset/hungry-guests-drive.md
Normal file
7
.changeset/hungry-guests-drive.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
'mermaid': minor
|
||||||
|
'@mermaid-js/layout-tidy-tree': minor
|
||||||
|
'@mermaid-js/layout-elk': minor
|
||||||
|
---
|
||||||
|
|
||||||
|
feat: Update mindmap rendering to support multiple layouts, improved edge intersections, and new shapes
|
5
.changeset/large-mirrors-cheer.md
Normal file
5
.changeset/large-mirrors-cheer.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
'mermaid': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
fix: Update casing of ID in requirement diagram
|
5
.changeset/lemon-masks-unite.md
Normal file
5
.changeset/lemon-masks-unite.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
'mermaid': minor
|
||||||
|
---
|
||||||
|
|
||||||
|
feat: Added support for per link curve styling in flowchart diagram using edge ids
|
5
.changeset/light-flowers-judge.md
Normal file
5
.changeset/light-flowers-judge.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
'mermaid': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
fix: Make flowchart elk detector regex match less greedy
|
8
.changeset/lovely-queens-own.md
Normal file
8
.changeset/lovely-queens-own.md
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
'mermaid': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
fix(block): overflowing blocks no longer affect later lines
|
||||||
|
|
||||||
|
This may change the layout of block diagrams that have overflowing lines
|
||||||
|
(i.e. block diagrams that use up more columns that the `columns` specifier).
|
7
.changeset/ninety-roses-turn.md
Normal file
7
.changeset/ninety-roses-turn.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
'mermaid': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
fix: log warning for blocks exceeding column width
|
||||||
|
|
||||||
|
This update adds a validation check that logs a warning message when a block's width exceeds the defined column layout.
|
5
.changeset/rare-women-fly.md
Normal file
5
.changeset/rare-women-fly.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
'mermaid': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
fix: Add escaped class literal name on namespace
|
5
.changeset/silver-eyes-build.md
Normal file
5
.changeset/silver-eyes-build.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
'mermaid': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
chore: migrate to class-based ArchitectureDB implementation
|
5
.changeset/smart-humans-cover.md
Normal file
5
.changeset/smart-humans-cover.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
'mermaid': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
fix: Update flowchart direction TD's behavior to be the same as TB
|
5
.changeset/vast-buses-see.md
Normal file
5
.changeset/vast-buses-see.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
'mermaid': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
chore: Update packet diagram to use new class-based database structure
|
@@ -7,6 +7,7 @@ catmull
|
|||||||
compositTitleSize
|
compositTitleSize
|
||||||
curv
|
curv
|
||||||
doublecircle
|
doublecircle
|
||||||
|
elem
|
||||||
elems
|
elems
|
||||||
gantt
|
gantt
|
||||||
gitgraph
|
gitgraph
|
||||||
|
3
.github/lychee.toml
vendored
3
.github/lychee.toml
vendored
@@ -52,6 +52,9 @@ exclude = [
|
|||||||
# Swimm returns 404, even though the link is valid
|
# Swimm returns 404, even though the link is valid
|
||||||
"https://docs.swimm.io",
|
"https://docs.swimm.io",
|
||||||
|
|
||||||
|
# Certificate Error
|
||||||
|
"https://noteshub.app",
|
||||||
|
|
||||||
# Timeout
|
# Timeout
|
||||||
"https://huehive.co",
|
"https://huehive.co",
|
||||||
"https://foswiki.org",
|
"https://foswiki.org",
|
||||||
|
2
.github/workflows/autofix.yml
vendored
2
.github/workflows/autofix.yml
vendored
@@ -42,4 +42,4 @@ jobs:
|
|||||||
working-directory: ./packages/mermaid
|
working-directory: ./packages/mermaid
|
||||||
run: pnpm run docs:build
|
run: pnpm run docs:build
|
||||||
|
|
||||||
- uses: autofix-ci/action@551dded8c6cc8a1054039c8bc0b8b48c51dfc6ef # main
|
- uses: autofix-ci/action@635ffb0c9798bd160680f18fd73371e355b85f27 # main
|
||||||
|
2
.github/workflows/e2e-timings.yml
vendored
2
.github/workflows/e2e-timings.yml
vendored
@@ -58,7 +58,7 @@ jobs:
|
|||||||
echo "EOF" >> $GITHUB_OUTPUT
|
echo "EOF" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Commit and create pull request
|
- name: Commit and create pull request
|
||||||
uses: peter-evans/create-pull-request@889dce9eaba7900ce30494f5e1ac7220b27e5c81
|
uses: peter-evans/create-pull-request@07cbaebb4bfc9c5d7db426ea5a5f585df29dd0a0
|
||||||
with:
|
with:
|
||||||
add-paths: |
|
add-paths: |
|
||||||
cypress/timings.json
|
cypress/timings.json
|
||||||
|
26
.github/workflows/pr-labeler.yml
vendored
26
.github/workflows/pr-labeler.yml
vendored
@@ -29,3 +29,29 @@ jobs:
|
|||||||
disable-releaser: true
|
disable-releaser: true
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Add "Sponsored by MermaidChart" label
|
||||||
|
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
script: |
|
||||||
|
const prNumber = context.payload.pull_request.number;
|
||||||
|
const { data: commits } = await github.rest.pulls.listCommits({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
pull_number: prNumber,
|
||||||
|
});
|
||||||
|
|
||||||
|
const isSponsored = commits.every(
|
||||||
|
(c) => c.commit.author.email?.endsWith('@mermaidchart.com')
|
||||||
|
);
|
||||||
|
|
||||||
|
if (isSponsored) {
|
||||||
|
console.log('PR is sponsored. Adding label.');
|
||||||
|
await github.rest.issues.addLabels({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
issue_number: prNumber,
|
||||||
|
labels: ['Sponsored by MermaidChart'],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
2
.github/workflows/validate-lockfile.yml
vendored
2
.github/workflows/validate-lockfile.yml
vendored
@@ -35,7 +35,7 @@ jobs:
|
|||||||
|
|
||||||
# 2) No unwanted vitepress paths
|
# 2) No unwanted vitepress paths
|
||||||
if grep -qF 'packages/mermaid/src/vitepress' pnpm-lock.yaml; then
|
if grep -qF 'packages/mermaid/src/vitepress' pnpm-lock.yaml; then
|
||||||
issues+=("• Disallowed path 'packages/mermaid/src/vitepress' present. Run `rm -rf packages/mermaid/src/vitepress && pnpm install` to regenerate.")
|
issues+=("• Disallowed path 'packages/mermaid/src/vitepress' present. Run \`rm -rf packages/mermaid/src/vitepress && pnpm install\` to regenerate.")
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 3) Lockfile only changes when package.json changes
|
# 3) Lockfile only changes when package.json changes
|
||||||
|
1
.gitignore
vendored
1
.gitignore
vendored
@@ -4,6 +4,7 @@ node_modules/
|
|||||||
coverage/
|
coverage/
|
||||||
.idea/
|
.idea/
|
||||||
.pnpm-store/
|
.pnpm-store/
|
||||||
|
.instructions/
|
||||||
|
|
||||||
dist
|
dist
|
||||||
v8-compile-cache-0
|
v8-compile-cache-0
|
||||||
|
1005
CHANGELOG.md
1005
CHANGELOG.md
File diff suppressed because it is too large
Load Diff
1
CHANGELOG.md
Symbolic link
1
CHANGELOG.md
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
./packages/mermaid/CHANGELOG.md
|
@@ -1,13 +0,0 @@
|
|||||||
import { MockedD3 } from '../packages/mermaid/src/tests/MockedD3.js';
|
|
||||||
|
|
||||||
export const select = function () {
|
|
||||||
return new MockedD3();
|
|
||||||
};
|
|
||||||
|
|
||||||
export const selectAll = function () {
|
|
||||||
return new MockedD3();
|
|
||||||
};
|
|
||||||
|
|
||||||
export const curveBasis = 'basis';
|
|
||||||
export const curveLinear = 'linear';
|
|
||||||
export const curveCardinal = 'cardinal';
|
|
@@ -26,7 +26,10 @@ export default eyesPlugin(
|
|||||||
config.env.useArgos = process.env.RUN_VISUAL_TEST === 'true';
|
config.env.useArgos = process.env.RUN_VISUAL_TEST === 'true';
|
||||||
|
|
||||||
if (config.env.useArgos) {
|
if (config.env.useArgos) {
|
||||||
registerArgosTask(on, config);
|
registerArgosTask(on, config, {
|
||||||
|
// Enable upload to Argos only when it runs on CI.
|
||||||
|
uploadToArgos: !!process.env.CI,
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
addMatchImageSnapshotPlugin(on, config);
|
addMatchImageSnapshotPlugin(on, config);
|
||||||
}
|
}
|
||||||
|
@@ -384,4 +384,17 @@ describe('Block diagram', () => {
|
|||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('BL30: block should overflow if too wide for columns', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`block-beta
|
||||||
|
columns 2
|
||||||
|
fit:2
|
||||||
|
overflow:3
|
||||||
|
short:1
|
||||||
|
also_overflow:2
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@@ -495,4 +495,34 @@ describe('Class diagram', () => {
|
|||||||
cy.get('a').should('have.attr', 'target', '_blank').should('have.attr', 'rel', 'noopener');
|
cy.get('a').should('have.attr', 'target', '_blank').should('have.attr', 'rel', 'noopener');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('Include char sequence "graph" in text (#6795)', () => {
|
||||||
|
it('has a label with char sequence "graph"', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
classDiagram
|
||||||
|
class Person {
|
||||||
|
+String name
|
||||||
|
-Int id
|
||||||
|
#double age
|
||||||
|
+Text demographicProfile
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
{ flowchart: { defaultRenderer: 'elk' } }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle backticks for namespace and class names', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
classDiagram
|
||||||
|
namespace \`A::B\` {
|
||||||
|
class \`IPC::Sender\`
|
||||||
|
}
|
||||||
|
RenderProcessHost --|> \`IPC::Sender\`
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@@ -354,4 +354,19 @@ ORDER ||--|{ LINE-ITEM : contains
|
|||||||
{ logLevel: 1 }
|
{ logLevel: 1 }
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('Include char sequence "graph" in text (#6795)', () => {
|
||||||
|
it('has a label with char sequence "graph"', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
p[Photograph] {
|
||||||
|
varchar(12) jobId
|
||||||
|
date dateCreated
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
{ flowchart: { defaultRenderer: 'elk' } }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@@ -1113,4 +1113,24 @@ end
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('6617: Per Link Curve Styling using edge Ids', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`flowchart TD
|
||||||
|
A e1@-->B e5@--> E
|
||||||
|
E e7@--> D
|
||||||
|
B e3@-->D
|
||||||
|
A e2@-->C e4@-->D
|
||||||
|
C e6@--> F
|
||||||
|
F e8@--> D
|
||||||
|
e1@{ curve: natural }
|
||||||
|
e2@{ curve: stepAfter }
|
||||||
|
e3@{ curve: monotoneY }
|
||||||
|
e4@{ curve: bumpY }
|
||||||
|
e5@{ curve: linear }
|
||||||
|
e6@{ curve: catmullRom }
|
||||||
|
e7@{ curve: cardinal }
|
||||||
|
`
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@@ -159,12 +159,10 @@ root
|
|||||||
});
|
});
|
||||||
it('square shape', () => {
|
it('square shape', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`mindmap
|
||||||
mindmap
|
|
||||||
root[
|
root[
|
||||||
The root
|
The root
|
||||||
]
|
]`,
|
||||||
`,
|
|
||||||
{},
|
{},
|
||||||
undefined,
|
undefined,
|
||||||
shouldHaveRoot
|
shouldHaveRoot
|
||||||
@@ -172,12 +170,10 @@ mindmap
|
|||||||
});
|
});
|
||||||
it('rounded rect shape', () => {
|
it('rounded rect shape', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`mindmap
|
||||||
mindmap
|
|
||||||
root((
|
root((
|
||||||
The root
|
The root
|
||||||
))
|
))`,
|
||||||
`,
|
|
||||||
{},
|
{},
|
||||||
undefined,
|
undefined,
|
||||||
shouldHaveRoot
|
shouldHaveRoot
|
||||||
@@ -185,12 +181,10 @@ mindmap
|
|||||||
});
|
});
|
||||||
it('circle shape', () => {
|
it('circle shape', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`mindmap
|
||||||
mindmap
|
|
||||||
root(
|
root(
|
||||||
The root
|
The root
|
||||||
)
|
)`,
|
||||||
`,
|
|
||||||
{},
|
{},
|
||||||
undefined,
|
undefined,
|
||||||
shouldHaveRoot
|
shouldHaveRoot
|
||||||
@@ -198,10 +192,8 @@ mindmap
|
|||||||
});
|
});
|
||||||
it('default shape', () => {
|
it('default shape', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`mindmap
|
||||||
mindmap
|
The root`,
|
||||||
The root
|
|
||||||
`,
|
|
||||||
{},
|
{},
|
||||||
undefined,
|
undefined,
|
||||||
shouldHaveRoot
|
shouldHaveRoot
|
||||||
@@ -209,12 +201,10 @@ mindmap
|
|||||||
});
|
});
|
||||||
it('adding children', () => {
|
it('adding children', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`mindmap
|
||||||
mindmap
|
|
||||||
The root
|
The root
|
||||||
child1
|
child1
|
||||||
child2
|
child2`,
|
||||||
`,
|
|
||||||
{},
|
{},
|
||||||
undefined,
|
undefined,
|
||||||
shouldHaveRoot
|
shouldHaveRoot
|
||||||
@@ -222,13 +212,11 @@ mindmap
|
|||||||
});
|
});
|
||||||
it('adding grand children', () => {
|
it('adding grand children', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`mindmap
|
||||||
mindmap
|
|
||||||
The root
|
The root
|
||||||
child1
|
child1
|
||||||
child2
|
child2
|
||||||
child3
|
child3`,
|
||||||
`,
|
|
||||||
{},
|
{},
|
||||||
undefined,
|
undefined,
|
||||||
shouldHaveRoot
|
shouldHaveRoot
|
||||||
@@ -246,5 +234,22 @@ Word!\`]
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
describe('Include char sequence "graph" in text (#6795)', () => {
|
||||||
|
it('has a label with char sequence "graph"', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
mindmap
|
||||||
|
root
|
||||||
|
Photograph
|
||||||
|
Waterfall
|
||||||
|
Landscape
|
||||||
|
Geography
|
||||||
|
Mountains
|
||||||
|
Rocks
|
||||||
|
`,
|
||||||
|
{ flowchart: { defaultRenderer: 'elk' } }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
/* The end */
|
/* The end */
|
||||||
});
|
});
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
import { imgSnapshotTest } from '../../helpers/util';
|
import { imgSnapshotTest } from '../../helpers/util';
|
||||||
|
|
||||||
describe('packet structure', () => {
|
describe('packet structure', () => {
|
||||||
it('should render a simple packet diagram', () => {
|
it('should render a simple packet-beta diagram', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`packet-beta
|
`packet-beta
|
||||||
title Hello world
|
title Hello world
|
||||||
@@ -10,9 +10,18 @@ describe('packet structure', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should render a simple packet diagram', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`packet
|
||||||
|
title Hello world
|
||||||
|
0-10: "hello"
|
||||||
|
`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
it('should render a simple packet diagram without ranges', () => {
|
it('should render a simple packet diagram without ranges', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`packet-beta
|
`packet
|
||||||
0: "h"
|
0: "h"
|
||||||
1: "i"
|
1: "i"
|
||||||
`
|
`
|
||||||
@@ -21,7 +30,7 @@ describe('packet structure', () => {
|
|||||||
|
|
||||||
it('should render a complex packet diagram', () => {
|
it('should render a complex packet diagram', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`packet-beta
|
`packet
|
||||||
0-15: "Source Port"
|
0-15: "Source Port"
|
||||||
16-31: "Destination Port"
|
16-31: "Destination Port"
|
||||||
32-63: "Sequence Number"
|
32-63: "Sequence Number"
|
||||||
@@ -52,7 +61,7 @@ describe('packet structure', () => {
|
|||||||
packet:
|
packet:
|
||||||
showBits: false
|
showBits: false
|
||||||
---
|
---
|
||||||
packet-beta
|
packet
|
||||||
0-15: "Source Port"
|
0-15: "Source Port"
|
||||||
16-31: "Destination Port"
|
16-31: "Destination Port"
|
||||||
32-63: "Sequence Number"
|
32-63: "Sequence Number"
|
||||||
|
@@ -131,94 +131,161 @@
|
|||||||
|
|
||||||
<body>
|
<body>
|
||||||
<pre id="diagram4" class="mermaid">
|
<pre id="diagram4" class="mermaid">
|
||||||
treemap
|
---
|
||||||
"Section 1"
|
config:
|
||||||
"Leaf 1.1": 12
|
layout: elk
|
||||||
"Section 1.2":::class1
|
flowchart:
|
||||||
"Leaf 1.2.1": 12
|
curve: linear
|
||||||
"Section 2"
|
---
|
||||||
"Leaf 2.1": 20:::class1
|
flowchart LR
|
||||||
"Leaf 2.2": 25
|
D["Use<br/>the<br/>editor"] -- Mermaid js --> I["fa:fa-code Text"]
|
||||||
"Leaf 2.3": 12
|
I --> D & D
|
||||||
|
D@{ shape: question}
|
||||||
|
I@{ shape: question}
|
||||||
|
|
||||||
classDef class1 fill:red,color:blue,stroke:#FFD600;
|
</pre>
|
||||||
|
<pre id="diagram5" class="mermaid">
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
layout: elk
|
||||||
|
flowchart:
|
||||||
|
curve: rounded
|
||||||
|
---
|
||||||
|
flowchart LR
|
||||||
|
I["fa:fa-code Text"] -- Mermaid js --> D["Use<br/>the<br/>editor!"]
|
||||||
|
I --> D & D
|
||||||
|
D@{ shape: question}
|
||||||
|
I@{ shape: question}
|
||||||
|
|
||||||
|
</pre>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
layout: tidy-tree
|
||||||
|
---
|
||||||
|
mindmap
|
||||||
|
root((mindmap))
|
||||||
|
Origins
|
||||||
|
Long history
|
||||||
|
::icon(fa fa-book)
|
||||||
|
Popularisation
|
||||||
|
British popular psychology author Tony Buzan
|
||||||
|
Research
|
||||||
|
On effectiveness<br/>and features
|
||||||
|
On Automatic creation
|
||||||
|
Uses
|
||||||
|
Creative techniques
|
||||||
|
Strategic planning
|
||||||
|
Argument mapping
|
||||||
|
Tools
|
||||||
|
Pen and paper
|
||||||
|
Mermaid
|
||||||
|
|
||||||
</pre
|
</pre>
|
||||||
>
|
<pre id="diagram4" class="mermaid">
|
||||||
<pre id="diagram4" class="mermaid2">
|
---
|
||||||
|
config:
|
||||||
|
layout: elk
|
||||||
|
flowchart:
|
||||||
|
curve: linear
|
||||||
|
---
|
||||||
|
flowchart LR
|
||||||
|
A[A] --> B[B]
|
||||||
|
A[A] --- B([C])
|
||||||
|
A@{ shape: diamond}
|
||||||
|
%%B@{ shape: diamond}
|
||||||
|
|
||||||
|
</pre>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
layout: elk
|
||||||
|
flowchart:
|
||||||
|
curve: linear
|
||||||
|
---
|
||||||
|
flowchart LR
|
||||||
|
A[A] -- Mermaid js --> B[B]
|
||||||
|
A[A] -- Mermaid js --- B[B]
|
||||||
|
A@{ shape: diamond}
|
||||||
|
B@{ shape: diamond}
|
||||||
|
|
||||||
|
</pre>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
layout: elk
|
||||||
|
flowchart:
|
||||||
|
curve: rounded
|
||||||
|
---
|
||||||
|
flowchart LR
|
||||||
|
D["Use the editor"] -- Mermaid js --> I["fa:fa-code Text"]
|
||||||
|
I --> D & D
|
||||||
|
D@{ shape: question}
|
||||||
|
I@{ shape: question}
|
||||||
|
</pre>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
layout: elk
|
||||||
|
flowchart:
|
||||||
|
curve: rounded
|
||||||
|
elk:
|
||||||
|
nodePlacementStrategy: NETWORK_SIMPLEX
|
||||||
|
---
|
||||||
|
flowchart LR
|
||||||
|
D["Use the editor"] -- Mermaid js --> I["fa:fa-code Text"]
|
||||||
|
D --> I & I
|
||||||
|
a["a"]
|
||||||
|
D@{ shape: trap-b}
|
||||||
|
I@{ shape: lean-l}
|
||||||
|
</pre>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
---
|
---
|
||||||
config:
|
config:
|
||||||
treemap:
|
layout: elk
|
||||||
valueFormat: '$0,0'
|
|
||||||
---
|
---
|
||||||
treemap
|
flowchart LR
|
||||||
"Budget"
|
%% subgraph s1["Untitled subgraph"]
|
||||||
"Operations"
|
C["Evaluate"]
|
||||||
"Salaries": 7000
|
%% end
|
||||||
"Equipment": 2000
|
|
||||||
"Supplies": 1000
|
|
||||||
"Marketing"
|
|
||||||
"Advertising": 4000
|
|
||||||
"Events": 1000
|
|
||||||
|
|
||||||
</pre
|
B --> C
|
||||||
>
|
</pre>
|
||||||
<pre id="diagram4" class="mermaid">
|
<pre id="diagram4" class="mermaid">
|
||||||
treemap
|
---
|
||||||
title Accessible Treemap Title
|
config:
|
||||||
"Category A"
|
layout: elk
|
||||||
"Item A1": 10
|
flowchart:
|
||||||
"Item A2": 20
|
//curve: linear
|
||||||
"Category B"
|
---
|
||||||
"Item B1": 15
|
|
||||||
"Item B2": 25
|
|
||||||
</pre>
|
|
||||||
<pre id="diagram4" class="mermaid2">
|
|
||||||
flowchart LR
|
|
||||||
AB["apa@apa@"] --> B(("`apa@apa`"))
|
|
||||||
</pre>
|
|
||||||
<pre id="diagram4" class="mermaid2">
|
|
||||||
flowchart
|
|
||||||
D(("for D"))
|
|
||||||
</pre>
|
|
||||||
<pre id="diagram4" class="mermaid2">
|
|
||||||
flowchart LR
|
|
||||||
A e1@==> B
|
|
||||||
e1@{ animate: true}
|
|
||||||
</pre>
|
|
||||||
<pre id="diagram4" class="mermaid2">
|
|
||||||
flowchart LR
|
flowchart LR
|
||||||
A e1@--> B
|
%% A ==> B
|
||||||
classDef animate stroke-width:2,stroke-dasharray:10\,8,stroke-dashoffset:-180,animation: edge-animation-frame 6s linear infinite, stroke-linecap: round
|
%% A2 --> B2
|
||||||
class e1 animate
|
A{A} --> B((Bo boo)) & B & B & B
|
||||||
</pre>
|
|
||||||
<h2>infinite</h2>
|
|
||||||
<pre id="diagram4" class="mermaid2">
|
|
||||||
flowchart LR
|
|
||||||
A e1@--> B
|
|
||||||
classDef animate stroke-dasharray: 9\,5,stroke-dashoffset: 900,animation: dash 25s linear infinite;
|
|
||||||
class e1 animate
|
|
||||||
</pre>
|
|
||||||
<h2>Mermaid - edge-animation-slow</h2>
|
|
||||||
<pre id="diagram4" class="mermaid2">
|
|
||||||
flowchart LR
|
|
||||||
A e1@--> B
|
|
||||||
e1@{ animation: fast}
|
|
||||||
</pre>
|
|
||||||
<h2>Mermaid - edge-animation-fast</h2>
|
|
||||||
<pre id="diagram4" class="mermaid2">
|
|
||||||
flowchart LR
|
|
||||||
A e1@--> B
|
|
||||||
classDef animate stroke-dasharray: 1000,stroke-dashoffset: 1000,animation: dash 10s linear;
|
|
||||||
class e1 edge-animation-fast
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<pre id="diagram4" class="mermaid2">
|
</pre>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
info </pre
|
---
|
||||||
>
|
config:
|
||||||
<pre id="diagram4" class="mermaid2">
|
layout: elk
|
||||||
|
theme: default
|
||||||
|
look: classic
|
||||||
|
---
|
||||||
|
flowchart LR
|
||||||
|
subgraph s1["APA"]
|
||||||
|
D{"Use the editor"}
|
||||||
|
end
|
||||||
|
subgraph S2["S2"]
|
||||||
|
s1
|
||||||
|
I>"fa:fa-code Text"]
|
||||||
|
E["E"]
|
||||||
|
end
|
||||||
|
D -- Mermaid js --> I
|
||||||
|
D --> I & E
|
||||||
|
E --> I
|
||||||
|
</pre>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
---
|
---
|
||||||
config:
|
config:
|
||||||
layout: elk
|
layout: elk
|
||||||
@@ -243,7 +310,7 @@ config:
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
</pre>
|
</pre>
|
||||||
<pre id="diagram4" class="mermaid2">
|
<pre id="diagram4" class="mermaid">
|
||||||
---
|
---
|
||||||
config:
|
config:
|
||||||
layout: elk
|
layout: elk
|
||||||
@@ -256,7 +323,7 @@ config:
|
|||||||
D-->I
|
D-->I
|
||||||
D-->I
|
D-->I
|
||||||
</pre>
|
</pre>
|
||||||
<pre id="diagram4" class="mermaid2">
|
<pre id="diagram4" class="mermaid">
|
||||||
---
|
---
|
||||||
config:
|
config:
|
||||||
layout: elk
|
layout: elk
|
||||||
@@ -295,7 +362,7 @@ flowchart LR
|
|||||||
n8@{ shape: rect}
|
n8@{ shape: rect}
|
||||||
|
|
||||||
</pre>
|
</pre>
|
||||||
<pre id="diagram4" class="mermaid2">
|
<pre id="diagram4" class="mermaid">
|
||||||
---
|
---
|
||||||
config:
|
config:
|
||||||
layout: elk
|
layout: elk
|
||||||
@@ -311,7 +378,7 @@ flowchart LR
|
|||||||
|
|
||||||
|
|
||||||
</pre>
|
</pre>
|
||||||
<pre id="diagram4" class="mermaid2">
|
<pre id="diagram4" class="mermaid">
|
||||||
---
|
---
|
||||||
config:
|
config:
|
||||||
layout: elk
|
layout: elk
|
||||||
@@ -320,7 +387,7 @@ flowchart LR
|
|||||||
A{A} --> B & C
|
A{A} --> B & C
|
||||||
</pre
|
</pre
|
||||||
>
|
>
|
||||||
<pre id="diagram4" class="mermaid2">
|
<pre id="diagram4" class="mermaid">
|
||||||
---
|
---
|
||||||
config:
|
config:
|
||||||
layout: elk
|
layout: elk
|
||||||
@@ -332,7 +399,7 @@ flowchart LR
|
|||||||
end
|
end
|
||||||
</pre
|
</pre
|
||||||
>
|
>
|
||||||
<pre id="diagram4" class="mermaid2">
|
<pre id="diagram4" class="mermaid">
|
||||||
---
|
---
|
||||||
config:
|
config:
|
||||||
layout: elk
|
layout: elk
|
||||||
@@ -350,7 +417,7 @@ flowchart LR
|
|||||||
|
|
||||||
|
|
||||||
</pre>
|
</pre>
|
||||||
<pre id="diagram4" class="mermaid2">
|
<pre id="diagram4" class="mermaid">
|
||||||
---
|
---
|
||||||
config:
|
config:
|
||||||
kanban:
|
kanban:
|
||||||
@@ -369,81 +436,81 @@ kanban
|
|||||||
task3[💻 Develop login feature]@{ ticket: 103 }
|
task3[💻 Develop login feature]@{ ticket: 103 }
|
||||||
|
|
||||||
</pre>
|
</pre>
|
||||||
<pre id="diagram4" class="mermaid2">
|
<pre id="diagram4" class="mermaid">
|
||||||
flowchart LR
|
flowchart LR
|
||||||
nA[Default] --> A@{ icon: 'fa:bell', form: 'rounded' }
|
nA[Default] --> A@{ icon: 'fa:bell', form: 'rounded' }
|
||||||
|
|
||||||
</pre>
|
</pre>
|
||||||
<pre id="diagram4" class="mermaid2">
|
<pre id="diagram4" class="mermaid">
|
||||||
flowchart LR
|
flowchart LR
|
||||||
nA[Style] --> A@{ icon: 'fa:bell', form: 'rounded' }
|
nA[Style] --> A@{ icon: 'fa:bell', form: 'rounded' }
|
||||||
style A fill:#f9f,stroke:#333,stroke-width:4px
|
style A fill:#f9f,stroke:#333,stroke-width:4px
|
||||||
</pre>
|
</pre>
|
||||||
<pre id="diagram4" class="mermaid2">
|
<pre id="diagram4" class="mermaid">
|
||||||
flowchart LR
|
flowchart LR
|
||||||
nA[Class] --> A@{ icon: 'fa:bell', form: 'rounded' }
|
nA[Class] --> A@{ icon: 'fa:bell', form: 'rounded' }
|
||||||
A:::AClass
|
A:::AClass
|
||||||
classDef AClass fill:#f9f,stroke:#333,stroke-width:4px
|
classDef AClass fill:#f9f,stroke:#333,stroke-width:4px
|
||||||
</pre>
|
</pre>
|
||||||
<pre id="diagram4" class="mermaid2">
|
<pre id="diagram4" class="mermaid">
|
||||||
flowchart LR
|
flowchart LR
|
||||||
nA[Class] --> A@{ icon: 'logos:aws', form: 'rounded' }
|
nA[Class] --> A@{ icon: 'logos:aws', form: 'rounded' }
|
||||||
|
|
||||||
</pre>
|
</pre>
|
||||||
<pre id="diagram4" class="mermaid2">
|
<pre id="diagram4" class="mermaid">
|
||||||
flowchart LR
|
flowchart LR
|
||||||
nA[Default] --> A@{ icon: 'fa:bell', form: 'square' }
|
nA[Default] --> A@{ icon: 'fa:bell', form: 'square' }
|
||||||
|
|
||||||
</pre>
|
</pre>
|
||||||
<pre id="diagram4" class="mermaid2">
|
<pre id="diagram4" class="mermaid">
|
||||||
flowchart LR
|
flowchart LR
|
||||||
nA[Style] --> A@{ icon: 'fa:bell', form: 'square' }
|
nA[Style] --> A@{ icon: 'fa:bell', form: 'square' }
|
||||||
style A fill:#f9f,stroke:#333,stroke-width:4px
|
style A fill:#f9f,stroke:#333,stroke-width:4px
|
||||||
</pre>
|
</pre>
|
||||||
<pre id="diagram4" class="mermaid2">
|
<pre id="diagram4" class="mermaid">
|
||||||
flowchart LR
|
flowchart LR
|
||||||
nA[Class] --> A@{ icon: 'fa:bell', form: 'square' }
|
nA[Class] --> A@{ icon: 'fa:bell', form: 'square' }
|
||||||
A:::AClass
|
A:::AClass
|
||||||
classDef AClass fill:#f9f,stroke:#333,stroke-width:4px
|
classDef AClass fill:#f9f,stroke:#333,stroke-width:4px
|
||||||
</pre>
|
</pre>
|
||||||
<pre id="diagram4" class="mermaid2">
|
<pre id="diagram4" class="mermaid">
|
||||||
flowchart LR
|
flowchart LR
|
||||||
nA[Class] --> A@{ icon: 'logos:aws', form: 'square' }
|
nA[Class] --> A@{ icon: 'logos:aws', form: 'square' }
|
||||||
|
|
||||||
</pre>
|
</pre>
|
||||||
<pre id="diagram4" class="mermaid2">
|
<pre id="diagram4" class="mermaid">
|
||||||
flowchart LR
|
flowchart LR
|
||||||
nA[Default] --> A@{ icon: 'fa:bell', form: 'circle' }
|
nA[Default] --> A@{ icon: 'fa:bell', form: 'circle' }
|
||||||
|
|
||||||
</pre>
|
</pre>
|
||||||
<pre id="diagram4" class="mermaid2">
|
<pre id="diagram4" class="mermaid">
|
||||||
flowchart LR
|
flowchart LR
|
||||||
nA[Style] --> A@{ icon: 'fa:bell', form: 'circle' }
|
nA[Style] --> A@{ icon: 'fa:bell', form: 'circle' }
|
||||||
style A fill:#f9f,stroke:#333,stroke-width:4px
|
style A fill:#f9f,stroke:#333,stroke-width:4px
|
||||||
</pre>
|
</pre>
|
||||||
<pre id="diagram4" class="mermaid2">
|
<pre id="diagram4" class="mermaid">
|
||||||
flowchart LR
|
flowchart LR
|
||||||
nA[Class] --> A@{ icon: 'fa:bell', form: 'circle' }
|
nA[Class] --> A@{ icon: 'fa:bell', form: 'circle' }
|
||||||
A:::AClass
|
A:::AClass
|
||||||
classDef AClass fill:#f9f,stroke:#333,stroke-width:4px
|
classDef AClass fill:#f9f,stroke:#333,stroke-width:4px
|
||||||
</pre>
|
</pre>
|
||||||
<pre id="diagram4" class="mermaid2">
|
<pre id="diagram4" class="mermaid">
|
||||||
flowchart LR
|
flowchart LR
|
||||||
nA[Class] --> A@{ icon: 'logos:aws', form: 'circle' }
|
nA[Class] --> A@{ icon: 'logos:aws', form: 'circle' }
|
||||||
A:::AClass
|
A:::AClass
|
||||||
classDef AClass fill:#f9f,stroke:#333,stroke-width:4px
|
classDef AClass fill:#f9f,stroke:#333,stroke-width:4px
|
||||||
</pre>
|
</pre>
|
||||||
<pre id="diagram4" class="mermaid2">
|
<pre id="diagram4" class="mermaid">
|
||||||
flowchart LR
|
flowchart LR
|
||||||
nA[Style] --> A@{ icon: 'logos:aws', form: 'circle' }
|
nA[Style] --> A@{ icon: 'logos:aws', form: 'circle' }
|
||||||
style A fill:#f9f,stroke:#333,stroke-width:4px
|
style A fill:#f9f,stroke:#333,stroke-width:4px
|
||||||
</pre>
|
</pre>
|
||||||
<pre id="diagram4" class="mermaid2">
|
<pre id="diagram4" class="mermaid">
|
||||||
kanban
|
kanban
|
||||||
id2[In progress]
|
id2[In progress]
|
||||||
docs[Create Blog about the new diagram]@{ priority: 'Very Low', ticket: MC-2037, assigned: 'knsv' }
|
docs[Create Blog about the new diagram]@{ priority: 'Very Low', ticket: MC-2037, assigned: 'knsv' }
|
||||||
</pre>
|
</pre>
|
||||||
<pre id="diagram4" class="mermaid2">
|
<pre id="diagram4" class="mermaid">
|
||||||
---
|
---
|
||||||
config:
|
config:
|
||||||
kanban:
|
kanban:
|
||||||
@@ -472,6 +539,7 @@ kanban
|
|||||||
<script type="module">
|
<script type="module">
|
||||||
import mermaid from './mermaid.esm.mjs';
|
import mermaid from './mermaid.esm.mjs';
|
||||||
import layouts from './mermaid-layout-elk.esm.mjs';
|
import layouts from './mermaid-layout-elk.esm.mjs';
|
||||||
|
import tidyTreeLayouts from './mermaid-layout-tidy-tree.esm.mjs';
|
||||||
|
|
||||||
const staticBellIconPack = {
|
const staticBellIconPack = {
|
||||||
prefix: 'fa6-regular',
|
prefix: 'fa6-regular',
|
||||||
@@ -497,6 +565,7 @@ kanban
|
|||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
mermaid.registerLayoutLoaders(layouts);
|
mermaid.registerLayoutLoaders(layouts);
|
||||||
|
mermaid.registerLayoutLoaders(tidyTreeLayouts);
|
||||||
mermaid.parseError = function (err, hash) {
|
mermaid.parseError = function (err, hash) {
|
||||||
console.error('Mermaid error: ', err);
|
console.error('Mermaid error: ', err);
|
||||||
};
|
};
|
||||||
@@ -514,7 +583,7 @@ kanban
|
|||||||
// look: 'handDrawn',
|
// look: 'handDrawn',
|
||||||
// 'elk.nodePlacement.strategy': 'NETWORK_SIMPLEX',
|
// 'elk.nodePlacement.strategy': 'NETWORK_SIMPLEX',
|
||||||
// layout: 'dagre',
|
// layout: 'dagre',
|
||||||
// layout: 'elk',
|
layout: 'elk',
|
||||||
// layout: 'fixed',
|
// layout: 'fixed',
|
||||||
// htmlLabels: false,
|
// htmlLabels: false,
|
||||||
flowchart: { titleTopMargin: 10 },
|
flowchart: { titleTopMargin: 10 },
|
||||||
|
379
cypress/platform/mindmap-layouts.html
Normal file
379
cypress/platform/mindmap-layouts.html
Normal file
@@ -0,0 +1,379 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||||
|
<title>Mermaid Quick Test Page</title>
|
||||||
|
<link rel="icon" type="image/png" href="data:image/png;base64,iVBORw0KGgo=" />
|
||||||
|
<style>
|
||||||
|
div.mermaid {
|
||||||
|
font-family: 'Courier New', Courier, monospace !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<pre class="mermaid">
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
layout: tidy-tree
|
||||||
|
---
|
||||||
|
mindmap
|
||||||
|
root((mindmap))
|
||||||
|
A
|
||||||
|
B
|
||||||
|
</pre>
|
||||||
|
<pre class="mermaid">
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
layout: dagre
|
||||||
|
---
|
||||||
|
mindmap
|
||||||
|
root((mindmap))
|
||||||
|
A
|
||||||
|
B
|
||||||
|
</pre>
|
||||||
|
<pre class="mermaid">
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
layout: elk
|
||||||
|
---
|
||||||
|
mindmap
|
||||||
|
root((mindmap))
|
||||||
|
A
|
||||||
|
B
|
||||||
|
</pre>
|
||||||
|
<pre class="mermaid">
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
layout: cose-bilkent
|
||||||
|
---
|
||||||
|
mindmap
|
||||||
|
root((mindmap))
|
||||||
|
A
|
||||||
|
B
|
||||||
|
</pre>
|
||||||
|
<pre class="mermaid">
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
layout: tidy-tree
|
||||||
|
---
|
||||||
|
mindmap
|
||||||
|
root((mindmap is a long thing))
|
||||||
|
A
|
||||||
|
B
|
||||||
|
C
|
||||||
|
D
|
||||||
|
</pre>
|
||||||
|
<pre class="mermaid">
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
layout: dagre
|
||||||
|
---
|
||||||
|
mindmap
|
||||||
|
root((mindmap is a long thing))
|
||||||
|
A
|
||||||
|
B
|
||||||
|
C
|
||||||
|
D
|
||||||
|
</pre>
|
||||||
|
<pre class="mermaid">
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
layout: elk
|
||||||
|
---
|
||||||
|
mindmap
|
||||||
|
root((mindmap is a long thing))
|
||||||
|
A
|
||||||
|
B
|
||||||
|
C
|
||||||
|
D
|
||||||
|
</pre>
|
||||||
|
<pre class="mermaid">
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
layout: cose-bilkent
|
||||||
|
---
|
||||||
|
mindmap
|
||||||
|
root((mindmap is a long thing))
|
||||||
|
A
|
||||||
|
B
|
||||||
|
C
|
||||||
|
D
|
||||||
|
</pre>
|
||||||
|
<pre class="mermaid">
|
||||||
|
mindmap
|
||||||
|
root((mindmap is a long thing))
|
||||||
|
A
|
||||||
|
B
|
||||||
|
C
|
||||||
|
D
|
||||||
|
</pre>
|
||||||
|
<pre class="mermaid">
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
layout: tidy-tree
|
||||||
|
---
|
||||||
|
mindmap
|
||||||
|
root((mindmap))
|
||||||
|
Origins
|
||||||
|
Long history
|
||||||
|
::icon(fa fa-book)
|
||||||
|
Popularisation
|
||||||
|
British popular psychology author Tony Buzan
|
||||||
|
Research
|
||||||
|
On effectiveness<br/>and features
|
||||||
|
On Automatic creation
|
||||||
|
Uses
|
||||||
|
Creative techniques
|
||||||
|
Strategic planning
|
||||||
|
Argument mapping
|
||||||
|
Tools
|
||||||
|
id)I am a cloud(
|
||||||
|
id))I am a bang((
|
||||||
|
Tools
|
||||||
|
</pre>
|
||||||
|
<pre class="mermaid">
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
layout: dagre
|
||||||
|
---
|
||||||
|
mindmap
|
||||||
|
root((mindmap))
|
||||||
|
Origins
|
||||||
|
Long history
|
||||||
|
::icon(fa fa-book)
|
||||||
|
Popularisation
|
||||||
|
British popular psychology author Tony Buzan
|
||||||
|
Research
|
||||||
|
On effectiveness<br/>and features
|
||||||
|
On Automatic creation
|
||||||
|
Uses
|
||||||
|
Creative techniques
|
||||||
|
Strategic planning
|
||||||
|
Argument mapping
|
||||||
|
Tools
|
||||||
|
id)I am a cloud(
|
||||||
|
id))I am a bang((
|
||||||
|
Tools
|
||||||
|
</pre>
|
||||||
|
<pre class="mermaid">
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
layout: elk
|
||||||
|
---
|
||||||
|
mindmap
|
||||||
|
root((mindmap))
|
||||||
|
Origins
|
||||||
|
Long history
|
||||||
|
::icon(fa fa-book)
|
||||||
|
Popularisation
|
||||||
|
British popular psychology author Tony Buzan
|
||||||
|
Research
|
||||||
|
On effectiveness<br/>and features
|
||||||
|
On Automatic creation
|
||||||
|
Uses
|
||||||
|
Creative techniques
|
||||||
|
Strategic planning
|
||||||
|
Argument mapping
|
||||||
|
Tools
|
||||||
|
id)I am a cloud(
|
||||||
|
id))I am a bang((
|
||||||
|
Tools
|
||||||
|
</pre>
|
||||||
|
<pre class="mermaid">
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
layout: cose-bilkent
|
||||||
|
---
|
||||||
|
mindmap
|
||||||
|
root((mindmap))
|
||||||
|
Origins
|
||||||
|
Long history
|
||||||
|
::icon(fa fa-book)
|
||||||
|
Popularisation
|
||||||
|
British popular psychology author Tony Buzan
|
||||||
|
Research
|
||||||
|
On effectiveness<br/>and features
|
||||||
|
On Automatic creation
|
||||||
|
Uses
|
||||||
|
Creative techniques
|
||||||
|
Strategic planning
|
||||||
|
Argument mapping
|
||||||
|
Tools
|
||||||
|
id)I am a cloud(
|
||||||
|
id))I am a bang((
|
||||||
|
Tools
|
||||||
|
</pre>
|
||||||
|
<pre class="mermaid">
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
layout: tidy-tree
|
||||||
|
---
|
||||||
|
mindmap
|
||||||
|
root((mindmap))
|
||||||
|
A
|
||||||
|
a
|
||||||
|
apa[I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on]
|
||||||
|
apa2[I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on]
|
||||||
|
b
|
||||||
|
c
|
||||||
|
d
|
||||||
|
B
|
||||||
|
apa3[I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on]
|
||||||
|
D
|
||||||
|
apa5[I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on]
|
||||||
|
apa4[I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on]
|
||||||
|
|
||||||
|
</pre>
|
||||||
|
<pre class="mermaid">
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
layout: dagre
|
||||||
|
---
|
||||||
|
mindmap
|
||||||
|
root((mindmap))
|
||||||
|
A
|
||||||
|
a
|
||||||
|
apa[I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on]
|
||||||
|
apa2[I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on]
|
||||||
|
b
|
||||||
|
c
|
||||||
|
d
|
||||||
|
B
|
||||||
|
apa3[I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on]
|
||||||
|
D
|
||||||
|
apa5[I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on]
|
||||||
|
apa4[I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on]
|
||||||
|
|
||||||
|
</pre>
|
||||||
|
<pre class="mermaid">
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
layout: elk
|
||||||
|
---
|
||||||
|
mindmap
|
||||||
|
root((mindmap))
|
||||||
|
A
|
||||||
|
a
|
||||||
|
apa[I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on]
|
||||||
|
apa2[I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on]
|
||||||
|
b
|
||||||
|
c
|
||||||
|
d
|
||||||
|
B
|
||||||
|
apa3[I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on]
|
||||||
|
D
|
||||||
|
apa5[I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on]
|
||||||
|
apa4[I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on]
|
||||||
|
|
||||||
|
</pre>
|
||||||
|
<pre class="mermaid">
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
layout: cose-bilkent
|
||||||
|
---
|
||||||
|
mindmap
|
||||||
|
root((mindmap))
|
||||||
|
A
|
||||||
|
a
|
||||||
|
apa[I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on]
|
||||||
|
apa2[I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on]
|
||||||
|
b
|
||||||
|
c
|
||||||
|
d
|
||||||
|
B
|
||||||
|
apa3[I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on]
|
||||||
|
D
|
||||||
|
apa5[I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on]
|
||||||
|
apa4[I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on. I am a long long multline string passing several levels of text. Lorum ipsum and so on]
|
||||||
|
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<pre class="mermaid">
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
layout: tidy-tree
|
||||||
|
---
|
||||||
|
mindmap
|
||||||
|
((This is a mindmap))
|
||||||
|
child1
|
||||||
|
grandchild 1
|
||||||
|
grandchild 2
|
||||||
|
child2
|
||||||
|
grandchild 3
|
||||||
|
grandchild 4
|
||||||
|
child3
|
||||||
|
grandchild 5
|
||||||
|
grandchild 6
|
||||||
|
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<pre class="mermaid">
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
layout: dagre
|
||||||
|
---
|
||||||
|
mindmap
|
||||||
|
((This is a mindmap))
|
||||||
|
child1
|
||||||
|
grandchild 1
|
||||||
|
grandchild 2
|
||||||
|
child2
|
||||||
|
grandchild 3
|
||||||
|
grandchild 4
|
||||||
|
child3
|
||||||
|
grandchild 5
|
||||||
|
grandchild 6
|
||||||
|
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<pre class="mermaid">
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
layout: elk
|
||||||
|
---
|
||||||
|
mindmap
|
||||||
|
((This is a mindmap))
|
||||||
|
child1
|
||||||
|
grandchild 1
|
||||||
|
grandchild 2
|
||||||
|
child2
|
||||||
|
grandchild 3
|
||||||
|
grandchild 4
|
||||||
|
child3
|
||||||
|
grandchild 5
|
||||||
|
grandchild 6
|
||||||
|
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<pre class="mermaid">
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
layout: cose-bilkent
|
||||||
|
---
|
||||||
|
mindmap
|
||||||
|
((This is a mindmap))
|
||||||
|
child1
|
||||||
|
grandchild 1
|
||||||
|
grandchild 2
|
||||||
|
child2
|
||||||
|
grandchild 3
|
||||||
|
grandchild 4
|
||||||
|
child3
|
||||||
|
grandchild 5
|
||||||
|
grandchild 6
|
||||||
|
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<hr />
|
||||||
|
<script type="module">
|
||||||
|
import mermaid from '/mermaid.esm.mjs';
|
||||||
|
mermaid.initialize({
|
||||||
|
theme: 'default',
|
||||||
|
logLevel: 3,
|
||||||
|
securityLevel: 'loose',
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
@@ -2,219 +2,219 @@
|
|||||||
"durations": [
|
"durations": [
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/other/configuration.spec.js",
|
"spec": "cypress/integration/other/configuration.spec.js",
|
||||||
"duration": 5659
|
"duration": 5672
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/other/external-diagrams.spec.js",
|
"spec": "cypress/integration/other/external-diagrams.spec.js",
|
||||||
"duration": 2015
|
"duration": 1990
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/other/ghsa.spec.js",
|
"spec": "cypress/integration/other/ghsa.spec.js",
|
||||||
"duration": 3195
|
"duration": 3186
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/other/iife.spec.js",
|
"spec": "cypress/integration/other/iife.spec.js",
|
||||||
"duration": 1976
|
"duration": 1948
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/other/interaction.spec.js",
|
"spec": "cypress/integration/other/interaction.spec.js",
|
||||||
"duration": 11149
|
"duration": 11938
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/other/rerender.spec.js",
|
"spec": "cypress/integration/other/rerender.spec.js",
|
||||||
"duration": 1910
|
"duration": 1932
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/other/xss.spec.js",
|
"spec": "cypress/integration/other/xss.spec.js",
|
||||||
"duration": 26998
|
"duration": 27237
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/appli.spec.js",
|
"spec": "cypress/integration/rendering/appli.spec.js",
|
||||||
"duration": 3176
|
"duration": 3170
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/architecture.spec.ts",
|
"spec": "cypress/integration/rendering/architecture.spec.ts",
|
||||||
"duration": 110
|
"duration": 104
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/block.spec.js",
|
"spec": "cypress/integration/rendering/block.spec.js",
|
||||||
"duration": 16265
|
"duration": 17390
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/c4.spec.js",
|
"spec": "cypress/integration/rendering/c4.spec.js",
|
||||||
"duration": 5431
|
"duration": 5296
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/classDiagram-elk-v3.spec.js",
|
"spec": "cypress/integration/rendering/classDiagram-elk-v3.spec.js",
|
||||||
"duration": 38025
|
"duration": 39004
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/classDiagram-handDrawn-v3.spec.js",
|
"spec": "cypress/integration/rendering/classDiagram-handDrawn-v3.spec.js",
|
||||||
"duration": 36179
|
"duration": 37653
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/classDiagram-v2.spec.js",
|
"spec": "cypress/integration/rendering/classDiagram-v2.spec.js",
|
||||||
"duration": 22386
|
"duration": 23278
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/classDiagram-v3.spec.js",
|
"spec": "cypress/integration/rendering/classDiagram-v3.spec.js",
|
||||||
"duration": 35378
|
"duration": 36645
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/classDiagram.spec.js",
|
"spec": "cypress/integration/rendering/classDiagram.spec.js",
|
||||||
"duration": 14967
|
"duration": 15418
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/conf-and-directives.spec.js",
|
"spec": "cypress/integration/rendering/conf-and-directives.spec.js",
|
||||||
"duration": 9140
|
"duration": 9684
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/current.spec.js",
|
"spec": "cypress/integration/rendering/current.spec.js",
|
||||||
"duration": 2652
|
"duration": 2570
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/erDiagram-unified.spec.js",
|
"spec": "cypress/integration/rendering/erDiagram-unified.spec.js",
|
||||||
"duration": 82257
|
"duration": 84687
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/erDiagram.spec.js",
|
"spec": "cypress/integration/rendering/erDiagram.spec.js",
|
||||||
"duration": 14138
|
"duration": 14819
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/errorDiagram.spec.js",
|
"spec": "cypress/integration/rendering/errorDiagram.spec.js",
|
||||||
"duration": 3718
|
"duration": 3371
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/flowchart-elk.spec.js",
|
"spec": "cypress/integration/rendering/flowchart-elk.spec.js",
|
||||||
"duration": 39683
|
"duration": 39925
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/flowchart-handDrawn.spec.js",
|
"spec": "cypress/integration/rendering/flowchart-handDrawn.spec.js",
|
||||||
"duration": 28676
|
"duration": 34694
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/flowchart-icon.spec.js",
|
"spec": "cypress/integration/rendering/flowchart-icon.spec.js",
|
||||||
"duration": 7080
|
"duration": 7137
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/flowchart-shape-alias.spec.ts",
|
"spec": "cypress/integration/rendering/flowchart-shape-alias.spec.ts",
|
||||||
"duration": 23175
|
"duration": 24740
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/flowchart-v2.spec.js",
|
"spec": "cypress/integration/rendering/flowchart-v2.spec.js",
|
||||||
"duration": 40846
|
"duration": 42077
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/flowchart.spec.js",
|
"spec": "cypress/integration/rendering/flowchart.spec.js",
|
||||||
"duration": 29743
|
"duration": 30642
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/gantt.spec.js",
|
"spec": "cypress/integration/rendering/gantt.spec.js",
|
||||||
"duration": 17352
|
"duration": 18085
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/gitGraph.spec.js",
|
"spec": "cypress/integration/rendering/gitGraph.spec.js",
|
||||||
"duration": 48514
|
"duration": 50107
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/iconShape.spec.ts",
|
"spec": "cypress/integration/rendering/iconShape.spec.ts",
|
||||||
"duration": 262422
|
"duration": 276279
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/imageShape.spec.ts",
|
"spec": "cypress/integration/rendering/imageShape.spec.ts",
|
||||||
"duration": 54513
|
"duration": 56505
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/info.spec.ts",
|
"spec": "cypress/integration/rendering/info.spec.ts",
|
||||||
"duration": 3025
|
"duration": 3036
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/journey.spec.js",
|
"spec": "cypress/integration/rendering/journey.spec.js",
|
||||||
"duration": 6994
|
"duration": 6889
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/kanban.spec.ts",
|
"spec": "cypress/integration/rendering/kanban.spec.ts",
|
||||||
"duration": 7346
|
"duration": 7353
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/katex.spec.js",
|
"spec": "cypress/integration/rendering/katex.spec.js",
|
||||||
"duration": 3642
|
"duration": 3580
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/marker_unique_id.spec.js",
|
"spec": "cypress/integration/rendering/marker_unique_id.spec.js",
|
||||||
"duration": 2464
|
"duration": 2508
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/mindmap.spec.ts",
|
"spec": "cypress/integration/rendering/mindmap.spec.ts",
|
||||||
"duration": 10882
|
"duration": 10939
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/newShapes.spec.ts",
|
"spec": "cypress/integration/rendering/newShapes.spec.ts",
|
||||||
"duration": 142092
|
"duration": 149102
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/oldShapes.spec.ts",
|
"spec": "cypress/integration/rendering/oldShapes.spec.ts",
|
||||||
"duration": 109340
|
"duration": 113987
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/packet.spec.ts",
|
"spec": "cypress/integration/rendering/packet.spec.ts",
|
||||||
"duration": 4167
|
"duration": 4060
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/pie.spec.ts",
|
"spec": "cypress/integration/rendering/pie.spec.ts",
|
||||||
"duration": 5736
|
"duration": 5715
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/quadrantChart.spec.js",
|
"spec": "cypress/integration/rendering/quadrantChart.spec.js",
|
||||||
"duration": 8628
|
"duration": 8945
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/radar.spec.js",
|
"spec": "cypress/integration/rendering/radar.spec.js",
|
||||||
"duration": 5311
|
"duration": 5337
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/requirement.spec.js",
|
"spec": "cypress/integration/rendering/requirement.spec.js",
|
||||||
"duration": 2619
|
"duration": 2643
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/requirementDiagram-unified.spec.js",
|
"spec": "cypress/integration/rendering/requirementDiagram-unified.spec.js",
|
||||||
"duration": 50640
|
"duration": 52072
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/sankey.spec.ts",
|
"spec": "cypress/integration/rendering/sankey.spec.ts",
|
||||||
"duration": 6735
|
"duration": 6692
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/sequencediagram.spec.js",
|
"spec": "cypress/integration/rendering/sequencediagram.spec.js",
|
||||||
"duration": 34777
|
"duration": 35721
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/stateDiagram-v2.spec.js",
|
"spec": "cypress/integration/rendering/stateDiagram-v2.spec.js",
|
||||||
"duration": 24440
|
"duration": 26030
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/stateDiagram.spec.js",
|
"spec": "cypress/integration/rendering/stateDiagram.spec.js",
|
||||||
"duration": 15476
|
"duration": 16333
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/theme.spec.js",
|
"spec": "cypress/integration/rendering/theme.spec.js",
|
||||||
"duration": 27932
|
"duration": 29287
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/timeline.spec.ts",
|
"spec": "cypress/integration/rendering/timeline.spec.ts",
|
||||||
"duration": 8162
|
"duration": 8491
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/treemap.spec.ts",
|
"spec": "cypress/integration/rendering/treemap.spec.ts",
|
||||||
"duration": 11763
|
"duration": 12291
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/xyChart.spec.js",
|
"spec": "cypress/integration/rendering/xyChart.spec.js",
|
||||||
"duration": 19759
|
"duration": 20651
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/zenuml.spec.js",
|
"spec": "cypress/integration/rendering/zenuml.spec.js",
|
||||||
"duration": 3316
|
"duration": 3218
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@@ -4,7 +4,7 @@
|
|||||||
<link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet" />
|
<link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet" />
|
||||||
<link
|
<link
|
||||||
rel="stylesheet"
|
rel="stylesheet"
|
||||||
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"
|
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/font-awesome.min.css"
|
||||||
/>
|
/>
|
||||||
<link
|
<link
|
||||||
href="https://cdn.jsdelivr.net/npm/@mdi/font@6.9.96/css/materialdesignicons.min.css"
|
href="https://cdn.jsdelivr.net/npm/@mdi/font@6.9.96/css/materialdesignicons.min.css"
|
||||||
|
@@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
<div class="diagrams">
|
<div class="diagrams">
|
||||||
<pre class="mermaid">
|
<pre class="mermaid">
|
||||||
packet-beta
|
packet
|
||||||
0-15: "Source Port"
|
0-15: "Source Port"
|
||||||
16-31: "Destination Port"
|
16-31: "Destination Port"
|
||||||
32-63: "Sequence Number"
|
32-63: "Sequence Number"
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
packet:
|
packet:
|
||||||
showBits: false
|
showBits: false
|
||||||
---
|
---
|
||||||
packet-beta
|
packet
|
||||||
0-15: "Source Port"
|
0-15: "Source Port"
|
||||||
16-31: "Destination Port"
|
16-31: "Destination Port"
|
||||||
32-63: "Sequence Number"
|
32-63: "Sequence Number"
|
||||||
@@ -70,7 +70,7 @@
|
|||||||
config:
|
config:
|
||||||
theme: forest
|
theme: forest
|
||||||
---
|
---
|
||||||
packet-beta
|
packet
|
||||||
title Forest theme
|
title Forest theme
|
||||||
0-15: "Source Port"
|
0-15: "Source Port"
|
||||||
16-31: "Destination Port"
|
16-31: "Destination Port"
|
||||||
@@ -97,7 +97,7 @@
|
|||||||
config:
|
config:
|
||||||
theme: dark
|
theme: dark
|
||||||
---
|
---
|
||||||
packet-beta
|
packet
|
||||||
title Dark theme
|
title Dark theme
|
||||||
0-15: "Source Port"
|
0-15: "Source Port"
|
||||||
16-31: "Destination Port"
|
16-31: "Destination Port"
|
||||||
|
@@ -29,7 +29,8 @@ In GitHub, you first [**fork a mermaid repository**](https://github.com/mermaid-
|
|||||||
|
|
||||||
Then you **clone** a copy to your local development machine (e.g. where you code) to make a copy with all the files to work with.
|
Then you **clone** a copy to your local development machine (e.g. where you code) to make a copy with all the files to work with.
|
||||||
|
|
||||||
> **💡 Tip** > [Here is a GitHub document that gives an overview of the process](https://docs.github.com/en/get-started/quickstart/fork-a-repo).
|
> **💡 Tip**
|
||||||
|
> [Here is a GitHub document that gives an overview of the process](https://docs.github.com/en/get-started/quickstart/fork-a-repo).
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone git@github.com/your-fork/mermaid
|
git clone git@github.com/your-fork/mermaid
|
||||||
@@ -301,7 +302,7 @@ If you are adding a feature, you will definitely need to add tests. Depending on
|
|||||||
|
|
||||||
Unit tests are tests that test a single function or module. They are the easiest to write and the fastest to run.
|
Unit tests are tests that test a single function or module. They are the easiest to write and the fastest to run.
|
||||||
|
|
||||||
Unit tests are mandatory for all code except the renderers. (The renderers are tested with integration tests.)
|
Unit tests are mandatory for all code except the layout tests. (The layouts are tested with integration tests.)
|
||||||
|
|
||||||
We use [Vitest](https://vitest.dev) to run unit tests.
|
We use [Vitest](https://vitest.dev) to run unit tests.
|
||||||
|
|
||||||
@@ -327,6 +328,30 @@ When using Docker prepend your command with `./run`:
|
|||||||
./run pnpm test
|
./run pnpm test
|
||||||
```
|
```
|
||||||
|
|
||||||
|
##### Testing the DOM
|
||||||
|
|
||||||
|
One can use `jsdomIt` to test any part of Mermaid that interacts with the DOM, as long as it is not related to the layout.
|
||||||
|
|
||||||
|
The function `jsdomIt` ([developed in utils.ts](../../tests/util.ts)) overrides `it` from `vitest`, and creates a pseudo-browser environment that works almost like the real deal for the duration of the test. It uses JSDOM to create a DOM, and adds objects `window` and `document` to `global` to mock the browser environment.
|
||||||
|
|
||||||
|
> \[!NOTE]
|
||||||
|
> The layout cannot work in `jsdomIt` tests because JSDOM has no rendering engine, hence the pseudo-browser environment.
|
||||||
|
|
||||||
|
Example :
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { ensureNodeFromSelector, jsdomIt } from './tests/util.js';
|
||||||
|
|
||||||
|
jsdomIt('should add element "thing" in the SVG', ({ svg }) => {
|
||||||
|
// Code in this block runs in a pseudo-browser environment
|
||||||
|
addThing(svg); // The svg item is the D3 selection of the SVG node
|
||||||
|
const svgNode = ensureNodeFromSelector('svg'); // Retrieve the DOM node using the DOM API
|
||||||
|
expect(svgNode.querySelector('thing')).not.toBeNull(); // Test the structure of the SVG
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
They can be used to test any method that interacts with the DOM, including for testing renderers. For renderers, additional integration testing is necessary to test the layout though.
|
||||||
|
|
||||||
#### Integration / End-to-End (E2E) Tests
|
#### Integration / End-to-End (E2E) Tests
|
||||||
|
|
||||||
These test the rendering and visual appearance of the diagrams.
|
These test the rendering and visual appearance of the diagrams.
|
||||||
|
@@ -33,7 +33,8 @@ mindmap
|
|||||||
|
|
||||||
## Join the Development
|
## Join the Development
|
||||||
|
|
||||||
> **💡 Tip** > **Check out our** [**detailed contribution guide**](./contributing.md).
|
> **💡 Tip**
|
||||||
|
> **Check out our** [**detailed contribution guide**](./contributing.md).
|
||||||
|
|
||||||
Where to start:
|
Where to start:
|
||||||
|
|
||||||
@@ -47,7 +48,8 @@ Where to start:
|
|||||||
|
|
||||||
## A Question Or a Suggestion?
|
## A Question Or a Suggestion?
|
||||||
|
|
||||||
> **💡 Tip** > **Have a look at** [**how to open an issue**](./questions-and-suggestions.md).
|
> **💡 Tip**
|
||||||
|
> **Have a look at** [**how to open an issue**](./questions-and-suggestions.md).
|
||||||
|
|
||||||
If you have faced a vulnerability [report it to us](./security.md).
|
If you have faced a vulnerability [report it to us](./security.md).
|
||||||
|
|
||||||
|
@@ -111,3 +111,13 @@ const themes = {
|
|||||||
```
|
```
|
||||||
|
|
||||||
The actual options and values for the colors are defined in **src/theme/theme-\[xyz].js**. If you provide the options your diagram needs in the existing theme files then the theming will work smoothly without hiccups.
|
The actual options and values for the colors are defined in **src/theme/theme-\[xyz].js**. If you provide the options your diagram needs in the existing theme files then the theming will work smoothly without hiccups.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
The `@mermaid-js/examples` package contains a collection of examples that are used by tools like mermaid.live to help users get started with the new diagram.
|
||||||
|
|
||||||
|
You can duplicate an existing diagram example file, eg: `packages/examples/src/examples/flowchart.ts`, and modify it with details specific to your diagram.
|
||||||
|
|
||||||
|
Then you can import the example in the `packages/examples/src/index.ts` file and add it to the `examples` array.
|
||||||
|
|
||||||
|
Each diagram should have at least one example, and that should be marked as default. It is good to add more examples to showcase different features of the diagram.
|
||||||
|
@@ -22,7 +22,6 @@ While directives allow you to change most of the default configuration settings,
|
|||||||
Mermaid basically supports two types of configuration options to be overridden by directives.
|
Mermaid basically supports two types of configuration options to be overridden by directives.
|
||||||
|
|
||||||
1. _General/Top Level configurations_ : These are the configurations that are available and applied to all the diagram. **Some of the most important top-level** configurations are:
|
1. _General/Top Level configurations_ : These are the configurations that are available and applied to all the diagram. **Some of the most important top-level** configurations are:
|
||||||
|
|
||||||
- theme
|
- theme
|
||||||
- fontFamily
|
- fontFamily
|
||||||
- logLevel
|
- logLevel
|
||||||
|
@@ -10,10 +10,6 @@
|
|||||||
|
|
||||||
# mermaid
|
# mermaid
|
||||||
|
|
||||||
## Classes
|
|
||||||
|
|
||||||
- [UnknownDiagramError](classes/UnknownDiagramError.md)
|
|
||||||
|
|
||||||
## Interfaces
|
## Interfaces
|
||||||
|
|
||||||
- [DetailedError](interfaces/DetailedError.md)
|
- [DetailedError](interfaces/DetailedError.md)
|
||||||
@@ -27,6 +23,7 @@
|
|||||||
- [RenderOptions](interfaces/RenderOptions.md)
|
- [RenderOptions](interfaces/RenderOptions.md)
|
||||||
- [RenderResult](interfaces/RenderResult.md)
|
- [RenderResult](interfaces/RenderResult.md)
|
||||||
- [RunOptions](interfaces/RunOptions.md)
|
- [RunOptions](interfaces/RunOptions.md)
|
||||||
|
- [UnknownDiagramError](interfaces/UnknownDiagramError.md)
|
||||||
|
|
||||||
## Type Aliases
|
## Type Aliases
|
||||||
|
|
||||||
|
@@ -1,159 +0,0 @@
|
|||||||
> **Warning**
|
|
||||||
>
|
|
||||||
> ## THIS IS AN AUTOGENERATED FILE. DO NOT EDIT.
|
|
||||||
>
|
|
||||||
> ## Please edit the corresponding file in [/packages/mermaid/src/docs/config/setup/mermaid/classes/UnknownDiagramError.md](../../../../../packages/mermaid/src/docs/config/setup/mermaid/classes/UnknownDiagramError.md).
|
|
||||||
|
|
||||||
[**mermaid**](../../README.md)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
# Class: UnknownDiagramError
|
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/errors.ts:1](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/errors.ts#L1)
|
|
||||||
|
|
||||||
## Extends
|
|
||||||
|
|
||||||
- `Error`
|
|
||||||
|
|
||||||
## Constructors
|
|
||||||
|
|
||||||
### new UnknownDiagramError()
|
|
||||||
|
|
||||||
> **new UnknownDiagramError**(`message`): [`UnknownDiagramError`](UnknownDiagramError.md)
|
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/errors.ts:2](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/errors.ts#L2)
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
##### message
|
|
||||||
|
|
||||||
`string`
|
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
[`UnknownDiagramError`](UnknownDiagramError.md)
|
|
||||||
|
|
||||||
#### Overrides
|
|
||||||
|
|
||||||
`Error.constructor`
|
|
||||||
|
|
||||||
## Properties
|
|
||||||
|
|
||||||
### cause?
|
|
||||||
|
|
||||||
> `optional` **cause**: `unknown`
|
|
||||||
|
|
||||||
Defined in: node_modules/.pnpm/typescript\@5.7.3/node_modules/typescript/lib/lib.es2022.error.d.ts:26
|
|
||||||
|
|
||||||
#### Inherited from
|
|
||||||
|
|
||||||
`Error.cause`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### message
|
|
||||||
|
|
||||||
> **message**: `string`
|
|
||||||
|
|
||||||
Defined in: node_modules/.pnpm/typescript\@5.7.3/node_modules/typescript/lib/lib.es5.d.ts:1077
|
|
||||||
|
|
||||||
#### Inherited from
|
|
||||||
|
|
||||||
`Error.message`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### name
|
|
||||||
|
|
||||||
> **name**: `string`
|
|
||||||
|
|
||||||
Defined in: node_modules/.pnpm/typescript\@5.7.3/node_modules/typescript/lib/lib.es5.d.ts:1076
|
|
||||||
|
|
||||||
#### Inherited from
|
|
||||||
|
|
||||||
`Error.name`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### stack?
|
|
||||||
|
|
||||||
> `optional` **stack**: `string`
|
|
||||||
|
|
||||||
Defined in: node_modules/.pnpm/typescript\@5.7.3/node_modules/typescript/lib/lib.es5.d.ts:1078
|
|
||||||
|
|
||||||
#### Inherited from
|
|
||||||
|
|
||||||
`Error.stack`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### prepareStackTrace()?
|
|
||||||
|
|
||||||
> `static` `optional` **prepareStackTrace**: (`err`, `stackTraces`) => `any`
|
|
||||||
|
|
||||||
Defined in: node_modules/.pnpm/@types+node\@22.13.5/node_modules/@types/node/globals.d.ts:143
|
|
||||||
|
|
||||||
Optional override for formatting stack traces
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
##### err
|
|
||||||
|
|
||||||
`Error`
|
|
||||||
|
|
||||||
##### stackTraces
|
|
||||||
|
|
||||||
`CallSite`\[]
|
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
`any`
|
|
||||||
|
|
||||||
#### See
|
|
||||||
|
|
||||||
<https://v8.dev/docs/stack-trace-api#customizing-stack-traces>
|
|
||||||
|
|
||||||
#### Inherited from
|
|
||||||
|
|
||||||
`Error.prepareStackTrace`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### stackTraceLimit
|
|
||||||
|
|
||||||
> `static` **stackTraceLimit**: `number`
|
|
||||||
|
|
||||||
Defined in: node_modules/.pnpm/@types+node\@22.13.5/node_modules/@types/node/globals.d.ts:145
|
|
||||||
|
|
||||||
#### Inherited from
|
|
||||||
|
|
||||||
`Error.stackTraceLimit`
|
|
||||||
|
|
||||||
## Methods
|
|
||||||
|
|
||||||
### captureStackTrace()
|
|
||||||
|
|
||||||
> `static` **captureStackTrace**(`targetObject`, `constructorOpt`?): `void`
|
|
||||||
|
|
||||||
Defined in: node_modules/.pnpm/@types+node\@22.13.5/node_modules/@types/node/globals.d.ts:136
|
|
||||||
|
|
||||||
Create .stack property on a target object
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
|
|
||||||
##### targetObject
|
|
||||||
|
|
||||||
`object`
|
|
||||||
|
|
||||||
##### constructorOpt?
|
|
||||||
|
|
||||||
`Function`
|
|
||||||
|
|
||||||
#### Returns
|
|
||||||
|
|
||||||
`void`
|
|
||||||
|
|
||||||
#### Inherited from
|
|
||||||
|
|
||||||
`Error.captureStackTrace`
|
|
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
# Interface: ExternalDiagramDefinition
|
# Interface: ExternalDiagramDefinition
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/diagram-api/types.ts:99](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L99)
|
Defined in: [packages/mermaid/src/diagram-api/types.ts:94](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L94)
|
||||||
|
|
||||||
## Properties
|
## Properties
|
||||||
|
|
||||||
@@ -18,7 +18,7 @@ Defined in: [packages/mermaid/src/diagram-api/types.ts:99](https://github.com/me
|
|||||||
|
|
||||||
> **detector**: `DiagramDetector`
|
> **detector**: `DiagramDetector`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/diagram-api/types.ts:101](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L101)
|
Defined in: [packages/mermaid/src/diagram-api/types.ts:96](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L96)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -26,7 +26,7 @@ Defined in: [packages/mermaid/src/diagram-api/types.ts:101](https://github.com/m
|
|||||||
|
|
||||||
> **id**: `string`
|
> **id**: `string`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/diagram-api/types.ts:100](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L100)
|
Defined in: [packages/mermaid/src/diagram-api/types.ts:95](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L95)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -34,4 +34,4 @@ Defined in: [packages/mermaid/src/diagram-api/types.ts:100](https://github.com/m
|
|||||||
|
|
||||||
> **loader**: `DiagramLoader`
|
> **loader**: `DiagramLoader`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/diagram-api/types.ts:102](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L102)
|
Defined in: [packages/mermaid/src/diagram-api/types.ts:97](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L97)
|
||||||
|
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
# Interface: LayoutData
|
# Interface: LayoutData
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/rendering-util/types.ts:145](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/rendering-util/types.ts#L145)
|
Defined in: [packages/mermaid/src/rendering-util/types.ts:170](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/rendering-util/types.ts#L170)
|
||||||
|
|
||||||
## Indexable
|
## Indexable
|
||||||
|
|
||||||
@@ -22,7 +22,7 @@ Defined in: [packages/mermaid/src/rendering-util/types.ts:145](https://github.co
|
|||||||
|
|
||||||
> **config**: [`MermaidConfig`](MermaidConfig.md)
|
> **config**: [`MermaidConfig`](MermaidConfig.md)
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/rendering-util/types.ts:148](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/rendering-util/types.ts#L148)
|
Defined in: [packages/mermaid/src/rendering-util/types.ts:173](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/rendering-util/types.ts#L173)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -30,7 +30,7 @@ Defined in: [packages/mermaid/src/rendering-util/types.ts:148](https://github.co
|
|||||||
|
|
||||||
> **edges**: `Edge`\[]
|
> **edges**: `Edge`\[]
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/rendering-util/types.ts:147](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/rendering-util/types.ts#L147)
|
Defined in: [packages/mermaid/src/rendering-util/types.ts:172](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/rendering-util/types.ts#L172)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -38,4 +38,4 @@ Defined in: [packages/mermaid/src/rendering-util/types.ts:147](https://github.co
|
|||||||
|
|
||||||
> **nodes**: `Node`\[]
|
> **nodes**: `Node`\[]
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/rendering-util/types.ts:146](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/rendering-util/types.ts#L146)
|
Defined in: [packages/mermaid/src/rendering-util/types.ts:171](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/rendering-util/types.ts#L171)
|
||||||
|
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
# Interface: Mermaid
|
# Interface: Mermaid
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/mermaid.ts:418](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L418)
|
Defined in: [packages/mermaid/src/mermaid.ts:429](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L429)
|
||||||
|
|
||||||
## Properties
|
## Properties
|
||||||
|
|
||||||
@@ -18,7 +18,7 @@ Defined in: [packages/mermaid/src/mermaid.ts:418](https://github.com/mermaid-js/
|
|||||||
|
|
||||||
> **contentLoaded**: () => `void`
|
> **contentLoaded**: () => `void`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/mermaid.ts:436](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L436)
|
Defined in: [packages/mermaid/src/mermaid.ts:447](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L447)
|
||||||
|
|
||||||
\##contentLoaded Callback function that is called when page is loaded. This functions fetches
|
\##contentLoaded Callback function that is called when page is loaded. This functions fetches
|
||||||
configuration for mermaid rendering and calls init for rendering the mermaid diagrams on the
|
configuration for mermaid rendering and calls init for rendering the mermaid diagrams on the
|
||||||
@@ -32,9 +32,9 @@ page.
|
|||||||
|
|
||||||
### detectType()
|
### detectType()
|
||||||
|
|
||||||
> **detectType**: (`text`, `config`?) => `string`
|
> **detectType**: (`text`, `config?`) => `string`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/mermaid.ts:438](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L438)
|
Defined in: [packages/mermaid/src/mermaid.ts:449](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L449)
|
||||||
|
|
||||||
Detects the type of the graph text.
|
Detects the type of the graph text.
|
||||||
|
|
||||||
@@ -86,11 +86,28 @@ A graph definition key
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
### getRegisteredDiagramsMetadata()
|
||||||
|
|
||||||
|
> **getRegisteredDiagramsMetadata**: () => `Pick`<[`ExternalDiagramDefinition`](ExternalDiagramDefinition.md), `"id"`>\[]
|
||||||
|
|
||||||
|
Defined in: [packages/mermaid/src/mermaid.ts:451](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L451)
|
||||||
|
|
||||||
|
Gets the metadata for all registered diagrams.
|
||||||
|
Currently only the id is returned.
|
||||||
|
|
||||||
|
#### Returns
|
||||||
|
|
||||||
|
`Pick`<[`ExternalDiagramDefinition`](ExternalDiagramDefinition.md), `"id"`>\[]
|
||||||
|
|
||||||
|
An array of objects with the id of the diagram.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
### ~~init()~~
|
### ~~init()~~
|
||||||
|
|
||||||
> **init**: (`config`?, `nodes`?, `callback`?) => `Promise`<`void`>
|
> **init**: (`config?`, `nodes?`, `callback?`) => `Promise`<`void`>
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/mermaid.ts:431](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L431)
|
Defined in: [packages/mermaid/src/mermaid.ts:442](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L442)
|
||||||
|
|
||||||
## init
|
## init
|
||||||
|
|
||||||
@@ -100,7 +117,7 @@ Defined in: [packages/mermaid/src/mermaid.ts:431](https://github.com/mermaid-js/
|
|||||||
|
|
||||||
[`MermaidConfig`](MermaidConfig.md)
|
[`MermaidConfig`](MermaidConfig.md)
|
||||||
|
|
||||||
**Deprecated**, please set configuration in [initialize](Mermaid.md#initialize).
|
**Deprecated**, please set configuration in [initialize](#initialize).
|
||||||
|
|
||||||
##### nodes?
|
##### nodes?
|
||||||
|
|
||||||
@@ -124,13 +141,13 @@ Called once for each rendered diagram's id.
|
|||||||
|
|
||||||
#### Deprecated
|
#### Deprecated
|
||||||
|
|
||||||
Use [initialize](Mermaid.md#initialize) and [run](Mermaid.md#run) instead.
|
Use [initialize](#initialize) and [run](#run) instead.
|
||||||
|
|
||||||
Renders the mermaid diagrams
|
Renders the mermaid diagrams
|
||||||
|
|
||||||
#### Deprecated
|
#### Deprecated
|
||||||
|
|
||||||
Use [initialize](Mermaid.md#initialize) and [run](Mermaid.md#run) instead.
|
Use [initialize](#initialize) and [run](#run) instead.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -138,7 +155,7 @@ Use [initialize](Mermaid.md#initialize) and [run](Mermaid.md#run) instead.
|
|||||||
|
|
||||||
> **initialize**: (`config`) => `void`
|
> **initialize**: (`config`) => `void`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/mermaid.ts:435](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L435)
|
Defined in: [packages/mermaid/src/mermaid.ts:446](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L446)
|
||||||
|
|
||||||
Used to set configurations for mermaid.
|
Used to set configurations for mermaid.
|
||||||
This function should be called before the run function.
|
This function should be called before the run function.
|
||||||
@@ -159,81 +176,89 @@ Configuration object for mermaid.
|
|||||||
|
|
||||||
### ~~mermaidAPI~~
|
### ~~mermaidAPI~~
|
||||||
|
|
||||||
> **mermaidAPI**: `Readonly`<{ `defaultConfig`: [`MermaidConfig`](MermaidConfig.md); `getConfig`: () => [`MermaidConfig`](MermaidConfig.md); `getDiagramFromText`: (`text`, `metadata`) => `Promise`<`Diagram`>; `getSiteConfig`: () => [`MermaidConfig`](MermaidConfig.md); `globalReset`: () => `void`; `initialize`: (`userOptions`) => `void`; `parse`: (`text`, `parseOptions`) => `Promise`<`false` | [`ParseResult`](ParseResult.md)>(`text`, `parseOptions`?) => `Promise`<[`ParseResult`](ParseResult.md)>; `render`: (`id`, `text`, `svgContainingElement`?) => `Promise`<[`RenderResult`](RenderResult.md)>; `reset`: () => `void`; `setConfig`: (`conf`) => [`MermaidConfig`](MermaidConfig.md); `updateSiteConfig`: (`conf`) => [`MermaidConfig`](MermaidConfig.md); }>
|
> **mermaidAPI**: `Readonly`<{ `defaultConfig`: [`MermaidConfig`](MermaidConfig.md); `getConfig`: () => [`MermaidConfig`](MermaidConfig.md); `getDiagramFromText`: (`text`, `metadata`) => `Promise`<`Diagram`>; `getSiteConfig`: () => [`MermaidConfig`](MermaidConfig.md); `globalReset`: () => `void`; `initialize`: (`userOptions`) => `void`; `parse`: {(`text`, `parseOptions`): `Promise`<`false` | [`ParseResult`](ParseResult.md)>; (`text`, `parseOptions?`): `Promise`<[`ParseResult`](ParseResult.md)>; }; `render`: (`id`, `text`, `svgContainingElement?`) => `Promise`<[`RenderResult`](RenderResult.md)>; `reset`: () => `void`; `setConfig`: (`conf`) => [`MermaidConfig`](MermaidConfig.md); `updateSiteConfig`: (`conf`) => [`MermaidConfig`](MermaidConfig.md); }>
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/mermaid.ts:425](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L425)
|
Defined in: [packages/mermaid/src/mermaid.ts:436](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L436)
|
||||||
|
|
||||||
**`Internal`**
|
**`Internal`**
|
||||||
|
|
||||||
#### Deprecated
|
#### Deprecated
|
||||||
|
|
||||||
Use [parse](Mermaid.md#parse) and [render](Mermaid.md#render) instead. Please [open a discussion](https://github.com/mermaid-js/mermaid/discussions) if your use case does not fit the new API.
|
Use [parse](#parse) and [render](#render) instead. Please [open a discussion](https://github.com/mermaid-js/mermaid/discussions) if your use case does not fit the new API.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### parse()
|
### parse()
|
||||||
|
|
||||||
> **parse**: (`text`, `parseOptions`) => `Promise`<`false` | [`ParseResult`](ParseResult.md)>(`text`, `parseOptions`?) => `Promise`<[`ParseResult`](ParseResult.md)>
|
> **parse**: {(`text`, `parseOptions`): `Promise`<`false` | [`ParseResult`](ParseResult.md)>; (`text`, `parseOptions?`): `Promise`<[`ParseResult`](ParseResult.md)>; }
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/mermaid.ts:426](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L426)
|
Defined in: [packages/mermaid/src/mermaid.ts:437](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L437)
|
||||||
|
|
||||||
|
#### Call Signature
|
||||||
|
|
||||||
|
> (`text`, `parseOptions`): `Promise`<`false` | [`ParseResult`](ParseResult.md)>
|
||||||
|
|
||||||
Parse the text and validate the syntax.
|
Parse the text and validate the syntax.
|
||||||
|
|
||||||
#### Parameters
|
##### Parameters
|
||||||
|
|
||||||
##### text
|
###### text
|
||||||
|
|
||||||
`string`
|
`string`
|
||||||
|
|
||||||
The mermaid diagram definition.
|
The mermaid diagram definition.
|
||||||
|
|
||||||
##### parseOptions
|
###### parseOptions
|
||||||
|
|
||||||
[`ParseOptions`](ParseOptions.md) & `object`
|
[`ParseOptions`](ParseOptions.md) & `object`
|
||||||
|
|
||||||
Options for parsing.
|
Options for parsing.
|
||||||
|
|
||||||
#### Returns
|
##### Returns
|
||||||
|
|
||||||
`Promise`<`false` | [`ParseResult`](ParseResult.md)>
|
`Promise`<`false` | [`ParseResult`](ParseResult.md)>
|
||||||
|
|
||||||
An object with the `diagramType` set to type of the diagram if valid. Otherwise `false` if parseOptions.suppressErrors is `true`.
|
An object with the `diagramType` set to type of the diagram if valid. Otherwise `false` if parseOptions.suppressErrors is `true`.
|
||||||
|
|
||||||
#### See
|
##### See
|
||||||
|
|
||||||
[ParseOptions](ParseOptions.md)
|
[ParseOptions](ParseOptions.md)
|
||||||
|
|
||||||
#### Throws
|
##### Throws
|
||||||
|
|
||||||
Error if the diagram is invalid and parseOptions.suppressErrors is false or not set.
|
Error if the diagram is invalid and parseOptions.suppressErrors is false or not set.
|
||||||
|
|
||||||
|
#### Call Signature
|
||||||
|
|
||||||
|
> (`text`, `parseOptions?`): `Promise`<[`ParseResult`](ParseResult.md)>
|
||||||
|
|
||||||
Parse the text and validate the syntax.
|
Parse the text and validate the syntax.
|
||||||
|
|
||||||
#### Parameters
|
##### Parameters
|
||||||
|
|
||||||
##### text
|
###### text
|
||||||
|
|
||||||
`string`
|
`string`
|
||||||
|
|
||||||
The mermaid diagram definition.
|
The mermaid diagram definition.
|
||||||
|
|
||||||
##### parseOptions?
|
###### parseOptions?
|
||||||
|
|
||||||
[`ParseOptions`](ParseOptions.md)
|
[`ParseOptions`](ParseOptions.md)
|
||||||
|
|
||||||
Options for parsing.
|
Options for parsing.
|
||||||
|
|
||||||
#### Returns
|
##### Returns
|
||||||
|
|
||||||
`Promise`<[`ParseResult`](ParseResult.md)>
|
`Promise`<[`ParseResult`](ParseResult.md)>
|
||||||
|
|
||||||
An object with the `diagramType` set to type of the diagram if valid. Otherwise `false` if parseOptions.suppressErrors is `true`.
|
An object with the `diagramType` set to type of the diagram if valid. Otherwise `false` if parseOptions.suppressErrors is `true`.
|
||||||
|
|
||||||
#### See
|
##### See
|
||||||
|
|
||||||
[ParseOptions](ParseOptions.md)
|
[ParseOptions](ParseOptions.md)
|
||||||
|
|
||||||
#### Throws
|
##### Throws
|
||||||
|
|
||||||
Error if the diagram is invalid and parseOptions.suppressErrors is false or not set.
|
Error if the diagram is invalid and parseOptions.suppressErrors is false or not set.
|
||||||
|
|
||||||
@@ -243,7 +268,7 @@ Error if the diagram is invalid and parseOptions.suppressErrors is false or not
|
|||||||
|
|
||||||
> `optional` **parseError**: [`ParseErrorFunction`](../type-aliases/ParseErrorFunction.md)
|
> `optional` **parseError**: [`ParseErrorFunction`](../type-aliases/ParseErrorFunction.md)
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/mermaid.ts:420](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L420)
|
Defined in: [packages/mermaid/src/mermaid.ts:431](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L431)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -251,7 +276,7 @@ Defined in: [packages/mermaid/src/mermaid.ts:420](https://github.com/mermaid-js/
|
|||||||
|
|
||||||
> **registerExternalDiagrams**: (`diagrams`, `opts`) => `Promise`<`void`>
|
> **registerExternalDiagrams**: (`diagrams`, `opts`) => `Promise`<`void`>
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/mermaid.ts:434](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L434)
|
Defined in: [packages/mermaid/src/mermaid.ts:445](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L445)
|
||||||
|
|
||||||
Used to register external diagram types.
|
Used to register external diagram types.
|
||||||
|
|
||||||
@@ -281,7 +306,7 @@ If opts.lazyLoad is false, the diagrams will be loaded immediately.
|
|||||||
|
|
||||||
> **registerIconPacks**: (`iconLoaders`) => `void`
|
> **registerIconPacks**: (`iconLoaders`) => `void`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/mermaid.ts:439](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L439)
|
Defined in: [packages/mermaid/src/mermaid.ts:450](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L450)
|
||||||
|
|
||||||
#### Parameters
|
#### Parameters
|
||||||
|
|
||||||
@@ -299,7 +324,7 @@ Defined in: [packages/mermaid/src/mermaid.ts:439](https://github.com/mermaid-js/
|
|||||||
|
|
||||||
> **registerLayoutLoaders**: (`loaders`) => `void`
|
> **registerLayoutLoaders**: (`loaders`) => `void`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/mermaid.ts:433](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L433)
|
Defined in: [packages/mermaid/src/mermaid.ts:444](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L444)
|
||||||
|
|
||||||
#### Parameters
|
#### Parameters
|
||||||
|
|
||||||
@@ -315,9 +340,9 @@ Defined in: [packages/mermaid/src/mermaid.ts:433](https://github.com/mermaid-js/
|
|||||||
|
|
||||||
### render()
|
### render()
|
||||||
|
|
||||||
> **render**: (`id`, `text`, `svgContainingElement`?) => `Promise`<[`RenderResult`](RenderResult.md)>
|
> **render**: (`id`, `text`, `svgContainingElement?`) => `Promise`<[`RenderResult`](RenderResult.md)>
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/mermaid.ts:427](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L427)
|
Defined in: [packages/mermaid/src/mermaid.ts:438](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L438)
|
||||||
|
|
||||||
#### Parameters
|
#### Parameters
|
||||||
|
|
||||||
@@ -349,7 +374,7 @@ Deprecated for external use.
|
|||||||
|
|
||||||
> **run**: (`options`) => `Promise`<`void`>
|
> **run**: (`options`) => `Promise`<`void`>
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/mermaid.ts:432](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L432)
|
Defined in: [packages/mermaid/src/mermaid.ts:443](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L443)
|
||||||
|
|
||||||
## run
|
## run
|
||||||
|
|
||||||
@@ -393,7 +418,7 @@ Optional runtime configs
|
|||||||
|
|
||||||
> **setParseErrorHandler**: (`parseErrorHandler`) => `void`
|
> **setParseErrorHandler**: (`parseErrorHandler`) => `void`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/mermaid.ts:437](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L437)
|
Defined in: [packages/mermaid/src/mermaid.ts:448](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L448)
|
||||||
|
|
||||||
## setParseErrorHandler Alternative to directly setting parseError using:
|
## setParseErrorHandler Alternative to directly setting parseError using:
|
||||||
|
|
||||||
@@ -424,4 +449,4 @@ New parseError() callback.
|
|||||||
|
|
||||||
> **startOnLoad**: `boolean`
|
> **startOnLoad**: `boolean`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/mermaid.ts:419](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L419)
|
Defined in: [packages/mermaid/src/mermaid.ts:430](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L430)
|
||||||
|
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
# Interface: ParseOptions
|
# Interface: ParseOptions
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/types.ts:59](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L59)
|
Defined in: [packages/mermaid/src/types.ts:76](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L76)
|
||||||
|
|
||||||
## Properties
|
## Properties
|
||||||
|
|
||||||
@@ -18,7 +18,7 @@ Defined in: [packages/mermaid/src/types.ts:59](https://github.com/mermaid-js/mer
|
|||||||
|
|
||||||
> `optional` **suppressErrors**: `boolean`
|
> `optional` **suppressErrors**: `boolean`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/types.ts:64](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L64)
|
Defined in: [packages/mermaid/src/types.ts:81](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L81)
|
||||||
|
|
||||||
If `true`, parse will return `false` instead of throwing error when the diagram is invalid.
|
If `true`, parse will return `false` instead of throwing error when the diagram is invalid.
|
||||||
The `parseError` function will not be called.
|
The `parseError` function will not be called.
|
||||||
|
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
# Interface: ParseResult
|
# Interface: ParseResult
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/types.ts:67](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L67)
|
Defined in: [packages/mermaid/src/types.ts:84](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L84)
|
||||||
|
|
||||||
## Properties
|
## Properties
|
||||||
|
|
||||||
@@ -18,7 +18,7 @@ Defined in: [packages/mermaid/src/types.ts:67](https://github.com/mermaid-js/mer
|
|||||||
|
|
||||||
> **config**: [`MermaidConfig`](MermaidConfig.md)
|
> **config**: [`MermaidConfig`](MermaidConfig.md)
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/types.ts:75](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L75)
|
Defined in: [packages/mermaid/src/types.ts:92](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L92)
|
||||||
|
|
||||||
The config passed as YAML frontmatter or directives
|
The config passed as YAML frontmatter or directives
|
||||||
|
|
||||||
@@ -28,6 +28,6 @@ The config passed as YAML frontmatter or directives
|
|||||||
|
|
||||||
> **diagramType**: `string`
|
> **diagramType**: `string`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/types.ts:71](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L71)
|
Defined in: [packages/mermaid/src/types.ts:88](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L88)
|
||||||
|
|
||||||
The diagram type, e.g. 'flowchart', 'sequence', etc.
|
The diagram type, e.g. 'flowchart', 'sequence', etc.
|
||||||
|
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
# Interface: RenderResult
|
# Interface: RenderResult
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/types.ts:85](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L85)
|
Defined in: [packages/mermaid/src/types.ts:102](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L102)
|
||||||
|
|
||||||
## Properties
|
## Properties
|
||||||
|
|
||||||
@@ -18,7 +18,7 @@ Defined in: [packages/mermaid/src/types.ts:85](https://github.com/mermaid-js/mer
|
|||||||
|
|
||||||
> `optional` **bindFunctions**: (`element`) => `void`
|
> `optional` **bindFunctions**: (`element`) => `void`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/types.ts:103](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L103)
|
Defined in: [packages/mermaid/src/types.ts:120](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L120)
|
||||||
|
|
||||||
Bind function to be called after the svg has been inserted into the DOM.
|
Bind function to be called after the svg has been inserted into the DOM.
|
||||||
This is necessary for adding event listeners to the elements in the svg.
|
This is necessary for adding event listeners to the elements in the svg.
|
||||||
@@ -45,7 +45,7 @@ bindFunctions?.(div); // To call bindFunctions only if it's present.
|
|||||||
|
|
||||||
> **diagramType**: `string`
|
> **diagramType**: `string`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/types.ts:93](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L93)
|
Defined in: [packages/mermaid/src/types.ts:110](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L110)
|
||||||
|
|
||||||
The diagram type, e.g. 'flowchart', 'sequence', etc.
|
The diagram type, e.g. 'flowchart', 'sequence', etc.
|
||||||
|
|
||||||
@@ -55,6 +55,6 @@ The diagram type, e.g. 'flowchart', 'sequence', etc.
|
|||||||
|
|
||||||
> **svg**: `string`
|
> **svg**: `string`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/types.ts:89](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L89)
|
Defined in: [packages/mermaid/src/types.ts:106](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L106)
|
||||||
|
|
||||||
The svg code for the rendered graph.
|
The svg code for the rendered graph.
|
||||||
|
65
docs/config/setup/mermaid/interfaces/UnknownDiagramError.md
Normal file
65
docs/config/setup/mermaid/interfaces/UnknownDiagramError.md
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
> **Warning**
|
||||||
|
>
|
||||||
|
> ## THIS IS AN AUTOGENERATED FILE. DO NOT EDIT.
|
||||||
|
>
|
||||||
|
> ## Please edit the corresponding file in [/packages/mermaid/src/docs/config/setup/mermaid/interfaces/UnknownDiagramError.md](../../../../../packages/mermaid/src/docs/config/setup/mermaid/interfaces/UnknownDiagramError.md).
|
||||||
|
|
||||||
|
[**mermaid**](../../README.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Interface: UnknownDiagramError
|
||||||
|
|
||||||
|
Defined in: [packages/mermaid/src/errors.ts:1](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/errors.ts#L1)
|
||||||
|
|
||||||
|
## Extends
|
||||||
|
|
||||||
|
- `Error`
|
||||||
|
|
||||||
|
## Properties
|
||||||
|
|
||||||
|
### cause?
|
||||||
|
|
||||||
|
> `optional` **cause**: `unknown`
|
||||||
|
|
||||||
|
Defined in: node_modules/.pnpm/typescript\@5.7.3/node_modules/typescript/lib/lib.es2022.error.d.ts:26
|
||||||
|
|
||||||
|
#### Inherited from
|
||||||
|
|
||||||
|
`Error.cause`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### message
|
||||||
|
|
||||||
|
> **message**: `string`
|
||||||
|
|
||||||
|
Defined in: node_modules/.pnpm/typescript\@5.7.3/node_modules/typescript/lib/lib.es5.d.ts:1077
|
||||||
|
|
||||||
|
#### Inherited from
|
||||||
|
|
||||||
|
`Error.message`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### name
|
||||||
|
|
||||||
|
> **name**: `string`
|
||||||
|
|
||||||
|
Defined in: node_modules/.pnpm/typescript\@5.7.3/node_modules/typescript/lib/lib.es5.d.ts:1076
|
||||||
|
|
||||||
|
#### Inherited from
|
||||||
|
|
||||||
|
`Error.name`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### stack?
|
||||||
|
|
||||||
|
> `optional` **stack**: `string`
|
||||||
|
|
||||||
|
Defined in: node_modules/.pnpm/typescript\@5.7.3/node_modules/typescript/lib/lib.es5.d.ts:1078
|
||||||
|
|
||||||
|
#### Inherited from
|
||||||
|
|
||||||
|
`Error.stack`
|
@@ -10,6 +10,6 @@
|
|||||||
|
|
||||||
# Type Alias: InternalHelpers
|
# Type Alias: InternalHelpers
|
||||||
|
|
||||||
> **InternalHelpers**: _typeof_ `internalHelpers`
|
> **InternalHelpers** = _typeof_ `internalHelpers`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/internals.ts:33](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/internals.ts#L33)
|
Defined in: [packages/mermaid/src/internals.ts:33](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/internals.ts#L33)
|
||||||
|
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
# Type Alias: ParseErrorFunction()
|
# Type Alias: ParseErrorFunction()
|
||||||
|
|
||||||
> **ParseErrorFunction**: (`err`, `hash`?) => `void`
|
> **ParseErrorFunction** = (`err`, `hash?`) => `void`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/Diagram.ts:10](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/Diagram.ts#L10)
|
Defined in: [packages/mermaid/src/Diagram.ts:10](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/Diagram.ts#L10)
|
||||||
|
|
||||||
|
@@ -10,6 +10,6 @@
|
|||||||
|
|
||||||
# Type Alias: SVG
|
# Type Alias: SVG
|
||||||
|
|
||||||
> **SVG**: `d3.Selection`<`SVGSVGElement`, `unknown`, `Element` | `null`, `unknown`>
|
> **SVG** = `d3.Selection`<`SVGSVGElement`, `unknown`, `Element` | `null`, `unknown`>
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/diagram-api/types.ts:130](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L130)
|
Defined in: [packages/mermaid/src/diagram-api/types.ts:126](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L126)
|
||||||
|
@@ -10,6 +10,6 @@
|
|||||||
|
|
||||||
# Type Alias: SVGGroup
|
# Type Alias: SVGGroup
|
||||||
|
|
||||||
> **SVGGroup**: `d3.Selection`<`SVGGElement`, `unknown`, `Element` | `null`, `unknown`>
|
> **SVGGroup** = `d3.Selection`<`SVGGElement`, `unknown`, `Element` | `null`, `unknown`>
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/diagram-api/types.ts:132](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L132)
|
Defined in: [packages/mermaid/src/diagram-api/types.ts:128](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L128)
|
||||||
|
@@ -12,4 +12,4 @@
|
|||||||
|
|
||||||
> `const` **default**: [`Mermaid`](../interfaces/Mermaid.md)
|
> `const` **default**: [`Mermaid`](../interfaces/Mermaid.md)
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/mermaid.ts:442](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L442)
|
Defined in: [packages/mermaid/src/mermaid.ts:454](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L454)
|
||||||
|
189
docs/diagrams/flowchart-code-flow.mmd
Normal file
189
docs/diagrams/flowchart-code-flow.mmd
Normal file
@@ -0,0 +1,189 @@
|
|||||||
|
---
|
||||||
|
references:
|
||||||
|
- "File: /packages/mermaid/src/diagrams/flowchart/flowDiagram.ts"
|
||||||
|
- "File: /packages/mermaid/src/diagrams/flowchart/flowDb.ts"
|
||||||
|
- "File: /packages/mermaid/src/diagrams/flowchart/flowDetector.ts"
|
||||||
|
- "File: /packages/mermaid/src/diagrams/flowchart/flowDetector-v2.ts"
|
||||||
|
- "File: /packages/mermaid/src/diagrams/flowchart/flowRenderer-v3-unified.ts"
|
||||||
|
- "File: /packages/mermaid/src/diagrams/flowchart/styles.ts"
|
||||||
|
- "File: /packages/mermaid/src/diagrams/flowchart/types.ts"
|
||||||
|
- "File: /packages/mermaid/src/diagrams/flowchart/flowChartShapes.js"
|
||||||
|
- "File: /packages/mermaid/src/diagrams/flowchart/parser/flowParser.ts"
|
||||||
|
- "File: /packages/mermaid/src/diagrams/flowchart/elk/detector.ts"
|
||||||
|
generationTime: 2025-07-23T10:31:53.266Z
|
||||||
|
---
|
||||||
|
flowchart TD
|
||||||
|
%% Entry Points and Detection
|
||||||
|
Input["User Input Text"] --> Detection{Detection Phase}
|
||||||
|
|
||||||
|
Detection --> flowDetector["flowDetector.ts<br/>detector(txt, config)"]
|
||||||
|
Detection --> flowDetectorV2["flowDetector-v2.ts<br/>detector(txt, config)"]
|
||||||
|
Detection --> elkDetector["elk/detector.ts<br/>detector(txt, config)"]
|
||||||
|
|
||||||
|
flowDetector --> |"Checks /^\s*graph/"| DetectLegacy{Legacy Flowchart?}
|
||||||
|
flowDetectorV2 --> |"Checks /^\s*flowchart/"| DetectNew{New Flowchart?}
|
||||||
|
elkDetector --> |"Checks /^\s*flowchart-elk/"| DetectElk{ELK Layout?}
|
||||||
|
|
||||||
|
DetectLegacy --> |Yes| LoadDiagram
|
||||||
|
DetectNew --> |Yes| LoadDiagram
|
||||||
|
DetectElk --> |Yes| LoadDiagram
|
||||||
|
|
||||||
|
%% Loading Phase
|
||||||
|
LoadDiagram["loader() function"] --> flowDiagram["flowDiagram.ts<br/>diagram object"]
|
||||||
|
|
||||||
|
flowDiagram --> DiagramStructure{Diagram Components}
|
||||||
|
DiagramStructure --> Parser["parser: flowParser"]
|
||||||
|
DiagramStructure --> Database["db: new FlowDB()"]
|
||||||
|
DiagramStructure --> Renderer["renderer: flowRenderer-v3-unified"]
|
||||||
|
DiagramStructure --> Styles["styles: flowStyles"]
|
||||||
|
DiagramStructure --> Init["init: (cnf: MermaidConfig)"]
|
||||||
|
|
||||||
|
%% Parser Phase
|
||||||
|
Parser --> flowParser["parser/flowParser.ts<br/>newParser.parse(src)"]
|
||||||
|
flowParser --> |"Preprocesses src"| RemoveWhitespace["Remove trailing whitespace<br/>src.replace(/}\s*\n/g, '}\n')"]
|
||||||
|
RemoveWhitespace --> flowJison["parser/flow.jison<br/>flowJisonParser.parse(newSrc)"]
|
||||||
|
|
||||||
|
flowJison --> ParseGraph["Parse Graph Structure"]
|
||||||
|
ParseGraph --> ParseVertices["Parse Vertices"]
|
||||||
|
ParseGraph --> ParseEdges["Parse Edges"]
|
||||||
|
ParseGraph --> ParseSubgraphs["Parse Subgraphs"]
|
||||||
|
ParseGraph --> ParseClasses["Parse Classes"]
|
||||||
|
ParseGraph --> ParseStyles["Parse Styles"]
|
||||||
|
|
||||||
|
%% Database Phase - FlowDB Class
|
||||||
|
Database --> FlowDBClass["flowDb.ts<br/>FlowDB class"]
|
||||||
|
|
||||||
|
FlowDBClass --> DBInit["constructor()<br/>- Initialize counters<br/>- Bind methods<br/>- Setup toolTips<br/>- Call clear()"]
|
||||||
|
|
||||||
|
DBInit --> DBMethods{FlowDB Methods}
|
||||||
|
|
||||||
|
DBMethods --> addVertex["addVertex(id, textObj, type, style,<br/>classes, dir, props, metadata)"]
|
||||||
|
DBMethods --> addLink["addLink(_start[], _end[], linkData)"]
|
||||||
|
DBMethods --> addSingleLink["addSingleLink(_start, _end, type, id)"]
|
||||||
|
DBMethods --> setDirection["setDirection(dir)"]
|
||||||
|
DBMethods --> addSubGraph["addSubGraph(nodes[], id, title)"]
|
||||||
|
DBMethods --> addClass["addClass(id, style)"]
|
||||||
|
DBMethods --> setClass["setClass(ids, className)"]
|
||||||
|
DBMethods --> setTooltip["setTooltip(ids, tooltip)"]
|
||||||
|
DBMethods --> setClickEvent["setClickEvent(id, functionName, args)"]
|
||||||
|
DBMethods --> setClickFun["setClickFun(id, functionName, args)"]
|
||||||
|
|
||||||
|
%% Vertex Processing
|
||||||
|
addVertex --> VertexProcess{Vertex Processing}
|
||||||
|
VertexProcess --> CreateVertex["Create FlowVertex object<br/>- id, labelType, domId<br/>- styles[], classes[]"]
|
||||||
|
VertexProcess --> SanitizeText["sanitizeText(textObj.text)"]
|
||||||
|
VertexProcess --> ParseMetadata["Parse YAML metadata<br/>yaml.load(yamlData)"]
|
||||||
|
VertexProcess --> SetVertexProps["Set vertex properties<br/>- shape, label, icon, form<br/>- pos, img, constraint, w, h"]
|
||||||
|
|
||||||
|
%% Edge Processing
|
||||||
|
addSingleLink --> EdgeProcess{Edge Processing}
|
||||||
|
EdgeProcess --> CreateEdge["Create FlowEdge object<br/>- start, end, type, text<br/>- labelType, classes[]"]
|
||||||
|
EdgeProcess --> ProcessLinkText["Process link text<br/>- sanitizeText()<br/>- strip quotes"]
|
||||||
|
EdgeProcess --> SetEdgeProps["Set edge properties<br/>- type, stroke, length"]
|
||||||
|
EdgeProcess --> GenerateEdgeId["Generate edge ID<br/>getEdgeId(start, end, counter)"]
|
||||||
|
EdgeProcess --> ValidateEdgeLimit["Validate edge limit<br/>maxEdges check"]
|
||||||
|
|
||||||
|
%% Data Collection
|
||||||
|
DBMethods --> GetData["getData()"]
|
||||||
|
GetData --> CollectNodes["Collect nodes[] from vertices"]
|
||||||
|
GetData --> CollectEdges["Collect edges[] from edges"]
|
||||||
|
GetData --> ProcessSubGraphs["Process subgraphs<br/>- parentDB Map<br/>- subGraphDB Map"]
|
||||||
|
GetData --> AddNodeFromVertex["addNodeFromVertex()<br/>for each vertex"]
|
||||||
|
GetData --> ProcessEdgeTypes["destructEdgeType()<br/>arrowTypeStart, arrowTypeEnd"]
|
||||||
|
|
||||||
|
%% Node Creation
|
||||||
|
AddNodeFromVertex --> NodeCreation{Node Creation}
|
||||||
|
NodeCreation --> FindExistingNode["findNode(nodes, vertex.id)"]
|
||||||
|
NodeCreation --> CreateBaseNode["Create base node<br/>- id, label, parentId<br/>- cssStyles, cssClasses<br/>- shape, domId, tooltip"]
|
||||||
|
NodeCreation --> GetCompiledStyles["getCompiledStyles(classDefs)"]
|
||||||
|
NodeCreation --> GetTypeFromVertex["getTypeFromVertex(vertex)"]
|
||||||
|
|
||||||
|
%% Rendering Phase
|
||||||
|
Renderer --> flowRendererV3["flowRenderer-v3-unified.ts<br/>draw(text, id, version, diag)"]
|
||||||
|
|
||||||
|
flowRendererV3 --> RenderInit["Initialize rendering<br/>- getConfig()<br/>- handle securityLevel<br/>- getDiagramElement()"]
|
||||||
|
|
||||||
|
RenderInit --> GetLayoutData["diag.db.getData()<br/>as LayoutData"]
|
||||||
|
GetLayoutData --> SetupLayoutData["Setup layout data<br/>- type, layoutAlgorithm<br/>- direction, spacing<br/>- markers, diagramId"]
|
||||||
|
|
||||||
|
SetupLayoutData --> CallRender["render(data4Layout, svg)"]
|
||||||
|
CallRender --> SetupViewPort["setupViewPortForSVG(svg, padding)"]
|
||||||
|
SetupViewPort --> ProcessLinks["Process vertex links<br/>- create anchor elements<br/>- handle click events"]
|
||||||
|
|
||||||
|
%% Shape Rendering
|
||||||
|
CallRender --> ShapeSystem["flowChartShapes.js<br/>Shape Functions"]
|
||||||
|
|
||||||
|
ShapeSystem --> ShapeFunctions{Shape Functions}
|
||||||
|
ShapeFunctions --> question["question(parent, bbox, node)"]
|
||||||
|
ShapeFunctions --> hexagon["hexagon(parent, bbox, node)"]
|
||||||
|
ShapeFunctions --> rect_left_inv_arrow["rect_left_inv_arrow(parent, bbox, node)"]
|
||||||
|
ShapeFunctions --> lean_right["lean_right(parent, bbox, node)"]
|
||||||
|
ShapeFunctions --> lean_left["lean_left(parent, bbox, node)"]
|
||||||
|
|
||||||
|
ShapeFunctions --> insertPolygonShape["insertPolygonShape(parent, w, h, points)"]
|
||||||
|
ShapeFunctions --> intersectPolygon["intersectPolygon(node, points, point)"]
|
||||||
|
ShapeFunctions --> intersectRect["intersectRect(node, point)"]
|
||||||
|
|
||||||
|
%% Styling System
|
||||||
|
Styles --> stylesTS["styles.ts<br/>getStyles(options)"]
|
||||||
|
stylesTS --> StyleOptions["FlowChartStyleOptions<br/>- arrowheadColor, border2<br/>- clusterBkg, mainBkg<br/>- fontFamily, textColor"]
|
||||||
|
|
||||||
|
StyleOptions --> GenerateCSS["Generate CSS styles<br/>- .label, .cluster-label<br/>- .node, .edgePath<br/>- .flowchart-link, .edgeLabel"]
|
||||||
|
GenerateCSS --> GetIconStyles["getIconStyles()"]
|
||||||
|
|
||||||
|
%% Type System
|
||||||
|
Parser --> TypeSystem["types.ts<br/>Type Definitions"]
|
||||||
|
TypeSystem --> FlowVertex["FlowVertex interface"]
|
||||||
|
TypeSystem --> FlowEdge["FlowEdge interface"]
|
||||||
|
TypeSystem --> FlowClass["FlowClass interface"]
|
||||||
|
TypeSystem --> FlowSubGraph["FlowSubGraph interface"]
|
||||||
|
TypeSystem --> FlowVertexTypeParam["FlowVertexTypeParam<br/>Shape types"]
|
||||||
|
|
||||||
|
%% Utility Functions
|
||||||
|
DBMethods --> UtilityFunctions{Utility Functions}
|
||||||
|
UtilityFunctions --> lookUpDomId["lookUpDomId(id)"]
|
||||||
|
UtilityFunctions --> getClasses["getClasses()"]
|
||||||
|
UtilityFunctions --> getDirection["getDirection()"]
|
||||||
|
UtilityFunctions --> getVertices["getVertices()"]
|
||||||
|
UtilityFunctions --> getEdges["getEdges()"]
|
||||||
|
UtilityFunctions --> getSubGraphs["getSubGraphs()"]
|
||||||
|
UtilityFunctions --> clear["clear()"]
|
||||||
|
UtilityFunctions --> defaultConfig["defaultConfig()"]
|
||||||
|
|
||||||
|
%% Event Handling
|
||||||
|
ProcessLinks --> EventHandling{Event Handling}
|
||||||
|
EventHandling --> setupToolTips["setupToolTips(element)"]
|
||||||
|
EventHandling --> bindFunctions["bindFunctions(element)"]
|
||||||
|
EventHandling --> runFunc["utils.runFunc(functionName, args)"]
|
||||||
|
|
||||||
|
%% Common Database Functions
|
||||||
|
DBMethods --> CommonDB["commonDb.js functions"]
|
||||||
|
CommonDB --> setAccTitle["setAccTitle()"]
|
||||||
|
CommonDB --> getAccTitle["getAccTitle()"]
|
||||||
|
CommonDB --> setAccDescription["setAccDescription()"]
|
||||||
|
CommonDB --> getAccDescription["getAccDescription()"]
|
||||||
|
CommonDB --> setDiagramTitle["setDiagramTitle()"]
|
||||||
|
CommonDB --> getDiagramTitle["getDiagramTitle()"]
|
||||||
|
CommonDB --> commonClear["clear()"]
|
||||||
|
|
||||||
|
%% Final Output
|
||||||
|
ProcessLinks --> FinalSVG["Final SVG Output"]
|
||||||
|
|
||||||
|
%% Layout Algorithm Selection
|
||||||
|
SetupLayoutData --> LayoutAlgorithm{Layout Algorithm}
|
||||||
|
LayoutAlgorithm --> Dagre["dagre<br/>(default)"]
|
||||||
|
LayoutAlgorithm --> DagreWrapper["dagre-wrapper<br/>(v2 renderer)"]
|
||||||
|
LayoutAlgorithm --> ELK["elk<br/>(external package)"]
|
||||||
|
|
||||||
|
%% Testing Components
|
||||||
|
FlowDBClass --> TestFiles["Test Files"]
|
||||||
|
TestFiles --> flowDbSpec["flowDb.spec.ts"]
|
||||||
|
TestFiles --> flowChartShapesSpec["flowChartShapes.spec.js"]
|
||||||
|
TestFiles --> ParserTests["parser/*.spec.js files<br/>- flow-text.spec.js<br/>- flow-edges.spec.js<br/>- flow-style.spec.js<br/>- subgraph.spec.js"]
|
||||||
|
|
||||||
|
%% Configuration
|
||||||
|
Init --> ConfigSetup["Configuration Setup"]
|
||||||
|
ConfigSetup --> FlowchartConfig["cnf.flowchart config"]
|
||||||
|
ConfigSetup --> ArrowMarkers["arrowMarkerAbsolute"]
|
||||||
|
ConfigSetup --> LayoutConfig["layout config"]
|
||||||
|
ConfigSetup --> SetConfig["setConfig() calls"]
|
307
docs/diagrams/mermaid-api-sequence.mmd
Normal file
307
docs/diagrams/mermaid-api-sequence.mmd
Normal file
@@ -0,0 +1,307 @@
|
|||||||
|
---
|
||||||
|
references:
|
||||||
|
- "File: /packages/mermaid/src/mermaidAPI.ts"
|
||||||
|
- "File: /packages/mermaid/src/mermaid.ts"
|
||||||
|
generationTime: 2025-01-28T16:30:00.000Z
|
||||||
|
---
|
||||||
|
sequenceDiagram
|
||||||
|
participant User as User/Browser
|
||||||
|
participant Mermaid as mermaid.ts
|
||||||
|
participant Queue as executionQueue
|
||||||
|
participant API as mermaidAPI.ts
|
||||||
|
participant Config as configApi
|
||||||
|
participant Preprocessor as preprocessDiagram
|
||||||
|
participant DiagramAPI as diagram-api
|
||||||
|
participant Diagram as Diagram.fromText
|
||||||
|
participant Renderer as diagram.renderer
|
||||||
|
participant Styles as Styling System
|
||||||
|
participant DOM as DOM/SVG
|
||||||
|
|
||||||
|
Note over User, DOM: Mermaid Complete API Flow
|
||||||
|
|
||||||
|
%% Initialization Phase
|
||||||
|
User->>+Mermaid: mermaid.initialize(config)
|
||||||
|
Mermaid->>+API: mermaidAPI.initialize(config)
|
||||||
|
|
||||||
|
API->>API: assignWithDepth({}, userOptions)
|
||||||
|
API->>API: handle legacy fontFamily config
|
||||||
|
API->>Config: saveConfigFromInitialize(options)
|
||||||
|
|
||||||
|
alt Theme Configuration Available
|
||||||
|
API->>API: check if theme in theme object
|
||||||
|
API->>API: set themeVariables from theme
|
||||||
|
else Default Theme
|
||||||
|
API->>API: use default theme variables
|
||||||
|
end
|
||||||
|
|
||||||
|
API->>Config: setSiteConfig(options) or getSiteConfig()
|
||||||
|
API->>API: setLogLevel(config.logLevel)
|
||||||
|
API->>DiagramAPI: addDiagrams()
|
||||||
|
|
||||||
|
API-->>-Mermaid: initialization complete
|
||||||
|
Mermaid-->>-User: ready to render
|
||||||
|
|
||||||
|
%% Content Loaded Event
|
||||||
|
User->>DOM: document.load event
|
||||||
|
DOM->>+Mermaid: contentLoaded()
|
||||||
|
|
||||||
|
opt startOnLoad is true
|
||||||
|
Mermaid->>Config: getConfig()
|
||||||
|
Config-->>Mermaid: { startOnLoad: true }
|
||||||
|
Mermaid->>Mermaid: run()
|
||||||
|
end
|
||||||
|
|
||||||
|
Mermaid-->>-DOM: event handling complete
|
||||||
|
|
||||||
|
%% Main Run Function
|
||||||
|
User->>+Mermaid: mermaid.run(options)
|
||||||
|
|
||||||
|
Mermaid->>Mermaid: runThrowsErrors(options)
|
||||||
|
Mermaid->>Config: getConfig()
|
||||||
|
Config-->>Mermaid: configuration object
|
||||||
|
|
||||||
|
alt nodes provided
|
||||||
|
Mermaid->>Mermaid: use provided nodes
|
||||||
|
else querySelector provided
|
||||||
|
Mermaid->>DOM: document.querySelectorAll(querySelector)
|
||||||
|
DOM-->>Mermaid: nodesToProcess
|
||||||
|
end
|
||||||
|
|
||||||
|
Mermaid->>Mermaid: new InitIDGenerator(deterministicIds, seed)
|
||||||
|
|
||||||
|
loop For each diagram element
|
||||||
|
Mermaid->>DOM: check element.getAttribute('data-processed')
|
||||||
|
|
||||||
|
opt not processed
|
||||||
|
Mermaid->>DOM: element.setAttribute('data-processed', 'true')
|
||||||
|
Mermaid->>Mermaid: generate unique id
|
||||||
|
Mermaid->>DOM: get element.innerHTML
|
||||||
|
Mermaid->>Mermaid: entityDecode and clean text
|
||||||
|
Mermaid->>Mermaid: detectInit(txt)
|
||||||
|
|
||||||
|
Mermaid->>Queue: render(id, txt, element)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Mermaid-->>-User: processing initiated
|
||||||
|
|
||||||
|
%% Render Function (Queued)
|
||||||
|
activate Queue
|
||||||
|
Queue->>+API: mermaidAPI.render(id, text, container)
|
||||||
|
|
||||||
|
API->>DiagramAPI: addDiagrams()
|
||||||
|
API->>+Preprocessor: processAndSetConfigs(text)
|
||||||
|
|
||||||
|
Preprocessor->>Preprocessor: preprocessDiagram(text)
|
||||||
|
Preprocessor->>Config: reset()
|
||||||
|
Preprocessor->>Config: addDirective(processed.config)
|
||||||
|
Preprocessor-->>-API: { code, config }
|
||||||
|
|
||||||
|
API->>Config: getConfig()
|
||||||
|
Config-->>API: current configuration
|
||||||
|
|
||||||
|
opt text length > maxTextSize
|
||||||
|
API->>API: text = MAX_TEXTLENGTH_EXCEEDED_MSG
|
||||||
|
end
|
||||||
|
|
||||||
|
API->>API: setup id selectors and element IDs
|
||||||
|
API->>API: determine security level (sandbox/loose)
|
||||||
|
|
||||||
|
%% DOM Setup
|
||||||
|
alt svgContainingElement provided
|
||||||
|
alt isSandboxed
|
||||||
|
API->>DOM: sandboxedIframe(select(svgContainingElement), iFrameID)
|
||||||
|
API->>DOM: select iframe contentDocument body
|
||||||
|
else
|
||||||
|
API->>DOM: select(svgContainingElement)
|
||||||
|
end
|
||||||
|
else no container
|
||||||
|
API->>API: removeExistingElements(document, id, divId, iFrameId)
|
||||||
|
alt isSandboxed
|
||||||
|
API->>DOM: sandboxedIframe(select('body'), iFrameID)
|
||||||
|
else
|
||||||
|
API->>DOM: select('body')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
API->>DOM: appendDivSvgG(root, id, enclosingDivID, fontFamily, XMLNS_XLINK_STD)
|
||||||
|
|
||||||
|
%% Diagram Creation
|
||||||
|
API->>+Diagram: Diagram.fromText(text, { title: processed.title })
|
||||||
|
|
||||||
|
Diagram->>DiagramAPI: detect diagram type
|
||||||
|
Diagram->>DiagramAPI: load appropriate diagram
|
||||||
|
Diagram-->>-API: diagram instance
|
||||||
|
|
||||||
|
opt parsing error occurred
|
||||||
|
API->>+Diagram: Diagram.fromText('error')
|
||||||
|
Diagram-->>-API: error diagram
|
||||||
|
API->>API: store parseEncounteredException
|
||||||
|
end
|
||||||
|
|
||||||
|
%% Style Generation
|
||||||
|
API->>DOM: get svg element and firstChild
|
||||||
|
API->>Renderer: diag.renderer.getClasses(text, diag)
|
||||||
|
Renderer-->>API: diagramClassDefs
|
||||||
|
|
||||||
|
API->>+Styles: createUserStyles(config, diagramType, diagramClassDefs, idSelector)
|
||||||
|
|
||||||
|
Styles->>Styles: createCssStyles(config, classDefs)
|
||||||
|
|
||||||
|
opt config.themeCSS defined
|
||||||
|
Styles->>Styles: append themeCSS
|
||||||
|
end
|
||||||
|
|
||||||
|
opt fontFamily configured
|
||||||
|
Styles->>Styles: add CSS variables for fonts
|
||||||
|
end
|
||||||
|
|
||||||
|
opt classDefs exist
|
||||||
|
loop For each styleClassDef
|
||||||
|
opt has styles
|
||||||
|
Styles->>Styles: cssImportantStyles for each CSS element
|
||||||
|
end
|
||||||
|
opt has textStyles
|
||||||
|
Styles->>Styles: cssImportantStyles for tspan elements
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Styles->>Styles: getStyles(graphType, userCSSstyles, themeVariables)
|
||||||
|
Styles->>Styles: serialize(compile(svgId{allStyles}), stringify)
|
||||||
|
Styles-->>-API: compiled CSS rules
|
||||||
|
|
||||||
|
API->>DOM: create style element
|
||||||
|
API->>DOM: style.innerHTML = rules
|
||||||
|
API->>DOM: svg.insertBefore(style, firstChild)
|
||||||
|
|
||||||
|
%% Diagram Rendering
|
||||||
|
API->>+Renderer: diag.renderer.draw(text, id, version, diag)
|
||||||
|
|
||||||
|
Renderer->>Renderer: diagram-specific rendering logic
|
||||||
|
Renderer->>DOM: create SVG elements
|
||||||
|
Renderer->>DOM: apply positioning and styling
|
||||||
|
Renderer-->>-API: rendered diagram
|
||||||
|
|
||||||
|
opt rendering error
|
||||||
|
alt suppressErrorRendering
|
||||||
|
API->>API: removeTempElements()
|
||||||
|
API->>Mermaid: throw error
|
||||||
|
else
|
||||||
|
API->>Renderer: errorRenderer.draw(text, id, version)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
%% Accessibility and Cleanup
|
||||||
|
API->>DOM: select svg element
|
||||||
|
API->>Diagram: diag.db.getAccTitle()
|
||||||
|
API->>Diagram: diag.db.getAccDescription()
|
||||||
|
API->>API: addA11yInfo(diagramType, svgNode, a11yTitle, a11yDescr)
|
||||||
|
|
||||||
|
API->>DOM: set xmlns for foreignobject elements
|
||||||
|
API->>DOM: get innerHTML from enclosing div
|
||||||
|
|
||||||
|
API->>+API: cleanUpSvgCode(svgCode, isSandboxed, arrowMarkerAbsolute)
|
||||||
|
|
||||||
|
opt not useArrowMarkerUrls and not sandboxed
|
||||||
|
API->>API: replace marker-end URLs with anchors
|
||||||
|
end
|
||||||
|
|
||||||
|
API->>API: decodeEntities(svgCode)
|
||||||
|
API->>API: replace <br> with <br/>
|
||||||
|
API-->>-API: cleaned SVG code
|
||||||
|
|
||||||
|
alt isSandboxed
|
||||||
|
API->>+API: putIntoIFrame(svgCode, svgEl)
|
||||||
|
API->>API: calculate iframe height
|
||||||
|
API->>API: toBase64 encode SVG content
|
||||||
|
API->>API: create iframe with sandbox attributes
|
||||||
|
API-->>-API: iframe HTML
|
||||||
|
else not loose security
|
||||||
|
API->>API: DOMPurify.sanitize(svgCode, options)
|
||||||
|
end
|
||||||
|
|
||||||
|
API->>API: attachFunctions()
|
||||||
|
API->>API: removeTempElements()
|
||||||
|
|
||||||
|
opt parseEncounteredException
|
||||||
|
API->>Mermaid: throw parseEncounteredException
|
||||||
|
end
|
||||||
|
|
||||||
|
API-->>-Queue: { diagramType, svg: svgCode, bindFunctions }
|
||||||
|
|
||||||
|
%% Return to Web Integration
|
||||||
|
activate Mermaid
|
||||||
|
Queue-->>Mermaid: render result
|
||||||
|
Mermaid->>DOM: element.innerHTML = svg
|
||||||
|
|
||||||
|
opt postRenderCallback
|
||||||
|
Mermaid->>User: postRenderCallback(id)
|
||||||
|
end
|
||||||
|
|
||||||
|
opt bindFunctions exist
|
||||||
|
Mermaid->>DOM: bindFunctions(element)
|
||||||
|
end
|
||||||
|
deactivate Mermaid
|
||||||
|
|
||||||
|
%% Parse Function Flow
|
||||||
|
User->>+Mermaid: mermaid.parse(text, parseOptions)
|
||||||
|
activate Queue
|
||||||
|
|
||||||
|
Queue->>+API: mermaidAPI.parse(text, parseOptions)
|
||||||
|
|
||||||
|
API->>DiagramAPI: addDiagrams()
|
||||||
|
API->>Preprocessor: processAndSetConfigs(text)
|
||||||
|
Preprocessor-->>API: { code, config }
|
||||||
|
API->>Diagram: getDiagramFromText(code)
|
||||||
|
Diagram-->>API: diagram instance
|
||||||
|
API-->>-Queue: { diagramType: diagram.type, config }
|
||||||
|
|
||||||
|
Queue-->>-Mermaid: parse result
|
||||||
|
Mermaid-->>-User: ParseResult or false
|
||||||
|
|
||||||
|
%% External Diagram Registration
|
||||||
|
User->>+Mermaid: registerExternalDiagrams(diagrams, options)
|
||||||
|
|
||||||
|
Mermaid->>DiagramAPI: addDiagrams()
|
||||||
|
Mermaid->>DiagramAPI: registerLazyLoadedDiagrams(...diagrams)
|
||||||
|
|
||||||
|
opt lazyLoad is false
|
||||||
|
Mermaid->>DiagramAPI: loadRegisteredDiagrams()
|
||||||
|
end
|
||||||
|
|
||||||
|
Mermaid-->>-User: registration complete
|
||||||
|
|
||||||
|
%% Error Handling
|
||||||
|
Note over Mermaid, API: Error Handling Throughout
|
||||||
|
alt Error occurs
|
||||||
|
API->>Mermaid: throw error
|
||||||
|
Mermaid->>+Mermaid: handleError(error, errors, parseError)
|
||||||
|
|
||||||
|
Mermaid->>Mermaid: log.warn(error)
|
||||||
|
|
||||||
|
alt isDetailedError
|
||||||
|
Mermaid->>User: parseError(error.str, error.hash)
|
||||||
|
else
|
||||||
|
Mermaid->>User: parseError(error)
|
||||||
|
end
|
||||||
|
|
||||||
|
opt not suppressErrors
|
||||||
|
Mermaid->>User: throw error
|
||||||
|
end
|
||||||
|
|
||||||
|
Mermaid-->>-User: error handled
|
||||||
|
end
|
||||||
|
|
||||||
|
%% Configuration Details
|
||||||
|
Note over Config: Configuration Functions
|
||||||
|
Note right of Config: Functions:<br/>- reset()<br/>- getConfig()<br/>- setConfig()<br/>- getSiteConfig()<br/>- updateSiteConfig()<br/>- saveConfigFromInitialize()
|
||||||
|
|
||||||
|
Note over Styles: CSS Generation
|
||||||
|
Note right of Styles: Features:<br/>- createCssStyles()<br/>- createUserStyles()<br/>- cssImportantStyles()<br/>- Theme integration<br/>- Class definitions
|
||||||
|
|
||||||
|
Note over API: Security Levels
|
||||||
|
Note right of API: Modes:<br/>- sandbox: iframe isolation<br/>- loose: minimal sanitization<br/>- default: DOMPurify sanitization
|
||||||
|
|
||||||
|
Note over API: Helper Functions
|
||||||
|
Note right of API: Utilities:<br/>- cleanUpSvgCode()<br/>- putIntoIFrame()<br/>- appendDivSvgG()<br/>- removeExistingElements()
|
180
docs/diagrams/mindmap-implementation-sequence.mmd
Normal file
180
docs/diagrams/mindmap-implementation-sequence.mmd
Normal file
@@ -0,0 +1,180 @@
|
|||||||
|
---
|
||||||
|
references:
|
||||||
|
- "File: /packages/mermaid/src/diagrams/mindmap/mindmap-definition.ts"
|
||||||
|
- "File: /packages/mermaid/src/diagrams/mindmap/mindmapDb.ts"
|
||||||
|
- "File: /packages/mermaid/src/diagrams/mindmap/detector.ts"
|
||||||
|
- "File: /packages/mermaid/src/diagrams/mindmap/mindmapTypes.ts"
|
||||||
|
- "File: /packages/mermaid/src/diagrams/mindmap/mindmapRenderer.ts"
|
||||||
|
- "File: /packages/mermaid/src/diagrams/mindmap/styles.ts"
|
||||||
|
- "File: /packages/mermaid/src/diagrams/mindmap/svgDraw.ts"
|
||||||
|
generationTime: 2025-01-28T16:00:00.000Z
|
||||||
|
---
|
||||||
|
sequenceDiagram
|
||||||
|
participant User as User Input Text
|
||||||
|
participant Detector as detector.ts
|
||||||
|
participant Loader as DiagramLoader
|
||||||
|
participant Definition as mindmap-definition.ts
|
||||||
|
participant Parser as parser/mindmap.jison
|
||||||
|
participant DB as MindmapDB
|
||||||
|
participant Renderer as mindmapRenderer.ts
|
||||||
|
participant Cytoscape as cytoscape.js
|
||||||
|
participant SVGDraw as svgDraw.ts
|
||||||
|
participant Styles as styles.ts
|
||||||
|
participant Output as Final SVG
|
||||||
|
|
||||||
|
Note over User, Output: Mindmap Implementation Flow
|
||||||
|
|
||||||
|
%% Detection Phase
|
||||||
|
User->>Detector: /^\s*mindmap/ text input
|
||||||
|
activate Detector
|
||||||
|
Detector->>Detector: detector(txt) validates pattern
|
||||||
|
Detector->>Loader: loader() function called
|
||||||
|
deactivate Detector
|
||||||
|
|
||||||
|
activate Loader
|
||||||
|
Loader->>Definition: import mindmap-definition.js
|
||||||
|
deactivate Loader
|
||||||
|
|
||||||
|
%% Core Structure Setup
|
||||||
|
activate Definition
|
||||||
|
Definition->>DB: get db() → new MindmapDB()
|
||||||
|
Definition->>Renderer: setup renderer
|
||||||
|
Definition->>Parser: setup parser
|
||||||
|
Definition->>Styles: setup styles
|
||||||
|
deactivate Definition
|
||||||
|
|
||||||
|
%% Database Initialization
|
||||||
|
activate DB
|
||||||
|
Note over DB: MindmapDB Constructor
|
||||||
|
DB->>DB: initialize nodes array
|
||||||
|
DB->>DB: setup nodeType constants
|
||||||
|
DB->>DB: bind methods
|
||||||
|
DB->>DB: clear() state
|
||||||
|
|
||||||
|
%% Parsing Phase
|
||||||
|
activate Parser
|
||||||
|
User->>Parser: mindmap syntax text
|
||||||
|
|
||||||
|
loop For each node in hierarchy
|
||||||
|
Parser->>DB: addNode(level, id, descr, type)
|
||||||
|
activate DB
|
||||||
|
DB->>DB: sanitizeText(id, descr)
|
||||||
|
DB->>DB: getType(startStr, endStr)
|
||||||
|
Note right of DB: Shape Detection:<br/>[ → RECT<br/>( → ROUNDED_RECT<br/>(( → CIRCLE<br/>)) → BANG<br/>{{ → HEXAGON
|
||||||
|
DB->>DB: getParent(level)
|
||||||
|
DB->>DB: create MindmapNode
|
||||||
|
DB->>DB: add to hierarchy
|
||||||
|
deactivate DB
|
||||||
|
end
|
||||||
|
|
||||||
|
opt Icon/Class Decoration
|
||||||
|
Parser->>DB: decorateNode(decoration)
|
||||||
|
DB->>DB: set icon/class properties
|
||||||
|
end
|
||||||
|
deactivate Parser
|
||||||
|
|
||||||
|
%% Data Preparation
|
||||||
|
Renderer->>DB: getData() for layout
|
||||||
|
activate DB
|
||||||
|
DB->>DB: collect all nodes
|
||||||
|
DB->>DB: build parent-child relationships
|
||||||
|
DB-->>Renderer: return node hierarchy
|
||||||
|
deactivate DB
|
||||||
|
|
||||||
|
%% Rendering Pipeline
|
||||||
|
activate Renderer
|
||||||
|
Note over Renderer: Rendering Phase
|
||||||
|
|
||||||
|
Renderer->>Cytoscape: initialize cytoscape
|
||||||
|
activate Cytoscape
|
||||||
|
|
||||||
|
loop For each node in mindmap
|
||||||
|
Renderer->>Cytoscape: addNodes(mindmap, cy, conf, level)
|
||||||
|
Cytoscape->>Cytoscape: create node data
|
||||||
|
Cytoscape->>Cytoscape: set position (x, y)
|
||||||
|
end
|
||||||
|
|
||||||
|
loop For parent-child relationships
|
||||||
|
Renderer->>Cytoscape: add edges
|
||||||
|
Cytoscape->>Cytoscape: create edge data
|
||||||
|
end
|
||||||
|
|
||||||
|
Renderer->>Cytoscape: configure cose-bilkent layout
|
||||||
|
Cytoscape->>Cytoscape: calculate optimal positions
|
||||||
|
Cytoscape-->>Renderer: return positioned graph
|
||||||
|
deactivate Cytoscape
|
||||||
|
|
||||||
|
%% SVG Generation
|
||||||
|
Renderer->>SVGDraw: drawNodes(db, svg, mindmap, section, conf)
|
||||||
|
activate SVGDraw
|
||||||
|
|
||||||
|
loop For each node recursively
|
||||||
|
SVGDraw->>SVGDraw: select shape function
|
||||||
|
|
||||||
|
alt Default Shape
|
||||||
|
SVGDraw->>SVGDraw: defaultBkg() - rounded rectangle
|
||||||
|
else Rectangle Shape
|
||||||
|
SVGDraw->>SVGDraw: rectBkg() - sharp corners
|
||||||
|
else Circle Shape
|
||||||
|
SVGDraw->>SVGDraw: circleBkg() - perfect circle
|
||||||
|
else Cloud Shape
|
||||||
|
SVGDraw->>SVGDraw: cloudBkg() - organic curves
|
||||||
|
else Bang Shape
|
||||||
|
SVGDraw->>SVGDraw: bangBkg() - explosion style
|
||||||
|
else Hexagon Shape
|
||||||
|
SVGDraw->>SVGDraw: hexagonBkg() - six sides
|
||||||
|
end
|
||||||
|
|
||||||
|
SVGDraw->>SVGDraw: create SVG elements
|
||||||
|
SVGDraw->>SVGDraw: add text labels
|
||||||
|
SVGDraw->>SVGDraw: position node
|
||||||
|
|
||||||
|
opt Node has children
|
||||||
|
SVGDraw->>SVGDraw: drawNodes() recursive call
|
||||||
|
end
|
||||||
|
end
|
||||||
|
deactivate SVGDraw
|
||||||
|
|
||||||
|
%% Edge Rendering
|
||||||
|
Renderer->>Renderer: drawEdges(edgesEl, cy)
|
||||||
|
loop For each edge
|
||||||
|
Renderer->>Renderer: extract edge bounds
|
||||||
|
Renderer->>Renderer: draw SVG path
|
||||||
|
end
|
||||||
|
|
||||||
|
%% Styling Application
|
||||||
|
Renderer->>Styles: getStyles(options)
|
||||||
|
activate Styles
|
||||||
|
|
||||||
|
Styles->>Styles: genSections(options)
|
||||||
|
loop For THEME_COLOR_LIMIT sections
|
||||||
|
Styles->>Styles: generate color scale
|
||||||
|
Styles->>Styles: create CSS rules
|
||||||
|
Note right of Styles: .section-X fills<br/>.edge-depth-X widths<br/>.node-icon-X colors
|
||||||
|
end
|
||||||
|
|
||||||
|
Styles->>Styles: apply theme integration
|
||||||
|
Styles-->>Renderer: return compiled CSS
|
||||||
|
deactivate Styles
|
||||||
|
|
||||||
|
%% Final Assembly
|
||||||
|
Renderer->>Output: selectSvgElement()
|
||||||
|
Renderer->>Output: setupGraphViewbox()
|
||||||
|
Renderer->>Output: apply styles
|
||||||
|
Renderer->>Output: add interactive elements
|
||||||
|
deactivate Renderer
|
||||||
|
|
||||||
|
activate Output
|
||||||
|
Note over Output: Final Mindmap Features
|
||||||
|
Output->>Output: responsive layout
|
||||||
|
Output->>Output: accessibility attributes
|
||||||
|
Output->>Output: hover effects
|
||||||
|
Output->>Output: click handling
|
||||||
|
Output-->>User: rendered mindmap
|
||||||
|
deactivate Output
|
||||||
|
|
||||||
|
%% Configuration Details
|
||||||
|
Note over DB, Styles: Configuration Options
|
||||||
|
Note right of DB: Padding Calculations:<br/>Base padding from config<br/>RECT: ×2 padding<br/>ROUNDED_RECT: ×2 padding<br/>HEXAGON: ×2 padding
|
||||||
|
Note right of Styles: Section Management:<br/>MAX_SECTIONS = 12<br/>Dynamic color generation<br/>Git theme integration
|
||||||
|
Note right of Renderer: Layout Parameters:<br/>Cytoscape configuration<br/>coseBilkent settings<br/>Node spacing rules
|
@@ -84,6 +84,7 @@ To add an integration to this list, see the [Integrations - create page](./integ
|
|||||||
LLM integrations to create mermaid diagrams using AI from text descriptions.
|
LLM integrations to create mermaid diagrams using AI from text descriptions.
|
||||||
|
|
||||||
- [HueHive - Create mermaid diagrams with text](https://huehive.co/tools/diagrams)
|
- [HueHive - Create mermaid diagrams with text](https://huehive.co/tools/diagrams)
|
||||||
|
- [MCP Server Mermaid](https://github.com/hustcc/mcp-mermaid) - Generate mermaid diagram and chart with AI MCP dynamically.
|
||||||
|
|
||||||
### CRM/ERP
|
### CRM/ERP
|
||||||
|
|
||||||
@@ -103,6 +104,7 @@ Blogging frameworks and platforms
|
|||||||
- [Mermaid](https://nextra.site/docs/guide/mermaid)
|
- [Mermaid](https://nextra.site/docs/guide/mermaid)
|
||||||
- [WordPress](https://wordpress.org)
|
- [WordPress](https://wordpress.org)
|
||||||
- [MerPRess](https://wordpress.org/plugins/merpress/)
|
- [MerPRess](https://wordpress.org/plugins/merpress/)
|
||||||
|
- [WP Documentation](https://wordpress.org/themes/wp-documentation/)
|
||||||
|
|
||||||
### CMS/ECM
|
### CMS/ECM
|
||||||
|
|
||||||
|
@@ -16,9 +16,7 @@ Applications that support Mermaid files [SHOULD](https://datatracker.ietf.org/do
|
|||||||
|
|
||||||
### MIME Type
|
### MIME Type
|
||||||
|
|
||||||
The recommended [MIME type](https://www.iana.org/assignments/media-types/media-types.xhtml) for Mermaid media is `text/vnd.mermaid`.
|
The recommended [MIME type](https://www.iana.org/assignments/media-types/media-types.xhtml) for Mermaid media is [`text/vnd.mermaid`](https://www.iana.org/assignments/media-types/application/vnd.mermaid).
|
||||||
|
|
||||||
Currently pending [IANA](https://www.iana.org/) recognition.
|
|
||||||
|
|
||||||
## Showcase
|
## Showcase
|
||||||
|
|
||||||
|
@@ -29,7 +29,6 @@ Try the Ultimate AI, Mermaid, and Visual Diagramming Suite by creating an accoun
|
|||||||
- **Plugins** - A plugin system for extending the functionality of Mermaid.
|
- **Plugins** - A plugin system for extending the functionality of Mermaid.
|
||||||
|
|
||||||
Official Mermaid Chart plugins:
|
Official Mermaid Chart plugins:
|
||||||
|
|
||||||
- [Mermaid Chart GPT](https://chatgpt.com/g/g-684cc36f30208191b21383b88650a45d-mermaid-chart-diagrams-and-charts)
|
- [Mermaid Chart GPT](https://chatgpt.com/g/g-684cc36f30208191b21383b88650a45d-mermaid-chart-diagrams-and-charts)
|
||||||
- [Confluence](https://marketplace.atlassian.com/apps/1234056/mermaid-chart-for-confluence?hosting=cloud&tab=overview)
|
- [Confluence](https://marketplace.atlassian.com/apps/1234056/mermaid-chart-for-confluence?hosting=cloud&tab=overview)
|
||||||
- [Jira](https://marketplace.atlassian.com/apps/1234810/mermaid-chart-for-jira?tab=overview&hosting=cloud)
|
- [Jira](https://marketplace.atlassian.com/apps/1234810/mermaid-chart-for-jira?tab=overview&hosting=cloud)
|
||||||
|
@@ -35,13 +35,11 @@ The Mermaid Chart team is excited to introduce a new Visual Editor for Flowchart
|
|||||||
Learn more:
|
Learn more:
|
||||||
|
|
||||||
- Visual Editor For Flowcharts
|
- Visual Editor For Flowcharts
|
||||||
|
|
||||||
- [Blog post](https://www.mermaidchart.com/blog/posts/mermaid-chart-releases-new-visual-editor-for-flowcharts)
|
- [Blog post](https://www.mermaidchart.com/blog/posts/mermaid-chart-releases-new-visual-editor-for-flowcharts)
|
||||||
|
|
||||||
- [Demo video](https://www.youtube.com/watch?v=5aja0gijoO0)
|
- [Demo video](https://www.youtube.com/watch?v=5aja0gijoO0)
|
||||||
|
|
||||||
- Visual Editor For Sequence diagrams
|
- Visual Editor For Sequence diagrams
|
||||||
|
|
||||||
- [Blog post](https://www.mermaidchart.com/blog/posts/mermaid-chart-unveils-visual-editor-for-sequence-diagrams)
|
- [Blog post](https://www.mermaidchart.com/blog/posts/mermaid-chart-unveils-visual-editor-for-sequence-diagrams)
|
||||||
|
|
||||||
- [Demo video](https://youtu.be/imc2u5_N6Dc)
|
- [Demo video](https://youtu.be/imc2u5_N6Dc)
|
||||||
|
@@ -139,7 +139,6 @@ The following unfinished features are not supported in the short term.
|
|||||||
- [ ] Legend
|
- [ ] Legend
|
||||||
|
|
||||||
- [x] System Context
|
- [x] System Context
|
||||||
|
|
||||||
- [x] Person(alias, label, ?descr, ?sprite, ?tags, $link)
|
- [x] Person(alias, label, ?descr, ?sprite, ?tags, $link)
|
||||||
- [x] Person_Ext
|
- [x] Person_Ext
|
||||||
- [x] System(alias, label, ?descr, ?sprite, ?tags, $link)
|
- [x] System(alias, label, ?descr, ?sprite, ?tags, $link)
|
||||||
@@ -153,7 +152,6 @@ The following unfinished features are not supported in the short term.
|
|||||||
- [x] System_Boundary
|
- [x] System_Boundary
|
||||||
|
|
||||||
- [x] Container diagram
|
- [x] Container diagram
|
||||||
|
|
||||||
- [x] Container(alias, label, ?techn, ?descr, ?sprite, ?tags, $link)
|
- [x] Container(alias, label, ?techn, ?descr, ?sprite, ?tags, $link)
|
||||||
- [x] ContainerDb
|
- [x] ContainerDb
|
||||||
- [x] ContainerQueue
|
- [x] ContainerQueue
|
||||||
@@ -163,7 +161,6 @@ The following unfinished features are not supported in the short term.
|
|||||||
- [x] Container_Boundary(alias, label, ?tags, $link)
|
- [x] Container_Boundary(alias, label, ?tags, $link)
|
||||||
|
|
||||||
- [x] Component diagram
|
- [x] Component diagram
|
||||||
|
|
||||||
- [x] Component(alias, label, ?techn, ?descr, ?sprite, ?tags, $link)
|
- [x] Component(alias, label, ?techn, ?descr, ?sprite, ?tags, $link)
|
||||||
- [x] ComponentDb
|
- [x] ComponentDb
|
||||||
- [x] ComponentQueue
|
- [x] ComponentQueue
|
||||||
@@ -172,18 +169,15 @@ The following unfinished features are not supported in the short term.
|
|||||||
- [x] ComponentQueue_Ext
|
- [x] ComponentQueue_Ext
|
||||||
|
|
||||||
- [x] Dynamic diagram
|
- [x] Dynamic diagram
|
||||||
|
|
||||||
- [x] RelIndex(index, from, to, label, ?tags, $link)
|
- [x] RelIndex(index, from, to, label, ?tags, $link)
|
||||||
|
|
||||||
- [x] Deployment diagram
|
- [x] Deployment diagram
|
||||||
|
|
||||||
- [x] Deployment_Node(alias, label, ?type, ?descr, ?sprite, ?tags, $link)
|
- [x] Deployment_Node(alias, label, ?type, ?descr, ?sprite, ?tags, $link)
|
||||||
- [x] Node(alias, label, ?type, ?descr, ?sprite, ?tags, $link): short name of Deployment_Node()
|
- [x] Node(alias, label, ?type, ?descr, ?sprite, ?tags, $link): short name of Deployment_Node()
|
||||||
- [x] Node_L(alias, label, ?type, ?descr, ?sprite, ?tags, $link): left aligned Node()
|
- [x] Node_L(alias, label, ?type, ?descr, ?sprite, ?tags, $link): left aligned Node()
|
||||||
- [x] Node_R(alias, label, ?type, ?descr, ?sprite, ?tags, $link): right aligned Node()
|
- [x] Node_R(alias, label, ?type, ?descr, ?sprite, ?tags, $link): right aligned Node()
|
||||||
|
|
||||||
- [x] Relationship Types
|
- [x] Relationship Types
|
||||||
|
|
||||||
- [x] Rel(from, to, label, ?techn, ?descr, ?sprite, ?tags, $link)
|
- [x] Rel(from, to, label, ?techn, ?descr, ?sprite, ?tags, $link)
|
||||||
- [x] BiRel (bidirectional relationship)
|
- [x] BiRel (bidirectional relationship)
|
||||||
- [x] Rel_U, Rel_Up
|
- [x] Rel_U, Rel_Up
|
||||||
|
@@ -326,7 +326,9 @@ Below is a comprehensive list of the newly introduced shapes and their correspon
|
|||||||
|
|
||||||
| **Semantic Name** | **Shape Name** | **Short Name** | **Description** | **Alias Supported** |
|
| **Semantic Name** | **Shape Name** | **Short Name** | **Description** | **Alias Supported** |
|
||||||
| --------------------------------- | ---------------------- | -------------- | ------------------------------ | ---------------------------------------------------------------- |
|
| --------------------------------- | ---------------------- | -------------- | ------------------------------ | ---------------------------------------------------------------- |
|
||||||
|
| Bang | Bang | `bang` | Bang | `bang` |
|
||||||
| Card | Notched Rectangle | `notch-rect` | Represents a card | `card`, `notched-rectangle` |
|
| Card | Notched Rectangle | `notch-rect` | Represents a card | `card`, `notched-rectangle` |
|
||||||
|
| Cloud | Cloud | `cloud` | cloud | `cloud` |
|
||||||
| Collate | Hourglass | `hourglass` | Represents a collate operation | `collate`, `hourglass` |
|
| Collate | Hourglass | `hourglass` | Represents a collate operation | `collate`, `hourglass` |
|
||||||
| Com Link | Lightning Bolt | `bolt` | Communication link | `com-link`, `lightning-bolt` |
|
| Com Link | Lightning Bolt | `bolt` | Communication link | `com-link`, `lightning-bolt` |
|
||||||
| Comment | Curly Brace | `brace` | Adds a comment | `brace-l`, `comment` |
|
| Comment | Curly Brace | `brace` | Adds a comment | `brace-l`, `comment` |
|
||||||
@@ -1795,15 +1797,54 @@ It is possible to style the type of curve used for lines between items, if the d
|
|||||||
Available curve styles include `basis`, `bumpX`, `bumpY`, `cardinal`, `catmullRom`, `linear`, `monotoneX`, `monotoneY`,
|
Available curve styles include `basis`, `bumpX`, `bumpY`, `cardinal`, `catmullRom`, `linear`, `monotoneX`, `monotoneY`,
|
||||||
`natural`, `step`, `stepAfter`, and `stepBefore`.
|
`natural`, `step`, `stepAfter`, and `stepBefore`.
|
||||||
|
|
||||||
|
For a full list of available curves, including an explanation of custom curves, refer to
|
||||||
|
the [Shapes](https://d3js.org/d3-shape/curve) documentation in the [d3-shape](https://github.com/d3/d3-shape/) project.
|
||||||
|
|
||||||
|
Line styling can be achieved in two ways:
|
||||||
|
|
||||||
|
1. Change the curve style of all the lines
|
||||||
|
2. Change the curve style of a particular line
|
||||||
|
|
||||||
|
#### Diagram level curve style
|
||||||
|
|
||||||
In this example, a left-to-right graph uses the `stepBefore` curve style:
|
In this example, a left-to-right graph uses the `stepBefore` curve style:
|
||||||
|
|
||||||
```
|
```
|
||||||
%%{ init: { 'flowchart': { 'curve': 'stepBefore' } } }%%
|
---
|
||||||
|
config:
|
||||||
|
flowchart:
|
||||||
|
curve: stepBefore
|
||||||
|
---
|
||||||
graph LR
|
graph LR
|
||||||
```
|
```
|
||||||
|
|
||||||
For a full list of available curves, including an explanation of custom curves, refer to
|
#### Edge level curve style using Edge IDs (v\<MERMAID_RELEASE_VERSION>+)
|
||||||
the [Shapes](https://d3js.org/d3-shape/curve) documentation in the [d3-shape](https://github.com/d3/d3-shape/) project.
|
|
||||||
|
You can assign IDs to [edges](#attaching-an-id-to-edges). After assigning an ID you can modify the line style by modifying the edge's `curve` property using the following syntax:
|
||||||
|
|
||||||
|
```mermaid-example
|
||||||
|
flowchart LR
|
||||||
|
A e1@==> B
|
||||||
|
A e2@--> C
|
||||||
|
e1@{ curve: linear }
|
||||||
|
e2@{ curve: natural }
|
||||||
|
```
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart LR
|
||||||
|
A e1@==> B
|
||||||
|
A e2@--> C
|
||||||
|
e1@{ curve: linear }
|
||||||
|
e2@{ curve: natural }
|
||||||
|
```
|
||||||
|
|
||||||
|
```info
|
||||||
|
Any edge curve style modified at the edge level overrides the diagram level style.
|
||||||
|
```
|
||||||
|
|
||||||
|
```info
|
||||||
|
If the same edge is modified multiple times the last modification will be rendered.
|
||||||
|
```
|
||||||
|
|
||||||
### Styling a node
|
### Styling a node
|
||||||
|
|
||||||
|
@@ -360,7 +360,8 @@ gantt
|
|||||||
weekday monday
|
weekday monday
|
||||||
```
|
```
|
||||||
|
|
||||||
> **Warning** > `millisecond` and `second` support was added in v10.3.0
|
> **Warning**
|
||||||
|
> `millisecond` and `second` support was added in v10.3.0
|
||||||
|
|
||||||
## Output in compact mode
|
## Output in compact mode
|
||||||
|
|
||||||
|
@@ -17,7 +17,7 @@ This diagram type is particularly useful for developers, network engineers, educ
|
|||||||
## Syntax
|
## Syntax
|
||||||
|
|
||||||
```
|
```
|
||||||
packet-beta
|
packet
|
||||||
start: "Block name" %% Single-bit block
|
start: "Block name" %% Single-bit block
|
||||||
start-end: "Block name" %% Multi-bit blocks
|
start-end: "Block name" %% Multi-bit blocks
|
||||||
... More Fields ...
|
... More Fields ...
|
||||||
@@ -28,7 +28,7 @@ start-end: "Block name" %% Multi-bit blocks
|
|||||||
Using start and end bit counts can be difficult, especially when modifying a design. For this we add a bit count field, which starts from the end of the previous field automagically. Use `+<count>` to set the number of bits, thus:
|
Using start and end bit counts can be difficult, especially when modifying a design. For this we add a bit count field, which starts from the end of the previous field automagically. Use `+<count>` to set the number of bits, thus:
|
||||||
|
|
||||||
```
|
```
|
||||||
packet-beta
|
packet
|
||||||
+1: "Block name" %% Single-bit block
|
+1: "Block name" %% Single-bit block
|
||||||
+8: "Block name" %% 8-bit block
|
+8: "Block name" %% 8-bit block
|
||||||
9-15: "Manually set start and end, it's fine to mix and match"
|
9-15: "Manually set start and end, it's fine to mix and match"
|
||||||
@@ -41,7 +41,7 @@ packet-beta
|
|||||||
---
|
---
|
||||||
title: "TCP Packet"
|
title: "TCP Packet"
|
||||||
---
|
---
|
||||||
packet-beta
|
packet
|
||||||
0-15: "Source Port"
|
0-15: "Source Port"
|
||||||
16-31: "Destination Port"
|
16-31: "Destination Port"
|
||||||
32-63: "Sequence Number"
|
32-63: "Sequence Number"
|
||||||
@@ -65,7 +65,7 @@ packet-beta
|
|||||||
---
|
---
|
||||||
title: "TCP Packet"
|
title: "TCP Packet"
|
||||||
---
|
---
|
||||||
packet-beta
|
packet
|
||||||
0-15: "Source Port"
|
0-15: "Source Port"
|
||||||
16-31: "Destination Port"
|
16-31: "Destination Port"
|
||||||
32-63: "Sequence Number"
|
32-63: "Sequence Number"
|
||||||
@@ -86,7 +86,7 @@ packet-beta
|
|||||||
```
|
```
|
||||||
|
|
||||||
```mermaid-example
|
```mermaid-example
|
||||||
packet-beta
|
packet
|
||||||
title UDP Packet
|
title UDP Packet
|
||||||
+16: "Source Port"
|
+16: "Source Port"
|
||||||
+16: "Destination Port"
|
+16: "Destination Port"
|
||||||
@@ -96,7 +96,7 @@ title UDP Packet
|
|||||||
```
|
```
|
||||||
|
|
||||||
```mermaid
|
```mermaid
|
||||||
packet-beta
|
packet
|
||||||
title UDP Packet
|
title UDP Packet
|
||||||
+16: "Source Port"
|
+16: "Source Port"
|
||||||
+16: "Destination Port"
|
+16: "Destination Port"
|
||||||
@@ -144,7 +144,7 @@ config:
|
|||||||
packet:
|
packet:
|
||||||
startByteColor: red
|
startByteColor: red
|
||||||
---
|
---
|
||||||
packet-beta
|
packet
|
||||||
0-15: "Source Port"
|
0-15: "Source Port"
|
||||||
16-31: "Destination Port"
|
16-31: "Destination Port"
|
||||||
32-63: "Sequence Number"
|
32-63: "Sequence Number"
|
||||||
|
@@ -17,6 +17,7 @@ export default tseslint.config(
|
|||||||
...tseslint.configs.stylisticTypeChecked,
|
...tseslint.configs.stylisticTypeChecked,
|
||||||
{
|
{
|
||||||
ignores: [
|
ignores: [
|
||||||
|
'**/*.d.ts',
|
||||||
'**/dist/',
|
'**/dist/',
|
||||||
'**/node_modules/',
|
'**/node_modules/',
|
||||||
'.git/',
|
'.git/',
|
||||||
|
145
instructions.md
Normal file
145
instructions.md
Normal file
@@ -0,0 +1,145 @@
|
|||||||
|
Please help me to implement the tidy-tree algorithm.
|
||||||
|
|
||||||
|
- I have added a placeholder with the correct signature in `packages/mermaid/src/rendering-util/layout-algorithms/tidy-tree/`.
|
||||||
|
|
||||||
|
Replace the cytoscape layout with one using tidy-tree.
|
||||||
|
|
||||||
|
This is the API for tidy-tree:
|
||||||
|
|
||||||
|
```
|
||||||
|
# non-layered-tidy-tree-layout
|
||||||
|
|
||||||
|
Draw non-layered tidy trees in linear time.
|
||||||
|
|
||||||
|
> This a JavaScript port from the project [cwi-swat/non-layered-tidy-trees](https://github.com/cwi-swat/non-layered-tidy-trees), which is written in Java. The algorithm used in that project is from the paper by _A.J. van der Ploeg_, [Drawing Non-layered Tidy Trees in Linear Time](http://oai.cwi.nl/oai/asset/21856/21856B.pdf). There is another JavaScript port from that project [d3-flextree](https://github.com/Klortho/d3-flextree), which depends on _d3-hierarchy_. This project is dependency free.
|
||||||
|
|
||||||
|
## Getting started
|
||||||
|
|
||||||
|
### Installation
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
npm install non-layered-tidy-tree-layout
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
Or
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
yarn add non-layered-tidy-tree-layout
|
||||||
|
|
||||||
|
````
|
||||||
|
|
||||||
|
There's also a built verison: `dist/non-layered-tidy-tree-layout.js` for use with browser `<script>` tag, or as a Javascript module.
|
||||||
|
|
||||||
|
### Usage
|
||||||
|
|
||||||
|
```js
|
||||||
|
import { BoundingBox, Layout } from 'non-layered-tidy-tree-layout'
|
||||||
|
|
||||||
|
// BoundingBox(gap, bottomPadding)
|
||||||
|
const bb = new BoundingBox(10, 20)
|
||||||
|
const layout = new Layout(bb)
|
||||||
|
const treeData = {
|
||||||
|
id: 0,
|
||||||
|
width: 40,
|
||||||
|
height: 40,
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
width: 40,
|
||||||
|
height: 40,
|
||||||
|
children: [{ id: 6, width: 400, height: 40 }]
|
||||||
|
},
|
||||||
|
{ id: 2, width: 40, height: 40 },
|
||||||
|
{ id: 3, width: 40, height: 40 },
|
||||||
|
{ id: 4, width: 40, height: 40 },
|
||||||
|
{ id: 5, width: 40, height: 80 }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
const { result, boundingBox } = layout.layout(treeData)
|
||||||
|
|
||||||
|
// result:
|
||||||
|
// {
|
||||||
|
// id: 0,
|
||||||
|
// x: 300,
|
||||||
|
// y: 0,
|
||||||
|
// width: 40,
|
||||||
|
// height: 40,
|
||||||
|
// children: [
|
||||||
|
// {
|
||||||
|
// id: 1,
|
||||||
|
// x: 185,
|
||||||
|
// y: 60,
|
||||||
|
// width: 40,
|
||||||
|
// height: 40,
|
||||||
|
// children: [
|
||||||
|
// { id: 6, x: 5, y: 120, width: 400, height: 40 }
|
||||||
|
// ]
|
||||||
|
// },
|
||||||
|
// { id: 2, x: 242.5, y: 60, width: 40, height: 40 },
|
||||||
|
// { id: 3, x: 300, y: 60, width: 40, height: 40 },
|
||||||
|
// { id: 4, x: 357.5, y: 60, width: 40, height: 40 },
|
||||||
|
// { id: 5, x: 415, y: 60, width: 40, height: 80 }
|
||||||
|
// ]
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// boundingBox:
|
||||||
|
// {
|
||||||
|
// left: 5,
|
||||||
|
// right: 455,
|
||||||
|
// top: 0,
|
||||||
|
// bottom: 160
|
||||||
|
// }
|
||||||
|
````
|
||||||
|
|
||||||
|
The method `Layout.layout` modifies `treeData` inplace. It returns an object like `{ result: treeData, boundingBox: {left: num, right: num, top: num, bottom: num} }`. `result` is the same object `treeData` with calculated coordinates, `boundingBox` are the coordinates for the whole tree:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
The red dashed lines are the bounding boxes for each node. `Layout.layout()` produces coordinates to draw nodes, which are the grey boxes with black border.
|
||||||
|
|
||||||
|
The library also provides a class `Tree` and a method `layout`.
|
||||||
|
|
||||||
|
```js
|
||||||
|
/**
|
||||||
|
* Constructor for Tree.
|
||||||
|
* @param {number} width - width of bounding box
|
||||||
|
* @param {number} height - height of bounding box
|
||||||
|
* @param {number} y - veritcal coordinate of bounding box
|
||||||
|
* @param {array} children - a list of Tree instances
|
||||||
|
*/
|
||||||
|
new Tree(width, height, y, children);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate x, y coordindates and assign them to tree.
|
||||||
|
* @param {Object} tree - a Tree object
|
||||||
|
*/
|
||||||
|
layout(tree);
|
||||||
|
```
|
||||||
|
|
||||||
|
In case your data structure are not the same as provided by the example above, you can refer to `src/helpers.js` to implement a `Layout` class that converts your data to a `Tree`, then call `layout` to calculate the coordinates for drawing.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
[MIT](./LICENSE)
|
||||||
|
|
||||||
|
## Changelog
|
||||||
|
|
||||||
|
### [2.0.1]
|
||||||
|
|
||||||
|
- Fixed bounding box calculation in `Layout.getSize` and `Layout.assignLayout` and `Layout.layout`
|
||||||
|
|
||||||
|
### [2.0.0]
|
||||||
|
|
||||||
|
- Added `Layout.layout`
|
||||||
|
- Removed `Layout.layoutTreeData`
|
||||||
|
|
||||||
|
### [1.0.0]
|
||||||
|
|
||||||
|
- Added `Layout`, `BoundingBox`, `layout`, `Tree`
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
35
package.json
35
package.json
@@ -64,10 +64,10 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@applitools/eyes-cypress": "^3.44.9",
|
"@applitools/eyes-cypress": "^3.44.9",
|
||||||
"@argos-ci/cypress": "^4.0.3",
|
"@argos-ci/cypress": "^5.0.2",
|
||||||
"@changesets/changelog-github": "^0.5.1",
|
"@changesets/changelog-github": "^0.5.1",
|
||||||
"@changesets/cli": "^2.27.12",
|
"@changesets/cli": "^2.27.12",
|
||||||
"@cspell/eslint-plugin": "^8.19.3",
|
"@cspell/eslint-plugin": "^8.19.4",
|
||||||
"@cypress/code-coverage": "^3.12.49",
|
"@cypress/code-coverage": "^3.12.49",
|
||||||
"@eslint/js": "^9.26.0",
|
"@eslint/js": "^9.26.0",
|
||||||
"@rollup/plugin-typescript": "^12.1.2",
|
"@rollup/plugin-typescript": "^12.1.2",
|
||||||
@@ -88,46 +88,46 @@
|
|||||||
"cors": "^2.8.5",
|
"cors": "^2.8.5",
|
||||||
"cpy-cli": "^5.0.0",
|
"cpy-cli": "^5.0.0",
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^7.0.3",
|
||||||
"cspell": "^8.6.1",
|
"cspell": "^9.1.3",
|
||||||
"cypress": "^14.0.3",
|
"cypress": "^14.5.1",
|
||||||
"cypress-image-snapshot": "^4.0.1",
|
"cypress-image-snapshot": "^4.0.1",
|
||||||
"cypress-split": "^1.24.14",
|
"cypress-split": "^1.24.14",
|
||||||
"esbuild": "^0.25.0",
|
"esbuild": "^0.25.0",
|
||||||
"eslint": "^9.26.0",
|
"eslint": "^9.26.0",
|
||||||
"eslint-config-prettier": "^10.1.1",
|
"eslint-config-prettier": "^10.1.8",
|
||||||
"eslint-plugin-cypress": "^4.3.0",
|
"eslint-plugin-cypress": "^4.3.0",
|
||||||
"eslint-plugin-html": "^8.1.2",
|
"eslint-plugin-html": "^8.1.3",
|
||||||
"eslint-plugin-jest": "^28.11.0",
|
"eslint-plugin-jest": "^28.14.0",
|
||||||
"eslint-plugin-jsdoc": "^50.6.9",
|
"eslint-plugin-jsdoc": "^50.8.0",
|
||||||
"eslint-plugin-json": "^4.0.1",
|
"eslint-plugin-json": "^4.0.1",
|
||||||
"eslint-plugin-lodash": "^8.0.0",
|
"eslint-plugin-lodash": "^8.0.0",
|
||||||
"eslint-plugin-markdown": "^5.1.0",
|
"eslint-plugin-markdown": "^5.1.0",
|
||||||
"eslint-plugin-no-only-tests": "^3.3.0",
|
"eslint-plugin-no-only-tests": "^3.3.0",
|
||||||
"eslint-plugin-tsdoc": "^0.4.0",
|
"eslint-plugin-tsdoc": "^0.4.0",
|
||||||
"eslint-plugin-unicorn": "^59.0.0",
|
"eslint-plugin-unicorn": "^59.0.1",
|
||||||
"express": "^5.1.0",
|
"express": "^5.1.0",
|
||||||
"globals": "^16.0.0",
|
"globals": "^16.0.0",
|
||||||
"globby": "^14.0.2",
|
"globby": "^14.0.2",
|
||||||
"husky": "^9.1.7",
|
"husky": "^9.1.7",
|
||||||
"jest": "^29.7.0",
|
"jest": "^30.0.4",
|
||||||
"jison": "^0.4.18",
|
"jison": "^0.4.18",
|
||||||
"js-yaml": "^4.1.0",
|
"js-yaml": "^4.1.0",
|
||||||
"jsdom": "^26.0.0",
|
"jsdom": "^26.1.0",
|
||||||
"langium-cli": "3.3.0",
|
"langium-cli": "3.3.0",
|
||||||
"lint-staged": "^15.2.11",
|
"lint-staged": "^16.1.2",
|
||||||
"markdown-table": "^3.0.4",
|
"markdown-table": "^3.0.4",
|
||||||
"nyc": "^17.1.0",
|
"nyc": "^17.1.0",
|
||||||
"path-browserify": "^1.0.1",
|
"path-browserify": "^1.0.1",
|
||||||
"prettier": "^3.5.2",
|
"prettier": "^3.5.2",
|
||||||
"prettier-plugin-jsdoc": "^1.3.2",
|
"prettier-plugin-jsdoc": "^1.3.2",
|
||||||
"rimraf": "^6.0.1",
|
"rimraf": "^6.0.1",
|
||||||
"rollup-plugin-visualizer": "^5.14.0",
|
"rollup-plugin-visualizer": "^6.0.3",
|
||||||
"start-server-and-test": "^2.0.10",
|
"start-server-and-test": "^2.0.10",
|
||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"tsx": "^4.7.3",
|
"tsx": "^4.7.3",
|
||||||
"typescript": "~5.7.3",
|
"typescript": "~5.7.3",
|
||||||
"typescript-eslint": "^8.32.0",
|
"typescript-eslint": "^8.38.0",
|
||||||
"vite": "^6.1.1",
|
"vite": "^7.0.3",
|
||||||
"vite-plugin-istanbul": "^7.0.0",
|
"vite-plugin-istanbul": "^7.0.0",
|
||||||
"vitest": "^3.0.6"
|
"vitest": "^3.0.6"
|
||||||
},
|
},
|
||||||
@@ -139,8 +139,13 @@
|
|||||||
"roughjs": "patches/roughjs.patch"
|
"roughjs": "patches/roughjs.patch"
|
||||||
},
|
},
|
||||||
"onlyBuiltDependencies": [
|
"onlyBuiltDependencies": [
|
||||||
|
"canvas",
|
||||||
"cypress",
|
"cypress",
|
||||||
"esbuild"
|
"esbuild"
|
||||||
|
],
|
||||||
|
"ignoredBuiltDependencies": [
|
||||||
|
"sharp",
|
||||||
|
"vue-demi"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
14
packages/examples/CHANGELOG.md
Normal file
14
packages/examples/CHANGELOG.md
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
# @mermaid-js/examples
|
||||||
|
|
||||||
|
## 1.0.0
|
||||||
|
|
||||||
|
### Minor Changes
|
||||||
|
|
||||||
|
- [#6453](https://github.com/mermaid-js/mermaid/pull/6453) [`4936ef5`](https://github.com/mermaid-js/mermaid/commit/4936ef5c306d2f892cca9a95a5deac4af6d4882b) Thanks [@sidharthv96](https://github.com/sidharthv96)! - feat: Add examples for diagrams in the `@mermaid-js/examples` package
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- [#6510](https://github.com/mermaid-js/mermaid/pull/6510) [`7a38eb7`](https://github.com/mermaid-js/mermaid/commit/7a38eb715d795cd5c66cb59357d64ec197b432e6) Thanks [@sidharthv96](https://github.com/sidharthv96)! - chore: Move packet diagram out of beta
|
||||||
|
|
||||||
|
- Updated dependencies [[`5acbd7e`](https://github.com/mermaid-js/mermaid/commit/5acbd7e762469d9d89a9c77faf6617ee13367f3a), [`d90634b`](https://github.com/mermaid-js/mermaid/commit/d90634bf2b09e586b055729e07e9a1a31b21827c), [`7a38eb7`](https://github.com/mermaid-js/mermaid/commit/7a38eb715d795cd5c66cb59357d64ec197b432e6), [`3e3ae08`](https://github.com/mermaid-js/mermaid/commit/3e3ae089305e1c7b9948b9e149eba6854fe7f2d6), [`d3e2be3`](https://github.com/mermaid-js/mermaid/commit/d3e2be35be066adeb7fd502b4a24c223c3b53947), [`637680d`](https://github.com/mermaid-js/mermaid/commit/637680d4d9e39b4f8cb6f05b4cb261e8f5693ac3)]:
|
||||||
|
- mermaid@11.9.0
|
41
packages/examples/README.md
Normal file
41
packages/examples/README.md
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
# @mermaid-js/examples
|
||||||
|
|
||||||
|
The `@mermaid-js/examples` package contains a collection of examples used by tools like [mermaid.live](https://mermaid.live) to help users get started with new diagrams.
|
||||||
|
|
||||||
|
You can duplicate an existing diagram example file, e.g., `packages/examples/src/examples/flowchart.ts`, and modify it with details specific to your diagram.
|
||||||
|
|
||||||
|
Then, import the example in the `packages/examples/src/index.ts` file and add it to the `examples` array.
|
||||||
|
|
||||||
|
Each diagram should have at least one example, which should be marked as the default. It's a good idea to add more examples to showcase different features of the diagram.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm add @mermaid-js/examples
|
||||||
|
```
|
||||||
|
|
||||||
|
A sample usage of the package in mermaid.live, to get the default example for every diagram type:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
import { diagramData } from '@mermaid-js/examples';
|
||||||
|
|
||||||
|
type DiagramDefinition = (typeof diagramData)[number];
|
||||||
|
|
||||||
|
const isValidDiagram = (diagram: DiagramDefinition): diagram is Required<DiagramDefinition> => {
|
||||||
|
return Boolean(diagram.name && diagram.examples && diagram.examples.length > 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getSampleDiagrams = () => {
|
||||||
|
const diagrams = diagramData
|
||||||
|
.filter((d) => isValidDiagram(d))
|
||||||
|
.map(({ examples, ...rest }) => ({
|
||||||
|
...rest,
|
||||||
|
example: examples?.filter(({ isDefault }) => isDefault)[0],
|
||||||
|
}));
|
||||||
|
const examples: Record<string, string> = {};
|
||||||
|
for (const diagram of diagrams) {
|
||||||
|
examples[diagram.name.replace(/ (Diagram|Chart|Graph)/, '')] = diagram.example.code;
|
||||||
|
}
|
||||||
|
return examples;
|
||||||
|
};
|
||||||
|
```
|
36
packages/examples/package.json
Normal file
36
packages/examples/package.json
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
{
|
||||||
|
"name": "@mermaid-js/examples",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Mermaid examples package",
|
||||||
|
"author": "Sidharth Vinod",
|
||||||
|
"type": "module",
|
||||||
|
"module": "./dist/mermaid-examples.core.mjs",
|
||||||
|
"types": "./dist/mermaid.d.ts",
|
||||||
|
"exports": {
|
||||||
|
".": {
|
||||||
|
"types": "./dist/index.d.ts",
|
||||||
|
"import": "./dist/mermaid-examples.core.mjs",
|
||||||
|
"default": "./dist/mermaid-examples.core.mjs"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"dist"
|
||||||
|
],
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/mermaid-js/mermaid"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"clean": "rimraf dist"
|
||||||
|
},
|
||||||
|
"dependencies": {},
|
||||||
|
"devDependencies": {
|
||||||
|
"mermaid": "workspace:*"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"mermaid": "workspace:~"
|
||||||
|
},
|
||||||
|
"publishConfig": {
|
||||||
|
"access": "public"
|
||||||
|
}
|
||||||
|
}
|
34
packages/examples/src/example.spec.ts
Normal file
34
packages/examples/src/example.spec.ts
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
import mermaid from 'mermaid';
|
||||||
|
import { diagramData } from './index.js';
|
||||||
|
|
||||||
|
describe('examples', () => {
|
||||||
|
beforeAll(async () => {
|
||||||
|
// To trigger the diagram registration
|
||||||
|
await mermaid.registerExternalDiagrams([]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should have examples for each diagrams', () => {
|
||||||
|
const skippedDiagrams = [
|
||||||
|
// These diagrams have no examples
|
||||||
|
'error',
|
||||||
|
'info',
|
||||||
|
'---',
|
||||||
|
// These diagrams have v2 versions, with examples
|
||||||
|
'class',
|
||||||
|
'graph',
|
||||||
|
'flowchart-elk',
|
||||||
|
'flowchart',
|
||||||
|
'state',
|
||||||
|
];
|
||||||
|
const diagrams = mermaid
|
||||||
|
.getRegisteredDiagramsMetadata()
|
||||||
|
.filter((d) => !skippedDiagrams.includes(d.id));
|
||||||
|
expect(diagrams.length).toBeGreaterThan(0);
|
||||||
|
for (const diagram of diagrams) {
|
||||||
|
const data = diagramData.find((d) => d.id === diagram.id)!;
|
||||||
|
expect(data, `Example for ${diagram.id} is not defined`).toBeDefined();
|
||||||
|
expect(data.examples.length).toBeGreaterThan(0);
|
||||||
|
expect(data.examples.filter((e) => e.isDefault).length).toBe(1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
24
packages/examples/src/examples/architecture.ts
Normal file
24
packages/examples/src/examples/architecture.ts
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
import type { DiagramMetadata } from '../types.js';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
id: 'architecture',
|
||||||
|
name: 'Architecture Diagram',
|
||||||
|
description: 'Visualize system architecture and components',
|
||||||
|
examples: [
|
||||||
|
{
|
||||||
|
title: 'Basic System Architecture',
|
||||||
|
isDefault: true,
|
||||||
|
code: `architecture-beta
|
||||||
|
group api(cloud)[API]
|
||||||
|
|
||||||
|
service db(database)[Database] in api
|
||||||
|
service disk1(disk)[Storage] in api
|
||||||
|
service disk2(disk)[Storage] in api
|
||||||
|
service server(server)[Server] in api
|
||||||
|
|
||||||
|
db:L -- R:server
|
||||||
|
disk1:T -- B:server
|
||||||
|
disk2:T -- B:db`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
} satisfies DiagramMetadata;
|
27
packages/examples/src/examples/block.ts
Normal file
27
packages/examples/src/examples/block.ts
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
import type { DiagramMetadata } from '../types.js';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
id: 'block',
|
||||||
|
name: 'Block Diagram',
|
||||||
|
description: 'Create block-based visualizations with beta styling',
|
||||||
|
examples: [
|
||||||
|
{
|
||||||
|
title: 'Basic Block Layout',
|
||||||
|
isDefault: true,
|
||||||
|
code: `block-beta
|
||||||
|
columns 1
|
||||||
|
db(("DB"))
|
||||||
|
blockArrowId6<[" "]>(down)
|
||||||
|
block:ID
|
||||||
|
A
|
||||||
|
B["A wide one in the middle"]
|
||||||
|
C
|
||||||
|
end
|
||||||
|
space
|
||||||
|
D
|
||||||
|
ID --> D
|
||||||
|
C --> D
|
||||||
|
style B fill:#969,stroke:#333,stroke-width:4px`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
} satisfies DiagramMetadata;
|
47
packages/examples/src/examples/c4.ts
Normal file
47
packages/examples/src/examples/c4.ts
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
import type { DiagramMetadata } from '../types.js';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
id: 'c4',
|
||||||
|
name: 'C4 Diagram',
|
||||||
|
description:
|
||||||
|
'Visualize software architecture using the C4 model (Context, Container, Component, Code)',
|
||||||
|
examples: [
|
||||||
|
{
|
||||||
|
title: 'Internet Banking System Context',
|
||||||
|
isDefault: true,
|
||||||
|
code: `C4Context
|
||||||
|
title System Context diagram for Internet Banking System
|
||||||
|
Enterprise_Boundary(b0, "BankBoundary0") {
|
||||||
|
Person(customerA, "Banking Customer A", "A customer of the bank, with personal bank accounts.")
|
||||||
|
Person(customerB, "Banking Customer B")
|
||||||
|
Person_Ext(customerC, "Banking Customer C", "desc")
|
||||||
|
|
||||||
|
Person(customerD, "Banking Customer D", "A customer of the bank, <br/> with personal bank accounts.")
|
||||||
|
|
||||||
|
System(SystemAA, "Internet Banking System", "Allows customers to view information about their bank accounts, and make payments.")
|
||||||
|
|
||||||
|
Enterprise_Boundary(b1, "BankBoundary") {
|
||||||
|
SystemDb_Ext(SystemE, "Mainframe Banking System", "Stores all of the core banking information about customers, accounts, transactions, etc.")
|
||||||
|
|
||||||
|
System_Boundary(b2, "BankBoundary2") {
|
||||||
|
System(SystemA, "Banking System A")
|
||||||
|
System(SystemB, "Banking System B", "A system of the bank, with personal bank accounts. next line.")
|
||||||
|
}
|
||||||
|
|
||||||
|
System_Ext(SystemC, "E-mail system", "The internal Microsoft Exchange e-mail system.")
|
||||||
|
SystemDb(SystemD, "Banking System D Database", "A system of the bank, with personal bank accounts.")
|
||||||
|
|
||||||
|
Boundary(b3, "BankBoundary3", "boundary") {
|
||||||
|
SystemQueue(SystemF, "Banking System F Queue", "A system of the bank.")
|
||||||
|
SystemQueue_Ext(SystemG, "Banking System G Queue", "A system of the bank, with personal bank accounts.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BiRel(customerA, SystemAA, "Uses")
|
||||||
|
BiRel(SystemAA, SystemE, "Uses")
|
||||||
|
Rel(SystemAA, SystemC, "Sends e-mails", "SMTP")
|
||||||
|
Rel(SystemC, customerA, "Sends e-mails to")`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
} satisfies DiagramMetadata;
|
34
packages/examples/src/examples/class.ts
Normal file
34
packages/examples/src/examples/class.ts
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
import type { DiagramMetadata } from '../types.js';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
id: 'classDiagram',
|
||||||
|
name: 'Class Diagram',
|
||||||
|
description: 'Visualize class structures and relationships in object-oriented programming',
|
||||||
|
examples: [
|
||||||
|
{
|
||||||
|
title: 'Basic Class Inheritance',
|
||||||
|
isDefault: true,
|
||||||
|
code: `classDiagram
|
||||||
|
Animal <|-- Duck
|
||||||
|
Animal <|-- Fish
|
||||||
|
Animal <|-- Zebra
|
||||||
|
Animal : +int age
|
||||||
|
Animal : +String gender
|
||||||
|
Animal: +isMammal()
|
||||||
|
Animal: +mate()
|
||||||
|
class Duck{
|
||||||
|
+String beakColor
|
||||||
|
+swim()
|
||||||
|
+quack()
|
||||||
|
}
|
||||||
|
class Fish{
|
||||||
|
-int sizeInFeet
|
||||||
|
-canEat()
|
||||||
|
}
|
||||||
|
class Zebra{
|
||||||
|
+bool is_wild
|
||||||
|
+run()
|
||||||
|
}`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
} satisfies DiagramMetadata;
|
36
packages/examples/src/examples/er.ts
Normal file
36
packages/examples/src/examples/er.ts
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
import type { DiagramMetadata } from '../types.js';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
id: 'er',
|
||||||
|
name: 'Entity Relationship Diagram',
|
||||||
|
description: 'Visualize database schemas and relationships between entities',
|
||||||
|
examples: [
|
||||||
|
{
|
||||||
|
title: 'Basic ER Schema',
|
||||||
|
isDefault: true,
|
||||||
|
code: `erDiagram
|
||||||
|
CUSTOMER ||--o{ ORDER : places
|
||||||
|
ORDER ||--|{ ORDER_ITEM : contains
|
||||||
|
PRODUCT ||--o{ ORDER_ITEM : includes
|
||||||
|
CUSTOMER {
|
||||||
|
string id
|
||||||
|
string name
|
||||||
|
string email
|
||||||
|
}
|
||||||
|
ORDER {
|
||||||
|
string id
|
||||||
|
date orderDate
|
||||||
|
string status
|
||||||
|
}
|
||||||
|
PRODUCT {
|
||||||
|
string id
|
||||||
|
string name
|
||||||
|
float price
|
||||||
|
}
|
||||||
|
ORDER_ITEM {
|
||||||
|
int quantity
|
||||||
|
float price
|
||||||
|
}`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
} satisfies DiagramMetadata;
|
19
packages/examples/src/examples/flowchart.ts
Normal file
19
packages/examples/src/examples/flowchart.ts
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import type { DiagramMetadata } from '../types.js';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
id: 'flowchart-v2',
|
||||||
|
name: 'Flowchart',
|
||||||
|
description: 'Visualize flowcharts and directed graphs',
|
||||||
|
examples: [
|
||||||
|
{
|
||||||
|
title: 'Basic Flowchart',
|
||||||
|
isDefault: true,
|
||||||
|
code: `flowchart TD
|
||||||
|
A[Christmas] -->|Get money| B(Go shopping)
|
||||||
|
B --> C{Let me think}
|
||||||
|
C -->|One| D[Laptop]
|
||||||
|
C -->|Two| E[iPhone]
|
||||||
|
C -->|Three| F[fa:fa-car Car]`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
} satisfies DiagramMetadata;
|
22
packages/examples/src/examples/gantt.ts
Normal file
22
packages/examples/src/examples/gantt.ts
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
import type { DiagramMetadata } from '../types.js';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
id: 'gantt',
|
||||||
|
name: 'Gantt Chart',
|
||||||
|
description: 'Visualize project schedules and timelines',
|
||||||
|
examples: [
|
||||||
|
{
|
||||||
|
title: 'Basic Project Timeline',
|
||||||
|
isDefault: true,
|
||||||
|
code: `gantt
|
||||||
|
title A Gantt Diagram
|
||||||
|
dateFormat YYYY-MM-DD
|
||||||
|
section Section
|
||||||
|
A task :a1, 2014-01-01, 30d
|
||||||
|
Another task :after a1 , 20d
|
||||||
|
section Another
|
||||||
|
Task in sec :2014-01-12 , 12d
|
||||||
|
another task : 24d`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
} satisfies DiagramMetadata;
|
28
packages/examples/src/examples/git.ts
Normal file
28
packages/examples/src/examples/git.ts
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
import type { DiagramMetadata } from '../types.js';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
id: 'gitGraph',
|
||||||
|
name: 'Git Graph',
|
||||||
|
description: 'Visualize Git repository history and branch relationships',
|
||||||
|
examples: [
|
||||||
|
{
|
||||||
|
title: 'Basic Git Flow',
|
||||||
|
isDefault: true,
|
||||||
|
code: `gitGraph
|
||||||
|
commit
|
||||||
|
branch develop
|
||||||
|
checkout develop
|
||||||
|
commit
|
||||||
|
commit
|
||||||
|
checkout main
|
||||||
|
merge develop
|
||||||
|
commit
|
||||||
|
branch feature
|
||||||
|
checkout feature
|
||||||
|
commit
|
||||||
|
commit
|
||||||
|
checkout main
|
||||||
|
merge feature`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
} satisfies DiagramMetadata;
|
37
packages/examples/src/examples/kanban.ts
Normal file
37
packages/examples/src/examples/kanban.ts
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
import type { DiagramMetadata } from '../types.js';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
id: 'kanban',
|
||||||
|
name: 'Kanban Diagram',
|
||||||
|
description: 'Visualize work items in a Kanban board',
|
||||||
|
examples: [
|
||||||
|
{
|
||||||
|
title: 'Kanban Diagram',
|
||||||
|
isDefault: true,
|
||||||
|
code: `---
|
||||||
|
config:
|
||||||
|
kanban:
|
||||||
|
ticketBaseUrl: 'https://github.com/mermaid-js/mermaid/issues/#TICKET#'
|
||||||
|
---
|
||||||
|
kanban
|
||||||
|
Todo
|
||||||
|
[Create Documentation]
|
||||||
|
docs[Create Blog about the new diagram]
|
||||||
|
[In progress]
|
||||||
|
id6[Create renderer so that it works in all cases. We also add some extra text here for testing purposes. And some more just for the extra flare.]
|
||||||
|
id9[Ready for deploy]
|
||||||
|
id8[Design grammar]@{ assigned: 'knsv' }
|
||||||
|
id10[Ready for test]
|
||||||
|
id4[Create parsing tests]@{ ticket: 2038, assigned: 'K.Sveidqvist', priority: 'High' }
|
||||||
|
id66[last item]@{ priority: 'Very Low', assigned: 'knsv' }
|
||||||
|
id11[Done]
|
||||||
|
id5[define getData]
|
||||||
|
id2[Title of diagram is more than 100 chars when user duplicates diagram with 100 char]@{ ticket: 2036, priority: 'Very High'}
|
||||||
|
id3[Update DB function]@{ ticket: 2037, assigned: knsv, priority: 'High' }
|
||||||
|
|
||||||
|
id12[Can't reproduce]
|
||||||
|
id3[Weird flickering in Firefox]
|
||||||
|
`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
} satisfies DiagramMetadata;
|
32
packages/examples/src/examples/mindmap.ts
Normal file
32
packages/examples/src/examples/mindmap.ts
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
import type { DiagramMetadata } from '../types.js';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
id: 'mindmap',
|
||||||
|
name: 'Mindmap',
|
||||||
|
description: 'Visualize ideas and concepts in a tree-like structure',
|
||||||
|
examples: [
|
||||||
|
{
|
||||||
|
title: 'Basic Mindmap',
|
||||||
|
isDefault: true,
|
||||||
|
code: `mindmap
|
||||||
|
root((mindmap))
|
||||||
|
Origins
|
||||||
|
Long history
|
||||||
|
::icon(fa fa-book)
|
||||||
|
Popularisation
|
||||||
|
British popular psychology author Tony Buzan
|
||||||
|
Research
|
||||||
|
On effectiveness<br/>and features
|
||||||
|
On Automatic creation
|
||||||
|
Uses
|
||||||
|
Creative techniques
|
||||||
|
Strategic planning
|
||||||
|
Argument mapping
|
||||||
|
Tools
|
||||||
|
Pen and paper
|
||||||
|
Mermaid`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
} satisfies DiagramMetadata;
|
||||||
|
|
||||||
|
// cspell:ignore Buzan
|
34
packages/examples/src/examples/packet.ts
Normal file
34
packages/examples/src/examples/packet.ts
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
import type { DiagramMetadata } from '../types.js';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
id: 'packet',
|
||||||
|
name: 'Packet Diagram',
|
||||||
|
description: 'Visualize packet data and network traffic',
|
||||||
|
examples: [
|
||||||
|
{
|
||||||
|
title: 'TCP Packet',
|
||||||
|
isDefault: true,
|
||||||
|
code: `---
|
||||||
|
title: "TCP Packet"
|
||||||
|
---
|
||||||
|
packet
|
||||||
|
0-15: "Source Port"
|
||||||
|
16-31: "Destination Port"
|
||||||
|
32-63: "Sequence Number"
|
||||||
|
64-95: "Acknowledgment Number"
|
||||||
|
96-99: "Data Offset"
|
||||||
|
100-105: "Reserved"
|
||||||
|
106: "URG"
|
||||||
|
107: "ACK"
|
||||||
|
108: "PSH"
|
||||||
|
109: "RST"
|
||||||
|
110: "SYN"
|
||||||
|
111: "FIN"
|
||||||
|
112-127: "Window"
|
||||||
|
128-143: "Checksum"
|
||||||
|
144-159: "Urgent Pointer"
|
||||||
|
160-191: "(Options and Padding)"
|
||||||
|
192-255: "Data (variable length)"`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
} satisfies DiagramMetadata;
|
17
packages/examples/src/examples/pie.ts
Normal file
17
packages/examples/src/examples/pie.ts
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
import type { DiagramMetadata } from '../types.js';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
id: 'pie',
|
||||||
|
name: 'Pie Chart',
|
||||||
|
description: 'Visualize data as proportional segments of a circle',
|
||||||
|
examples: [
|
||||||
|
{
|
||||||
|
title: 'Basic Pie Chart',
|
||||||
|
isDefault: true,
|
||||||
|
code: `pie title Pets adopted by volunteers
|
||||||
|
"Dogs" : 386
|
||||||
|
"Cats" : 85
|
||||||
|
"Rats" : 15`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
} satisfies DiagramMetadata;
|
27
packages/examples/src/examples/quadrant-chart.ts
Normal file
27
packages/examples/src/examples/quadrant-chart.ts
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
import type { DiagramMetadata } from '../types.js';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
id: 'quadrantChart',
|
||||||
|
name: 'Quadrant Chart',
|
||||||
|
description: 'Visualize items in a 2x2 matrix based on two variables',
|
||||||
|
examples: [
|
||||||
|
{
|
||||||
|
title: 'Product Positioning',
|
||||||
|
isDefault: true,
|
||||||
|
code: `quadrantChart
|
||||||
|
title Reach and engagement of campaigns
|
||||||
|
x-axis Low Reach --> High Reach
|
||||||
|
y-axis Low Engagement --> High Engagement
|
||||||
|
quadrant-1 We should expand
|
||||||
|
quadrant-2 Need to promote
|
||||||
|
quadrant-3 Re-evaluate
|
||||||
|
quadrant-4 May be improved
|
||||||
|
Campaign A: [0.3, 0.6]
|
||||||
|
Campaign B: [0.45, 0.23]
|
||||||
|
Campaign C: [0.57, 0.69]
|
||||||
|
Campaign D: [0.78, 0.34]
|
||||||
|
Campaign E: [0.40, 0.34]
|
||||||
|
Campaign F: [0.35, 0.78]`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
} satisfies DiagramMetadata;
|
25
packages/examples/src/examples/radar.ts
Normal file
25
packages/examples/src/examples/radar.ts
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
import type { DiagramMetadata } from '../types.js';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
id: 'radar',
|
||||||
|
name: 'Radar Diagram',
|
||||||
|
description: 'Visualize data in a radial format',
|
||||||
|
examples: [
|
||||||
|
{
|
||||||
|
title: 'Student Grades',
|
||||||
|
isDefault: true,
|
||||||
|
code: `---
|
||||||
|
title: "Grades"
|
||||||
|
---
|
||||||
|
radar-beta
|
||||||
|
axis m["Math"], s["Science"], e["English"]
|
||||||
|
axis h["History"], g["Geography"], a["Art"]
|
||||||
|
curve a["Alice"]{85, 90, 80, 70, 75, 90}
|
||||||
|
curve b["Bob"]{70, 75, 85, 80, 90, 85}
|
||||||
|
|
||||||
|
max 100
|
||||||
|
min 0
|
||||||
|
`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
} satisfies DiagramMetadata;
|
27
packages/examples/src/examples/requirement.ts
Normal file
27
packages/examples/src/examples/requirement.ts
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
import type { DiagramMetadata } from '../types.js';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
id: 'requirement',
|
||||||
|
name: 'Requirement Diagram',
|
||||||
|
description: 'Visualize system requirements and their relationships',
|
||||||
|
examples: [
|
||||||
|
{
|
||||||
|
title: 'Basic Requirements',
|
||||||
|
code: `requirementDiagram
|
||||||
|
|
||||||
|
requirement test_req {
|
||||||
|
id: 1
|
||||||
|
text: the test text.
|
||||||
|
risk: high
|
||||||
|
verifymethod: test
|
||||||
|
}
|
||||||
|
|
||||||
|
element test_entity {
|
||||||
|
type: simulation
|
||||||
|
}
|
||||||
|
|
||||||
|
test_entity - satisfies -> test_req`,
|
||||||
|
isDefault: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
} satisfies DiagramMetadata;
|
88
packages/examples/src/examples/sankey.ts
Normal file
88
packages/examples/src/examples/sankey.ts
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
import type { DiagramMetadata } from '../types.js';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
id: 'sankey',
|
||||||
|
name: 'Sankey Diagram',
|
||||||
|
description: 'Visualize flow quantities between different stages or processes',
|
||||||
|
examples: [
|
||||||
|
{
|
||||||
|
title: 'Energy Flow',
|
||||||
|
isDefault: true,
|
||||||
|
code: `---
|
||||||
|
config:
|
||||||
|
sankey:
|
||||||
|
showValues: false
|
||||||
|
---
|
||||||
|
sankey-beta
|
||||||
|
|
||||||
|
Agricultural 'waste',Bio-conversion,124.729
|
||||||
|
Bio-conversion,Liquid,0.597
|
||||||
|
Bio-conversion,Losses,26.862
|
||||||
|
Bio-conversion,Solid,280.322
|
||||||
|
Bio-conversion,Gas,81.144
|
||||||
|
Biofuel imports,Liquid,35
|
||||||
|
Biomass imports,Solid,35
|
||||||
|
Coal imports,Coal,11.606
|
||||||
|
Coal reserves,Coal,63.965
|
||||||
|
Coal,Solid,75.571
|
||||||
|
District heating,Industry,10.639
|
||||||
|
District heating,Heating and cooling - commercial,22.505
|
||||||
|
District heating,Heating and cooling - homes,46.184
|
||||||
|
Electricity grid,Over generation / exports,104.453
|
||||||
|
Electricity grid,Heating and cooling - homes,113.726
|
||||||
|
Electricity grid,H2 conversion,27.14
|
||||||
|
Electricity grid,Industry,342.165
|
||||||
|
Electricity grid,Road transport,37.797
|
||||||
|
Electricity grid,Agriculture,4.412
|
||||||
|
Electricity grid,Heating and cooling - commercial,40.858
|
||||||
|
Electricity grid,Losses,56.691
|
||||||
|
Electricity grid,Rail transport,7.863
|
||||||
|
Electricity grid,Lighting & appliances - commercial,90.008
|
||||||
|
Electricity grid,Lighting & appliances - homes,93.494
|
||||||
|
Gas imports,NGas,40.719
|
||||||
|
Gas reserves,NGas,82.233
|
||||||
|
Gas,Heating and cooling - commercial,0.129
|
||||||
|
Gas,Losses,1.401
|
||||||
|
Gas,Thermal generation,151.891
|
||||||
|
Gas,Agriculture,2.096
|
||||||
|
Gas,Industry,48.58
|
||||||
|
Geothermal,Electricity grid,7.013
|
||||||
|
H2 conversion,H2,20.897
|
||||||
|
H2 conversion,Losses,6.242
|
||||||
|
H2,Road transport,20.897
|
||||||
|
Hydro,Electricity grid,6.995
|
||||||
|
Liquid,Industry,121.066
|
||||||
|
Liquid,International shipping,128.69
|
||||||
|
Liquid,Road transport,135.835
|
||||||
|
Liquid,Domestic aviation,14.458
|
||||||
|
Liquid,International aviation,206.267
|
||||||
|
Liquid,Agriculture,3.64
|
||||||
|
Liquid,National navigation,33.218
|
||||||
|
Liquid,Rail transport,4.413
|
||||||
|
Marine algae,Bio-conversion,4.375
|
||||||
|
NGas,Gas,122.952
|
||||||
|
Nuclear,Thermal generation,839.978
|
||||||
|
Oil imports,Oil,504.287
|
||||||
|
Oil reserves,Oil,107.703
|
||||||
|
Oil,Liquid,611.99
|
||||||
|
Other waste,Solid,56.587
|
||||||
|
Other waste,Bio-conversion,77.81
|
||||||
|
Pumped heat,Heating and cooling - homes,193.026
|
||||||
|
Pumped heat,Heating and cooling - commercial,70.672
|
||||||
|
Solar PV,Electricity grid,59.901
|
||||||
|
Solar Thermal,Heating and cooling - homes,19.263
|
||||||
|
Solar,Solar Thermal,19.263
|
||||||
|
Solar,Solar PV,59.901
|
||||||
|
Solid,Agriculture,0.882
|
||||||
|
Solid,Thermal generation,400.12
|
||||||
|
Solid,Industry,46.477
|
||||||
|
Thermal generation,Electricity grid,525.531
|
||||||
|
Thermal generation,Losses,787.129
|
||||||
|
Thermal generation,District heating,79.329
|
||||||
|
Tidal,Electricity grid,9.452
|
||||||
|
UK land based bioenergy,Bio-conversion,182.01
|
||||||
|
Wave,Electricity grid,19.013
|
||||||
|
Wind,Electricity grid,289.366`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
} satisfies DiagramMetadata;
|
18
packages/examples/src/examples/sequence.ts
Normal file
18
packages/examples/src/examples/sequence.ts
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
import type { DiagramMetadata } from '../types.js';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
id: 'sequence',
|
||||||
|
name: 'Sequence Diagram',
|
||||||
|
description: 'Visualize interactions between objects over time',
|
||||||
|
examples: [
|
||||||
|
{
|
||||||
|
title: 'Basic Sequence',
|
||||||
|
isDefault: true,
|
||||||
|
code: `sequenceDiagram
|
||||||
|
Alice->>+John: Hello John, how are you?
|
||||||
|
Alice->>+John: John, can you hear me?
|
||||||
|
John-->>-Alice: Hi Alice, I can hear you!
|
||||||
|
John-->>-Alice: I feel great!`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
} satisfies DiagramMetadata;
|
20
packages/examples/src/examples/state.ts
Normal file
20
packages/examples/src/examples/state.ts
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
import type { DiagramMetadata } from '../types.js';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
id: 'stateDiagram',
|
||||||
|
name: 'State Diagram',
|
||||||
|
description: 'Visualize the states and transitions of a system',
|
||||||
|
examples: [
|
||||||
|
{
|
||||||
|
title: 'Basic State Diagram',
|
||||||
|
code: `stateDiagram-v2
|
||||||
|
[*] --> Still
|
||||||
|
Still --> [*]
|
||||||
|
Still --> Moving
|
||||||
|
Moving --> Still
|
||||||
|
Moving --> Crash
|
||||||
|
Crash --> [*]`,
|
||||||
|
isDefault: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
} satisfies DiagramMetadata;
|
20
packages/examples/src/examples/timeline.ts
Normal file
20
packages/examples/src/examples/timeline.ts
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
import type { DiagramMetadata } from '../types.js';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
id: 'timeline',
|
||||||
|
name: 'Timeline Diagram',
|
||||||
|
description: 'Visualize events and milestones in chronological order',
|
||||||
|
examples: [
|
||||||
|
{
|
||||||
|
title: 'Project Timeline',
|
||||||
|
isDefault: true,
|
||||||
|
code: `timeline
|
||||||
|
title History of Social Media Platform
|
||||||
|
2002 : LinkedIn
|
||||||
|
2004 : Facebook
|
||||||
|
: Google
|
||||||
|
2005 : YouTube
|
||||||
|
2006 : Twitter`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
} satisfies DiagramMetadata;
|
21
packages/examples/src/examples/treemap.ts
Normal file
21
packages/examples/src/examples/treemap.ts
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
import type { DiagramMetadata } from '../types.js';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
id: 'treemap',
|
||||||
|
name: 'Treemap',
|
||||||
|
description: 'Visualize hierarchical data as nested rectangles',
|
||||||
|
examples: [
|
||||||
|
{
|
||||||
|
title: 'Treemap',
|
||||||
|
isDefault: true,
|
||||||
|
code: `treemap-beta
|
||||||
|
"Section 1"
|
||||||
|
"Leaf 1.1": 12
|
||||||
|
"Section 1.2"
|
||||||
|
"Leaf 1.2.1": 12
|
||||||
|
"Section 2"
|
||||||
|
"Leaf 2.1": 20
|
||||||
|
"Leaf 2.2": 25`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
} satisfies DiagramMetadata;
|
22
packages/examples/src/examples/user-journey.ts
Normal file
22
packages/examples/src/examples/user-journey.ts
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
import type { DiagramMetadata } from '../types.js';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
id: 'journey',
|
||||||
|
name: 'User Journey Diagram',
|
||||||
|
description: 'Visualize user interactions and experiences with a system',
|
||||||
|
examples: [
|
||||||
|
{
|
||||||
|
title: 'My Working Day',
|
||||||
|
isDefault: true,
|
||||||
|
code: `journey
|
||||||
|
title My working day
|
||||||
|
section Go to work
|
||||||
|
Make tea: 5: Me
|
||||||
|
Go upstairs: 3: Me
|
||||||
|
Do work: 1: Me, Cat
|
||||||
|
section Go home
|
||||||
|
Go downstairs: 5: Me
|
||||||
|
Sit down: 5: Me`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
} satisfies DiagramMetadata;
|
19
packages/examples/src/examples/xychart.ts
Normal file
19
packages/examples/src/examples/xychart.ts
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import type { DiagramMetadata } from '../types.js';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
id: 'xychart',
|
||||||
|
name: 'XY Chart',
|
||||||
|
description: 'Create scatter plots and line charts with customizable axes',
|
||||||
|
examples: [
|
||||||
|
{
|
||||||
|
title: 'Sales Revenue',
|
||||||
|
isDefault: true,
|
||||||
|
code: `xychart-beta
|
||||||
|
title "Sales Revenue"
|
||||||
|
x-axis [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec]
|
||||||
|
y-axis "Revenue (in $)" 4000 --> 11000
|
||||||
|
bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
|
||||||
|
line [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
} satisfies DiagramMetadata;
|
48
packages/examples/src/index.ts
Normal file
48
packages/examples/src/index.ts
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
import type { DiagramMetadata } from './types.js';
|
||||||
|
import flowChart from './examples/flowchart.js';
|
||||||
|
import c4 from './examples/c4.js';
|
||||||
|
import kanban from './examples/kanban.js';
|
||||||
|
import classDiagram from './examples/class.js';
|
||||||
|
import sequenceDiagram from './examples/sequence.js';
|
||||||
|
import pieDiagram from './examples/pie.js';
|
||||||
|
import userJourneyDiagram from './examples/user-journey.js';
|
||||||
|
import mindmapDiagram from './examples/mindmap.js';
|
||||||
|
import requirementDiagram from './examples/requirement.js';
|
||||||
|
import radarDiagram from './examples/radar.js';
|
||||||
|
import stateDiagram from './examples/state.js';
|
||||||
|
import erDiagram from './examples/er.js';
|
||||||
|
import gitDiagram from './examples/git.js';
|
||||||
|
import architectureDiagram from './examples/architecture.js';
|
||||||
|
import xychartDiagram from './examples/xychart.js';
|
||||||
|
import sankeyDiagram from './examples/sankey.js';
|
||||||
|
import ganttDiagram from './examples/gantt.js';
|
||||||
|
import timelineDiagram from './examples/timeline.js';
|
||||||
|
import quadrantChart from './examples/quadrant-chart.js';
|
||||||
|
import packetDiagram from './examples/packet.js';
|
||||||
|
import blockDiagram from './examples/block.js';
|
||||||
|
import treemapDiagram from './examples/treemap.js';
|
||||||
|
|
||||||
|
export const diagramData: DiagramMetadata[] = [
|
||||||
|
flowChart,
|
||||||
|
c4,
|
||||||
|
kanban,
|
||||||
|
classDiagram,
|
||||||
|
sequenceDiagram,
|
||||||
|
pieDiagram,
|
||||||
|
userJourneyDiagram,
|
||||||
|
mindmapDiagram,
|
||||||
|
requirementDiagram,
|
||||||
|
radarDiagram,
|
||||||
|
stateDiagram,
|
||||||
|
erDiagram,
|
||||||
|
gitDiagram,
|
||||||
|
architectureDiagram,
|
||||||
|
xychartDiagram,
|
||||||
|
sankeyDiagram,
|
||||||
|
ganttDiagram,
|
||||||
|
timelineDiagram,
|
||||||
|
quadrantChart,
|
||||||
|
packetDiagram,
|
||||||
|
blockDiagram,
|
||||||
|
treemapDiagram,
|
||||||
|
];
|
12
packages/examples/src/types.ts
Normal file
12
packages/examples/src/types.ts
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
export interface Example {
|
||||||
|
title: string;
|
||||||
|
code: string;
|
||||||
|
isDefault?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface DiagramMetadata {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
description: string;
|
||||||
|
examples: Example[];
|
||||||
|
}
|
11
packages/examples/tsconfig.json
Normal file
11
packages/examples/tsconfig.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"extends": "../../tsconfig.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"outDir": "./dist",
|
||||||
|
"rootDir": "./src",
|
||||||
|
"module": "Node16",
|
||||||
|
"moduleResolution": "Node16"
|
||||||
|
},
|
||||||
|
"include": ["src/**/*"],
|
||||||
|
"exclude": ["node_modules", "dist"]
|
||||||
|
}
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
This package provides a layout engine for Mermaid based on the [ELK](https://www.eclipse.org/elk/) layout engine.
|
This package provides a layout engine for Mermaid based on the [ELK](https://www.eclipse.org/elk/) layout engine.
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> The ELK Layout engine will not be available in all providers that support mermaid by default.
|
> The ELK Layout engine will not be available in all providers that support mermaid by default.
|
||||||
> The websites will have to install the `@mermaid-js/layout-elk` package to use the ELK layout engine.
|
> The websites will have to install the `@mermaid-js/layout-elk` package to use the ELK layout engine.
|
||||||
|
|
||||||
@@ -69,4 +69,4 @@ mermaid.registerLayoutLoaders(elkLayouts);
|
|||||||
- `elk.mrtree`: Multi-root tree layout
|
- `elk.mrtree`: Multi-root tree layout
|
||||||
- `elk.sporeOverlap`: Spore overlap layout
|
- `elk.sporeOverlap`: Spore overlap layout
|
||||||
|
|
||||||
<!-- TODO: Add images for these layouts, as GitHub doesn't support natively -->
|
<!-- TODO: Add images for these layouts, as GitHub doesn't support natively. -->
|
||||||
|
9
packages/mermaid-layout-elk/src/find-common-ancestor.d.ts
vendored
Normal file
9
packages/mermaid-layout-elk/src/find-common-ancestor.d.ts
vendored
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
export interface TreeData {
|
||||||
|
parentById: Record<string, string>;
|
||||||
|
childrenById: Record<string, string[]>;
|
||||||
|
}
|
||||||
|
export declare const findCommonAncestor: (
|
||||||
|
id1: string,
|
||||||
|
id2: string,
|
||||||
|
{ parentById }: TreeData
|
||||||
|
) => string;
|
19
packages/mermaid-layout-elk/src/render.d.ts
vendored
Normal file
19
packages/mermaid-layout-elk/src/render.d.ts
vendored
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import type { InternalHelpers, LayoutData, RenderOptions, SVG } from 'mermaid';
|
||||||
|
export declare const render: (
|
||||||
|
data4Layout: LayoutData,
|
||||||
|
svg: SVG,
|
||||||
|
{
|
||||||
|
common,
|
||||||
|
getConfig,
|
||||||
|
insertCluster,
|
||||||
|
insertEdge,
|
||||||
|
insertEdgeLabel,
|
||||||
|
insertMarkers,
|
||||||
|
insertNode,
|
||||||
|
interpolateToCurve,
|
||||||
|
labelHelper,
|
||||||
|
log,
|
||||||
|
positionEdgeLabel,
|
||||||
|
}: InternalHelpers,
|
||||||
|
{ algorithm }: RenderOptions
|
||||||
|
) => Promise<void>;
|
@@ -1,10 +1,23 @@
|
|||||||
|
import type {
|
||||||
|
InternalHelpers,
|
||||||
|
LayoutData,
|
||||||
|
RenderOptions,
|
||||||
|
SVG,
|
||||||
|
SVGGroup,
|
||||||
|
} from '@mermaid-chart/mermaid';
|
||||||
|
// @ts-ignore TODO: Investigate D3 issue
|
||||||
import { curveLinear } from 'd3';
|
import { curveLinear } from 'd3';
|
||||||
import ELK from 'elkjs/lib/elk.bundled.js';
|
import ELK from 'elkjs/lib/elk.bundled.js';
|
||||||
import type { InternalHelpers, LayoutData, RenderOptions, SVG, SVGGroup } from 'mermaid';
|
|
||||||
import { type TreeData, findCommonAncestor } from './find-common-ancestor.js';
|
import { type TreeData, findCommonAncestor } from './find-common-ancestor.js';
|
||||||
|
|
||||||
type Node = LayoutData['nodes'][number];
|
type Node = LayoutData['nodes'][number];
|
||||||
|
|
||||||
|
// Minimal structural type to avoid depending on d3 Selection typings
|
||||||
|
interface D3Selection<T extends Element> {
|
||||||
|
node(): T | null;
|
||||||
|
attr(name: string, value: string): D3Selection<T>;
|
||||||
|
}
|
||||||
|
|
||||||
interface LabelData {
|
interface LabelData {
|
||||||
width: number;
|
width: number;
|
||||||
height: number;
|
height: number;
|
||||||
@@ -13,9 +26,9 @@ interface LabelData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface NodeWithVertex extends Omit<Node, 'domId'> {
|
interface NodeWithVertex extends Omit<Node, 'domId'> {
|
||||||
children?: unknown[];
|
children?: LayoutData['nodes'];
|
||||||
labelData?: LabelData;
|
labelData?: LabelData;
|
||||||
domId?: Node['domId'] | SVGGroup | d3.Selection<SVGAElement, unknown, Element | null, unknown>;
|
domId?: D3Selection<SVGAElement | SVGGElement>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const render = async (
|
export const render = async (
|
||||||
@@ -51,14 +64,13 @@ export const render = async (
|
|||||||
|
|
||||||
// Add the element to the DOM
|
// Add the element to the DOM
|
||||||
if (!node.isGroup) {
|
if (!node.isGroup) {
|
||||||
const child: NodeWithVertex = {
|
const child = node as NodeWithVertex;
|
||||||
...node,
|
|
||||||
};
|
|
||||||
graph.children.push(child);
|
graph.children.push(child);
|
||||||
nodeDb[node.id] = child;
|
nodeDb[node.id] = node;
|
||||||
|
|
||||||
const childNodeEl = await insertNode(nodeEl, node, { config, dir: node.dir });
|
const childNodeEl = await insertNode(nodeEl, node, { config, dir: node.dir });
|
||||||
const boundingBox = childNodeEl.node()!.getBBox();
|
const boundingBox = childNodeEl.node()!.getBBox();
|
||||||
|
// Store the domId separately for rendering, not in the ELK graph
|
||||||
child.domId = childNodeEl;
|
child.domId = childNodeEl;
|
||||||
child.width = boundingBox.width;
|
child.width = boundingBox.width;
|
||||||
child.height = boundingBox.height;
|
child.height = boundingBox.height;
|
||||||
@@ -68,7 +80,9 @@ export const render = async (
|
|||||||
...node,
|
...node,
|
||||||
children: [],
|
children: [],
|
||||||
};
|
};
|
||||||
|
// Let elk render with the copy
|
||||||
graph.children.push(child);
|
graph.children.push(child);
|
||||||
|
// Save the original containing the intersection function
|
||||||
nodeDb[node.id] = child;
|
nodeDb[node.id] = child;
|
||||||
await addVertices(nodeEl, nodeArr, child, node.id);
|
await addVertices(nodeEl, nodeArr, child, node.id);
|
||||||
|
|
||||||
@@ -143,7 +157,7 @@ export const render = async (
|
|||||||
height: node.height,
|
height: node.height,
|
||||||
};
|
};
|
||||||
if (node.isGroup) {
|
if (node.isGroup) {
|
||||||
log.debug('id abc88 subgraph = ', node.id, node.x, node.y, node.labelData);
|
log.debug('Id abc88 subgraph = ', node.id, node.x, node.y, node.labelData);
|
||||||
const subgraphEl = subgraphsEl.insert('g').attr('class', 'subgraph');
|
const subgraphEl = subgraphsEl.insert('g').attr('class', 'subgraph');
|
||||||
// TODO use faster way of cloning
|
// TODO use faster way of cloning
|
||||||
const clusterNode = JSON.parse(JSON.stringify(node));
|
const clusterNode = JSON.parse(JSON.stringify(node));
|
||||||
@@ -152,10 +166,10 @@ export const render = async (
|
|||||||
clusterNode.width = Math.max(clusterNode.width, node.labelData.width);
|
clusterNode.width = Math.max(clusterNode.width, node.labelData.width);
|
||||||
await insertCluster(subgraphEl, clusterNode);
|
await insertCluster(subgraphEl, clusterNode);
|
||||||
|
|
||||||
log.debug('id (UIO)= ', node.id, node.width, node.shape, node.labels);
|
log.debug('Id (UIO)= ', node.id, node.width, node.shape, node.labels);
|
||||||
} else {
|
} else {
|
||||||
log.info(
|
log.info(
|
||||||
'id NODE = ',
|
'Id NODE = ',
|
||||||
node.id,
|
node.id,
|
||||||
node.x,
|
node.x,
|
||||||
node.y,
|
node.y,
|
||||||
@@ -197,25 +211,19 @@ export const render = async (
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
subgraphs.forEach(function (subgraph: { id: string | number }) {
|
|
||||||
const data: any = { id: subgraph.id };
|
|
||||||
if (parentLookupDb.parentById[subgraph.id] !== undefined) {
|
|
||||||
data.parent = parentLookupDb.parentById[subgraph.id];
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return parentLookupDb;
|
return parentLookupDb;
|
||||||
};
|
};
|
||||||
|
|
||||||
const getEdgeStartEndPoint = (edge: any) => {
|
const getEdgeStartEndPoint = (edge: any) => {
|
||||||
const source: any = edge.start;
|
// edge.start and edge.end are IDs (string/number) in our layout data
|
||||||
const target: any = edge.end;
|
const sourceId: string | number = edge.start;
|
||||||
|
const targetId: string | number = edge.end;
|
||||||
|
|
||||||
// Save the original source and target
|
const source = sourceId;
|
||||||
const sourceId = source;
|
const target = targetId;
|
||||||
const targetId = target;
|
|
||||||
|
|
||||||
const startNode = nodeDb[edge.start.id];
|
const startNode = nodeDb[sourceId];
|
||||||
const endNode = nodeDb[edge.end.id];
|
const endNode = nodeDb[targetId];
|
||||||
|
|
||||||
if (!startNode || !endNode) {
|
if (!startNode || !endNode) {
|
||||||
return { source, target };
|
return { source, target };
|
||||||
@@ -259,7 +267,6 @@ export const render = async (
|
|||||||
const edges = dataForLayout.edges;
|
const edges = dataForLayout.edges;
|
||||||
const labelsEl = svg.insert('g').attr('class', 'edgeLabels');
|
const labelsEl = svg.insert('g').attr('class', 'edgeLabels');
|
||||||
const linkIdCnt: any = {};
|
const linkIdCnt: any = {};
|
||||||
const dir = dataForLayout.direction || 'DOWN';
|
|
||||||
let defaultStyle: string | undefined;
|
let defaultStyle: string | undefined;
|
||||||
let defaultLabelStyle: string | undefined;
|
let defaultLabelStyle: string | undefined;
|
||||||
|
|
||||||
@@ -289,7 +296,7 @@ export const render = async (
|
|||||||
linkIdCnt[linkIdBase]++;
|
linkIdCnt[linkIdBase]++;
|
||||||
log.info('abc78 new entry', linkIdBase, linkIdCnt[linkIdBase]);
|
log.info('abc78 new entry', linkIdBase, linkIdCnt[linkIdBase]);
|
||||||
}
|
}
|
||||||
const linkId = linkIdBase + '_' + linkIdCnt[linkIdBase];
|
const linkId = linkIdBase; // + '_' + linkIdCnt[linkIdBase];
|
||||||
edge.id = linkId;
|
edge.id = linkId;
|
||||||
log.info('abc78 new link id to be used is', linkIdBase, linkId, linkIdCnt[linkIdBase]);
|
log.info('abc78 new link id to be used is', linkIdBase, linkId, linkIdCnt[linkIdBase]);
|
||||||
const linkNameStart = 'LS_' + edge.start;
|
const linkNameStart = 'LS_' + edge.start;
|
||||||
@@ -358,8 +365,8 @@ export const render = async (
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
edgeData.style = edgeData.style += style;
|
edgeData.style += style;
|
||||||
edgeData.labelStyle = edgeData.labelStyle += labelStyle;
|
edgeData.labelStyle += labelStyle;
|
||||||
|
|
||||||
const conf = getConfig();
|
const conf = getConfig();
|
||||||
if (edge.interpolate !== undefined) {
|
if (edge.interpolate !== undefined) {
|
||||||
@@ -396,13 +403,11 @@ export const render = async (
|
|||||||
|
|
||||||
// calculate start and end points of the edge, note that the source and target
|
// calculate start and end points of the edge, note that the source and target
|
||||||
// can be modified for shapes that have ports
|
// can be modified for shapes that have ports
|
||||||
// @ts-ignore TODO: fix this
|
|
||||||
const { source, target, sourceId, targetId } = getEdgeStartEndPoint(edge, dir);
|
const { source, target, sourceId, targetId } = getEdgeStartEndPoint(edge);
|
||||||
log.debug('abc78 source and target', source, target);
|
log.debug('abc78 source and target', source, target);
|
||||||
// Add the edge to the graph
|
// Add the edge to the graph
|
||||||
graph.edges.push({
|
graph.edges.push({
|
||||||
// @ts-ignore TODO: fix this
|
|
||||||
id: 'e' + edge.start + edge.end,
|
|
||||||
...edge,
|
...edge,
|
||||||
sources: [source],
|
sources: [source],
|
||||||
targets: [target],
|
targets: [target],
|
||||||
@@ -436,6 +441,7 @@ export const render = async (
|
|||||||
case 'RL':
|
case 'RL':
|
||||||
return 'LEFT';
|
return 'LEFT';
|
||||||
case 'TB':
|
case 'TB':
|
||||||
|
case 'TD': // TD is an alias for TB in Mermaid
|
||||||
return 'DOWN';
|
return 'DOWN';
|
||||||
case 'BT':
|
case 'BT':
|
||||||
return 'UP';
|
return 'UP';
|
||||||
@@ -459,155 +465,6 @@ export const render = async (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function intersectLine(
|
|
||||||
p1: { y: number; x: number },
|
|
||||||
p2: { y: number; x: number },
|
|
||||||
q1: { x: any; y: any },
|
|
||||||
q2: { x: any; y: any }
|
|
||||||
) {
|
|
||||||
log.debug('UIO intersectLine', p1, p2, q1, q2);
|
|
||||||
// Algorithm from J. Avro, (ed.) Graphics Gems, No 2, Morgan Kaufmann, 1994,
|
|
||||||
// p7 and p473.
|
|
||||||
|
|
||||||
// let a1, a2, b1, b2, c1, c2;
|
|
||||||
// let r1, r2, r3, r4;
|
|
||||||
// let denom, offset, num;
|
|
||||||
// let x, y;
|
|
||||||
|
|
||||||
// Compute a1, b1, c1, where line joining points 1 and 2 is F(x,y) = a1 x +
|
|
||||||
// b1 y + c1 = 0.
|
|
||||||
const a1 = p2.y - p1.y;
|
|
||||||
const b1 = p1.x - p2.x;
|
|
||||||
const c1 = p2.x * p1.y - p1.x * p2.y;
|
|
||||||
|
|
||||||
// Compute r3 and r4.
|
|
||||||
const r3 = a1 * q1.x + b1 * q1.y + c1;
|
|
||||||
const r4 = a1 * q2.x + b1 * q2.y + c1;
|
|
||||||
|
|
||||||
const epsilon = 1e-6;
|
|
||||||
|
|
||||||
// Check signs of r3 and r4. If both point 3 and point 4 lie on
|
|
||||||
// same side of line 1, the line segments do not intersect.
|
|
||||||
if (r3 !== 0 && r4 !== 0 && sameSign(r3, r4)) {
|
|
||||||
return /*DON'T_INTERSECT*/;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compute a2, b2, c2 where line joining points 3 and 4 is G(x,y) = a2 x + b2 y + c2 = 0
|
|
||||||
const a2 = q2.y - q1.y;
|
|
||||||
const b2 = q1.x - q2.x;
|
|
||||||
const c2 = q2.x * q1.y - q1.x * q2.y;
|
|
||||||
|
|
||||||
// Compute r1 and r2
|
|
||||||
const r1 = a2 * p1.x + b2 * p1.y + c2;
|
|
||||||
const r2 = a2 * p2.x + b2 * p2.y + c2;
|
|
||||||
|
|
||||||
// Check signs of r1 and r2. If both point 1 and point 2 lie
|
|
||||||
// on same side of second line segment, the line segments do
|
|
||||||
// not intersect.
|
|
||||||
if (Math.abs(r1) < epsilon && Math.abs(r2) < epsilon && sameSign(r1, r2)) {
|
|
||||||
return /*DON'T_INTERSECT*/;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Line segments intersect: compute intersection point.
|
|
||||||
const denom = a1 * b2 - a2 * b1;
|
|
||||||
if (denom === 0) {
|
|
||||||
return /*COLLINEAR*/;
|
|
||||||
}
|
|
||||||
|
|
||||||
const offset = Math.abs(denom / 2);
|
|
||||||
|
|
||||||
// The denom/2 is to get rounding instead of truncating. It
|
|
||||||
// is added or subtracted to the numerator, depending upon the
|
|
||||||
// sign of the numerator.
|
|
||||||
let num = b1 * c2 - b2 * c1;
|
|
||||||
const x = num < 0 ? (num - offset) / denom : (num + offset) / denom;
|
|
||||||
|
|
||||||
num = a2 * c1 - a1 * c2;
|
|
||||||
const y = num < 0 ? (num - offset) / denom : (num + offset) / denom;
|
|
||||||
|
|
||||||
return { x: x, y: y };
|
|
||||||
}
|
|
||||||
|
|
||||||
function sameSign(r1: number, r2: number) {
|
|
||||||
return r1 * r2 > 0;
|
|
||||||
}
|
|
||||||
const diamondIntersection = (
|
|
||||||
bounds: { x: any; y: any; width: any; height: any },
|
|
||||||
outsidePoint: { x: number; y: number },
|
|
||||||
insidePoint: any
|
|
||||||
) => {
|
|
||||||
const x1 = bounds.x;
|
|
||||||
const y1 = bounds.y;
|
|
||||||
|
|
||||||
const w = bounds.width; //+ bounds.padding;
|
|
||||||
const h = bounds.height; // + bounds.padding;
|
|
||||||
|
|
||||||
const polyPoints = [
|
|
||||||
{ x: x1, y: y1 - h / 2 },
|
|
||||||
{ x: x1 + w / 2, y: y1 },
|
|
||||||
{ x: x1, y: y1 + h / 2 },
|
|
||||||
{ x: x1 - w / 2, y: y1 },
|
|
||||||
];
|
|
||||||
log.debug(
|
|
||||||
`APA16 diamondIntersection calc abc89:
|
|
||||||
outsidePoint: ${JSON.stringify(outsidePoint)}
|
|
||||||
insidePoint : ${JSON.stringify(insidePoint)}
|
|
||||||
node-bounds : x:${bounds.x} y:${bounds.y} w:${bounds.width} h:${bounds.height}`,
|
|
||||||
JSON.stringify(polyPoints)
|
|
||||||
);
|
|
||||||
|
|
||||||
const intersections = [];
|
|
||||||
|
|
||||||
let minX = Number.POSITIVE_INFINITY;
|
|
||||||
let minY = Number.POSITIVE_INFINITY;
|
|
||||||
|
|
||||||
polyPoints.forEach(function (entry) {
|
|
||||||
minX = Math.min(minX, entry.x);
|
|
||||||
minY = Math.min(minY, entry.y);
|
|
||||||
});
|
|
||||||
|
|
||||||
const left = x1 - w / 2 - minX;
|
|
||||||
const top = y1 - h / 2 - minY;
|
|
||||||
|
|
||||||
for (let i = 0; i < polyPoints.length; i++) {
|
|
||||||
const p1 = polyPoints[i];
|
|
||||||
const p2 = polyPoints[i < polyPoints.length - 1 ? i + 1 : 0];
|
|
||||||
const intersect = intersectLine(
|
|
||||||
bounds,
|
|
||||||
outsidePoint,
|
|
||||||
{ x: left + p1.x, y: top + p1.y },
|
|
||||||
{ x: left + p2.x, y: top + p2.y }
|
|
||||||
);
|
|
||||||
|
|
||||||
if (intersect) {
|
|
||||||
intersections.push(intersect);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!intersections.length) {
|
|
||||||
return bounds;
|
|
||||||
}
|
|
||||||
|
|
||||||
log.debug('UIO intersections', intersections);
|
|
||||||
|
|
||||||
if (intersections.length > 1) {
|
|
||||||
// More intersections, find the one nearest to edge end point
|
|
||||||
intersections.sort(function (p, q) {
|
|
||||||
const pdx = p.x - outsidePoint.x;
|
|
||||||
const pdy = p.y - outsidePoint.y;
|
|
||||||
const distp = Math.sqrt(pdx * pdx + pdy * pdy);
|
|
||||||
|
|
||||||
const qdx = q.x - outsidePoint.x;
|
|
||||||
const qdy = q.y - outsidePoint.y;
|
|
||||||
const distq = Math.sqrt(qdx * qdx + qdy * qdy);
|
|
||||||
|
|
||||||
return distp < distq ? -1 : distp === distq ? 0 : 1;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return intersections[0];
|
|
||||||
};
|
|
||||||
|
|
||||||
const intersection = (
|
const intersection = (
|
||||||
node: { x: any; y: any; width: number; height: number },
|
node: { x: any; y: any; width: number; height: number },
|
||||||
outsidePoint: { x: number; y: number },
|
outsidePoint: { x: number; y: number },
|
||||||
@@ -653,7 +510,7 @@ export const render = async (
|
|||||||
|
|
||||||
return res;
|
return res;
|
||||||
} else {
|
} else {
|
||||||
// Intersection on sides of rect
|
// Intersection onn sides of rect
|
||||||
if (insidePoint.x < outsidePoint.x) {
|
if (insidePoint.x < outsidePoint.x) {
|
||||||
r = outsidePoint.x - w - x;
|
r = outsidePoint.x - w - x;
|
||||||
} else {
|
} else {
|
||||||
@@ -696,62 +553,298 @@ export const render = async (
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
/**
|
|
||||||
* This function will page a path and node where the last point(s) in the path is inside the node
|
|
||||||
* and return an update path ending by the border of the node.
|
|
||||||
*/
|
|
||||||
const cutPathAtIntersect = (
|
|
||||||
_points: any[],
|
|
||||||
bounds: { x: any; y: any; width: any; height: any; padding: any },
|
|
||||||
isDiamond: boolean
|
|
||||||
) => {
|
|
||||||
log.debug('APA18 cutPathAtIntersect Points:', _points, 'node:', bounds, 'isDiamond', isDiamond);
|
|
||||||
const points: any[] = [];
|
|
||||||
let lastPointOutside = _points[0];
|
|
||||||
let isInside = false;
|
|
||||||
_points.forEach((point: any) => {
|
|
||||||
// check if point is inside the boundary rect
|
|
||||||
if (!outsideNode(bounds, point) && !isInside) {
|
|
||||||
// First point inside the rect found
|
|
||||||
// Calc the intersection coord between the point and the last point outside the rect
|
|
||||||
let inter;
|
|
||||||
|
|
||||||
if (isDiamond) {
|
const cutter2 = (startNode: any, endNode: any, _points: any[]) => {
|
||||||
const inter2 = diamondIntersection(bounds, lastPointOutside, point);
|
const startBounds = {
|
||||||
const distance = Math.sqrt(
|
x: startNode.offset.posX + startNode.width / 2,
|
||||||
(lastPointOutside.x - inter2.x) ** 2 + (lastPointOutside.y - inter2.y) ** 2
|
y: startNode.offset.posY + startNode.height / 2,
|
||||||
);
|
width: startNode.width,
|
||||||
if (distance > 1) {
|
height: startNode.height,
|
||||||
inter = inter2;
|
padding: startNode.padding,
|
||||||
}
|
};
|
||||||
}
|
const endBounds = {
|
||||||
if (!inter) {
|
x: endNode.offset.posX + endNode.width / 2,
|
||||||
inter = intersection(bounds, lastPointOutside, point);
|
y: endNode.offset.posY + endNode.height / 2,
|
||||||
}
|
width: endNode.width,
|
||||||
|
height: endNode.height,
|
||||||
|
padding: endNode.padding,
|
||||||
|
};
|
||||||
|
|
||||||
// Check case where the intersection is the same as the last point
|
if (_points.length === 0) {
|
||||||
let pointPresent = false;
|
return [];
|
||||||
points.forEach((p) => {
|
}
|
||||||
pointPresent = pointPresent || (p.x === inter.x && p.y === inter.y);
|
|
||||||
});
|
// Copy the original points array
|
||||||
// if (!pointPresent) {
|
const points = [..._points];
|
||||||
if (!points.some((e) => e.x === inter.x && e.y === inter.y)) {
|
|
||||||
points.push(inter);
|
// The first point is the center of sNode, the last point is the center of eNode
|
||||||
} else {
|
const startCenter = points[0];
|
||||||
log.debug('abc88 no intersect', inter, points);
|
const endCenter = points[points.length - 1];
|
||||||
}
|
|
||||||
// points.push(inter);
|
log.debug('UIO cutter2: startCenter:', startCenter);
|
||||||
isInside = true;
|
log.debug('UIO cutter2: endCenter:', endCenter);
|
||||||
} else {
|
|
||||||
// Outside
|
let firstOutsideStartIndex = -1;
|
||||||
log.debug('abc88 outside', point, lastPointOutside, points);
|
let lastOutsideEndIndex = -1;
|
||||||
lastPointOutside = point;
|
|
||||||
// points.push(point);
|
// Single iteration through the array
|
||||||
if (!isInside) {
|
for (const [i, point] of points.entries()) {
|
||||||
points.push(point);
|
// Check if this is the first point outside the start node
|
||||||
|
if (firstOutsideStartIndex === -1 && outsideNode(startBounds, point)) {
|
||||||
|
firstOutsideStartIndex = i;
|
||||||
|
log.debug('UIO cutter2: First point outside start node at index', i, point);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if this point is outside the end node (keep updating to find the last one)
|
||||||
|
if (outsideNode(endBounds, point)) {
|
||||||
|
lastOutsideEndIndex = i;
|
||||||
|
log.debug('UIO cutter2: Point outside end node at index', i, point);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log.debug(
|
||||||
|
'UIO cutter2: firstOutsideStartIndex:',
|
||||||
|
firstOutsideStartIndex,
|
||||||
|
'lastOutsideEndIndex:',
|
||||||
|
lastOutsideEndIndex
|
||||||
|
);
|
||||||
|
log.debug('UIO cutter2: startBounds:', startBounds);
|
||||||
|
log.debug('UIO cutter2: endBounds:', endBounds);
|
||||||
|
log.debug('UIO cutter2: original points:', _points);
|
||||||
|
|
||||||
|
// Calculate intersection with start node if we found a point outside it
|
||||||
|
if (firstOutsideStartIndex !== -1) {
|
||||||
|
const outsidePoint = points[firstOutsideStartIndex];
|
||||||
|
let startIntersection;
|
||||||
|
|
||||||
|
// Try using the node's intersect method first
|
||||||
|
if (startNode.intersect) {
|
||||||
|
startIntersection = startNode.intersect(outsidePoint);
|
||||||
|
|
||||||
|
// Check if the intersection is valid (distance > 1)
|
||||||
|
const distance = Math.sqrt(
|
||||||
|
(startCenter.x - startIntersection.x) ** 2 + (startCenter.y - startIntersection.y) ** 2
|
||||||
|
);
|
||||||
|
if (distance <= 1) {
|
||||||
|
startIntersection = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
// Fallback to intersection function
|
||||||
|
if (!startIntersection) {
|
||||||
|
startIntersection = intersection(startBounds, startCenter, outsidePoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Replace the first point with the intersection
|
||||||
|
if (startIntersection) {
|
||||||
|
// Check if the intersection is the same as any existing point
|
||||||
|
const isDuplicate = points.some(
|
||||||
|
(p, index) =>
|
||||||
|
index > 0 &&
|
||||||
|
Math.abs(p.x - startIntersection.x) < 0.1 &&
|
||||||
|
Math.abs(p.y - startIntersection.y) < 0.1
|
||||||
|
);
|
||||||
|
|
||||||
|
if (isDuplicate) {
|
||||||
|
log.debug(
|
||||||
|
'UIO cutter2: Start intersection is duplicate of existing point, removing first point instead'
|
||||||
|
);
|
||||||
|
points.shift(); // Remove the first point instead of replacing it
|
||||||
|
} else {
|
||||||
|
log.debug(
|
||||||
|
'UIO cutter2: Replacing first point',
|
||||||
|
points[0],
|
||||||
|
'with intersection',
|
||||||
|
startIntersection
|
||||||
|
);
|
||||||
|
points[0] = startIntersection;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate intersection with end node
|
||||||
|
// Need to recalculate indices since we may have removed the first point
|
||||||
|
let outsidePointForEnd = null;
|
||||||
|
let outsideIndexForEnd = -1;
|
||||||
|
|
||||||
|
// Find the last point that's outside the end node in the current points array
|
||||||
|
for (let i = points.length - 1; i >= 0; i--) {
|
||||||
|
if (outsideNode(endBounds, points[i])) {
|
||||||
|
outsidePointForEnd = points[i];
|
||||||
|
outsideIndexForEnd = i;
|
||||||
|
log.debug('UIO cutter2: Found point outside end node at current index:', i, points[i]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!outsidePointForEnd && points.length > 1) {
|
||||||
|
// No points outside end node, try using the second-to-last point
|
||||||
|
log.debug('UIO cutter2: No points outside end node, trying second-to-last point');
|
||||||
|
outsidePointForEnd = points[points.length - 2];
|
||||||
|
outsideIndexForEnd = points.length - 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (outsidePointForEnd) {
|
||||||
|
// Check if the outside point is actually on the boundary (distance = 0 from intersection)
|
||||||
|
// If so, we need to create a truly outside point
|
||||||
|
let actualOutsidePoint = outsidePointForEnd;
|
||||||
|
|
||||||
|
// Quick check: if the point is very close to the node boundary, move it further out
|
||||||
|
const dx = Math.abs(outsidePointForEnd.x - endBounds.x);
|
||||||
|
const dy = Math.abs(outsidePointForEnd.y - endBounds.y);
|
||||||
|
const w = endBounds.width / 2;
|
||||||
|
const h = endBounds.height / 2;
|
||||||
|
|
||||||
|
log.debug('UIO cutter2: Checking if outside point is truly outside:', {
|
||||||
|
outsidePoint: outsidePointForEnd,
|
||||||
|
dx,
|
||||||
|
dy,
|
||||||
|
w,
|
||||||
|
h,
|
||||||
|
isOnBoundary: Math.abs(dx - w) < 1 || Math.abs(dy - h) < 1,
|
||||||
|
});
|
||||||
|
|
||||||
|
// If the point is on or very close to the boundary, move it further out
|
||||||
|
if (Math.abs(dx - w) < 1 || Math.abs(dy - h) < 1) {
|
||||||
|
log.debug('UIO cutter2: Outside point is on boundary, creating truly outside point');
|
||||||
|
// Move the point further away from the node center
|
||||||
|
const directionX = outsidePointForEnd.x - endBounds.x;
|
||||||
|
const directionY = outsidePointForEnd.y - endBounds.y;
|
||||||
|
const length = Math.sqrt(directionX * directionX + directionY * directionY);
|
||||||
|
|
||||||
|
if (length > 0) {
|
||||||
|
// Move the point 10 pixels further out in the same direction
|
||||||
|
actualOutsidePoint = {
|
||||||
|
x: endBounds.x + (directionX / length) * (length + 10),
|
||||||
|
y: endBounds.y + (directionY / length) * (length + 10),
|
||||||
|
};
|
||||||
|
log.debug('UIO cutter2: Created truly outside point:', actualOutsidePoint);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let endIntersection;
|
||||||
|
|
||||||
|
// Try using the node's intersect method first
|
||||||
|
if (endNode.intersect) {
|
||||||
|
endIntersection = endNode.intersect(actualOutsidePoint);
|
||||||
|
log.debug('UIO cutter2: endNode.intersect result:', endIntersection);
|
||||||
|
|
||||||
|
// Check if the intersection is on the wrong side of the node
|
||||||
|
const isWrongSide =
|
||||||
|
(actualOutsidePoint.x < endBounds.x && endIntersection.x > endBounds.x) ||
|
||||||
|
(actualOutsidePoint.x > endBounds.x && endIntersection.x < endBounds.x);
|
||||||
|
|
||||||
|
if (isWrongSide) {
|
||||||
|
log.debug('UIO cutter2: endNode.intersect returned wrong side, setting to null');
|
||||||
|
endIntersection = null;
|
||||||
|
} else {
|
||||||
|
// Check if the intersection is valid (distance > 1)
|
||||||
|
const distance = Math.sqrt(
|
||||||
|
(actualOutsidePoint.x - endIntersection.x) ** 2 +
|
||||||
|
(actualOutsidePoint.y - endIntersection.y) ** 2
|
||||||
|
);
|
||||||
|
log.debug('UIO cutter2: Distance from outside point to intersection:', distance);
|
||||||
|
if (distance <= 1) {
|
||||||
|
log.debug('UIO cutter2: endNode.intersect distance too small, setting to null');
|
||||||
|
endIntersection = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.debug('UIO cutter2: endNode.intersect method not available');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fallback to intersection function
|
||||||
|
if (!endIntersection) {
|
||||||
|
// Create a proper inside point that's on the correct side of the node
|
||||||
|
// The inside point should be between the outside point and the far edge
|
||||||
|
const insidePoint = {
|
||||||
|
x:
|
||||||
|
actualOutsidePoint.x < endBounds.x
|
||||||
|
? endBounds.x - endBounds.width / 4
|
||||||
|
: endBounds.x + endBounds.width / 4,
|
||||||
|
y: endCenter.y,
|
||||||
|
};
|
||||||
|
|
||||||
|
log.debug('UIO cutter2: Using fallback intersection function with:', {
|
||||||
|
endBounds,
|
||||||
|
actualOutsidePoint,
|
||||||
|
insidePoint,
|
||||||
|
endCenter,
|
||||||
|
});
|
||||||
|
endIntersection = intersection(endBounds, actualOutsidePoint, insidePoint);
|
||||||
|
log.debug('UIO cutter2: Fallback intersection result:', endIntersection);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Replace the last point with the intersection
|
||||||
|
if (endIntersection) {
|
||||||
|
// Check if the intersection is the same as any existing point
|
||||||
|
const isDuplicate = points.some(
|
||||||
|
(p, index) =>
|
||||||
|
index < points.length - 1 &&
|
||||||
|
Math.abs(p.x - endIntersection.x) < 0.1 &&
|
||||||
|
Math.abs(p.y - endIntersection.y) < 0.1
|
||||||
|
);
|
||||||
|
|
||||||
|
if (isDuplicate) {
|
||||||
|
log.debug(
|
||||||
|
'UIO cutter2: End intersection is duplicate of existing point, removing last point instead'
|
||||||
|
);
|
||||||
|
points.pop(); // Remove the last point instead of replacing it
|
||||||
|
} else {
|
||||||
|
log.debug(
|
||||||
|
'UIO cutter2: Replacing last point',
|
||||||
|
points[points.length - 1],
|
||||||
|
'with intersection',
|
||||||
|
endIntersection,
|
||||||
|
'using outside point at index',
|
||||||
|
outsideIndexForEnd
|
||||||
|
);
|
||||||
|
points[points.length - 1] = endIntersection;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.debug('UIO cutter2: No suitable outside point found for end node intersection');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Final cleanup: Check if the last point is too close to the previous point
|
||||||
|
if (points.length > 1) {
|
||||||
|
const lastPoint = points[points.length - 1];
|
||||||
|
const secondLastPoint = points[points.length - 2];
|
||||||
|
const distance = Math.sqrt(
|
||||||
|
(lastPoint.x - secondLastPoint.x) ** 2 + (lastPoint.y - secondLastPoint.y) ** 2
|
||||||
|
);
|
||||||
|
|
||||||
|
// If the distance is very small (less than 2 pixels), remove the last point
|
||||||
|
if (distance < 2) {
|
||||||
|
log.debug(
|
||||||
|
'UIO cutter2: Last point too close to previous point, removing it. Distance:',
|
||||||
|
distance
|
||||||
|
);
|
||||||
|
log.debug('UIO cutter2: Removing last point:', lastPoint, 'keeping:', secondLastPoint);
|
||||||
|
points.pop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log.debug('UIO cutter2: Final points:', points);
|
||||||
|
|
||||||
|
// Debug: Check which side of the end node we're ending at
|
||||||
|
if (points.length > 0) {
|
||||||
|
const finalPoint = points[points.length - 1];
|
||||||
|
const endNodeCenter = endBounds.x;
|
||||||
|
const endNodeLeftEdge = endNodeCenter - endBounds.width / 2;
|
||||||
|
const endNodeRightEdge = endNodeCenter + endBounds.width / 2;
|
||||||
|
|
||||||
|
log.debug('UIO cutter2: End node analysis:', {
|
||||||
|
finalPoint,
|
||||||
|
endNodeCenter,
|
||||||
|
endNodeLeftEdge,
|
||||||
|
endNodeRightEdge,
|
||||||
|
endingSide: finalPoint.x < endNodeCenter ? 'LEFT' : 'RIGHT',
|
||||||
|
distanceFromLeftEdge: Math.abs(finalPoint.x - endNodeLeftEdge),
|
||||||
|
distanceFromRightEdge: Math.abs(finalPoint.x - endNodeRightEdge),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
return points;
|
return points;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -766,14 +859,15 @@ export const render = async (
|
|||||||
id: 'root',
|
id: 'root',
|
||||||
layoutOptions: {
|
layoutOptions: {
|
||||||
'elk.hierarchyHandling': 'INCLUDE_CHILDREN',
|
'elk.hierarchyHandling': 'INCLUDE_CHILDREN',
|
||||||
'elk.layered.crossingMinimization.forceNodeModelOrder': true,
|
|
||||||
'elk.algorithm': algorithm,
|
'elk.algorithm': algorithm,
|
||||||
'nodePlacement.strategy': data4Layout.config.elk?.nodePlacementStrategy,
|
'nodePlacement.strategy': data4Layout.config.elk?.nodePlacementStrategy,
|
||||||
'elk.layered.mergeEdges': data4Layout.config.elk?.mergeEdges,
|
'elk.layered.mergeEdges': data4Layout.config.elk?.mergeEdges,
|
||||||
'elk.direction': 'DOWN',
|
'elk.direction': 'DOWN',
|
||||||
'spacing.baseValue': 35,
|
'spacing.baseValue': 25,
|
||||||
'elk.layered.unnecessaryBendpoints': true,
|
// 'elk.layered.unnecessaryBendpoints': true,
|
||||||
'elk.layered.cycleBreaking.strategy': data4Layout.config.elk?.cycleBreakingStrategy,
|
// 'elk.layered.cycleBreaking.strategy': data4Layout.config.elk?.cycleBreakingStrategy,
|
||||||
|
// 'elk.layered.cycleBreaking.strategy': 'GREEDY_MODEL_ORDER',
|
||||||
|
// 'elk.layered.cycleBreaking.strategy': 'MODEL_ORDER',
|
||||||
// 'spacing.nodeNode': 20,
|
// 'spacing.nodeNode': 20,
|
||||||
// 'spacing.nodeNodeBetweenLayers': 25,
|
// 'spacing.nodeNodeBetweenLayers': 25,
|
||||||
// 'spacing.edgeNode': 20,
|
// 'spacing.edgeNode': 20,
|
||||||
@@ -781,23 +875,29 @@ export const render = async (
|
|||||||
// 'spacing.edgeEdge': 10,
|
// 'spacing.edgeEdge': 10,
|
||||||
// 'spacing.edgeEdgeBetweenLayers': 20,
|
// 'spacing.edgeEdgeBetweenLayers': 20,
|
||||||
// 'spacing.nodeSelfLoop': 20,
|
// 'spacing.nodeSelfLoop': 20,
|
||||||
|
|
||||||
// Tweaking options
|
// Tweaking options
|
||||||
// 'elk.layered.nodePlacement.favorStraightEdges': true,
|
'nodePlacement.favorStraightEdges': true,
|
||||||
// 'nodePlacement.feedbackEdges': true,
|
'elk.layered.nodePlacement.favorStraightEdges': true,
|
||||||
// 'elk.layered.wrapping.multiEdge.improveCuts': true,
|
'nodePlacement.feedbackEdges': true,
|
||||||
// 'elk.layered.wrapping.multiEdge.improveWrappedEdges': true,
|
'elk.layered.wrapping.multiEdge.improveCuts': true,
|
||||||
// 'elk.layered.wrapping.strategy': 'MULTI_EDGE',
|
'elk.layered.wrapping.multiEdge.improveWrappedEdges': true,
|
||||||
// 'elk.layered.edgeRouting.selfLoopDistribution': 'EQUALLY',
|
'elk.layered.wrapping.strategy': 'MULTI_EDGE',
|
||||||
// 'elk.layered.mergeHierarchyEdges': true,
|
// 'elk.layered.wrapping.strategy': 'SINGLE_EDGE',
|
||||||
// 'elk.layered.feedbackEdges': true,
|
'elk.layered.edgeRouting.selfLoopDistribution': 'EQUALLY',
|
||||||
// 'elk.layered.crossingMinimization.semiInteractive': true,
|
'elk.layered.mergeHierarchyEdges': true,
|
||||||
// 'elk.layered.edgeRouting.splines.sloppy.layerSpacingFactor': 1,
|
|
||||||
// 'elk.layered.edgeRouting.polyline.slopedEdgeZoneWidth': 4.0,
|
'elk.layered.feedbackEdges': true,
|
||||||
// 'elk.layered.wrapping.validify.strategy': 'LOOK_BACK',
|
'elk.layered.crossingMinimization.semiInteractive': true,
|
||||||
// 'elk.insideSelfLoops.activate': true,
|
'elk.layered.edgeRouting.splines.sloppy.layerSpacingFactor': 1,
|
||||||
// 'elk.alg.layered.options.EdgeStraighteningStrategy': 'NONE',
|
'elk.layered.edgeRouting.polyline.slopedEdgeZoneWidth': 4.0,
|
||||||
|
'elk.layered.wrapping.validify.strategy': 'LOOK_BACK',
|
||||||
|
'elk.insideSelfLoops.activate': true,
|
||||||
|
'elk.separateConnectedComponents': true,
|
||||||
|
'elk.alg.layered.options.EdgeStraighteningStrategy': 'NONE',
|
||||||
// 'elk.layered.considerModelOrder.strategy': 'NODES_AND_EDGES', // NODES_AND_EDGES
|
// 'elk.layered.considerModelOrder.strategy': 'NODES_AND_EDGES', // NODES_AND_EDGES
|
||||||
// 'elk.layered.wrapping.cutting.strategy': 'ARD', // NODES_AND_EDGES
|
'elk.layered.considerModelOrder.strategy': 'EDGES', // NODES_AND_EDGES
|
||||||
|
'elk.layered.wrapping.cutting.strategy': 'ARD', // NODES_AND_EDGES
|
||||||
},
|
},
|
||||||
children: [],
|
children: [],
|
||||||
edges: [],
|
edges: [],
|
||||||
@@ -837,15 +937,16 @@ export const render = async (
|
|||||||
|
|
||||||
// Subgraph
|
// Subgraph
|
||||||
if (parentLookupDb.childrenById[node.id] !== undefined) {
|
if (parentLookupDb.childrenById[node.id] !== undefined) {
|
||||||
|
// Set label and adjust node width separately (avoid side effects in labels array)
|
||||||
node.labels = [
|
node.labels = [
|
||||||
{
|
{
|
||||||
text: node.label,
|
text: node.label,
|
||||||
width: node?.labelData?.width || 50,
|
width: node?.labelData?.width ?? 50,
|
||||||
height: node?.labelData?.height || 50,
|
height: node?.labelData?.height ?? 50,
|
||||||
},
|
},
|
||||||
(node.width = node.width + 2 * node.padding),
|
|
||||||
log.debug('UIO node label', node?.labelData?.width, node.padding),
|
|
||||||
];
|
];
|
||||||
|
node.width = node.width + 2 * node.padding;
|
||||||
|
log.debug('UIO node label', node?.labelData?.width, node.padding);
|
||||||
node.layoutOptions = {
|
node.layoutOptions = {
|
||||||
'spacing.baseValue': 30,
|
'spacing.baseValue': 30,
|
||||||
'nodeLabels.placement': '[H_CENTER V_TOP, INSIDE]',
|
'nodeLabels.placement': '[H_CENTER V_TOP, INSIDE]',
|
||||||
@@ -866,11 +967,16 @@ export const render = async (
|
|||||||
delete node.height;
|
delete node.height;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
elkGraph.edges.forEach((edge: any) => {
|
log.debug('APA01 processing edges, count:', elkGraph.edges.length);
|
||||||
|
elkGraph.edges.forEach((edge: any, index: number) => {
|
||||||
|
log.debug('APA01 processing edge', index, ':', edge);
|
||||||
const source = edge.sources[0];
|
const source = edge.sources[0];
|
||||||
const target = edge.targets[0];
|
const target = edge.targets[0];
|
||||||
|
log.debug('APA01 source:', source, 'target:', target);
|
||||||
|
log.debug('APA01 nodeDb[source]:', nodeDb[source]);
|
||||||
|
log.debug('APA01 nodeDb[target]:', nodeDb[target]);
|
||||||
|
|
||||||
if (nodeDb[source].parentId !== nodeDb[target].parentId) {
|
if (nodeDb[source] && nodeDb[target] && nodeDb[source].parentId !== nodeDb[target].parentId) {
|
||||||
const ancestorId = findCommonAncestor(source, target, parentLookupDb);
|
const ancestorId = findCommonAncestor(source, target, parentLookupDb);
|
||||||
// an edge that breaks a subgraph has been identified, set configuration accordingly
|
// an edge that breaks a subgraph has been identified, set configuration accordingly
|
||||||
setIncludeChildrenPolicy(source, ancestorId);
|
setIncludeChildrenPolicy(source, ancestorId);
|
||||||
@@ -878,7 +984,37 @@ export const render = async (
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const g = await elk.layout(elkGraph);
|
log.debug('APA01 before');
|
||||||
|
log.debug('APA01 elkGraph structure:', JSON.stringify(elkGraph, null, 2));
|
||||||
|
log.debug('APA01 elkGraph.children length:', elkGraph.children?.length);
|
||||||
|
log.debug('APA01 elkGraph.edges length:', elkGraph.edges?.length);
|
||||||
|
|
||||||
|
// Validate that all edge references exist as nodes
|
||||||
|
elkGraph.edges?.forEach((edge: any, index: number) => {
|
||||||
|
log.debug(`APA01 validating edge ${index}:`, edge);
|
||||||
|
if (edge.sources) {
|
||||||
|
edge.sources.forEach((sourceId: any) => {
|
||||||
|
const sourceExists = elkGraph.children?.some((child: any) => child.id === sourceId);
|
||||||
|
log.debug(`APA01 source ${sourceId} exists:`, sourceExists);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (edge.targets) {
|
||||||
|
edge.targets.forEach((targetId: any) => {
|
||||||
|
const targetExists = elkGraph.children?.some((child: any) => child.id === targetId);
|
||||||
|
log.debug(`APA01 target ${targetId} exists:`, targetExists);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
let g;
|
||||||
|
try {
|
||||||
|
g = await elk.layout(elkGraph);
|
||||||
|
log.debug('APA01 after - success');
|
||||||
|
log.info('APA01 layout result:', JSON.stringify(g, null, 2));
|
||||||
|
} catch (error) {
|
||||||
|
log.error('APA01 ELK layout error:', error);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
|
||||||
// debugger;
|
// debugger;
|
||||||
await drawNodes(0, 0, g.children, svg, subGraphsEl, 0);
|
await drawNodes(0, 0, g.children, svg, subGraphsEl, 0);
|
||||||
@@ -938,7 +1074,7 @@ export const render = async (
|
|||||||
log.debug(
|
log.debug(
|
||||||
'UIO width',
|
'UIO width',
|
||||||
startNode.id,
|
startNode.id,
|
||||||
startNode.with,
|
startNode.width,
|
||||||
'bbox.width=',
|
'bbox.width=',
|
||||||
bbox.width,
|
bbox.width,
|
||||||
'lw=',
|
'lw=',
|
||||||
@@ -958,7 +1094,7 @@ export const render = async (
|
|||||||
log.debug(
|
log.debug(
|
||||||
'UIO width',
|
'UIO width',
|
||||||
startNode.id,
|
startNode.id,
|
||||||
startNode.with,
|
startNode.width,
|
||||||
bbox.width,
|
bbox.width,
|
||||||
'EW = ',
|
'EW = ',
|
||||||
ew,
|
ew,
|
||||||
@@ -966,43 +1102,26 @@ export const render = async (
|
|||||||
startNode.innerHTML
|
startNode.innerHTML
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (startNode.shape === 'diamond' || startNode.shape === 'diam') {
|
startNode.x = startNode.offset.posX + startNode.width / 2;
|
||||||
|
startNode.y = startNode.offset.posY + startNode.height / 2;
|
||||||
|
endNode.x = endNode.offset.posX + endNode.width / 2;
|
||||||
|
endNode.y = endNode.offset.posY + endNode.height / 2;
|
||||||
|
if (startNode.shape !== 'rect33') {
|
||||||
edge.points.unshift({
|
edge.points.unshift({
|
||||||
x: startNode.offset.posX + startNode.width / 2,
|
x: startNode.x,
|
||||||
y: startNode.offset.posY + startNode.height / 2,
|
y: startNode.y,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (endNode.shape === 'diamond' || endNode.shape === 'diam') {
|
if (endNode.shape !== 'rect33') {
|
||||||
edge.points.push({
|
edge.points.push({
|
||||||
x: endNode.offset.posX + endNode.width / 2,
|
x: endNode.x,
|
||||||
y: endNode.offset.posY + endNode.height / 2,
|
y: endNode.y,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
edge.points = cutPathAtIntersect(
|
log.debug('UIO cutter2: Points before cutter2:', edge.points);
|
||||||
edge.points.reverse(),
|
edge.points = cutter2(startNode, endNode, edge.points);
|
||||||
{
|
log.debug('UIO cutter2: Points after cutter2:', edge.points);
|
||||||
x: startNode.offset.posX + startNode.width / 2,
|
|
||||||
y: startNode.offset.posY + startNode.height / 2,
|
|
||||||
width: sw,
|
|
||||||
height: startNode.height,
|
|
||||||
padding: startNode.padding,
|
|
||||||
},
|
|
||||||
startNode.shape === 'diamond' || startNode.shape === 'diam'
|
|
||||||
).reverse();
|
|
||||||
|
|
||||||
edge.points = cutPathAtIntersect(
|
|
||||||
edge.points,
|
|
||||||
{
|
|
||||||
x: endNode.offset.posX + endNode.width / 2,
|
|
||||||
y: endNode.offset.posY + endNode.height / 2,
|
|
||||||
width: ew,
|
|
||||||
height: endNode.height,
|
|
||||||
padding: endNode.padding,
|
|
||||||
},
|
|
||||||
endNode.shape === 'diamond' || endNode.shape === 'diam'
|
|
||||||
);
|
|
||||||
|
|
||||||
const paths = insertEdge(
|
const paths = insertEdge(
|
||||||
edgesEl,
|
edgesEl,
|
||||||
edge,
|
edge,
|
||||||
@@ -1010,7 +1129,8 @@ export const render = async (
|
|||||||
data4Layout.type,
|
data4Layout.type,
|
||||||
startNode,
|
startNode,
|
||||||
endNode,
|
endNode,
|
||||||
data4Layout.diagramId
|
data4Layout.diagramId,
|
||||||
|
true
|
||||||
);
|
);
|
||||||
log.info('APA12 edge points after insert', JSON.stringify(edge.points));
|
log.info('APA12 edge points after insert', JSON.stringify(edge.points));
|
||||||
|
|
||||||
|
@@ -5,6 +5,6 @@
|
|||||||
"outDir": "./dist",
|
"outDir": "./dist",
|
||||||
"types": ["vitest/importMeta", "vitest/globals"]
|
"types": ["vitest/importMeta", "vitest/globals"]
|
||||||
},
|
},
|
||||||
"include": ["./src/**/*.ts"],
|
"include": ["./src/**/*.ts", "./src/**/*.d.ts"],
|
||||||
"typeRoots": ["./src/types"]
|
"typeRoots": ["./src/types"]
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user