feat: von Hand nachbearbeitete Ausgabe wird nicht mehr überschrieben

abschrift_korrigieren.py merkt sich die Prüfsumme der geschriebenen
Ausgabe in <Ausgabe>.parts/ausgabe.sha256. Weicht die vorhandene Datei
davon und vom neuen Ergebnis ab, bleibt sie erhalten; das Ergebnis kommt
nach <Name>.neu.korrigiert.txt (mit eigenem Bericht) und es gibt eine
Warnung. --ueberschreiben ersetzt die Datei trotzdem.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-10-11 21:57:12 +02:00
commit 37e4a2bca0

View file

@ -33,6 +33,7 @@ MAX_WORD_DEVIATION = 0.05 # ab dieser Abweichung der Wortzahl wird gewarnt
PARAGRAPH_WINDOW = 150 # Sätze pro Anfrage bei der Absatzgliederung
MAX_PARAGRAPH_SENTENCES = 10 # längere Absätze werden nachträglich geteilt
MIN_PARAGRAPH_SENTENCES = 3 # kürzere Absätze werden mit dem Nachbarn verbunden
OUTPUT_RECORD = "ausgabe.sha256" # in <Ausgabe>.parts/: Prüfsumme der zuletzt geschriebenen Ausgabe
SENTENCE_END = re.compile(r"[.!?…][\"'»«“”)\]]*$")
SENTENCE_SPLIT = re.compile(r"(?:(?<=[.!?…])|(?<=[.!?…][\"'»«“”)\]]))\s+")
@ -641,6 +642,11 @@ def parse_args():
"--kein-bericht", action="store_true",
help="keinen Änderungsbericht <Ausgabe>.aenderungen.html schreiben",
)
parser.add_argument(
"--ueberschreiben", action="store_true",
help="die Ausgabedatei auch dann überschreiben, wenn sie seit dem letzten Lauf "
"von Hand geändert wurde (sonst entsteht <Name>.neu.korrigiert.txt)",
)
add_time_options(parser)
args = parser.parse_args(range_argv(sys.argv[1:]))
resolve_time_ranges(parser, args)
@ -708,6 +714,35 @@ def read_source(args):
return raw, args.output, base_language(args.lang or DEFAULT_LANGUAGE)
def text_hash(text):
return hashlib.sha256(text.encode("utf-8")).hexdigest()
def new_output_path(target):
"""rede.korrigiert.txt -> rede.neu.korrigiert.txt, out.txt -> out.neu.txt"""
if target.name.endswith(".korrigiert.txt"):
stem = target.name.removesuffix(".korrigiert.txt")
return target.with_name(f"{stem}.neu.korrigiert.txt")
return target.with_name(f"{target.stem}.neu{target.suffix}")
def choose_output(target, content, parts_dir, overwrite=False):
"""Where to write `content`: the target, unless it was changed by hand.
A target counts as changed by hand if it differs both from what the last
run wrote there (checksum in parts_dir) and from the new content. Without
a checksum (first run, .parts deleted) any differing target counts.
"""
if overwrite or not target.exists():
return target
current = target.read_text(encoding="utf-8")
record = parts_dir / OUTPUT_RECORD
last = record.read_text(encoding="utf-8").strip() if record.exists() else None
if current == content or text_hash(current) == last:
return target
return new_output_path(target)
def main():
global MODEL
args = parse_args()
@ -800,7 +835,18 @@ def main():
corrected_blocks.append((header, paragraphs))
text = join_segments(corrected_blocks, header_gap="\n\n")
target.write_text(text + "\n", encoding="utf-8")
content = text + "\n"
output = choose_output(target, content, parts_dir, args.ueberschreiben)
output.write_text(content, encoding="utf-8")
if output == target:
(parts_dir / OUTPUT_RECORD).write_text(text_hash(content) + "\n", encoding="utf-8")
else:
print(
f"WARNUNG: {target} wurde seit dem letzten Lauf geändert (von Hand?) und "
f"bleibt erhalten. Neues Ergebnis: {output} "
"(mit --ueberschreiben wird die Datei ersetzt)"
)
target = output
print(f"Fertig: {target}")
if not args.kein_bericht: