@riebeckite/plugin-mermaid 0.0.30 → 0.0.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -6,6 +6,8 @@ Mermaid diagram rendering for ` ```mermaid ` code blocks.
6
6
 
7
7
  [日本語](./README_ja.md)
8
8
 
9
+ For static SVG rendering without a headless browser, see [Mermaid (Pele)](../mermaid-pele/README.md).
10
+
9
11
  ## Overview
10
12
 
11
13
  `mermaid()` replaces mermaid code blocks with a `<figure class="rr-mermaid">`
package/README_ja.md CHANGED
@@ -6,6 +6,8 @@
6
6
 
7
7
  [English](./README.md)
8
8
 
9
+ ヘッドレスブラウザを使わずに静的 SVG を生成したい場合は [Mermaid (Pele)](../mermaid-pele/README_ja.md) を使ってください。
10
+
9
11
  ## 設定する
10
12
 
11
13
  ```ts
package/dist/client.js CHANGED
@@ -1,27 +1,32 @@
1
1
  // src/init.ts
2
2
  var DEFAULT_THEME = { light: "default", dark: "dark" };
3
3
  var DEFAULT_SCRIPT_URL = "https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.min.js";
4
- async function initMermaidDiagrams(options = {}) {
4
+ async function initMermaidDiagrams(context = {}) {
5
+ const options = context.config ?? {};
6
+ const root = context.root ?? document;
5
7
  const mermaid = options.mermaid ?? await loadMermaid(options.scriptUrl);
6
8
  if (!mermaid) return;
9
+ if (context.signal?.aborted) return;
7
10
  mermaid.initialize({
8
11
  startOnLoad: false,
9
12
  securityLevel: "strict",
10
13
  theme: selectTheme(options.theme ?? DEFAULT_THEME)
11
14
  });
12
- const diagrams = document.querySelectorAll(
15
+ const diagrams = root.querySelectorAll(
13
16
  '.rr-mermaid[data-mermaid="pending"]'
14
17
  );
15
18
  for (const [index, diagram] of Array.from(diagrams).entries()) {
16
- await renderDiagram(mermaid, diagram, index);
19
+ if (context.signal?.aborted || !diagram.isConnected) return;
20
+ await renderDiagram(mermaid, diagram, index, context.signal);
17
21
  }
18
22
  }
19
- async function renderDiagram(mermaid, diagram, index) {
23
+ async function renderDiagram(mermaid, diagram, index, signal) {
20
24
  const source = diagram.dataset.mermaidSource;
21
25
  const canvas = diagram.querySelector(".rr-mermaid__canvas");
22
26
  if (!source || !canvas) return;
23
27
  try {
24
28
  const { svg } = await mermaid.render(`rr-mermaid-client-${index}`, source);
29
+ if (signal?.aborted || !diagram.isConnected) return;
25
30
  canvas.innerHTML = svg;
26
31
  diagram.removeAttribute("data-mermaid");
27
32
  } catch {
package/dist/index.js CHANGED
@@ -14,52 +14,24 @@ var __export = (target, all) => {
14
14
  };
15
15
 
16
16
  // src/hast.ts
17
- function visitElements(node, visitor, parent, index) {
18
- if (isElementNode(node)) visitor(node, parent, index);
19
- for (const [childIndex, child] of [...getChildren(node)].entries()) {
20
- visitElements(
21
- child,
22
- visitor,
23
- hasChildren(node) ? node : parent,
24
- childIndex
25
- );
26
- }
27
- }
28
- function element(tagName, properties = {}, children = []) {
29
- return { type: "element", tagName, properties, children };
30
- }
31
- function text(value) {
32
- return { type: "text", value };
33
- }
34
- function getTextContent(node) {
35
- if (node.type === "text" && "value" in node && typeof node.value === "string") {
36
- return node.value;
37
- }
38
- return getChildren(node).map(getTextContent).join("");
39
- }
40
- function getStringProperty(node, key) {
41
- const value = node.properties?.[key];
42
- if (typeof value === "string") return value;
43
- if (Array.isArray(value)) return value.join(" ");
44
- return null;
45
- }
46
- function hasClass(node, className) {
47
- const value = node.properties?.className;
48
- const classes = Array.isArray(value) ? value.map(String) : typeof value === "string" ? value.split(/\s+/) : [];
49
- return classes.includes(className);
50
- }
51
- function isElementNode(node) {
52
- return node.type === "element";
53
- }
54
- function hasChildren(node) {
55
- return Array.isArray(node.children);
56
- }
57
- function getChildren(node) {
58
- const children = node.children;
59
- return Array.isArray(children) ? children : [];
60
- }
17
+ import {
18
+ element as sharedElement,
19
+ getStringProperty as sharedGetStringProperty,
20
+ getTextContent as sharedGetTextContent,
21
+ hasClass as sharedHasClass,
22
+ mergeClassName as sharedMergeClassName,
23
+ text as sharedText,
24
+ visitElements as sharedVisitElements
25
+ } from "@riebeckite/diagram";
26
+ var element, text, getTextContent, getStringProperty, hasClass, visitElements;
61
27
  var init_hast = __esm({
62
28
  "src/hast.ts"() {
29
+ element = sharedElement;
30
+ text = sharedText;
31
+ getTextContent = sharedGetTextContent;
32
+ getStringProperty = sharedGetStringProperty;
33
+ hasClass = sharedHasClass;
34
+ visitElements = sharedVisitElements;
63
35
  }
64
36
  });
65
37
 
@@ -73,6 +45,7 @@ function rehypeMermaid(options = {}, session) {
73
45
  const renderMode = options.render ?? "build";
74
46
  const theme = options.theme ?? DEFAULT_THEME;
75
47
  return async (tree, file) => {
48
+ assertNoPeleRenderer(tree);
76
49
  const replacements = [];
77
50
  visitElements(tree, (node, parent, index) => {
78
51
  if (!parent || index === void 0 || !isMermaidCodeBlock(node)) return;
@@ -144,12 +117,26 @@ function buildFigure(input) {
144
117
  "figure",
145
118
  {
146
119
  className: "rr-mermaid",
120
+ dataRiebeckiteMermaidRenderer: "mermaid",
147
121
  dataMermaid: input.clientFallback && !input.staticSvg ? "pending" : void 0,
148
122
  dataMermaidSource: input.clientFallback && !input.staticSvg ? input.source : void 0
149
123
  },
150
124
  children
151
125
  );
152
126
  }
127
+ function assertNoPeleRenderer(tree) {
128
+ let hasPeleRenderer = false;
129
+ visitElements(tree, (node) => {
130
+ if (node.properties?.dataRiebeckiteMermaidRenderer === "pele") {
131
+ hasPeleRenderer = true;
132
+ }
133
+ });
134
+ if (hasPeleRenderer) {
135
+ throw new Error(
136
+ "@riebeckite/plugin-mermaid and @riebeckite/plugin-mermaid-pele cannot be enabled together. Enable exactly one Mermaid renderer."
137
+ );
138
+ }
139
+ }
153
140
  async function renderStaticSvg(id, source, theme, file, session) {
154
141
  try {
155
142
  const result = await session.render(
@@ -523,7 +510,10 @@ function mermaid(options = {}) {
523
510
  createClientEntry(
524
511
  "mermaid",
525
512
  "@riebeckite/plugin-mermaid/client",
526
- "initMermaidDiagrams"
513
+ "initMermaidDiagrams",
514
+ void 0,
515
+ void 0,
516
+ "context"
527
517
  )
528
518
  ]
529
519
  });
@@ -1,8 +1,9 @@
1
+ import { mergeClassName as sharedMergeClassName } from "@riebeckite/diagram";
1
2
  import type { ElementNode, HastNode, ParentNode, TextNode } from "./types.js";
2
- export declare function visitElements(node: HastNode, visitor: (node: ElementNode, parent?: ParentNode, index?: number) => void, parent?: ParentNode, index?: number): void;
3
- export declare function element(tagName: string, properties?: Record<string, unknown>, children?: HastNode[]): ElementNode;
4
- export declare function text(value: string): TextNode;
5
- export declare function getTextContent(node: HastNode): string;
6
- export declare function getStringProperty(node: ElementNode, key: string): string | null;
7
- export declare function hasClass(node: ElementNode, className: string): boolean;
8
- export declare function mergeClassName(current: unknown, next: string): string;
3
+ export declare const element: (tagName: string, properties?: Record<string, unknown>, children?: HastNode[]) => ElementNode;
4
+ export declare const text: (value: string) => TextNode;
5
+ export declare const getTextContent: (node: HastNode) => string;
6
+ export declare const getStringProperty: (node: ElementNode, key: string) => string | null;
7
+ export declare const hasClass: (node: ElementNode, className: string) => boolean;
8
+ export declare const visitElements: (node: HastNode, visitor: (node: ElementNode, parent?: ParentNode, index?: number) => void, parent?: ParentNode, index?: number) => void;
9
+ export declare const mergeClassName: typeof sharedMergeClassName;
@@ -1,2 +1,8 @@
1
1
  import type { MermaidClientOptions } from "./types.js";
2
- export declare function initMermaidDiagrams(options?: MermaidClientOptions): Promise<void>;
2
+ type ClientContext = {
3
+ root?: ParentNode;
4
+ signal?: AbortSignal;
5
+ config?: MermaidClientOptions;
6
+ };
7
+ export declare function initMermaidDiagrams(context?: ClientContext): Promise<void>;
8
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@riebeckite/plugin-mermaid",
3
- "version": "0.0.30",
3
+ "version": "0.0.32",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -23,7 +23,8 @@
23
23
  "dependencies": {
24
24
  "mermaid": "^11.12.2",
25
25
  "puppeteer": "^25.11.0",
26
- "@riebeckite/core": "0.0.30"
26
+ "@riebeckite/core": "0.0.32",
27
+ "@riebeckite/diagram": "0.0.32"
27
28
  },
28
29
  "publishConfig": {
29
30
  "access": "public"