| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -6,7 +6,7 @@ | |||
| 6 | 6 | meldet oder erst als Folgefehler. Die meisten stammen aus maschineller | |
| 7 | 7 | Voruebersetzung, bei der reST-Syntax wie Fließtext behandelt wurde. | |
| 8 | 8 | ||
| 9 | - Geprueft werden sechs Fehlerarten (Kuerzel fuer --art): | ||
| 9 | + Geprueft werden acht Fehlerarten (Kuerzel fuer --art): | ||
| 10 | 10 | ||
| 11 | 11 | klammer Ueberfluessige Backtick- oder Stern-Klammer um eine Rolle: | |
| 12 | 12 | Ein ` :class:`tuple` `, der ... | |
@@ -39,6 +39,20 @@ | |||
| 39 | 39 | :exc:`GeneratorExit` -Ausnahme | |
| 40 | 40 | Technisch harmlos, im Satz aber ein Fremdkoerper. | |
| 41 | 41 | ||
| 42 | + titel Der Seitentitel eines LaTeX-Wurzeldokuments beginnt mit | ||
| 43 | + Auszeichnung: | ||
| 44 | + ``optparse``-Code nach ``argparse`` migrieren | ||
| 45 | + Sphinx baut aus jedem HOWTO und aus jedem Wurzeldokument ein | ||
| 46 | + eigenes LaTeX-Dokument. Dessen erste Ueberschrift wird zum | ||
| 47 | + \\title{} -- und dafuer verlangt der LaTeX-Writer einen reinen | ||
| 48 | + Textknoten am Anfang (sphinx/writers/latex.py, visit_title). | ||
| 49 | + Sonst warnt er "document title is not a single Text node", und | ||
| 50 | + weil der CPython-Build mit -W laeuft, bricht er ab. Im | ||
| 51 | + Fliesstext und in Zwischenueberschriften ist Auszeichnung am | ||
| 52 | + Anfang dagegen unbedenklich -- nur die H1 dieser Seiten zaehlt. | ||
| 53 | + Abhilfe: umformulieren, sodass der Titel mit Text beginnt | ||
| 54 | + ("Migration von ``optparse``-Code zu ``argparse``"). | ||
| 55 | + | ||
| 42 | 56 | Das Skript aendert nichts. Es meldet nur, wo etwas zu tun ist -- die | |
| 43 | 57 | Korrekturen sind oft Ermessensfragen und gehoeren von Hand entschieden. | |
| 44 | 58 | ||
@@ -126,6 +140,61 @@ def ist_code(msgid: str) -> bool: | |||
| 126 | 140 | return "\n" in msgid and bool(CODE_START.match(msgid.lstrip())) | |
| 127 | 141 | ||
| 128 | 142 | ||
| 143 | + # --- Titel von LaTeX-Wurzeldokumenten -------------------------------------- | ||
| 144 | + # | ||
| 145 | + # CPythons Doc/conf.py macht aus jeder Datei in latex_documents ein eigenes | ||
| 146 | + # .tex -- und zusaetzlich aus *jedem* howto/*.rst ausser index.rst. Nur bei | ||
| 147 | + # diesen Seiten wird die erste Ueberschrift zum \title{} und damit von | ||
| 148 | + # sphinx/writers/latex.py geprueft. Alle anderen Seiten (etwa library/json) | ||
| 149 | + # duerfen mit einer Rolle beginnen; dort passiert nichts. | ||
| 150 | + | ||
| 151 | + WURZELN = { | ||
| 152 | + "about.po", "bugs.po", "contents.po", "glossary.po", | ||
| 153 | + "c-api/index.po", "distributing/index.po", "extending/index.po", | ||
| 154 | + "faq/index.po", "installing/index.po", "library/index.po", | ||
| 155 | + "reference/index.po", "tutorial/index.po", "using/index.po", | ||
| 156 | + "whatsnew/index.po", | ||
| 157 | + } | ||
| 158 | + | ||
| 159 | + # Auszeichnung, die einen eigenen Knoten erzeugt und deshalb nicht am | ||
| 160 | + # Titelanfang stehen darf. | ||
| 161 | + TITEL_AUSZEICHNUNG = re.compile( | ||
| 162 | + r'^\s*(' | ||
| 163 | + r'``[^`]+``' # ``Literal`` | ||
| 164 | + r'|:[a-zA-Z][\w-]*:`[^`]*`' # :rolle:`Text` | ||
| 165 | + r'|`[^`]+`__?' # `Verweis`_ | ||
| 166 | + r'|\*\*[^*]+\*\*' # **fett** | ||
| 167 | + r'|\*[^*]+\*' # *kursiv* | ||
| 168 | + r')' | ||
| 169 | + ) | ||
| 170 | + | ||
| 171 | + | ||
| 172 | + def ist_latex_wurzel(datei: Path) -> bool: | ||
| 173 | + teile = datei.parts | ||
| 174 | + name = teile[-1] | ||
| 175 | + ordner = teile[-2] if len(teile) >= 2 else "" | ||
| 176 | + if ordner == "howto" and name != "index.po": | ||
| 177 | + return True | ||
| 178 | + if ordner == "whatsnew" and re.fullmatch(r"3\.\d+\.po", name): | ||
| 179 | + return True | ||
| 180 | + return name in WURZELN or f"{ordner}/{name}" in WURZELN | ||
| 181 | + | ||
| 182 | + | ||
| 183 | + def pruefe_titel(datei: Path, msgstr: str) -> list: | ||
| 184 | + """Prueft die erste Ueberschrift eines LaTeX-Wurzeldokuments.""" | ||
| 185 | + if not ist_latex_wurzel(datei): | ||
| 186 | + return [] | ||
| 187 | + treffer = TITEL_AUSZEICHNUNG.match(msgstr) | ||
| 188 | + if not treffer: | ||
| 189 | + return [] | ||
| 190 | + # Besteht der Titel *nur* aus der Auszeichnung, ist es ein einzelner | ||
| 191 | + # Knoten -- genau den laesst der LaTeX-Writer durchgehen. | ||
| 192 | + if not msgstr[treffer.end():].strip(): | ||
| 193 | + return [] | ||
| 194 | + return [("titel", "Seitentitel beginnt mit Auszeichnung", | ||
| 195 | + msgstr[:70].replace("\n", " "))] | ||
| 196 | + | ||
| 197 | + | ||
| 129 | 198 | # --- PO-Parser (bewusst ohne polib, damit das Skript ueberall laeuft) ------ | |
| 130 | 199 | ||
| 131 | 200 | ENTKOMMEN = {"\\n": "\n", "\\t": "\t", "\\r": "\r", "\\\"": "\"", "\\\\": "\\"} | |
@@ -261,7 +330,7 @@ def pruefe_eintrag(msgid: str, msgstr: str, arten: set) -> list: | |||
| 261 | 330 | # --- Hauptprogramm --------------------------------------------------------- | |
| 262 | 331 | ||
| 263 | 332 | ALLE_ARTEN = ["klammer", "anzeige", "verweis", "code", "literal", "typo", | |
| 264 | - "bindestrich"] | ||
| 333 | + "bindestrich", "titel"] | ||
| 265 | 334 | ||
| 266 | 335 | ERKLAERUNG = { | |
| 267 | 336 | "klammer": "Ueberfluessige Backtick-/Stern-Klammer um eine Rolle -- zerstoert die folgenden Querverweise", | |
@@ -271,6 +340,7 @@ def pruefe_eintrag(msgid: str, msgstr: str, arten: set) -> list: | |||
| 271 | 340 | "literal": "``Literale`` aus dem Original fehlen in der Uebersetzung -- Code wurde mituebersetzt", | |
| 272 | 341 | "typo": "Typografische Anfuehrungszeichen innerhalb von Code oder Literalen", | |
| 273 | 342 | "bindestrich": "Leerzeichen zwischen Rolle und angehaengtem Wort", | |
| 343 | + "titel": "Seitentitel eines LaTeX-Wurzeldokuments beginnt mit Auszeichnung -- bricht den LaTeX-Build mit -W ab", | ||
| 274 | 344 | } | |
| 275 | 345 | ||
| 276 | 346 | ||
@@ -320,8 +390,15 @@ def main() -> None: | |||
| 320 | 390 | if nr % 100 == 0: | |
| 321 | 391 | print(f" {nr}/{len(dateien)}", file=sys.stderr) | |
| 322 | 392 | try: | |
| 393 | + erster = True | ||
| 323 | 394 | for po_zeile, quelle, msgid, msgstr in po_eintraege(datei): | |
| 324 | - for art, name, ausschnitt in pruefe_eintrag(msgid, msgstr, arten): | ||
| 395 | + treffer = list(pruefe_eintrag(msgid, msgstr, arten)) | ||
| 396 | + if erster: | ||
| 397 | + # Der erste uebersetzte Eintrag einer Datei ist ihre H1. | ||
| 398 | + erster = False | ||
| 399 | + if "titel" in arten: | ||
| 400 | + treffer += pruefe_titel(datei, msgstr) | ||
| 401 | + for art, name, ausschnitt in treffer: | ||
| 325 | 402 | funde[art].append((str(datei), po_zeile, quelle, name, ausschnitt)) | |
| 326 | 403 | betroffene_dateien[art].add(str(datei)) | |
| 327 | 404 | except Exception as fehler: # defekte Datei nicht verschlucken | |
| Back | FazBrowse Home | New Git URL |
0 commit comments