66meldet oder erst als Folgefehler. Die meisten stammen aus maschineller
77Voruebersetzung, bei der reST-Syntax wie Fließtext behandelt wurde.
88
9- Geprueft werden sechs Fehlerarten (Kuerzel fuer --art):
9+ Geprueft werden acht Fehlerarten (Kuerzel fuer --art):
1010
1111 klammer Ueberfluessige Backtick- oder Stern-Klammer um eine Rolle:
1212 Ein ` :class:`tuple` `, der ...
3939 :exc:`GeneratorExit` -Ausnahme
4040 Technisch harmlos, im Satz aber ein Fremdkoerper.
4141
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+
4256Das Skript aendert nichts. Es meldet nur, wo etwas zu tun ist -- die
4357Korrekturen sind oft Ermessensfragen und gehoeren von Hand entschieden.
4458
@@ -126,6 +140,61 @@ def ist_code(msgid: str) -> bool:
126140 return "\n " in msgid and bool (CODE_START .match (msgid .lstrip ()))
127141
128142
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+
129198# --- PO-Parser (bewusst ohne polib, damit das Skript ueberall laeuft) ------
130199
131200ENTKOMMEN = {"\\ n" : "\n " , "\\ t" : "\t " , "\\ r" : "\r " , "\\ \" " : "\" " , "\\ \\ " : "\\ " }
@@ -261,7 +330,7 @@ def pruefe_eintrag(msgid: str, msgstr: str, arten: set) -> list:
261330# --- Hauptprogramm ---------------------------------------------------------
262331
263332ALLE_ARTEN = ["klammer" , "anzeige" , "verweis" , "code" , "literal" , "typo" ,
264- "bindestrich" ]
333+ "bindestrich" , "titel" ]
265334
266335ERKLAERUNG = {
267336 "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:
271340 "literal" : "``Literale`` aus dem Original fehlen in der Uebersetzung -- Code wurde mituebersetzt" ,
272341 "typo" : "Typografische Anfuehrungszeichen innerhalb von Code oder Literalen" ,
273342 "bindestrich" : "Leerzeichen zwischen Rolle und angehaengtem Wort" ,
343+ "titel" : "Seitentitel eines LaTeX-Wurzeldokuments beginnt mit Auszeichnung -- bricht den LaTeX-Build mit -W ab" ,
274344}
275345
276346
@@ -320,8 +390,15 @@ def main() -> None:
320390 if nr % 100 == 0 :
321391 print (f" { nr } /{ len (dateien )} " , file = sys .stderr )
322392 try :
393+ erster = True
323394 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 :
325402 funde [art ].append ((str (datei ), po_zeile , quelle , name , ausschnitt ))
326403 betroffene_dateien [art ].add (str (datei ))
327404 except Exception as fehler : # defekte Datei nicht verschlucken
0 commit comments