Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 20 additions & 8 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,22 @@ dokumentiert.

## Unveröffentlicht

### Hinzugefügt

- 90 einzeln geprüfte Personenbezeichnungen mit sicheren Singular- und
Pluralzielen, darunter unveränderte Plurale, schwache Flexionen,
Sonderplurale und Binnen-I-Singularformen.
- Sichere Artikel-Adjektiv-Ketten wie `der:die neue Lehrer:in`,
`den:die fleißige:n Schüler:in` und
`ein*e gut ausgebildete*r Jurist*in`.
- Weitere explizite Formen wie `jene:r Nutzer:in`, `Arzt:Ärztin`,
`Kolleg:en:innen`, `Pat*innenschaft` und `Themenpat*in`.

### Korrigiert

- Unvollständige Teilkorrekturen hinter femininen oder markierten Artikeln
werden auch bei zwischengeschalteten Adjektiven verhindert.

## 0.6.1 – RC2 (2026-07-29)

### Korrigiert
Expand Down Expand Up @@ -78,8 +94,8 @@ dokumentiert.
`Lehrys`, `Kollegys` und `Mitarbeitys`.
- Eigene literale Ersetzungen, vollständig getrennt von persönlichen Ausnahmen,
lokal gespeichert, case-sensitive, nicht rekursiv und ohne Regex-Unterstützung.
- Maschinenlesbarer Flexions- und Sonderformenkatalog mit quellenbezogenen
Positiv- und Negativregressionen.
- Maschinenlesbarer Flexions- und Sonderformenkatalog mit Positiv- und
Negativregressionen.
- Stark erweitertes Flexionslexikon für häufige schwache, regelmäßige und
unregelmäßige Personenformen.
- Lokale Lizenz- und Quelltextseite in der Erweiterung.
Expand Down Expand Up @@ -116,18 +132,14 @@ dokumentiert.

- Automatisierter GitHub-Prerelease mit geprüften Chromium-, Firefox- und
Quellcodepaketen sowie SHA-256-Prüfsummen.
- Öffentliche Projektvorstellung mit Hinweisen zu Lesbarkeit, Datenschutz,
Recherchequellen und Danksagung.
- Öffentliche Projektvorstellung mit Hinweisen zu Lesbarkeit, Datenschutz und
Danksagung.
- Aktualisierte Roadmap und Beta-Testanleitung für die noch offenen Praxisprüfungen.

### Geändert

- Projektbeschreibung und Manifesttexte verwenden nun den Leitsatz
**„Macht Webseiten leichter lesbar.“**
- Die Herkunftsdokumentation unterscheidet genauer zwischen übernommenem
Quelltext und öffentlich dokumentierten Sprachbeispielen, Flexionsfällen und
Fehlertreffern als Recherchebasis.

### Teststand

- Der reale Waterfox-Test und die daraus entstandenen Popup- und Icon-Korrekturen
Expand Down
4 changes: 1 addition & 3 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,7 @@ Neue Sprachregeln benötigen:
3. korrekte Flexion für die betroffenen Kasus und Numeri,
4. Berücksichtigung von Großschreibung und Komposita,
5. eine Einordnung in eine sichtbare Regelgruppe,
6. automatisierte Tests,
7. einen Quellenhinweis, wenn öffentlich dokumentierte Fundstellen oder
Wörterbuchangaben ausgewertet wurden.
6. automatisierte Tests.

Vollständige fremde Wörterbücher, Regelbestände, Regexsammlungen oder
lizenzrechtlich unklare Datensätze dürfen nicht ohne vorherige Prüfung
Expand Down
13 changes: 2 additions & 11 deletions UPSTREAMS.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
# Recherchequellen
# Berücksichtigte Projekte

Sprachverstand ist eine eigenständige Neuimplementierung.

Folgende Projekte wurden als Recherchequellen für bekannte Schreibweisen,
Flexionsfälle, Fehlerfälle, offene Issues und mögliche Regressionstests
ausgewertet:
Folgende Projekte wurden bei der Planung von Sprachverstand berücksichtigt:

