From 614c2d3c50d920f2b7a352e38bae025d1bd6712d Mon Sep 17 00:00:00 2001 From: charlesLoder Date: Sat, 25 Jul 2026 00:10:38 -0400 Subject: [PATCH 1/3] add metadata to schema export --- src/components/transliterate/SettingsDialog.svelte | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/components/transliterate/SettingsDialog.svelte b/src/components/transliterate/SettingsDialog.svelte index 44561b9..8d22569 100644 --- a/src/components/transliterate/SettingsDialog.svelte +++ b/src/components/transliterate/SettingsDialog.svelte @@ -22,6 +22,7 @@ import { EditorView } from "@codemirror/view"; import IconInfoCircle from "@tabler/icons-svelte/icons/info-circle"; import type { SBL } from "hebrew-transliteration"; + import { version } from "hebrew-transliteration/package.json"; import { getContext } from "svelte"; import CodeMirror from "svelte-codemirror-editor"; import { toast } from "svelte-sonner"; @@ -441,7 +442,11 @@ } function export_schema() { - const schemaContent = `export const schema = ${JSON.stringify(transliteration_state.value.schema, serialize_value, 2)};`; + const schemaContent = + `// hebrew-transliteration v${version}\n// ${new Intl.DateTimeFormat( + navigator.language, + ).format(new Date())}\n` + + `export const schema = ${JSON.stringify(transliteration_state.value.schema, serialize_value, 2)};`.trim(); const blob = new Blob([schemaContent], { type: "text/javascript" }); const url = URL.createObjectURL(blob); const a = document.createElement("a"); From 30ac169294f3f5763e89651b9d18dc97fab4ad0c Mon Sep 17 00:00:00 2001 From: charlesLoder Date: Tue, 28 Jul 2026 15:59:51 -0400 Subject: [PATCH 2/3] update serialization with library --- package-lock.json | 10 ++++ package.json | 1 + .../transliterate/SettingsDialog.svelte | 48 ++----------------- 3 files changed, 14 insertions(+), 45 deletions(-) diff --git a/package-lock.json b/package-lock.json index 431eee7..22e375e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,7 @@ "google-auth-library": "^10.7.0", "google-spreadsheet": "^5.3.0", "hebrew-transliteration": "^2.11.0", + "serialize-javascript": "^7.0.7", "svelte-codemirror-editor": "^2.1.0", "tailwindcss": "^4.3.1", "typescript": "^6.0.3" @@ -12835,6 +12836,15 @@ "node": ">=10" } }, + "node_modules/serialize-javascript": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.7.tgz", + "integrity": "sha512-YAy8Od6KV+uuwUuU50np8fGB/Aues6Y0nAhA9y/hId74PlKUcme4pXcBD46NWKr1Q4osN/iseZ17YqO1XfmI8g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", diff --git a/package.json b/package.json index 6e51292..8d3f30b 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "google-auth-library": "^10.7.0", "google-spreadsheet": "^5.3.0", "hebrew-transliteration": "^2.11.0", + "serialize-javascript": "^7.0.7", "svelte-codemirror-editor": "^2.1.0", "tailwindcss": "^4.3.1", "typescript": "^6.0.3" diff --git a/src/components/transliterate/SettingsDialog.svelte b/src/components/transliterate/SettingsDialog.svelte index 8d22569..4d8beff 100644 --- a/src/components/transliterate/SettingsDialog.svelte +++ b/src/components/transliterate/SettingsDialog.svelte @@ -23,6 +23,7 @@ import IconInfoCircle from "@tabler/icons-svelte/icons/info-circle"; import type { SBL } from "hebrew-transliteration"; import { version } from "hebrew-transliteration/package.json"; + import serialize from "serialize-javascript"; import { getContext } from "svelte"; import CodeMirror from "svelte-codemirror-editor"; import { toast } from "svelte-sonner"; @@ -220,16 +221,6 @@ return String(val); } - function serialize_value(key: string, value: unknown): unknown { - if (value instanceof RegExp) { - return `new RegExp(${JSON.stringify(value.source)}, ${JSON.stringify(value.flags)})`; - } - if (typeof value === "function") { - return `(${value.toString()})`; - } - return value; - } - function is_modified(): boolean { return !!transliteration_state.value.modified_schema_base; } @@ -386,9 +377,8 @@ return; } const schemaObj = eval(`(${match[1]})`) as SBL; - const reconstructed_schema = reconstruct_special_values(schemaObj) as SBL; transliteration_state.value.schema = { - ...reconstructed_schema, + ...schemaObj, }; transliteration_state.value.modified_schema_base = ""; } catch (err) { @@ -398,38 +388,6 @@ reader.readAsText(file); } - function reconstruct_special_values(obj: unknown): unknown { - if (Array.isArray(obj)) { - return obj.map(reconstruct_special_values); - } - if (obj && typeof obj === "object") { - const result: Record = {}; - for (const [key, value] of Object.entries(obj)) { - if (typeof value === "string") { - if (/^new RegExp\(/.test(value)) { - try { - result[key] = eval(value); - } catch { - result[key] = value; - } - } else if (/^\(.*\) =>/.test(value) || /^function\(/.test(value)) { - try { - result[key] = eval(value); - } catch { - result[key] = value; - } - } else { - result[key] = value; - } - } else { - result[key] = reconstruct_special_values(value); - } - } - return result; - } - return obj; - } - function clear_custom_schema() { custom_schema_filename = ""; custom_upload_visibility = "hidden"; @@ -446,7 +404,7 @@ `// hebrew-transliteration v${version}\n// ${new Intl.DateTimeFormat( navigator.language, ).format(new Date())}\n` + - `export const schema = ${JSON.stringify(transliteration_state.value.schema, serialize_value, 2)};`.trim(); + `export const schema = ${serialize(transliteration_state.value.schema, { space: 2 })};`.trim(); const blob = new Blob([schemaContent], { type: "text/javascript" }); const url = URL.createObjectURL(blob); const a = document.createElement("a"); From 34653a88e232da75109fec5386b578cf406aed1f Mon Sep 17 00:00:00 2001 From: charlesLoder Date: Tue, 28 Jul 2026 16:00:49 -0400 Subject: [PATCH 3/3] update param color in callback editor --- src/components/transliterate/FeatureEditor.svelte | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/transliterate/FeatureEditor.svelte b/src/components/transliterate/FeatureEditor.svelte index 71dd156..380b72f 100644 --- a/src/components/transliterate/FeatureEditor.svelte +++ b/src/components/transliterate/FeatureEditor.svelte @@ -104,6 +104,9 @@ ".cm-completionDetail": { color: "var(--muted-foreground)", }, + ".ͼg": { + color: "#7878f7", + }, }), ];