QA-Toolkit für deutschsprachige Markdown-Manuskripte. Validiert Style, bereinigt Encoding, konvertiert Anführungszeichen und misst Lesbarkeit.
pip install manuscript-toolsOder als Projekt-Dependency:
poetry add manuscript-tools| Kommando | Beschreibung |
|---|---|
ms-check |
Style-Checks (6 Core-Regeln, --strict fügt 3 Prosa-Regeln hinzu) |
ms-sanitize |
Encoding reparieren, unsichtbare Zeichen entfernen, Unicode normalisieren |
ms-quotes |
Anführungszeichen in deutsche Typografie konvertieren „ " ‚ ' |
ms-dashes |
Gefakte Gedankenstriche (--, gespationierter Bindestrich) durch echte ersetzen (--to em|en) |
ms-umlauts |
ASCII-Umlaute (fuer zu für) per kuratierter Wortliste ersetzen |
ms-format |
Gebrochenes Bold/Italic von zeilenumbrechenden Formatierern reparieren |
ms-metrics |
Wortzahl, Satzanalyse, Flesch-DE Lesbarkeitsindex |
ms-validate |
Volle QA-Pipeline (Sanitize + Quotes + Formatierung + Check + Lesbarkeit) |
# Volle QA-Pipeline
ms-validate manuscript/
# Nur Style-Check (Core-Regeln)
ms-check manuscript/
# Style-Check mit Prosa-Analyse (Füllwörter, Passiv, Satzlänge)
ms-check manuscript/ --strict
# Lesbarkeitsreport
ms-metrics manuscript/
# Anführungszeichen korrigieren (Vorschau)
ms-quotes manuscript/ --dry-run
# Gebrochenes Bold/Italic reparieren (Vorschau)
ms-format manuscript/ --dry-run
# -- und gespationierte Bindestriche zu Halbgeviertstrichen (Vorschau)
ms-dashes manuscript/ --to en --dry-run
# ASCII-Umlaute wie "fuer" und "Uebung" ersetzen (Vorschau)
ms-umlauts manuscript/ --dry-runNicht auf Markdown beschränkt. Verzeichnisse werden per Default mit dem Glob **/*.md durchsucht; eine einzelne Datei als Argument wird unabhängig von der Endung direkt verarbeitet:
# Einzeldatei: kein Glob-Filter
ms-check brief.txt
# Verzeichnis mit anderen Endungen: Glob überschreiben
ms-sanitize docs/ --include '**/*.txt'
ms-check kapitel/ --include '**/*.tex' --exclude '**/build/**'Dateien müssen UTF-8-Text sein (txt, tex, rst, html, ...) — Binärformate wie docx oder pdf werden nicht unterstützt. Die Regel broken-formatting prüft Markdown-Marker (**/*); bei Nicht-Markdown-Dateien ist sie harmlos oder lässt sich per disable = ["broken-formatting"] in der Konfiguration abschalten.
Ein Manuskript mit typischen Artefakten aus AI-Tools, Copy-Paste oder Code-Formatierern — Zeile 1 enthält ein unsichtbares Zero-Width Space (U+200B) nach „Test":
Das ist ein Test mit unsichtbarem Zeichen.
Er sagte: "Hallo Welt" und ging.
Dies ist ein **
wichtiger Satz** im Text.ms-check meldet jedes Problem mit Datei, Zeile und Regel — unsichtbare Zeichen werden mit Codepoint benannt:
$ ms-check kapitel-01.md
FAIL: kapitel-01.md:1 [no-invisible-chars] Unsichtbare Unicode-Zeichen gefunden: U+200B ZERO WIDTH SPACE
FAIL: kapitel-01.md:3 [non-german-quotes] Nicht-deutsche Anführungszeichen gefunden
FAIL: kapitel-01.md:5 [broken-formatting] Oeffnendes ** am Zeilenende (Formatierung gebrochen)
------------------------------------------------------------
Dateien: 1, Woerter: 21
Status: FEHLER (1 Dateien, 3 Verstoss(e))Schritt für Schritt beheben — jeder Fixer unterstützt --dry-run (Vorschau) und legt .bak-Backups an:
$ ms-sanitize kapitel-01.md
CLEANED: kapitel-01.md
$ ms-quotes kapitel-01.md
FIXED: kapitel-01.md (1 Ersetzung(en))
$ ms-format kapitel-01.md
FIXED: kapitel-01.md (1 bold, 0 italic)
$ ms-check kapitel-01.md
OK: kapitel-01.md (20 Woerter)
Status: OKErgebnis:
Das ist ein Test mit unsichtbarem Zeichen.
Er sagte: „Hallo Welt“ und ging.
Dies ist ein **wichtiger Satz** im Text.Oder alles in einem Durchlauf: ms-validate kapitel-01.md --fix.
Core (immer aktiv):
no-dashes, no-invisible-chars, no-repeated-words, no-double-spaces, non-german-quotes, broken-formatting
no-dashes meldet standardmäßig Halbgeviertstrich (U+2013) und Geviertstrich (U+2014); dashes-allow = ["en"] in der Konfiguration lässt eine Sorte durch — den Halbgeviertstrich schreibt ms-dashes --to en. no-repeated-words übergeht die kleingeschriebene Verdopplung von der, die, das und sie im Satzinneren (Relativpronomen plus Artikel: „Leser, die die Natur lieben“); dasselbe Paar großgeschrieben am Satzanfang wird weiterhin gemeldet.
Prosa (mit --strict oder ms-validate):
max-sentence-length, filler-words-de, passive-voice-de
Opt-in (über rules = [...] in der Konfiguration):
faked-dashes — findet -- und gespationierte Bindestriche, die einen echten Gedankenstrich ersetzen sollen. Widerspricht bewusst no-dashes (eine Regel verbietet Gedankenstriche, die andere verlangt korrekt gesetzte) — eine aktivieren, die andere deaktivieren. ms-dashes --to em|en schreibt die Funde um:
Er kam -- wie immer -- viel zu spaet. # vorher
Er kam – wie immer – viel zu spaet. # nachher ms-dashes --to en
Seiten 12 - 15 behandeln das Thema. # Zahlenbereiche bleiben unangetastet
[x](https://img.shields.io/badge/a--b) # URLs und Badge-Slugs bleiben unangetastet
ascii-umlauts — findet ASCII-Umlaut-Schreibweisen (fuer, Uebung) aus kuratierter Wortliste; ms-umlauts schreibt sie um. Bewusst kein Pattern: Deutsch ist voller legitimer ae/oe/ue-Folgen („Frauen", „Goethe", „Aerobic"), darum werden nur geprüfte ganze Wörter angefasst — null False Positives per Konstruktion. Projektspezifisch erweiterbar über umlaut-words-extra = ["oekologie"]. ss zu ß bleibt außen vor (kontextabhängig, Schweiz-Konflikt).
Das waere natuerlich schoen fuer alle. # vorher
Das wäre natürlich schön für alle. # nachher ms-umlauts
Goethe traf die Frauen beim Feuer. # Namen und Diphthonge bleiben unangetastet
Eigene Regeln sind einfache Callables mit der Signatur (text: str, path: Path) -> list[StyleViolation]. Das Wiki enthält ein Schritt-für-Schritt-Tutorial.
Konfigurierbar über [tool.manuscript-tools] in der pyproject.toml:
[tool.manuscript-tools]
rules = ["max-sentence-length"] # mit Defaults zusammenführen
disable = ["passive-voice-de"] # aus aktivem Set entfernen
max-sentence-words = 30 # Default: 40
flesch-target = [65, 80] # warnen wenn ausserhalb
filler-words-extra = ["definitiv", "absolut"] # Füllwortliste erweitern
umlaut-words-extra = ["oekologie"] # ascii-umlauts-Wortliste erweitern
dashes-allow = ["en"] # Halbgeviertstrich als Gedankenstrich erlaubenKeine Konfiguration = alle Defaults. rules wird mit Defaults zusammengeführt (Union). disable entfernt aus dem aktiven Set und hat Vorrang vor rules. Details im Wiki.
ms-metrics berechnet den Flesch-DE Lesbarkeitsindex (Amstad, 1978) mit deutscher Silbenzählung. Bewertung:
| Score | Bewertung | Typische Verwendung |
|---|---|---|
| 80-100 | Sehr leicht | Kinderbuch |
| 60-80 | Leicht bis mittel | Belletristik, Sachbuch |
| 30-60 | Schwer | Journalismus, Fachtext |
| 0-30 | Sehr schwer | Juristisch, wissenschaftlich |
git clone https://github.com/astrapi69/manuscript-tools.git
cd manuscript-tools
make install-dev
make ci # Lint + Format-Check + 255 TestsDie vollständige Dokumentation liegt im Wiki:
- Installation und Setup
- Verwendung
- Eigene Regeln schreiben
- Integration in andere Projekte
- Publishing auf PyPI
- Entwicklung und CI
- FAQ
- Quick Start für Buchprojekte
- Konfiguration
BSD 3-Clause. Siehe LICENSE.