- https://github.com/brilliance-richter-huh/gendersprache-korrigieren
- https://github.com/sternth/no-gender
Expand All @@ -18,14 +16,7 @@ Hinweise für Anforderungen, Grenzfälle und Sicherheitsprüfungen geliefert.

Es wurden keine Codebestandteile oder fremden Regexketten übernommen. Die
Regel-Engine, DOM-Verarbeitung und Browser-Architektur wurden neu entwickelt.
Öffentlich dokumentierte Sprachbeispiele, Flexionsfälle, Fehlertreffer und
fachliche Kategorien dienten als Recherchebasis und wurden in eigenständig
formulierte Regeln und Tests überführt.

`rggl` enthält eine umfangreiche, über Jahre gewachsene Kasus- und
Flexionssammlung und steht unter GPL-3.0. Deshalb wird besonders darauf geachtet,
keine Quelltextpassagen, Regexketten oder vollständigen Datenbestände zu
übernehmen.

Die Herkunft einzelner fachlicher Anregungen bleibt in `docs/MIGRATION.md`, der
Git-Historie und den Pull Requests nachvollziehbar.
156 changes: 77 additions & 79 deletions data/flexion-regression-cases.json
Original file line number Diff line number Diff line change
@@ -1,89 +1,87 @@
{
"schemaVersion": 1,
"description": "Kuratierte reale und recherchierte Flexionsfälle. Die Einträge sind Testfälle, kein importiertes Wörterbuch.",
"sources": [
{
"id": "field-reports",
"label": "Gemeldete Fundstellen und manuelle Praxistests im Sprachverstand-Projekt"
},
{
"id": "duden-declension",
"label": "Duden: Deklination und substantivierte Adjektive",
"url": "https://www.duden.de/deklination"
},
{
"id": "phettberg-bpb",
"label": "Bundeszentrale für politische Bildung: Entgendern nach Phettberg",
"url": "https://www.bpb.de/shop/zeitschriften/apuz/geschlechtergerechte-sprache-2022/346085/entgendern-nach-phettberg/"
},
{
"id": "sinti-roma-zentralrat",
"label": "Zentralrat Deutscher Sinti und Roma: Kontroverse zur gegenderten Selbstbezeichnung",
"url": "https://zentralrat.sintiundroma.de/mitgliederversammlung-beschliesst-papier-ueber-die-kontroverse-zum-gendern-der-selbstbezeichnung-sinti-und-roma/"
},
{
"id": "curated-lexicon",
"label": "Eigenständig kuratierte deutsche Personen- und Flexionsformen"
}
],
"cases": [
{ "id": "binnen-i-bare-user", "source": "field-reports", "input": "NutzerIn", "expected": "Nutzer" },
{ "id": "binnen-i-standalone-user", "source": "field-reports", "input": "eine NutzerIn", "expected": "ein Nutzer" },
{ "id": "binnen-i-nominative-sentence", "source": "field-reports", "input": "Eine NutzerIn arbeitet heute.", "expected": "Ein Nutzer arbeitet heute." },
{ "id": "binnen-i-accusative-verb", "source": "field-reports", "input": "Ich sehe eine NutzerIn.", "expected": "Ich sehe einen Nutzer." },
{ "id": "binnen-i-accusative-preposition", "source": "field-reports", "input": "für eine ÄrztIn", "expected": "für einen Arzt" },
{ "id": "binnen-i-dative-preposition", "source": "field-reports", "input": "mit einer StudentIn", "expected": "mit einem Studenten" },
{ "id": "binnen-i-genitive-preposition", "source": "field-reports", "input": "wegen einer ÄrztIn", "expected": "wegen eines Arztes" },
{ "id": "binnen-i-bare-user", "input": "NutzerIn", "expected": "Nutzer" },
{ "id": "binnen-i-standalone-user", "input": "eine NutzerIn", "expected": "ein Nutzer" },
{ "id": "binnen-i-nominative-sentence", "input": "Eine NutzerIn arbeitet heute.", "expected": "Ein Nutzer arbeitet heute." },
{ "id": "binnen-i-accusative-verb", "input": "Ich sehe eine NutzerIn.", "expected": "Ich sehe einen Nutzer." },
{ "id": "binnen-i-accusative-preposition", "input": "für eine ÄrztIn", "expected": "für einen Arzt" },
{ "id": "binnen-i-dative-preposition", "input": "mit einer StudentIn", "expected": "mit einem Studenten" },
{ "id": "binnen-i-genitive-preposition", "input": "wegen einer ÄrztIn", "expected": "wegen eines Arztes" },

{ "id": "double-singular-nominative", "source": "curated-lexicon", "input": "eine Nutzerin oder ein Nutzer", "expected": "ein Nutzer" },
{ "id": "double-singular-accusative", "source": "curated-lexicon", "input": "einen Studenten und eine Studentin", "expected": "einen Studenten" },
{ "id": "double-singular-dative", "source": "curated-lexicon", "input": "einer Studentin und einem Studenten", "expected": "einem Studenten" },
{ "id": "double-singular-genitive", "source": "curated-lexicon", "input": "eines Arztes oder einer Ärztin", "expected": "eines Arztes" },
{ "id": "double-plural-repeated-article", "source": "curated-lexicon", "input": "die Nutzerinnen und die Nutzer", "expected": "die Nutzer" },
{ "id": "double-plural-dative-article", "source": "curated-lexicon", "input": "den Ärztinnen und den Ärzten", "expected": "den Ärzten" },
{ "id": "double-plural-genitive-article", "source": "curated-lexicon", "input": "der Studentinnen und der Studenten", "expected": "der Studenten" },
{ "id": "double-singular-nominative", "input": "eine Nutzerin oder ein Nutzer", "expected": "ein Nutzer" },
{ "id": "double-singular-accusative", "input": "einen Studenten und eine Studentin", "expected": "einen Studenten" },
{ "id": "double-singular-dative", "input": "einer Studentin und einem Studenten", "expected": "einem Studenten" },
{ "id": "double-singular-genitive", "input": "eines Arztes oder einer Ärztin", "expected": "eines Arztes" },
{ "id": "double-plural-repeated-article", "input": "die Nutzerinnen und die Nutzer", "expected": "die Nutzer" },
{ "id": "double-plural-dative-article", "input": "den Ärztinnen und den Ärzten", "expected": "den Ärzten" },
{ "id": "double-plural-genitive-article", "input": "der Studentinnen und der Studenten", "expected": "der Studenten" },

{ "id": "adjective-adult-nominative", "source": "duden-declension", "input": "Erwachsene:r", "expected": "Erwachsener" },
{ "id": "adjective-adult-accusative", "source": "duden-declension", "input": "Erwachsene:n", "expected": "Erwachsenen" },
{ "id": "adjective-adult-dative", "source": "duden-declension", "input": "Erwachsene:m", "expected": "Erwachsenem" },
{ "id": "adjective-adult-mixed", "source": "duden-declension", "input": "ein:e Erwachsene:r", "expected": "ein Erwachsener" },
{ "id": "adjective-employed-weak", "source": "duden-declension", "input": "der:die Beschäftigte:r", "expected": "der Beschäftigte" },
{ "id": "adjective-unemployed-dative", "source": "duden-declension", "input": "einem:einer Arbeitslose:n", "expected": "einem Arbeitslosen" },
{ "id": "adjective-superior", "source": "curated-lexicon", "input": "Vorgesetzte:r", "expected": "Vorgesetzter" },
{ "id": "adjective-authorized", "source": "curated-lexicon", "input": "Erziehungsberechtigte:r", "expected": "Erziehungsberechtigter" },
{ "id": "adjective-adult-nominative", "input": "Erwachsene:r", "expected": "Erwachsener" },
{ "id": "adjective-adult-accusative", "input": "Erwachsene:n", "expected": "Erwachsenen" },
{ "id": "adjective-adult-dative", "input": "Erwachsene:m", "expected": "Erwachsenem" },
{ "id": "adjective-adult-mixed", "input": "ein:e Erwachsene:r", "expected": "ein Erwachsener" },
{ "id": "adjective-employed-weak", "input": "der:die Beschäftigte:r", "expected": "der Beschäftigte" },
{ "id": "adjective-unemployed-dative", "input": "einem:einer Arbeitslose:n", "expected": "einem Arbeitslosen" },
{ "id": "adjective-superior", "input": "Vorgesetzte:r", "expected": "Vorgesetzter" },
{ "id": "adjective-authorized", "input": "Erziehungsberechtigte:r", "expected": "Erziehungsberechtigter" },

{ "id": "special-romnja", "source": "sinti-roma-zentralrat", "input": "Rom*nja", "expected": "Roma" },
{ "id": "special-sintizze", "source": "sinti-roma-zentralrat", "input": "Sinti*zze", "expected": "Sinti" },
{ "id": "phettberg-studentys", "source": "phettberg-bpb", "input": "Studentys", "expected": "Studenten" },
{ "id": "phettberg-lesys", "source": "phettberg-bpb", "input": "Lesys", "expected": "Leser" },
{ "id": "phettberg-lehrys", "source": "phettberg-bpb", "input": "Lehrys", "expected": "Lehrer" },
{ "id": "phettberg-wirtys", "source": "phettberg-bpb", "input": "Wirtys", "expected": "Wirte" },
{ "id": "phettberg-kollegys", "source": "phettberg-bpb", "input": "Kollegys", "expected": "Kollegen" },
{ "id": "phettberg-mitarbeitys", "source": "phettberg-bpb", "input": "Mitarbeitys", "expected": "Mitarbeiter" },
{ "id": "phettberg-kommilitonys", "source": "phettberg-bpb", "input": "Kommilitonys", "expected": "Kommilitonen" },
{ "id": "special-romnja", "input": "Rom*nja", "expected": "Roma" },
{ "id": "special-sintizze", "input": "Sinti*zze", "expected": "Sinti" },
{ "id": "special-studentys", "input": "Studentys", "expected": "Studenten" },
{ "id": "special-lesys", "input": "Lesys", "expected": "Leser" },
{ "id": "special-lehrys", "input": "Lehrys", "expected": "Lehrer" },
{ "id": "special-wirtys", "input": "Wirtys", "expected": "Wirte" },
{ "id": "special-kollegys", "input": "Kollegys", "expected": "Kollegen" },
{ "id": "special-mitarbeitys", "input": "Mitarbeitys", "expected": "Mitarbeiter" },
{ "id": "special-kommilitonys", "input": "Kommilitonys", "expected": "Kommilitonen" },

{ "id": "lexicon-lawyers", "source": "curated-lexicon", "input": "Anwält:innen", "expected": "Anwälte" },
{ "id": "lexicon-guests", "source": "curated-lexicon", "input": "Gäst:innen", "expected": "Gäste" },
{ "id": "lexicon-cooks", "source": "curated-lexicon", "input": "Köch:innen", "expected": "Köche" },
{ "id": "lexicon-officials", "source": "curated-lexicon", "input": "Beamt:innen", "expected": "Beamte" },
{ "id": "lexicon-board", "source": "curated-lexicon", "input": "Vorständ:innen", "expected": "Vorstände" },
{ "id": "lexicon-ministers", "source": "curated-lexicon", "input": "Minister:innen", "expected": "Minister" },
{ "id": "lexicon-apprentices", "source": "curated-lexicon", "input": "Lehrling:innen", "expected": "Lehrlinge" },
{ "id": "lexicon-witnesses", "source": "curated-lexicon", "input": "Zeitzeug:innen", "expected": "Zeitzeugen" },
{ "id": "lexicon-photographers", "source": "curated-lexicon", "input": "Fotograf:innen", "expected": "Fotografen" },
{ "id": "lexicon-librarians", "source": "curated-lexicon", "input": "Bibliothekar:innen", "expected": "Bibliothekare" },
{ "id": "lexicon-psychologists", "source": "curated-lexicon", "input": "Psycholog:innen", "expected": "Psychologen" },
{ "id": "lexicon-correspondents", "source": "curated-lexicon", "input": "Korrespondent:innen", "expected": "Korrespondenten" },
{ "id": "lexicon-parliamentarians", "source": "curated-lexicon", "input": "Parlamentarier:innen", "expected": "Parlamentarier" },
{ "id": "lexicon-chancellors", "source": "curated-lexicon", "input": "Bundeskanzler:innen", "expected": "Bundeskanzler" },
{ "id": "plural-lawyers", "input": "Anwält:innen", "expected": "Anwälte" },
{ "id": "plural-guests", "input": "Gäst:innen", "expected": "Gäste" },
{ "id": "plural-cooks", "input": "Köch:innen", "expected": "Köche" },
{ "id": "plural-officials", "input": "Beamt:innen", "expected": "Beamte" },
{ "id": "plural-board", "input": "Vorständ:innen", "expected": "Vorstände" },
{ "id": "plural-ministers", "input": "Minister:innen", "expected": "Minister" },
{ "id": "plural-apprentices", "input": "Lehrling:innen", "expected": "Lehrlinge" },
{ "id": "plural-witnesses", "input": "Zeitzeug:innen", "expected": "Zeitzeugen" },
{ "id": "plural-photographers", "input": "Fotograf:innen", "expected": "Fotografen" },
{ "id": "plural-librarians", "input": "Bibliothekar:innen", "expected": "Bibliothekare" },
{ "id": "plural-psychologists", "input": "Psycholog:innen", "expected": "Psychologen" },
{ "id": "plural-correspondents", "input": "Korrespondent:innen", "expected": "Korrespondenten" },
{ "id": "plural-parliamentarians", "input": "Parlamentarier:innen", "expected": "Parlamentarier" },
{ "id": "plural-chancellors", "input": "Bundeskanzler:innen", "expected": "Bundeskanzler" },
{ "id": "singular-verteidiger-binnen-i", "input": "VerteidigerIn", "expected": "Verteidiger" },
{ "id": "plural-stonemasons", "input": "Steinmetz:innen", "expected": "Steinmetze" },
{ "id": "plural-coaches", "input": "Coach:innen", "expected": "Coaches" },
{ "id": "plural-racists", "input": "Rassist:innen", "expected": "Rassisten" },
{ "id": "compound-patenschaft", "input": "Pat*innenschaft", "expected": "Patenschaft" },
{ "id": "singular-themenpate", "input": "Themenpat*in", "expected": "Themenpate" },

{ "id": "negative-feminine-politicians", "source": "field-reports", "input": "Politikerinnen", "expected": "Politikerinnen" },
{ "id": "negative-ambiguous-inline-binnen-i", "source": "field-reports", "input": "Vielleicht eine NutzerIn im Team", "expected": "Vielleicht eine NutzerIn im Team" },
{ "id": "negative-adjective-use", "source": "duden-declension", "input": "erwachsene Kinder", "expected": "erwachsene Kinder" },
{ "id": "negative-wrong-adjective-marker", "source": "duden-declension", "input": "ein:e Erwachsene:n", "expected": "ein:e Erwachsene:n" },
{ "id": "negative-robot", "source": "curated-lexicon", "input": "Robot:innen", "expected": "Robot:innen" },
{ "id": "negative-plain-romnja", "source": "sinti-roma-zentralrat", "input": "Romnja", "expected": "Romnja" },
{ "id": "negative-plain-sintizze", "source": "sinti-roma-zentralrat", "input": "Sintizze", "expected": "Sintizze" },
{ "id": "negative-ordinary-hobbys", "source": "phettberg-bpb", "input": "Hobbys und Handys", "expected": "Hobbys und Handys" }
{ "id": "syntax-jene-determiner", "input": "jene:r Nutzer:in", "expected": "jener Nutzer" },
{ "id": "syntax-attributive-nominative", "input": "der:die neue Lehrer:in", "expected": "der neue Lehrer" },
{ "id": "syntax-attributive-accusative", "input": "den:die fleißige:n Schüler:in", "expected": "den fleißigen Schüler" },
{ "id": "syntax-attributive-multiword", "input": "ein*e gut ausgebildete*r Jurist*in", "expected": "ein gut ausgebildeter Jurist" },
{ "id": "syntax-full-stem-colon-pair", "input": "der:die Arzt:Ärztin", "expected": "der Arzt" },
{ "id": "syntax-duplicated-colleague-ending", "input": "Kolleg:en:innen", "expected": "Kollegen" },

{ "id": "compound-readership", "input": "Leser*innenschaft", "expected": "Leserschaft" },
{ "id": "compound-citizen-municipality", "input": "Bürger*innenkommune", "expected": "Bürgerkommune" },
{ "id": "compound-migrant-organization", "input": "Migrant*innenorganisation", "expected": "Migrantenorganisation" },
{ "id": "compound-worker-protection", "input": "ArbeitnehmerInnenschutz", "expected": "Arbeitnehmerschutz" },

{ "id": "negative-feminine-politicians", "input": "Politikerinnen", "expected": "Politikerinnen" },
{ "id": "negative-ambiguous-inline-binnen-i", "input": "Vielleicht eine NutzerIn im Team", "expected": "Vielleicht eine NutzerIn im Team" },
{ "id": "negative-adjective-use", "input": "erwachsene Kinder", "expected": "erwachsene Kinder" },
{ "id": "negative-wrong-adjective-marker", "input": "ein:e Erwachsene:n", "expected": "ein:e Erwachsene:n" },
{ "id": "negative-robot", "input": "Robot:innen", "expected": "Robot:innen" },
{ "id": "negative-plain-validated-feminine", "input": "Verteidigerin", "expected": "Verteidigerin" },
{ "id": "negative-uppercase-feminine", "input": "VERTEIDIGERIN", "expected": "VERTEIDIGERIN" },
{ "id": "negative-attributive-wrong-ending", "input": "eine:n neue Lehrer:in", "expected": "eine:n neue Lehrer:in" },
{ "id": "negative-unpaired-colon-form", "input": "Arzt:Arzt", "expected": "Arzt:Arzt" },
{ "id": "negative-incomplete-colleague-ending", "input": "Kolleg:en", "expected": "Kolleg:en" },
{ "id": "negative-ordinary-patenschaft", "input": "Patenschaft", "expected": "Patenschaft" },
{ "id": "negative-plain-romnja", "input": "Romnja", "expected": "Romnja" },
{ "id": "negative-plain-sintizze", "input": "Sintizze", "expected": "Sintizze" },
{ "id": "negative-ordinary-hobbys", "input": "Hobbys und Handys", "expected": "Hobbys und Handys" }
]
}
2 changes: 1 addition & 1 deletion docs/ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ Sprachverstand erzeugten Wert entspricht.
- `person-lexicon.ts`: Singular, Plural, oblique Formen, Genitiv, Komposita und unregelmäßige Flexionen
- `substantivized-adjectives.ts`: geprüfte substantivierte Adjektive
- `special-gender-forms.ts`: einzelne ausdrücklich zugeordnete Sonderformen
- `data/flexion-regression-cases.json`: quellenbezogene Positiv- und Negativfälle
- `data/flexion-regression-cases.json`: kuratierte Positiv- und Negativfälle

Das Aufnahmeverfahren ist in [`LEXICON.md`](LEXICON.md) beschrieben.

Expand Down
Loading
Loading