diff --git a/.gitignore b/.gitignore index b8505f2..59d04ee 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,7 @@ src-tauri/target/ src-tauri/gen/ *.log -# local reference copy of the original macOS Numi bundle — not ours to ship +# local reference copy of a third-party macOS bundle — not ours to ship Contents/ # one-off debugging artifacts diff --git a/package-lock.json b/package-lock.json index 7c389b4..7e874ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "numi-windows", + "name": "summarum", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "numi-windows", + "name": "summarum", "version": "1.0.0", "dependencies": { "@codemirror/autocomplete": "^6.18.0", diff --git a/src-tauri/extension-sample.js b/src-tauri/extension-sample.js index 26dc6b4..c3eab38 100644 --- a/src-tauri/extension-sample.js +++ b/src-tauri/extension-sample.js @@ -1,7 +1,6 @@ // Summarum extension example. // Drop .js files into this folder and restart the app. -// The API is compatible with Numi extensions: numi.setVariable, -// numi.addUnit, numi.addFunction. +// API: numi.setVariable, numi.addUnit, numi.addFunction. // A global variable usable on any sheet, e.g. `salary * vat` // numi.setVariable("vat", { "double": 20 }); diff --git a/src/engine/edge.test.ts b/src/engine/edge.test.ts index 0bb7c16..d0e7852 100644 --- a/src/engine/edge.test.ts +++ b/src/engine/edge.test.ts @@ -81,7 +81,7 @@ describe("edge cases", () => { }); }); -describe("extra units (beyond original Numi)", () => { +describe("extra units", () => { it("speed", () => { expect(calc("100 km/h in mph")).toBe("62.14 mph"); expect(calc("60 mph in km/h")).toBe("96.56 km/h"); diff --git a/src/engine/engine.test.ts b/src/engine/engine.test.ts index 5da94d8..8a6c75f 100644 --- a/src/engine/engine.test.ts +++ b/src/engine/engine.test.ts @@ -49,7 +49,7 @@ describe("arithmetic", () => { it("scales", () => { expect(calc("1.5 million")).toBe("1,500,000"); expect(calc("5k")).toBe("5,000"); - expect(calc("2 dozen")).toBe("2"); // dozen is not in Numi vocab — noise + expect(calc("2 dozen")).toBe("2"); // dozen is not in the vocab — noise }); it("free text around math is ignored", () => { expect(calc("I spent 20 on pizza plus 5 on coffee")).toBe("25"); diff --git a/src/engine/evaluator.ts b/src/engine/evaluator.ts index 23f8690..8c2fdae 100644 --- a/src/engine/evaluator.ts +++ b/src/engine/evaluator.ts @@ -419,7 +419,7 @@ function evalAgg(name: "sum" | "avg" | "prev", ctx: EvalCtx): Value { acc = numericAdd(acc, item, 1); counted++; } catch { - // skip lines with incompatible dimensions, as Numi does + // skip lines with incompatible dimensions } } if (name === "avg") return qty(acc.value.div(counted), acc.unit); diff --git a/src/engine/registry.ts b/src/engine/registry.ts index 0a4e624..4deffc5 100644 --- a/src/engine/registry.ts +++ b/src/engine/registry.ts @@ -175,7 +175,7 @@ export function buildRegistry(): Registry { reg.addPhrase("mod", { t: "op", op: "mod" }, { caseSensitive: false }); reg.addPhrase("modulo", { t: "op", op: "mod" }, { caseSensitive: false }); - // bitwise: "and" stays an addition word (original Numi), so & | xor shl shr + // bitwise: "and" stays an addition word, so & | xor shl shr reg.addPhrase("xor", { t: "bitop", op: "bxor" }, { caseSensitive: false }); reg.addPhrase("or", { t: "bitop", op: "bor" }, { caseSensitive: false }); reg.addPhrase("shl", { t: "bitop", op: "shl" }, { caseSensitive: false }); diff --git a/src/extensions.ts b/src/extensions.ts index e7d9214..176a7e6 100644 --- a/src/extensions.ts +++ b/src/extensions.ts @@ -1,4 +1,4 @@ -// JS extensions runtime (Numi-compatible API): numi.setVariable, +// JS extensions runtime: numi.setVariable, // numi.addUnit, numi.addFunction. Scripts share the engine's JS runtime. import { SumEngine, ExtensionUnitSpec, ExtensionValue } from "./engine"; diff --git a/src/main.ts b/src/main.ts index 248d192..98c155f 100644 --- a/src/main.ts +++ b/src/main.ts @@ -433,9 +433,9 @@ function toast(msg: string): void { async function boot(): Promise { settings = await loadSettings(); - if (!localStorage.getItem("numi.langInit") && settings.language === "en") { + if (!localStorage.getItem("summarum.langInit") && settings.language === "en") { settings.language = detectLang(); - localStorage.setItem("numi.langInit", "1"); + localStorage.setItem("summarum.langInit", "1"); } engine = new SumEngine({ precision: settings.precision, groupSeparator: settings.groupSeparator }); diff --git a/src/storage.ts b/src/storage.ts index 1010b9d..36c73cc 100644 --- a/src/storage.ts +++ b/src/storage.ts @@ -66,7 +66,7 @@ export async function loadSettings(): Promise { try { const raw = isTauri() ? await invoke("load_file", { name: "settings.json" }) - : localStorage.getItem("numi.settings"); + : localStorage.getItem("summarum.settings"); if (raw) return { ...defaultSettingsData, ...JSON.parse(raw) }; } catch (e) { console.warn("loadSettings failed", e); @@ -77,7 +77,7 @@ export async function loadSettings(): Promise { export async function saveSettings(s: SettingsData): Promise { const raw = JSON.stringify(s, null, 2); if (isTauri()) await invoke("save_file", { name: "settings.json", contents: raw }); - else localStorage.setItem("numi.settings", raw); + else localStorage.setItem("summarum.settings", raw); } // ---------- documents @@ -86,7 +86,7 @@ export async function loadAppData(dataDir: string): Promise { try { const raw = isTauri() ? await invoke("load_documents", { dir: dirArg(dataDir) }) - : localStorage.getItem("numi.documents"); + : localStorage.getItem("summarum.documents"); if (raw) return JSON.parse(raw); } catch (e) { console.warn("loadAppData failed", e); @@ -120,7 +120,7 @@ export async function flushAppData(): Promise { pendingData = null; try { if (isTauri()) await invoke("save_documents", { dir: dirArg(currentDataDir), contents: raw }); - else localStorage.setItem("numi.documents", raw); + else localStorage.setItem("summarum.documents", raw); } catch (e) { console.warn("saveAppData failed", e); }