mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-09-03 23:56:44 +02:00
Compare commits
31 Commits
test-commi
...
mermaid@11
Author | SHA1 | Date | |
---|---|---|---|
![]() |
767754f4fb | ||
![]() |
cff59c58b4 | ||
![]() |
5b241bbb97 | ||
![]() |
7e5e47843b | ||
![]() |
9e2cd1a926 | ||
![]() |
abf2227faf | ||
![]() |
7db942b0e1 | ||
![]() |
70041c806f | ||
![]() |
77e2703f72 | ||
![]() |
771801b366 | ||
![]() |
a9a0a9b2de | ||
![]() |
1e5e835c41 | ||
![]() |
6b071c135a | ||
![]() |
42a3c3487f | ||
![]() |
96c21c7e54 | ||
![]() |
e95e4d155a | ||
![]() |
688170558c | ||
![]() |
832f012e10 | ||
![]() |
2e2e8c4152 | ||
![]() |
6ff6e08c4b | ||
![]() |
d3e2be35be | ||
![]() |
260a045da0 | ||
![]() |
e097b480d5 | ||
![]() |
12e3d31437 | ||
![]() |
ad024b01d6 | ||
![]() |
c12aea588c | ||
![]() |
9dfbf1166d | ||
![]() |
d90634bf2b | ||
![]() |
90707e8062 | ||
![]() |
7e23f984e6 | ||
![]() |
12c94a177b |
@@ -1,5 +0,0 @@
|
|||||||
---
|
|
||||||
'mermaid': minor
|
|
||||||
---
|
|
||||||
|
|
||||||
feat: Add `getRegisteredDiagramsMetadata` to `mermaid`, which returns all the registered diagram IDs in mermaid
|
|
@@ -1,5 +0,0 @@
|
|||||||
---
|
|
||||||
'@mermaid-js/examples': minor
|
|
||||||
---
|
|
||||||
|
|
||||||
feat: Add examples for diagrams in the `@mermaid-js/examples` package
|
|
@@ -1,7 +0,0 @@
|
|||||||
---
|
|
||||||
'@mermaid-js/examples': patch
|
|
||||||
'mermaid': patch
|
|
||||||
'@mermaid-js/parser': patch
|
|
||||||
---
|
|
||||||
|
|
||||||
chore: Move packet diagram out of beta
|
|
@@ -1,5 +0,0 @@
|
|||||||
---
|
|
||||||
'mermaid': patch
|
|
||||||
---
|
|
||||||
|
|
||||||
fix: adjust sequence diagram title positioning to prevent overlap with top border in Safari
|
|
@@ -1,7 +0,0 @@
|
|||||||
---
|
|
||||||
'mermaid': patch
|
|
||||||
---
|
|
||||||
|
|
||||||
fix(timeline): fix loading `leftMargin` from config
|
|
||||||
|
|
||||||
The `timeline.leftMargin` config value should now correctly control the size of the left margin, instead of being ignored.
|
|
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",
|
||||||
|
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
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@mermaid-js/examples",
|
"name": "@mermaid-js/examples",
|
||||||
"version": "0.0.1-beta.1",
|
"version": "1.0.0",
|
||||||
"description": "Mermaid examples package",
|
"description": "Mermaid examples package",
|
||||||
"author": "Sidharth Vinod",
|
"author": "Sidharth Vinod",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
@@ -1,5 +1,28 @@
|
|||||||
# mermaid
|
# mermaid
|
||||||
|
|
||||||
|
## 11.9.0
|
||||||
|
|
||||||
|
### Minor Changes
|
||||||
|
|
||||||
|
- [#6453](https://github.com/mermaid-js/mermaid/pull/6453) [`5acbd7e`](https://github.com/mermaid-js/mermaid/commit/5acbd7e762469d9d89a9c77faf6617ee13367f3a) Thanks [@sidharthv96](https://github.com/sidharthv96)! - feat: Add `getRegisteredDiagramsMetadata` to `mermaid`, which returns all the registered diagram IDs in mermaid
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- [#6738](https://github.com/mermaid-js/mermaid/pull/6738) [`d90634b`](https://github.com/mermaid-js/mermaid/commit/d90634bf2b09e586b055729e07e9a1a31b21827c) Thanks [@shubham-mermaid](https://github.com/shubham-mermaid)! - chore: Updated TreeMapDB to use class based approach
|
||||||
|
|
||||||
|
- [#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
|
||||||
|
|
||||||
|
- [#6747](https://github.com/mermaid-js/mermaid/pull/6747) [`3e3ae08`](https://github.com/mermaid-js/mermaid/commit/3e3ae089305e1c7b9948b9e149eba6854fe7f2d6) Thanks [@darshanr0107](https://github.com/darshanr0107)! - fix: adjust sequence diagram title positioning to prevent overlap with top border in Safari
|
||||||
|
|
||||||
|
- [#6751](https://github.com/mermaid-js/mermaid/pull/6751) [`d3e2be3`](https://github.com/mermaid-js/mermaid/commit/d3e2be35be066adeb7fd502b4a24c223c3b53947) Thanks [@darshanr0107](https://github.com/darshanr0107)! - chore: Update MindmapDB to use class based approach
|
||||||
|
|
||||||
|
- [#6715](https://github.com/mermaid-js/mermaid/pull/6715) [`637680d`](https://github.com/mermaid-js/mermaid/commit/637680d4d9e39b4f8cb6f05b4cb261e8f5693ac3) Thanks [@Syn3ugar](https://github.com/Syn3ugar)! - fix(timeline): fix loading `leftMargin` from config
|
||||||
|
|
||||||
|
The `timeline.leftMargin` config value should now correctly control the size of the left margin, instead of being ignored.
|
||||||
|
|
||||||
|
- Updated dependencies [[`7a38eb7`](https://github.com/mermaid-js/mermaid/commit/7a38eb715d795cd5c66cb59357d64ec197b432e6)]:
|
||||||
|
- @mermaid-js/parser@0.6.2
|
||||||
|
|
||||||
## 11.8.1
|
## 11.8.1
|
||||||
|
|
||||||
### Patch Changes
|
### Patch Changes
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "mermaid",
|
"name": "mermaid",
|
||||||
"version": "11.8.1",
|
"version": "11.9.0",
|
||||||
"description": "Markdown-ish syntax for generating flowcharts, mindmaps, sequence diagrams, class diagrams, gantt charts, git graphs and more.",
|
"description": "Markdown-ish syntax for generating flowcharts, mindmaps, sequence diagrams, class diagrams, gantt charts, git graphs and more.",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"module": "./dist/mermaid.core.mjs",
|
"module": "./dist/mermaid.core.mjs",
|
||||||
@@ -79,7 +79,7 @@
|
|||||||
"dagre-d3-es": "7.0.11",
|
"dagre-d3-es": "7.0.11",
|
||||||
"dayjs": "^1.11.13",
|
"dayjs": "^1.11.13",
|
||||||
"dompurify": "^3.2.5",
|
"dompurify": "^3.2.5",
|
||||||
"katex": "^0.16.9",
|
"katex": "^0.16.22",
|
||||||
"khroma": "^2.1.0",
|
"khroma": "^2.1.0",
|
||||||
"lodash-es": "^4.17.21",
|
"lodash-es": "^4.17.21",
|
||||||
"marked": "^16.0.0",
|
"marked": "^16.0.0",
|
||||||
|
@@ -1,12 +1,14 @@
|
|||||||
// @ts-ignore: JISON doesn't support types
|
// @ts-ignore: JISON doesn't support types
|
||||||
import parser from './parser/mindmap.jison';
|
import parser from './parser/mindmap.jison';
|
||||||
import db from './mindmapDb.js';
|
import { MindmapDB } from './mindmapDb.js';
|
||||||
import renderer from './mindmapRenderer.js';
|
import renderer from './mindmapRenderer.js';
|
||||||
import styles from './styles.js';
|
import styles from './styles.js';
|
||||||
import type { DiagramDefinition } from '../../diagram-api/types.js';
|
import type { DiagramDefinition } from '../../diagram-api/types.js';
|
||||||
|
|
||||||
export const diagram: DiagramDefinition = {
|
export const diagram: DiagramDefinition = {
|
||||||
db,
|
get db() {
|
||||||
|
return new MindmapDB();
|
||||||
|
},
|
||||||
renderer,
|
renderer,
|
||||||
parser,
|
parser,
|
||||||
styles,
|
styles,
|
||||||
|
@@ -1,12 +1,12 @@
|
|||||||
// @ts-expect-error No types available for JISON
|
// @ts-expect-error No types available for JISON
|
||||||
import { parser as mindmap } from './parser/mindmap.jison';
|
import { parser as mindmap } from './parser/mindmap.jison';
|
||||||
import mindmapDB from './mindmapDb.js';
|
import { MindmapDB } from './mindmapDb.js';
|
||||||
// Todo fix utils functions for tests
|
// Todo fix utils functions for tests
|
||||||
import { setLogLevel } from '../../diagram-api/diagramAPI.js';
|
import { setLogLevel } from '../../diagram-api/diagramAPI.js';
|
||||||
|
|
||||||
describe('when parsing a mindmap ', function () {
|
describe('when parsing a mindmap ', function () {
|
||||||
beforeEach(function () {
|
beforeEach(function () {
|
||||||
mindmap.yy = mindmapDB;
|
mindmap.yy = new MindmapDB();
|
||||||
mindmap.yy.clear();
|
mindmap.yy.clear();
|
||||||
setLogLevel('trace');
|
setLogLevel('trace');
|
||||||
});
|
});
|
||||||
|
@@ -5,70 +5,6 @@ import { log } from '../../logger.js';
|
|||||||
import type { MindmapNode } from './mindmapTypes.js';
|
import type { MindmapNode } from './mindmapTypes.js';
|
||||||
import defaultConfig from '../../defaultConfig.js';
|
import defaultConfig from '../../defaultConfig.js';
|
||||||
|
|
||||||
let nodes: MindmapNode[] = [];
|
|
||||||
let cnt = 0;
|
|
||||||
let elements: Record<number, D3Element> = {};
|
|
||||||
|
|
||||||
const clear = () => {
|
|
||||||
nodes = [];
|
|
||||||
cnt = 0;
|
|
||||||
elements = {};
|
|
||||||
};
|
|
||||||
|
|
||||||
const getParent = function (level: number) {
|
|
||||||
for (let i = nodes.length - 1; i >= 0; i--) {
|
|
||||||
if (nodes[i].level < level) {
|
|
||||||
return nodes[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// No parent found
|
|
||||||
return null;
|
|
||||||
};
|
|
||||||
|
|
||||||
const getMindmap = () => {
|
|
||||||
return nodes.length > 0 ? nodes[0] : null;
|
|
||||||
};
|
|
||||||
|
|
||||||
const addNode = (level: number, id: string, descr: string, type: number) => {
|
|
||||||
log.info('addNode', level, id, descr, type);
|
|
||||||
const conf = getConfig();
|
|
||||||
let padding: number = conf.mindmap?.padding ?? defaultConfig.mindmap.padding;
|
|
||||||
switch (type) {
|
|
||||||
case nodeType.ROUNDED_RECT:
|
|
||||||
case nodeType.RECT:
|
|
||||||
case nodeType.HEXAGON:
|
|
||||||
padding *= 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
const node = {
|
|
||||||
id: cnt++,
|
|
||||||
nodeId: sanitizeText(id, conf),
|
|
||||||
level,
|
|
||||||
descr: sanitizeText(descr, conf),
|
|
||||||
type,
|
|
||||||
children: [],
|
|
||||||
width: conf.mindmap?.maxNodeWidth ?? defaultConfig.mindmap.maxNodeWidth,
|
|
||||||
padding,
|
|
||||||
} satisfies MindmapNode;
|
|
||||||
|
|
||||||
const parent = getParent(level);
|
|
||||||
if (parent) {
|
|
||||||
parent.children.push(node);
|
|
||||||
// Keep all nodes in the list
|
|
||||||
nodes.push(node);
|
|
||||||
} else {
|
|
||||||
if (nodes.length === 0) {
|
|
||||||
// First node, the root
|
|
||||||
nodes.push(node);
|
|
||||||
} else {
|
|
||||||
// Syntax error ... there can only bee one root
|
|
||||||
throw new Error(
|
|
||||||
'There can be only one root. No parent could be found for ("' + node.descr + '")'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const nodeType = {
|
const nodeType = {
|
||||||
DEFAULT: 0,
|
DEFAULT: 0,
|
||||||
NO_BORDER: 0,
|
NO_BORDER: 0,
|
||||||
@@ -78,82 +14,149 @@ const nodeType = {
|
|||||||
CLOUD: 4,
|
CLOUD: 4,
|
||||||
BANG: 5,
|
BANG: 5,
|
||||||
HEXAGON: 6,
|
HEXAGON: 6,
|
||||||
};
|
|
||||||
|
|
||||||
const getType = (startStr: string, endStr: string): number => {
|
|
||||||
log.debug('In get type', startStr, endStr);
|
|
||||||
switch (startStr) {
|
|
||||||
case '[':
|
|
||||||
return nodeType.RECT;
|
|
||||||
case '(':
|
|
||||||
return endStr === ')' ? nodeType.ROUNDED_RECT : nodeType.CLOUD;
|
|
||||||
case '((':
|
|
||||||
return nodeType.CIRCLE;
|
|
||||||
case ')':
|
|
||||||
return nodeType.CLOUD;
|
|
||||||
case '))':
|
|
||||||
return nodeType.BANG;
|
|
||||||
case '{{':
|
|
||||||
return nodeType.HEXAGON;
|
|
||||||
default:
|
|
||||||
return nodeType.DEFAULT;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const setElementForId = (id: number, element: D3Element) => {
|
|
||||||
elements[id] = element;
|
|
||||||
};
|
|
||||||
|
|
||||||
const decorateNode = (decoration?: { class?: string; icon?: string }) => {
|
|
||||||
if (!decoration) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const config = getConfig();
|
|
||||||
const node = nodes[nodes.length - 1];
|
|
||||||
if (decoration.icon) {
|
|
||||||
node.icon = sanitizeText(decoration.icon, config);
|
|
||||||
}
|
|
||||||
if (decoration.class) {
|
|
||||||
node.class = sanitizeText(decoration.class, config);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const type2Str = (type: number) => {
|
|
||||||
switch (type) {
|
|
||||||
case nodeType.DEFAULT:
|
|
||||||
return 'no-border';
|
|
||||||
case nodeType.RECT:
|
|
||||||
return 'rect';
|
|
||||||
case nodeType.ROUNDED_RECT:
|
|
||||||
return 'rounded-rect';
|
|
||||||
case nodeType.CIRCLE:
|
|
||||||
return 'circle';
|
|
||||||
case nodeType.CLOUD:
|
|
||||||
return 'cloud';
|
|
||||||
case nodeType.BANG:
|
|
||||||
return 'bang';
|
|
||||||
case nodeType.HEXAGON:
|
|
||||||
return 'hexgon'; // cspell: disable-line
|
|
||||||
default:
|
|
||||||
return 'no-border';
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Expose logger to grammar
|
|
||||||
const getLogger = () => log;
|
|
||||||
const getElementById = (id: number) => elements[id];
|
|
||||||
|
|
||||||
const db = {
|
|
||||||
clear,
|
|
||||||
addNode,
|
|
||||||
getMindmap,
|
|
||||||
nodeType,
|
|
||||||
getType,
|
|
||||||
setElementForId,
|
|
||||||
decorateNode,
|
|
||||||
type2Str,
|
|
||||||
getLogger,
|
|
||||||
getElementById,
|
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export default db;
|
export class MindmapDB {
|
||||||
|
private nodes: MindmapNode[] = [];
|
||||||
|
private count = 0;
|
||||||
|
private elements: Record<number, D3Element> = {};
|
||||||
|
public readonly nodeType: typeof nodeType;
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.getLogger = this.getLogger.bind(this);
|
||||||
|
this.nodeType = nodeType;
|
||||||
|
this.clear();
|
||||||
|
this.getType = this.getType.bind(this);
|
||||||
|
this.getMindmap = this.getMindmap.bind(this);
|
||||||
|
this.getElementById = this.getElementById.bind(this);
|
||||||
|
this.getParent = this.getParent.bind(this);
|
||||||
|
this.getMindmap = this.getMindmap.bind(this);
|
||||||
|
this.addNode = this.addNode.bind(this);
|
||||||
|
this.decorateNode = this.decorateNode.bind(this);
|
||||||
|
}
|
||||||
|
public clear() {
|
||||||
|
this.nodes = [];
|
||||||
|
this.count = 0;
|
||||||
|
this.elements = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
public getParent(level: number): MindmapNode | null {
|
||||||
|
for (let i = this.nodes.length - 1; i >= 0; i--) {
|
||||||
|
if (this.nodes[i].level < level) {
|
||||||
|
return this.nodes[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public getMindmap(): MindmapNode | null {
|
||||||
|
return this.nodes.length > 0 ? this.nodes[0] : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public addNode(level: number, id: string, descr: string, type: number): void {
|
||||||
|
log.info('addNode', level, id, descr, type);
|
||||||
|
|
||||||
|
const conf = getConfig();
|
||||||
|
let padding = conf.mindmap?.padding ?? defaultConfig.mindmap.padding;
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case this.nodeType.ROUNDED_RECT:
|
||||||
|
case this.nodeType.RECT:
|
||||||
|
case this.nodeType.HEXAGON:
|
||||||
|
padding *= 2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
const node: MindmapNode = {
|
||||||
|
id: this.count++,
|
||||||
|
nodeId: sanitizeText(id, conf),
|
||||||
|
level,
|
||||||
|
descr: sanitizeText(descr, conf),
|
||||||
|
type,
|
||||||
|
children: [],
|
||||||
|
width: conf.mindmap?.maxNodeWidth ?? defaultConfig.mindmap.maxNodeWidth,
|
||||||
|
padding,
|
||||||
|
};
|
||||||
|
|
||||||
|
const parent = this.getParent(level);
|
||||||
|
if (parent) {
|
||||||
|
parent.children.push(node);
|
||||||
|
this.nodes.push(node);
|
||||||
|
} else {
|
||||||
|
if (this.nodes.length === 0) {
|
||||||
|
this.nodes.push(node);
|
||||||
|
} else {
|
||||||
|
throw new Error(
|
||||||
|
`There can be only one root. No parent could be found for ("${node.descr}")`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public getType(startStr: string, endStr: string) {
|
||||||
|
log.debug('In get type', startStr, endStr);
|
||||||
|
switch (startStr) {
|
||||||
|
case '[':
|
||||||
|
return this.nodeType.RECT;
|
||||||
|
case '(':
|
||||||
|
return endStr === ')' ? this.nodeType.ROUNDED_RECT : this.nodeType.CLOUD;
|
||||||
|
case '((':
|
||||||
|
return this.nodeType.CIRCLE;
|
||||||
|
case ')':
|
||||||
|
return this.nodeType.CLOUD;
|
||||||
|
case '))':
|
||||||
|
return this.nodeType.BANG;
|
||||||
|
case '{{':
|
||||||
|
return this.nodeType.HEXAGON;
|
||||||
|
default:
|
||||||
|
return this.nodeType.DEFAULT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public setElementForId(id: number, element: D3Element): void {
|
||||||
|
this.elements[id] = element;
|
||||||
|
}
|
||||||
|
public getElementById(id: number) {
|
||||||
|
return this.elements[id];
|
||||||
|
}
|
||||||
|
|
||||||
|
public decorateNode(decoration?: { class?: string; icon?: string }): void {
|
||||||
|
if (!decoration) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const config = getConfig();
|
||||||
|
const node = this.nodes[this.nodes.length - 1];
|
||||||
|
if (decoration.icon) {
|
||||||
|
node.icon = sanitizeText(decoration.icon, config);
|
||||||
|
}
|
||||||
|
if (decoration.class) {
|
||||||
|
node.class = sanitizeText(decoration.class, config);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type2Str(type: number): string {
|
||||||
|
switch (type) {
|
||||||
|
case this.nodeType.DEFAULT:
|
||||||
|
return 'no-border';
|
||||||
|
case this.nodeType.RECT:
|
||||||
|
return 'rect';
|
||||||
|
case this.nodeType.ROUNDED_RECT:
|
||||||
|
return 'rounded-rect';
|
||||||
|
case this.nodeType.CIRCLE:
|
||||||
|
return 'circle';
|
||||||
|
case this.nodeType.CLOUD:
|
||||||
|
return 'cloud';
|
||||||
|
case this.nodeType.BANG:
|
||||||
|
return 'bang';
|
||||||
|
case this.nodeType.HEXAGON:
|
||||||
|
return 'hexgon'; // cspell: disable-line
|
||||||
|
default:
|
||||||
|
return 'no-border';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public getLogger() {
|
||||||
|
return log;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -9,10 +9,10 @@ import { log } from '../../logger.js';
|
|||||||
import type { D3Element } from '../../types.js';
|
import type { D3Element } from '../../types.js';
|
||||||
import { selectSvgElement } from '../../rendering-util/selectSvgElement.js';
|
import { selectSvgElement } from '../../rendering-util/selectSvgElement.js';
|
||||||
import { setupGraphViewbox } from '../../setupGraphViewbox.js';
|
import { setupGraphViewbox } from '../../setupGraphViewbox.js';
|
||||||
import type { FilledMindMapNode, MindmapDB, MindmapNode } from './mindmapTypes.js';
|
import type { FilledMindMapNode, MindmapNode } from './mindmapTypes.js';
|
||||||
import { drawNode, positionNode } from './svgDraw.js';
|
import { drawNode, positionNode } from './svgDraw.js';
|
||||||
import defaultConfig from '../../defaultConfig.js';
|
import defaultConfig from '../../defaultConfig.js';
|
||||||
|
import type { MindmapDB } from './mindmapDb.js';
|
||||||
// Inject the layout algorithm into cytoscape
|
// Inject the layout algorithm into cytoscape
|
||||||
cytoscape.use(coseBilkent);
|
cytoscape.use(coseBilkent);
|
||||||
|
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
import type { RequiredDeep } from 'type-fest';
|
import type { RequiredDeep } from 'type-fest';
|
||||||
import type mindmapDb from './mindmapDb.js';
|
|
||||||
|
|
||||||
export interface MindmapNode {
|
export interface MindmapNode {
|
||||||
id: number;
|
id: number;
|
||||||
@@ -19,4 +18,3 @@ export interface MindmapNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export type FilledMindMapNode = RequiredDeep<MindmapNode>;
|
export type FilledMindMapNode = RequiredDeep<MindmapNode>;
|
||||||
export type MindmapDB = typeof mindmapDb;
|
|
||||||
|
@@ -1,8 +1,9 @@
|
|||||||
import { createText } from '../../rendering-util/createText.js';
|
import { createText } from '../../rendering-util/createText.js';
|
||||||
import type { FilledMindMapNode, MindmapDB } from './mindmapTypes.js';
|
import type { FilledMindMapNode } from './mindmapTypes.js';
|
||||||
import type { Point, D3Element } from '../../types.js';
|
import type { Point, D3Element } from '../../types.js';
|
||||||
import { parseFontSize } from '../../utils.js';
|
import { parseFontSize } from '../../utils.js';
|
||||||
import type { MermaidConfig } from '../../config.type.js';
|
import type { MermaidConfig } from '../../config.type.js';
|
||||||
|
import type { MindmapDB } from './mindmapDb.js';
|
||||||
|
|
||||||
const MAX_SECTIONS = 12;
|
const MAX_SECTIONS = 12;
|
||||||
|
|
||||||
|
@@ -1,10 +1,10 @@
|
|||||||
import { getConfig as commonGetConfig } from '../../config.js';
|
import type { DiagramDB } from '../../diagram-api/types.js';
|
||||||
import DEFAULT_CONFIG from '../../defaultConfig.js';
|
|
||||||
import type { DiagramStyleClassDef } from '../../diagram-api/types.js';
|
import type { DiagramStyleClassDef } from '../../diagram-api/types.js';
|
||||||
import { isLabelStyle } from '../../rendering-util/rendering-elements/shapes/handDrawnShapeStyles.js';
|
import type { TreemapDiagramConfig, TreemapNode } from './types.js';
|
||||||
|
import DEFAULT_CONFIG from '../../defaultConfig.js';
|
||||||
|
import { getConfig as commonGetConfig } from '../../config.js';
|
||||||
import { cleanAndMerge } from '../../utils.js';
|
import { cleanAndMerge } from '../../utils.js';
|
||||||
import { ImperativeState } from '../../utils/imperativeState.js';
|
import { isLabelStyle } from '../../rendering-util/rendering-elements/shapes/handDrawnShapeStyles.js';
|
||||||
import {
|
import {
|
||||||
clear as commonClear,
|
clear as commonClear,
|
||||||
getAccDescription,
|
getAccDescription,
|
||||||
@@ -14,99 +14,82 @@ import {
|
|||||||
setAccTitle,
|
setAccTitle,
|
||||||
setDiagramTitle,
|
setDiagramTitle,
|
||||||
} from '../common/commonDb.js';
|
} from '../common/commonDb.js';
|
||||||
import type { TreemapDB, TreemapData, TreemapDiagramConfig, TreemapNode } from './types.js';
|
export class TreeMapDB implements DiagramDB {
|
||||||
|
private nodes: TreemapNode[] = [];
|
||||||
|
private levels: Map<TreemapNode, number> = new Map<TreemapNode, number>();
|
||||||
|
private outerNodes: TreemapNode[] = [];
|
||||||
|
private classes: Map<string, DiagramStyleClassDef> = new Map<string, DiagramStyleClassDef>();
|
||||||
|
private root?: TreemapNode;
|
||||||
|
|
||||||
const defaultTreemapData: TreemapData = {
|
public getNodes() {
|
||||||
nodes: [],
|
return this.nodes;
|
||||||
levels: new Map(),
|
|
||||||
outerNodes: [],
|
|
||||||
classes: new Map(),
|
|
||||||
};
|
|
||||||
|
|
||||||
const state = new ImperativeState<TreemapData>(() => structuredClone(defaultTreemapData));
|
|
||||||
|
|
||||||
const getConfig = (): Required<TreemapDiagramConfig> => {
|
|
||||||
// Use type assertion with unknown as intermediate step
|
|
||||||
const defaultConfig = DEFAULT_CONFIG as unknown as { treemap: Required<TreemapDiagramConfig> };
|
|
||||||
const userConfig = commonGetConfig() as unknown as { treemap?: Partial<TreemapDiagramConfig> };
|
|
||||||
|
|
||||||
return cleanAndMerge({
|
|
||||||
...defaultConfig.treemap,
|
|
||||||
...(userConfig.treemap ?? {}),
|
|
||||||
}) as Required<TreemapDiagramConfig>;
|
|
||||||
};
|
|
||||||
|
|
||||||
const getNodes = (): TreemapNode[] => state.records.nodes;
|
|
||||||
|
|
||||||
const addNode = (node: TreemapNode, level: number) => {
|
|
||||||
const data = state.records;
|
|
||||||
data.nodes.push(node);
|
|
||||||
data.levels.set(node, level);
|
|
||||||
|
|
||||||
if (level === 0) {
|
|
||||||
data.outerNodes.push(node);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the root node if this is a level 0 node and we don't have a root yet
|
public getConfig() {
|
||||||
if (level === 0 && !data.root) {
|
const defaultConfig = DEFAULT_CONFIG as unknown as { treemap: Required<TreemapDiagramConfig> };
|
||||||
data.root = node;
|
const userConfig = commonGetConfig() as unknown as { treemap?: Partial<TreemapDiagramConfig> };
|
||||||
|
return cleanAndMerge({
|
||||||
|
...defaultConfig.treemap,
|
||||||
|
...(userConfig.treemap ?? {}),
|
||||||
|
}) as Required<TreemapDiagramConfig>;
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
const getRoot = (): TreemapNode | undefined => ({ name: '', children: state.records.outerNodes });
|
public addNode(node: TreemapNode, level: number) {
|
||||||
|
this.nodes.push(node);
|
||||||
|
this.levels.set(node, level);
|
||||||
|
if (level === 0) {
|
||||||
|
this.outerNodes.push(node);
|
||||||
|
this.root ??= node;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const addClass = (id: string, _style: string) => {
|
public getRoot() {
|
||||||
const classes = state.records.classes;
|
return { name: '', children: this.outerNodes };
|
||||||
const styleClass = classes.get(id) ?? { id, styles: [], textStyles: [] };
|
}
|
||||||
classes.set(id, styleClass);
|
|
||||||
|
|
||||||
const styles = _style.replace(/\\,/g, '§§§').replace(/,/g, ';').replace(/§§§/g, ',').split(';');
|
public addClass(id: string, _style: string) {
|
||||||
|
const styleClass = this.classes.get(id) ?? { id, styles: [], textStyles: [] };
|
||||||
if (styles) {
|
const styles = _style.replace(/\\,/g, '§§§').replace(/,/g, ';').replace(/§§§/g, ',').split(';');
|
||||||
styles.forEach((s) => {
|
if (styles) {
|
||||||
if (isLabelStyle(s)) {
|
styles.forEach((s) => {
|
||||||
if (styleClass?.textStyles) {
|
if (isLabelStyle(s)) {
|
||||||
styleClass.textStyles.push(s);
|
if (styleClass?.textStyles) {
|
||||||
} else {
|
styleClass.textStyles.push(s);
|
||||||
styleClass.textStyles = [s];
|
} else {
|
||||||
|
styleClass.textStyles = [s];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
if (styleClass?.styles) {
|
||||||
if (styleClass?.styles) {
|
styleClass.styles.push(s);
|
||||||
styleClass.styles.push(s);
|
} else {
|
||||||
} else {
|
styleClass.styles = [s];
|
||||||
styleClass.styles = [s];
|
}
|
||||||
}
|
});
|
||||||
});
|
}
|
||||||
|
this.classes.set(id, styleClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
classes.set(id, styleClass);
|
public getClasses() {
|
||||||
};
|
return this.classes;
|
||||||
const getClasses = (): Map<string, DiagramStyleClassDef> => {
|
}
|
||||||
return state.records.classes;
|
|
||||||
};
|
|
||||||
|
|
||||||
const getStylesForClass = (classSelector: string): string[] => {
|
public getStylesForClass(classSelector: string): string[] {
|
||||||
return state.records.classes.get(classSelector)?.styles ?? [];
|
return this.classes.get(classSelector)?.styles ?? [];
|
||||||
};
|
}
|
||||||
|
|
||||||
const clear = () => {
|
public clear() {
|
||||||
commonClear();
|
commonClear();
|
||||||
state.reset();
|
this.nodes = [];
|
||||||
};
|
this.levels = new Map();
|
||||||
|
this.outerNodes = [];
|
||||||
|
this.classes = new Map();
|
||||||
|
this.root = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
export const db: TreemapDB = {
|
public setAccTitle = setAccTitle;
|
||||||
getNodes,
|
public getAccTitle = getAccTitle;
|
||||||
addNode,
|
public setDiagramTitle = setDiagramTitle;
|
||||||
getRoot,
|
public getDiagramTitle = getDiagramTitle;
|
||||||
getConfig,
|
public getAccDescription = getAccDescription;
|
||||||
clear,
|
public setAccDescription = setAccDescription;
|
||||||
setAccTitle,
|
}
|
||||||
getAccTitle,
|
|
||||||
setDiagramTitle,
|
|
||||||
getDiagramTitle,
|
|
||||||
getAccDescription,
|
|
||||||
setAccDescription,
|
|
||||||
addClass,
|
|
||||||
getClasses,
|
|
||||||
getStylesForClass,
|
|
||||||
};
|
|
||||||
|
@@ -1,12 +1,14 @@
|
|||||||
import type { DiagramDefinition } from '../../diagram-api/types.js';
|
import type { DiagramDefinition } from '../../diagram-api/types.js';
|
||||||
import { db } from './db.js';
|
import { TreeMapDB } from './db.js';
|
||||||
import { parser } from './parser.js';
|
import { parser } from './parser.js';
|
||||||
import { renderer } from './renderer.js';
|
import { renderer } from './renderer.js';
|
||||||
import styles from './styles.js';
|
import styles from './styles.js';
|
||||||
|
|
||||||
export const diagram: DiagramDefinition = {
|
export const diagram: DiagramDefinition = {
|
||||||
parser,
|
parser,
|
||||||
db,
|
get db() {
|
||||||
|
return new TreeMapDB();
|
||||||
|
},
|
||||||
renderer,
|
renderer,
|
||||||
styles,
|
styles,
|
||||||
};
|
};
|
||||||
|
@@ -2,15 +2,15 @@ import { parse } from '@mermaid-js/parser';
|
|||||||
import type { ParserDefinition } from '../../diagram-api/types.js';
|
import type { ParserDefinition } from '../../diagram-api/types.js';
|
||||||
import { log } from '../../logger.js';
|
import { log } from '../../logger.js';
|
||||||
import { populateCommonDb } from '../common/populateCommonDb.js';
|
import { populateCommonDb } from '../common/populateCommonDb.js';
|
||||||
import { db } from './db.js';
|
import type { TreemapNode, TreemapAst, TreemapDB } from './types.js';
|
||||||
import type { TreemapNode, TreemapAst } from './types.js';
|
|
||||||
import { buildHierarchy } from './utils.js';
|
import { buildHierarchy } from './utils.js';
|
||||||
|
import { TreeMapDB } from './db.js';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Populates the database with data from the Treemap AST
|
* Populates the database with data from the Treemap AST
|
||||||
* @param ast - The Treemap AST
|
* @param ast - The Treemap AST
|
||||||
*/
|
*/
|
||||||
const populate = (ast: TreemapAst) => {
|
const populate = (ast: TreemapAst, db: TreemapDB) => {
|
||||||
// We need to bypass the type checking for populateCommonDb
|
// We need to bypass the type checking for populateCommonDb
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
populateCommonDb(ast as any, db);
|
populateCommonDb(ast as any, db);
|
||||||
@@ -84,6 +84,8 @@ const getItemName = (item: { name?: string | number }): string => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const parser: ParserDefinition = {
|
export const parser: ParserDefinition = {
|
||||||
|
// @ts-expect-error - TreeMapDB is not assignable to DiagramDB
|
||||||
|
parser: { yy: undefined },
|
||||||
parse: async (text: string): Promise<void> => {
|
parse: async (text: string): Promise<void> => {
|
||||||
try {
|
try {
|
||||||
// Use a generic parse that accepts any diagram type
|
// Use a generic parse that accepts any diagram type
|
||||||
@@ -91,7 +93,13 @@ export const parser: ParserDefinition = {
|
|||||||
const parseFunc = parse as (diagramType: string, text: string) => Promise<TreemapAst>;
|
const parseFunc = parse as (diagramType: string, text: string) => Promise<TreemapAst>;
|
||||||
const ast = await parseFunc('treemap', text);
|
const ast = await parseFunc('treemap', text);
|
||||||
log.debug('Treemap AST:', ast);
|
log.debug('Treemap AST:', ast);
|
||||||
populate(ast);
|
const db = parser.parser?.yy;
|
||||||
|
if (!(db instanceof TreeMapDB)) {
|
||||||
|
throw new Error(
|
||||||
|
'parser.parser?.yy was not a TreemapDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
populate(ast, db);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
log.error('Error parsing treemap:', error);
|
log.error('Error parsing treemap:', error);
|
||||||
throw error;
|
throw error;
|
||||||
|
@@ -1,5 +1,11 @@
|
|||||||
# @mermaid-js/parser
|
# @mermaid-js/parser
|
||||||
|
|
||||||
|
## 0.6.2
|
||||||
|
|
||||||
|
### 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
|
||||||
|
|
||||||
## 0.6.1
|
## 0.6.1
|
||||||
|
|
||||||
### Patch Changes
|
### Patch Changes
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@mermaid-js/parser",
|
"name": "@mermaid-js/parser",
|
||||||
"version": "0.6.1",
|
"version": "0.6.2",
|
||||||
"description": "MermaidJS parser",
|
"description": "MermaidJS parser",
|
||||||
"author": "Yokozuna59",
|
"author": "Yokozuna59",
|
||||||
"contributors": [
|
"contributors": [
|
||||||
|
@@ -1,5 +1,28 @@
|
|||||||
# mermaid
|
# mermaid
|
||||||
|
|
||||||
|
## 11.9.0
|
||||||
|
|
||||||
|
### Minor Changes
|
||||||
|
|
||||||
|
- [#6453](https://github.com/mermaid-js/mermaid/pull/6453) [`5acbd7e`](https://github.com/mermaid-js/mermaid/commit/5acbd7e762469d9d89a9c77faf6617ee13367f3a) Thanks [@sidharthv96](https://github.com/sidharthv96)! - feat: Add `getRegisteredDiagramsMetadata` to `mermaid`, which returns all the registered diagram IDs in mermaid
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- [#6738](https://github.com/mermaid-js/mermaid/pull/6738) [`d90634b`](https://github.com/mermaid-js/mermaid/commit/d90634bf2b09e586b055729e07e9a1a31b21827c) Thanks [@shubham-mermaid](https://github.com/shubham-mermaid)! - chore: Updated TreeMapDB to use class based approach
|
||||||
|
|
||||||
|
- [#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
|
||||||
|
|
||||||
|
- [#6747](https://github.com/mermaid-js/mermaid/pull/6747) [`3e3ae08`](https://github.com/mermaid-js/mermaid/commit/3e3ae089305e1c7b9948b9e149eba6854fe7f2d6) Thanks [@darshanr0107](https://github.com/darshanr0107)! - fix: adjust sequence diagram title positioning to prevent overlap with top border in Safari
|
||||||
|
|
||||||
|
- [#6751](https://github.com/mermaid-js/mermaid/pull/6751) [`d3e2be3`](https://github.com/mermaid-js/mermaid/commit/d3e2be35be066adeb7fd502b4a24c223c3b53947) Thanks [@darshanr0107](https://github.com/darshanr0107)! - chore: Update MindmapDB to use class based approach
|
||||||
|
|
||||||
|
- [#6715](https://github.com/mermaid-js/mermaid/pull/6715) [`637680d`](https://github.com/mermaid-js/mermaid/commit/637680d4d9e39b4f8cb6f05b4cb261e8f5693ac3) Thanks [@Syn3ugar](https://github.com/Syn3ugar)! - fix(timeline): fix loading `leftMargin` from config
|
||||||
|
|
||||||
|
The `timeline.leftMargin` config value should now correctly control the size of the left margin, instead of being ignored.
|
||||||
|
|
||||||
|
- Updated dependencies [[`7a38eb7`](https://github.com/mermaid-js/mermaid/commit/7a38eb715d795cd5c66cb59357d64ec197b432e6)]:
|
||||||
|
- @mermaid-js/parser@0.6.2
|
||||||
|
|
||||||
## 11.8.1
|
## 11.8.1
|
||||||
|
|
||||||
### Patch Changes
|
### Patch Changes
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@mermaid-js/tiny",
|
"name": "@mermaid-js/tiny",
|
||||||
"version": "11.8.1",
|
"version": "11.9.0",
|
||||||
"description": "Tiny version of mermaid",
|
"description": "Tiny version of mermaid",
|
||||||
"type": "commonjs",
|
"type": "commonjs",
|
||||||
"main": "./dist/mermaid.tiny.js",
|
"main": "./dist/mermaid.tiny.js",
|
||||||
|
10
pnpm-lock.yaml
generated
10
pnpm-lock.yaml
generated
@@ -260,8 +260,8 @@ importers:
|
|||||||
specifier: ^3.2.5
|
specifier: ^3.2.5
|
||||||
version: 3.2.5
|
version: 3.2.5
|
||||||
katex:
|
katex:
|
||||||
specifier: ^0.16.9
|
specifier: ^0.16.22
|
||||||
version: 0.16.11
|
version: 0.16.22
|
||||||
khroma:
|
khroma:
|
||||||
specifier: ^2.1.0
|
specifier: ^2.1.0
|
||||||
version: 2.1.0
|
version: 2.1.0
|
||||||
@@ -7175,8 +7175,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==}
|
resolution: {integrity: sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==}
|
||||||
engines: {node: '>=12.20'}
|
engines: {node: '>=12.20'}
|
||||||
|
|
||||||
katex@0.16.11:
|
katex@0.16.22:
|
||||||
resolution: {integrity: sha512-RQrI8rlHY92OLf3rho/Ts8i/XvjgguEjOkO1BEXcU3N8BqPpSzBNwV/G0Ukr+P/l3ivvJUE/Fa/CwbS6HesGNQ==}
|
resolution: {integrity: sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
keyv@4.5.4:
|
keyv@4.5.4:
|
||||||
@@ -18830,7 +18830,7 @@ snapshots:
|
|||||||
|
|
||||||
junk@4.0.1: {}
|
junk@4.0.1: {}
|
||||||
|
|
||||||
katex@0.16.11:
|
katex@0.16.22:
|
||||||
dependencies:
|
dependencies:
|
||||||
commander: 8.3.0
|
commander: 8.3.0
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user