Ein Zeilenumbruch gilt als weich (vom Satzprogramm), wenn das erste Wort der nächsten Zeile nicht mehr gepasst hätte (Toleranz 5 % der Spalte); sonst als hart, und die Zeile bleibt samt Einrückung erhalten. - lines_to_md (Patch von text_to_md): harte/weiche Umbrüche aus der Geometrie; Blöcke mit überwiegend harten Umbrüchen zeilengetreu als Codeblock (auch Proportionalschrift, Einrückung rekonstruiert) oder als Zeilen mit "\" und geschützten Leerzeichen - Blockgrenzen: freie Zeichen der letzten Zeile werden mitgegeben, normalize_markdown prüft damit das erste Wort des nächsten Blocks - normalize_markdown: harte Umbrüche, Absatzenden ohne Satzzeichen, Codeblöcke über Seitengrenzen zusammenführen, wörtliches ``` maskieren - EPUB-CSS: lange Codezeilen umbrechen (white-space: pre-wrap) - Tests (tests/test_verbatim.py), README, Bedienungsanleitung, CLAUDE.md, TODO.md Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
82 lines
3.7 KiB
Markdown
82 lines
3.7 KiB
Markdown
# TODO
|
||
|
||
## 1. Teile und Kapitel als separate Markdown-Dateien (`--split`)
|
||
|
||
**Ziel:** Beim Konvertieren PDF → Markdown jeden Teil bzw. jedes Kapitel als eigene MD-Datei
|
||
speichern. Damit lassen sich:
|
||
|
||
- Teile/Kapitel einzeln ändern,
|
||
- Teile/Kapitel vertauschen oder umsortieren,
|
||
- die MD-Dateien für RAG verarbeiten (ein Kapitel = ein Dokument),
|
||
- daraus HTML-Dateien oder andere Formate erzeugen.
|
||
|
||
**Skizze:**
|
||
|
||
- Option `--split teile|kapitel`; Ausgabe als Ordner `<name>/` statt einer einzelnen `.md`.
|
||
- Dateinamen mit Nummer und Titel, z. B.
|
||
```
|
||
band1/
|
||
index.md # Reihenfolge der Dateien (bzw. book.yaml)
|
||
00_vorspann.md # Titelei, Inhaltsverzeichnis, Vorwort
|
||
01_teil-i_das-vermaechtnis.md
|
||
02_kapitel-01_der-notar.md
|
||
…
|
||
99_nachspann.md # Der Autor, Impressum
|
||
images/
|
||
```
|
||
- YAML-Frontmatter pro Datei (für RAG und Umsortieren):
|
||
```yaml
|
||
---
|
||
title: "1 Der Notar"
|
||
part: "Teil I: Das Vermächtnis"
|
||
chapter: 1
|
||
source_pages: [12, 25]
|
||
book: "Operation Ljutsch"
|
||
author: "Reinhard Otto Kranz"
|
||
---
|
||
```
|
||
- EPUB aus den Einzeldateien: pandoc nimmt mehrere Eingabedateien in der Reihenfolge von
|
||
`index.md`; Umsortieren = Reihenfolge im Index ändern.
|
||
|
||
**Ansatzpunkte im Code (`pdf2md.py`):**
|
||
|
||
- Schnitt **nach** `normalize_markdown()` an den Überschriften `##` (Teil) und `###` (Kapitel);
|
||
die Ebenen kommen aus `load_outline()`.
|
||
- Bildpfade pro Datei anpassen (`make_image_links_relative()`).
|
||
- Vorspann (alles vor dem ersten Teil/Kapitel) und Nachspann als eigene Dateien.
|
||
|
||
**Offene Fragen:**
|
||
|
||
- Ein Ordner pro Teil oder alles flach in einem Ordner?
|
||
- Seitenzahlen ins Frontmatter? (pymupdf4llm liefert sie mit `page_chunks=True`.)
|
||
- Bücher ohne PDF-Gliederung: auf die erkannten Überschriften zurückfallen?
|
||
- Umkehrweg „Einzeldateien → ein MD/EPUB“ als eigene Option oder eigenes Skript?
|
||
|
||
**Tests:** Aufteilung des synthetischen Test-PDFs (Teil I, Kapitel 1–2) prüfen; Einzeldateien
|
||
wieder zusammengesetzt = Gesamt-Markdown.
|
||
|
||
## 2. Weitere Ideen
|
||
|
||
- `--from-md buch.md`: nur den EPUB-Schritt aus einem (von Hand bearbeiteten) Markdown
|
||
ausführen; Titel, Autor und Cover automatisch übernehmen.
|
||
- JPEG-Qualität einstellbar machen (z. B. `--jpeg-quality 85`), damit das EPUB noch kleiner wird.
|
||
- Remote für das Git-Repo einrichten (z. B. GitHub), damit die Commits gesichert sind.
|
||
|
||
## 3. Bekannte Schwächen (aus Probeläufen mit fremden PDFs)
|
||
|
||
- Reine Zahlen als Überschrift: pymupdf4llm macht Fußnotenzeichen zu Überschriften
|
||
(„## 90“ im Zensur-Report). Nicht pauschal entfernen – im DDR-Buch sind „## 1“, „## 2“
|
||
echte Kapitelnummern. Möglicher Ansatz: Zahl-Überschrift nur behalten, wenn direkt eine
|
||
Überschrift folgt.
|
||
- Römische Seitenzahlen („## XX“, „## XXIV“) werden nicht als Seitenzahl erkannt; Vorsicht
|
||
wegen echter Kapitel „I.“, „II.“.
|
||
- Gesperrte Überschriften („M e i n k l e i nes Stück D D R“) bleiben zerrissen.
|
||
- Alte Scans mit eigener OCR-Ebene: `--ocr always` liefert meist besseren Text.
|
||
- Zeilengetreu: Verszeilen mit Satzzeichen am Ende werden zu Absätzen (split_by_indent
|
||
wertet kurze Zeile + Satzende als Absatzende); Codefragmente ohne Code-Merkmale
|
||
(`[dependencies]`, Programmausgaben) landen als `\`-Zeilen neben dem Codeblock statt darin.
|
||
- Markdown-Sonderzeichen werden nicht maskiert: `__add__` im Register wird fett gesetzt.
|
||
- Links: Setzt sich eine URL in einem neuen Block fort (z. B. als Listenpunkt „- juuuport-…“),
|
||
bleibt sie abgeschnitten. Links mit eigenem Text („hier“) gehen verloren; Abhilfe wäre,
|
||
die Link-Rechtecke der PDF dem Text zuzuordnen (`[hier](…)`). Die Heuristik ohne Linkziel
|
||
hängt Wörter mit „/“ an („https://a.de/ und/oder“ → eine URL).
|