Merge pull request #2393 from x-delfino/d2js-unicode

d2js: support unicode characters
This commit is contained in:
Alexander Wang 2025-03-04 07:24:23 -08:00 committed by GitHub
commit a77602329a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 20 additions and 2 deletions

View file

@ -32,3 +32,4 @@
- fixes panic when comment lines appear in arrays [#2378](https://github.com/terrastruct/d2/pull/2378)
- fixes inconsistencies when objects were double quoted [#2390](https://github.com/terrastruct/d2/pull/2390)
- CLI: fetch and render remote images of mimetype octet-stream correctly [#2370](https://github.com/terrastruct/d2/pull/2370)
- d2js: handle unicode characters [#2393](https://github.com/terrastruct/d2/pull/2393)

View file

@ -54,7 +54,10 @@ export function setupMessageHandler(isNode, port, initWasm) {
const result = await d2.render(JSON.stringify(data));
const response = JSON.parse(result);
if (response.error) throw new Error(response.error.message);
currentPort.postMessage({ type: "result", data: atob(response.data) });
const decoded = new TextDecoder().decode(
Uint8Array.from(atob(response.data), (c) => c.charCodeAt(0))
);
currentPort.postMessage({ type: "result", data: decoded });
} catch (err) {
currentPort.postMessage({ type: "error", error: err.message });
}

View file

@ -49,7 +49,10 @@ export function setupMessageHandler(isNode, port, initWasm) {
const result = await d2.render(JSON.stringify(data));
const response = JSON.parse(result);
if (response.error) throw new Error(response.error.message);
currentPort.postMessage({ type: "result", data: atob(response.data) });
const decoded = new TextDecoder().decode(
Uint8Array.from(atob(response.data), (c) => c.charCodeAt(0))
);
currentPort.postMessage({ type: "result", data: decoded });
} catch (err) {
currentPort.postMessage({ type: "error", error: err.message });
}

View file

@ -171,6 +171,17 @@ layers: {
await d2.worker.terminate();
}, 20000);
test("unicode characters work", async () => {
const d2 = new D2();
const result = await d2.compile("こんにちは -> ♒️");
const svg = await d2.render(result.diagram);
expect(svg).toContain("<svg");
expect(svg).toContain("</svg>");
expect(svg).toContain("こんにちは");
expect(svg).toContain("♒️");
await d2.worker.terminate();
}, 20000);
test("handles syntax errors correctly", async () => {
const d2 = new D2();
try {