feat: XOR-Gruppen (=) — genau eine Alternative (SPEC §3, D35)
Parser erkennt `=` als disjunktives Gate (nur mit folgendem Leerraum — `=SUMME(…)` bleibt Label); Mischungen melden mixedGate wie gehabt. Die XOR-Regel warnt je WEITERER realisierter Alternative (xorConflict mit Zeilennummer; realisiert = [~]/[/]/[x]/[^], siehe D35). Darstellung erbt die komplette any-of-Geometrie (ul class="or xor"), ergänzt um eine „1"-Plakette am Austritt der Sammelleiste — auch im Grafikexport. Legende (+ hint_root) und Warntext in allen 9 Sprachen; SPEC §11-Eintrag in §1/§3/§9 überführt; 13 neue Tests (tests/xor.test.js). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
2754fa40f6
commit
d276c94840
@@ -1624,3 +1624,39 @@ der Kandidaten nötig gewesen.
|
||||
nachdenken will (D32).
|
||||
- **`°`** — fehlt auf US-Layouts, und der kleine Kreis kollidierte semantisch
|
||||
mit dem hohlen Kreis, der im Diagramm bereits *optional* bedeutet (D29).
|
||||
|
||||
## D35 — XOR (`=`) umgesetzt: „realisiert“ definiert, „1“-Plakette, keine neue Linienart
|
||||
Das in D34 entschiedene XOR-Gate ist gebaut (SPEC §1/§3/§9); beim Bauen waren
|
||||
drei Dinge zu entscheiden, die die SPEC bis dahin offen ließ:
|
||||
|
||||
**„Realisiert“ heißt: Kosten investiert oder mehr** — Status `[~]`, `[/]`,
|
||||
`[x]`, `[^]`. Die XOR-Regel („genau eine Alternative darf realisiert werden“)
|
||||
soll genau dann anschlagen, wenn der Plan tatsächlich doppelt einkauft — und
|
||||
das beginnt mit `[~]`: Wer an zwei Alternativen zugleich **arbeitet**, verletzt
|
||||
das „genau eine“ bereits, nicht erst beim zweiten `[x]`. `[?]`, `[ ]` und `[!]`
|
||||
sind Absicht ohne Investition, `[-]` ist die Entscheidung dagegen, neutral sagt
|
||||
nichts — alle fünf zählen nicht. Gemeldet wird **jede weitere** realisierte
|
||||
Alternative einzeln (Warnung `xorConflict` mit ihrer Zeilennummer und ihrem
|
||||
Label): Die Meldung zeigt so auf die Zeile, die man ansehen muss, statt
|
||||
pauschal auf die Gruppe. Bewusst eine **Warnung, kein Fehler** — die Notation
|
||||
bleibt fehlertolerant (§4), der Baum wird unverändert dargestellt.
|
||||
|
||||
**Kennzeichnung: „1“-Plakette am Austritt der Sammelleiste.** Der D34-Nachtrag
|
||||
hielt fest, dass `=` optisch bei der konjunktiven Familie steht und das
|
||||
Diagramm die Lesart korrigieren muss. Die Linien übernehmen das schon
|
||||
(gestrichelt grau wie any-of); die Plakette — kleiner weißer Kreis, graue
|
||||
Ziffer, auf dem Leitungsstück zwischen Elternknoten und erstem Abzweig — sagt
|
||||
das „genau eine“, das der Linienstil allein nicht sagen kann. Grau statt
|
||||
Petrol, weil sie zur Gate-Codierung gehört (D15: keine Signalfarbe im
|
||||
Diagramm); an der Sammelleiste statt am Knoten, weil sie eine Aussage über die
|
||||
**Gruppe** ist und die Knoten-Ecken belegt sind (D18). Sie erscheint auch im
|
||||
Grafikexport (dort nach den Knoten gezeichnet, wie der Optional-Kreis aus D29).
|
||||
|
||||
**Keine neue Linienart, keine neue CSS-Familie:** Der Renderer gibt
|
||||
XOR-Gruppen als `<ul class="or xor">` aus — die gesamte any-of-Geometrie
|
||||
(alle drei Modi, D18-Sonderfälle, Export-Routing) gilt damit automatisch;
|
||||
`.xor` ergänzt nur die Plakette. Die Alternative — ein eigener Gruppentyp mit
|
||||
kopierten Regeln — hätte jede künftige Layoutänderung doppelt pflegen lassen.
|
||||
Im Modell ist `'xor'` ein eigener Gate-Wert (`gateOf`), damit die
|
||||
`mixedGate`-Warnung Mischungen mit `|` von selbst meldet; alle
|
||||
Disjunktiv-Abfragen prüfen `!== 'and'`.
|
||||
|
||||
+1
-1
@@ -138,7 +138,7 @@ Pfad, der die Wahrheit sagt.
|
||||
- **XOR** (`=`) — neben „mindestens eine" (`|`) eine Gruppe, in der **genau
|
||||
eine** Alternative realisiert werden darf. Für die Pfadrechnung ändert das
|
||||
nichts (die wählt bei `|` ohnehin eine); es kommt eine Regel hinzu, die
|
||||
verletzt werden kann und dann gemeldet wird.
|
||||
verletzt werden kann und dann gemeldet wird. **Umgesetzt** (SPEC §3, D35).
|
||||
- **Knotenbeschreibungen** — Erläuterungstext zum Knoten, im Diagramm als
|
||||
Tooltip oder Pop-up: kurz direkt beim Knoten, lang als Block am Dokumentende
|
||||
über die ID zugeordnet. Die Arbeit steckt nicht im Anzeigen, sondern in der
|
||||
|
||||
+27
-31
@@ -14,7 +14,8 @@ Alle Bestandteile außer dem Label sind optional. Die Extraktion erfolgt in
|
||||
dieser Reihenfolge (wichtig für Kollisionsfreiheit):
|
||||
|
||||
1. Kommentar entfernen: alles ab `%%` bis Zeilenende.
|
||||
2. Einrückung, Zeichen (`-` / `+` / `|`) und Statusbox `[…]` per Zeilen-Regex.
|
||||
2. Einrückung, Zeichen (`-` / `+` / `|` / `=`) und Statusbox `[…]` per
|
||||
Zeilen-Regex; `=` nur mit folgendem Leerraum (§3).
|
||||
3. URL: erstes Token, das auf `https?://\S+` passt (dadurch stören `@` in URLs nicht).
|
||||
4. Größe: erstes `(XS|S|M|L|XL|XXL)`, Groß-/Kleinschreibung egal.
|
||||
5. Tags: alle `@name`-Vorkommen.
|
||||
@@ -41,7 +42,7 @@ hat etwas, das ein Cursor nicht hat: **alle** sehen dieselbe Stelle.
|
||||
Referenz-Regex der Implementierung:
|
||||
|
||||
```
|
||||
^([ \t]*)([-|+])?\s*(?:\[([ ?~xX^/-])\]\s*)?(.*)$
|
||||
^([ \t]*)([-|+]|=(?=[ \t]))?\s*(?:\[([ ?~xX^/-])\]\s*)?(.*)$
|
||||
```
|
||||
|
||||
Für die Fokusmarke (Schritt 6):
|
||||
@@ -55,8 +56,8 @@ Für die Fokusmarke (Schritt 6):
|
||||
- Die Einrückung bestimmt die Ebene. Es gibt keine feste Schrittweite:
|
||||
Elternknoten ist die nächste vorangehende Zeile mit **kleinerer**
|
||||
Einrückungsbreite (Tab zählt als 2 Leerzeichen).
|
||||
- Zeilen ohne Zeichen (`-`/`+`/`|`) sind Wurzelknoten. Mehrere Wurzeln = mehrere
|
||||
Bäume nebeneinander.
|
||||
- Zeilen ohne Zeichen (`-`/`+`/`|`/`=`) sind Wurzelknoten. Mehrere Wurzeln =
|
||||
mehrere Bäume nebeneinander.
|
||||
|
||||
## 3. Zerlegungsart (Gate)
|
||||
|
||||
@@ -65,14 +66,26 @@ Für die Fokusmarke (Schritt 6):
|
||||
| `-` | all of (Und-Zerlegung) | Alle Teilpakete sind erforderlich. |
|
||||
| `+` | optional (Zugabe) | Einzelnes zusätzliches Teilpaket, nicht erforderlich. |
|
||||
| `\|` | any of (Oder-Zerlegung) | Mindestens eine Alternative wird gewählt. |
|
||||
| `=` | exactly one (XOR-Zerlegung) | Genau eine Alternative wird realisiert. |
|
||||
|
||||
- `-` und `|` sind Eigenschaften der **Geschwistergruppe**; `+` ist eine
|
||||
- `-`, `|` und `=` sind Eigenschaften der **Geschwistergruppe**; `+` ist eine
|
||||
Eigenschaft des **einzelnen Knotens** (er hängt an derselben Und-Zerlegung,
|
||||
ist darin aber entbehrlich).
|
||||
- Daraus folgt die Mischregel: Eine Gruppe ist entweder **konjunktiv** — dann
|
||||
dürfen `-` und `+` frei nebeneinander stehen — oder **disjunktiv** (`|`).
|
||||
`|` mit `-`/`+` zu mischen ist ungültig: Darstellung nach dem **ersten** Kind,
|
||||
plus Warnung `mixedGate` mit Zeilennummer.
|
||||
dürfen `-` und `+` frei nebeneinander stehen — oder **disjunktiv**
|
||||
(einheitlich `|` oder einheitlich `=`). Jede andere Mischung ist ungültig:
|
||||
Darstellung nach dem **ersten** Kind, plus Warnung `mixedGate` mit
|
||||
Zeilennummer.
|
||||
- **Leerraum-Regel:** Als Gate wird `=` nur mit **folgendem Leerraum** erkannt —
|
||||
ein Label wie `=SUMME(A1:B2)` bleibt damit ein Label. `=` ist das einzige
|
||||
Gate, das diese Regel braucht; für `-`/`+`/`|` ändert sich nichts.
|
||||
- **XOR-Regel:** In einer `=`-Gruppe darf genau **eine** Alternative realisiert
|
||||
werden. **Realisiert** heißt: Kosten sind investiert oder mehr — Status `[~]`,
|
||||
`[/]`, `[x]` oder `[^]` (§4); `[?]`, `[ ]`, `[!]`, `[-]` und neutrale Knoten
|
||||
zählen nicht. Jede **weitere** realisierte Alternative ergibt eine Warnung
|
||||
`xorConflict` mit ihrer Zeilennummer. Die Regel ist verletzbar, kein
|
||||
Parse-Fehler: Der Baum wird unverändert dargestellt. Für den günstigsten
|
||||
Pfad (§9) verhält sich `=` wie `|` — der wählt ohnehin genau eine.
|
||||
- Ein `+`-Knoten zerlegt sich weiter wie jeder andere; das Gate seiner eigenen
|
||||
Kinder ist davon unabhängig. Optionalität vererbt sich nicht ausdrücklich —
|
||||
wer unter einem `+`-Knoten hängt, ist mit ihm zusammen entbehrlich.
|
||||
@@ -155,6 +168,12 @@ nebeneinander (schmales Diagramm rechts).
|
||||
ist grau (`#6B7A8C`) — kein Petrol mehr im Diagramm. Der Modus ändert nur die
|
||||
**Anordnung**, nicht die Linienfarbe.
|
||||
|
||||
**XOR-Gruppen (`=`, §3)** werden wie any-of gezeichnet (gestrichelt in Grau,
|
||||
gleiche Anordnung). Zusätzlich sitzt am **Austritt der Sammelleiste** — auf dem
|
||||
Stück zwischen Elternknoten und erstem Abzweig — eine kleine **„1“-Plakette**
|
||||
(weißer Kreis mit grauem Rand, graue Ziffer): „genau eine“. Sie erscheint auch
|
||||
im Grafikexport. Siehe D35.
|
||||
|
||||
**Optionale Knoten (`+`, §3):** Sie hängen an der normalen all-of-Zerlegung,
|
||||
die Anordnung bleibt unverändert. Zwei Kennzeichen, beide auch im Grafikexport:
|
||||
|
||||
@@ -596,29 +615,6 @@ die Rechnung schwerer als heute — siehe D34.
|
||||
Zerlegungszeichen — und ob eingeklappte Teilbäume in Grafikexport und Druck
|
||||
eingeklappt bleiben.
|
||||
|
||||
### XOR — genau eine Alternative (`=`)
|
||||
|
||||
Neben `-` (all of), `+` (Zugabe) und `|` (any of, **mindestens** eine) soll es
|
||||
eine Gruppe geben, in der **genau eine** Alternative realisiert werden darf.
|
||||
Zeichen: **`=`**, an derselben Stelle wie die übrigen Zerlegungszeichen
|
||||
(entschieden; Begründung und verworfene Kandidaten: D34-Nachtrag).
|
||||
|
||||
- Für den günstigsten Pfad ändert das nichts: Der wählt bei `|` ohnehin genau
|
||||
eine (§9). XOR fügt eine **Regel** hinzu, die verletzt werden kann — zwei
|
||||
realisierte Alternativen ergeben eine Warnung.
|
||||
- `=` ist **disjunktiv** wie `|`; die Mischregel aus §3 gilt entsprechend:
|
||||
Eine Gruppe ist einheitlich `-`/`+`, einheitlich `|` oder einheitlich `=` —
|
||||
jede Mischung mit `=` ist ungültig (`mixedGate`). Auch die Darstellung folgt
|
||||
any-of (gestrichelt in Grau); wie die Gruppe zusätzlich als „genau eine"
|
||||
gekennzeichnet wird, ist offen (z. B. eine kleine „1" an der Sammelleiste).
|
||||
- **Leerraum-Regel:** Als Gate wird `=` nur mit **folgendem Leerraum**
|
||||
erkannt — ein Label wie `=SUMME(A1:B2)` bleibt damit ein Label. `=` ist das
|
||||
erste Gate, das diese Regel braucht; für `-`/`+`/`|` ändert sich nichts.
|
||||
- Das ursprünglich vorgeschlagene `x` ist verworfen: `x [x] …` stünde als
|
||||
Endzustand jeder entschiedenen Gruppe **dauerhaft** im Text (genau eine
|
||||
Alternative soll ja fertig werden), und als Buchstabe kollidierte es ohne
|
||||
Leerraum-Regel mit gewöhnlichen Labels (`XSS-Schutz` → Gate `X`).
|
||||
|
||||
### Knotenbeschreibungen
|
||||
|
||||
Erläuternder Text zu einem Knoten, im Diagramm als Tooltip oder Pop-up.
|
||||
|
||||
+6
-2
@@ -82,8 +82,12 @@ entscheiden, **bevor** Code entsteht.
|
||||
- [ ] Querverbindungen zeichnen (eigene SVG-Ebene, optisch sekundär);
|
||||
bei ausgewähltem Knoten ein-/ausgehende hervorheben.
|
||||
- [ ] Faltmarken `>` / `<` parsen; interaktives Auf-/Zuklappen im Diagramm.
|
||||
- [ ] XOR-Gruppe (`=`) parsen (nur mit folgendem Leerraum, Mischung →
|
||||
- [x] XOR-Gruppe (`=`) parsen (nur mit folgendem Leerraum, Mischung →
|
||||
`mixedGate`), zwei realisierte Alternativen melden.
|
||||
→ Zeichen entschieden: `=` statt `x` (D34-Nachtrag).
|
||||
→ Zeichen entschieden: `=` statt `x` (D34-Nachtrag). Umgesetzt (D35):
|
||||
„realisiert“ = `[~]`/`[/]`/`[x]`/`[^]`, Warnung `xorConflict` je weiterer
|
||||
realisierter Alternative; Darstellung als any-of plus „1“-Plakette an der
|
||||
Sammelleiste (auch im Grafikexport); Legende + i18n in 9 Sprachen;
|
||||
`tests/xor.test.js`.
|
||||
- [ ] Knotenbeschreibungen: Schreibweise für kurze und lange Form festlegen
|
||||
(Einrückung ist bereits Hierarchie), dann Tooltip/Pop-up.
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
- [?] Effective status: intrinsic, plus what it depends on (S)
|
||||
- [?] Cycles are legal — they mean "finished together" (XS)
|
||||
- [ ] An id with no node behind it is a warning (XS)
|
||||
- [?] XOR, = — exactly one alternative, not at least one (S)
|
||||
- [x] XOR, = — exactly one alternative, not at least one (S)
|
||||
- [?] Node descriptions, shown as a tooltip or pop-up (M)
|
||||
- [?] A short text right at the node (S) %% indentation already means hierarchy
|
||||
- [?] A long block at the end, addressed by its id (S)
|
||||
|
||||
Reference in New Issue
Block a user