Skip to content

Commit ff16be2

Browse files
committed
tools/check_markup.py -> failure checks extended
1 parent e2e99b9 commit ff16be2

1 file changed

Lines changed: 80 additions & 3 deletions

File tree

‎tools/check_markup.py‎

Lines changed: 80 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
meldet oder erst als Folgefehler. Die meisten stammen aus maschineller
77
Voruebersetzung, 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 ...
@@ -39,6 +39,20 @@
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+
4256
Das Skript aendert nichts. Es meldet nur, wo etwas zu tun ist -- die
4357
Korrekturen 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

131200
ENTKOMMEN = {"\\n": "\n", "\\t": "\t", "\\r": "\r", "\\\"": "\"", "\\\\": "\\"}
@@ -261,7 +330,7 @@ def pruefe_eintrag(msgid: str, msgstr: str, arten: set) -> list:
261330
# --- Hauptprogramm ---------------------------------------------------------
262331

263332
ALLE_ARTEN = ["klammer", "anzeige", "verweis", "code", "literal", "typo",
264-
"bindestrich"]
333+
"bindestrich", "titel"]
265334

266335
ERKLAERUNG = {
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

Comments
 (0)