added mermaid and a lot of cmap changes

This commit is contained in:
2026-08-27 13:13:39 +02:00
parent 20c1584016
commit 2215d1d04a
35 changed files with 6442 additions and 350 deletions
+68
View File
@@ -0,0 +1,68 @@
"use strict";
const test = require("node:test");
const assert = require("node:assert/strict");
const integration = require("../static/js/mermaid-racket-wiki.js");
function fixture(sourceText) {
let replacement = null;
const document = {
createElement() {
return {
attributes: {},
className: "",
innerHTML: "",
setAttribute(name, value) { this.attributes[name] = value; }
};
}
};
const source = {
classList: { values: [], add(value) { this.values.push(value); } },
dataset: {},
ownerDocument: document,
replaceWith(value) { replacement = value; },
title: ""
};
const code = { parentElement: source, textContent: sourceText };
const container = { querySelectorAll: () => [code] };
return { container, replacement: () => replacement, source };
}
test("initializes Mermaid with automatic rendering disabled and strict security", () => {
let config = null;
integration.initialize({ initialize(value) { config = value; } });
assert.deepEqual(config, {
startOnLoad: false,
securityLevel: "strict",
suppressErrorRendering: true
});
});
test("replaces a Mermaid code block with the rendered SVG", async () => {
const value = fixture("flowchart LR\n A --> B");
const mermaid = {
initialize() {},
async render(id, source) {
assert.match(id, /^racket-wiki-mermaid-/);
assert.equal(source, "flowchart LR\n A --> B");
return { svg: "<svg>diagram</svg>" };
}
};
await integration.hydrate(value.container, mermaid);
assert.equal(value.replacement().className, "rw-mermaid");
assert.equal(value.replacement().innerHTML, "<svg>diagram</svg>");
assert.equal(value.replacement().attributes.role, "img");
});
test("keeps invalid Mermaid source visible and marks it as an error", async () => {
const value = fixture("not a diagram");
const mermaid = {
initialize() {},
async render() { throw new Error("Parse error"); }
};
await integration.hydrate(value.container, mermaid);
assert.equal(value.replacement(), null);
assert.equal(value.source.dataset.mermaidState, "error");
assert.deepEqual(value.source.classList.values, ["rw-mermaid-error"]);
assert.equal(value.source.title, "Parse error");
});