Rename project from numbers-study to numolus
- package.json / package-lock.json: package name "numolus" - README: new title, drop the "Case- und Designstudie" framing, update test count (331 -> 528) - localStorage keys renamed to numolus:doc:v2 / numolus:theme; the old numbers-study:* keys are still read as a fallback so existing documents and theme choices survive the rename Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,7 +1,6 @@
|
|||||||
# Numbers-Studie — Tabellenkalkulation mit eigener Formel-Engine
|
# numolus — Tabellenkalkulation mit eigener Formel-Engine
|
||||||
|
|
||||||
Eine browserbasierte Tabellenkalkulation als **Case- und Designstudie** nach dem
|
Eine browserbasierte Tabellenkalkulation nach dem Vorbild von **Apple Numbers**. Zwei Dinge stehen im Mittelpunkt:
|
||||||
Vorbild von **Apple Numbers**. Zwei Dinge stehen im Mittelpunkt:
|
|
||||||
|
|
||||||
1. **Handwerk** — eine von Grund auf selbst geschriebene, schlanke Formel-Engine
|
1. **Handwerk** — eine von Grund auf selbst geschriebene, schlanke Formel-Engine
|
||||||
(Tokenizer, Parser, AST, Abhängigkeitsgraph, Neuberechnung, Zirkelbezug-
|
(Tokenizer, Parser, AST, Abhängigkeitsgraph, Neuberechnung, Zirkelbezug-
|
||||||
@@ -13,7 +12,7 @@ Vorbild von **Apple Numbers**. Zwei Dinge stehen im Mittelpunkt:
|
|||||||
```bash
|
```bash
|
||||||
npm install
|
npm install
|
||||||
npm run dev # Vite-Devserver
|
npm run dev # Vite-Devserver
|
||||||
npm run test # Vitest-Suite (Engine + Store + IO), 331 Tests
|
npm run test # Vitest-Suite (Engine + Store + IO), 528 Tests
|
||||||
npm run build # Typecheck + Produktionsbuild
|
npm run build # Typecheck + Produktionsbuild
|
||||||
npm run lint # ESLint (flat config)
|
npm run lint # ESLint (flat config)
|
||||||
```
|
```
|
||||||
@@ -961,7 +960,7 @@ gefunden wurde, ein Fehler darin schlägt bei einem Treffer also nie durch.
|
|||||||
Platzhalter-Modus (`2`) ist nicht unterstützt. `Suchmodus`: `1` (Standard)
|
Platzhalter-Modus (`2`) ist nicht unterstützt. `Suchmodus`: `1` (Standard)
|
||||||
erster Treffer zuerst, `-1` letzter Treffer zuerst; Excels binäre
|
erster Treffer zuerst, `-1` letzter Treffer zuerst; Excels binäre
|
||||||
Suchmodi (`2`/`-2`, setzen einen sortierten Bereich voraus) sind nicht
|
Suchmodi (`2`/`-2`, setzen einen sortierten Bereich voraus) sind nicht
|
||||||
unterstützt — bei den Tabellengrößen dieser Studie ohne Vorteil. Beispiel:
|
unterstützt — bei den Tabellengrößen von numolus ohne Vorteil. Beispiel:
|
||||||
`=XLOOKUP(B7; A2:A6; C2:C6; "unbekannt")`.
|
`=XLOOKUP(B7; A2:A6; C2:C6; "unbekannt")`.
|
||||||
|
|
||||||
**Fehlermodell** (propagiert an abhängige Zellen):
|
**Fehlermodell** (propagiert an abhängige Zellen):
|
||||||
@@ -1075,13 +1074,13 @@ Grundrechenarten: `Übersicht!B2 = =SUM(Umsatz!B2:E2)`, `D2 = =B2-C2`,
|
|||||||
|
|
||||||
> **Hinweis zur Aufgabenstellung:** Die Akzeptanzliste nennt „Übersicht!B2 =
|
> **Hinweis zur Aufgabenstellung:** Die Akzeptanzliste nennt „Übersicht!B2 =
|
||||||
> 6070". Die explizit angegebene Nord-Zeile ergibt jedoch
|
> 6070". Die explizit angegebene Nord-Zeile ergibt jedoch
|
||||||
> `1200+1450+1600+1720 = 5970`. Die Studie hält sich an die explizite Tabelle;
|
> `1200+1450+1600+1720 = 5970`. numolus hält sich an die explizite Tabelle;
|
||||||
> das demonstrierte Verhalten (Sofort-Propagierung durch Übersicht, „Gesamt" und
|
> das demonstrierte Verhalten (Sofort-Propagierung durch Übersicht, „Gesamt" und
|
||||||
> das Diagramm bei Änderung von `Umsatz!B2`) ist davon unberührt.
|
> das Diagramm bei Änderung von `Umsatz!B2`) ist davon unberührt.
|
||||||
|
|
||||||
## Tests
|
## Tests
|
||||||
|
|
||||||
`npm run test` — Vitest, 331 Tests:
|
`npm run test` — Vitest, 528 Tests:
|
||||||
|
|
||||||
- **lexer / parser** — Präzedenz & Assoziativität (`^` vor `*/` vor `+-`, `^`
|
- **lexer / parser** — Präzedenz & Assoziativität (`^` vor `*/` vor `+-`, `^`
|
||||||
rechts, `-2^2 = -(2^2)`), lokale/qualifizierte/quoted Bezüge, `!` **und** `::`,
|
rechts, `-2^2 = -(2^2)`), lokale/qualifizierte/quoted Bezüge, `!` **und** `::`,
|
||||||
|
|||||||
Generated
+2
-2
@@ -1,11 +1,11 @@
|
|||||||
{
|
{
|
||||||
"name": "numbers-study",
|
"name": "numolus",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "numbers-study",
|
"name": "numolus",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"chart.js": "^4.4.6",
|
"chart.js": "^4.4.6",
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "numbers-study",
|
"name": "numolus",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
@@ -2,8 +2,12 @@ import { ref, watchEffect } from 'vue';
|
|||||||
|
|
||||||
type Mode = 'system' | 'light' | 'dark';
|
type Mode = 'system' | 'light' | 'dark';
|
||||||
|
|
||||||
const KEY = 'numbers-study:theme';
|
const KEY = 'numolus:theme';
|
||||||
const stored = (localStorage.getItem(KEY) as Mode | null) ?? 'system';
|
/** Key used before the rename to numolus -- still read as a fallback. */
|
||||||
|
const LEGACY_KEY = 'numbers-study:theme';
|
||||||
|
const stored =
|
||||||
|
((localStorage.getItem(KEY) ?? localStorage.getItem(LEGACY_KEY)) as Mode | null) ??
|
||||||
|
'system';
|
||||||
const mode = ref<Mode>(stored);
|
const mode = ref<Mode>(stored);
|
||||||
|
|
||||||
watchEffect(() => {
|
watchEffect(() => {
|
||||||
|
|||||||
@@ -80,7 +80,9 @@ import { defaultTableView, DEFAULT_ROW_H, MIN_GRID_SIZE, MAX_GRID_SIZE } from '.
|
|||||||
import { createSeedDocument } from '../data/seed';
|
import { createSeedDocument } from '../data/seed';
|
||||||
import { validateDocument } from '../io/json';
|
import { validateDocument } from '../io/json';
|
||||||
|
|
||||||
const STORAGE_KEY = 'numbers-study:doc:v2';
|
const STORAGE_KEY = 'numolus:doc:v2';
|
||||||
|
/** Key used before the rename to numolus -- still read as a fallback. */
|
||||||
|
const LEGACY_STORAGE_KEY = 'numbers-study:doc:v2';
|
||||||
|
|
||||||
const CASCADE = 28; // px offset for successive inserted objects
|
const CASCADE = 28; // px offset for successive inserted objects
|
||||||
|
|
||||||
@@ -523,7 +525,8 @@ function rewriteRefsForRename(
|
|||||||
|
|
||||||
function loadInitial(): DocumentState {
|
function loadInitial(): DocumentState {
|
||||||
try {
|
try {
|
||||||
const raw = localStorage.getItem(STORAGE_KEY);
|
const raw =
|
||||||
|
localStorage.getItem(STORAGE_KEY) ?? localStorage.getItem(LEGACY_STORAGE_KEY);
|
||||||
if (raw) {
|
if (raw) {
|
||||||
// validateDocument migrates v1, validates + *normalises* v2 (fills in
|
// validateDocument migrates v1, validates + *normalises* v2 (fills in
|
||||||
// `view` and other defaults for documents saved by an older build).
|
// `view` and other defaults for documents saved by an older build).
|
||||||
|
|||||||
Reference in New Issue
Block a user