feat: epub2md_merge kürzt ISO-Datum im Buch-Kopf (13.01.2025)

display_date(): '2025-01-13T08:00:00+00:00' → '13.01.2025' bei deutschen
Büchern, sonst '2025-01-13'; andere Formate unverändert. metadata.yaml
behält den Originalwert.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-10-06 06:09:10 +02:00
commit 65c90c67ca
4 changed files with 36 additions and 7 deletions

View file

@ -5,16 +5,18 @@ Versionsnummern nach [Semantic Versioning](https://semver.org/lang/de/).
## [Unveröffentlicht]
### Geändert
- Seitenmarken (`--page-markers`) aus einem Kastentitel stehen jetzt vor dem Kasten statt im fetten Titel,
wie bei Überschriften.
### Neu
- `pandoc/print.css`: Druck-Layout für PDFs mit weasyprint (A4, Seitenzahlen, Kapitel auf neuer Seite,
Silbentrennung außer in Code, umbrechende Codezeilen). Die Buch-README enthält den passenden Befehl.
### Geändert
- `epub2md_merge.py` kürzt ISO-Zeitstempel im Buch-Kopf (`2025-01-13T08:00:00+00:00` → `13.01.2025`, bei
nicht-deutschen Büchern `2025-01-13`), damit die Pandoc-Titelseite ein lesbares Datum zeigt.
- Seitenmarken (`--page-markers`) aus einem Kastentitel stehen jetzt vor dem Kasten statt im fetten Titel,
wie bei Überschriften.
### Behoben
- `pandoc/callouts.lua`: Die Kästen blieben ohne Rahmen, wenn man Pandoc zusätzlich `-H`/`--include-in-header`

View file

@ -313,7 +313,9 @@ Beim Zusammenfügen passiert Folgendes:
- Kapitelüberschriften bleiben `#`, jedes Kapitel beginnt also mit einer H1. Pandoc behandelt sie als
Kapitel.
- Der Buch-Kopf enthält nur Felder, die im EPUB vorhanden sind (`title`, `subtitle`, `author`, `lang`,
`publisher`, `date`, `identifier`, `rights`, `description`).
`publisher`, `date`, `identifier`, `rights`, `description`). Ein ISO-Zeitstempel als Datum wird gekürzt,
damit Pandoc auf der Titelseite nicht `2025-01-13T08:00:00+00:00` druckt: bei deutschen Büchern zu
`13.01.2025`, sonst zu `2025-01-13`. `metadata.yaml` behält den Originalwert.
Am Ende werden alle Links der Gesamtdatei geprüft. Ein Link auf einen nicht vorhandenen Anker zeigt auf
den Kapitelanfang und erzeugt eine Warnung auf stderr. Die Zusammenfassung nennt Kapitelanzahl,

View file

@ -89,6 +89,18 @@ def load_book(out_dir: Path) -> tuple[dict, list[ChapterFile]]:
return report, chapters
ISO_DATE = re.compile(r"^(\d{4})-(\d{2})-(\d{2})(?:[T ][\d:.]+(?:Z|[+-]\d{2}:?\d{2})?)?$")
def display_date(value: str, language: str) -> str:
"""'2025-01-13T08:00:00+00:00' → '13.01.2025' (German) or '2025-01-13'; other formats unchanged."""
m = ISO_DATE.match(value.strip())
if not m:
return value
year, month, day = m.groups()
return f"{day}.{month}.{year}" if language.lower().startswith("de") else f"{year}-{month}-{day}"
def default_target(out_dir: Path, report: dict) -> Path:
name = (report.get("input") or {}).get("name") or (out_dir.name + ".epub")
stem = name[:-5] if name.lower().endswith(".epub") else name
@ -225,7 +237,7 @@ def merge(out_dir: Path, target: Path | None = None, *, frontmatter: bool = True
("publisher", "publisher"), ("date", "published"), ("identifier", "identifier"),
("rights", "rights"), ("description", "description")):
if md.get(src):
fm[key] = md[src]
fm[key] = display_date(md[src], md.get("language", "")) if key == "date" else md[src]
if fm:
parts.append("---\n" + to_yaml(fm) + "---")
if toc:

View file

@ -71,3 +71,16 @@ def test_merge_invalid_directory(tmp_path):
assert merge_main([str(tmp_path / "gibt-es-nicht")]) == 1
(tmp_path / "leer").mkdir()
assert merge_main([str(tmp_path / "leer")]) == 1
def test_merge_shortens_iso_date(convert):
from epub2md.merge import display_date
assert display_date("2025-01-13T08:00:00+00:00", "de") == "13.01.2025"
assert display_date("2025-01-13", "de-DE") == "13.01.2025"
assert display_date("2025-01-13T08:00:00Z", "en") == "2025-01-13"
assert display_date("2025", "de") == "2025" # year only / other formats stay
assert display_date("Januar 2025", "de") == "Januar 2025"
run = convert(book())
assert merge_main([str(run.out)]) == 0
text = (run.out / f"{run.report['input']['name'][:-5]}.md").read_text(encoding="utf-8")
assert yaml.safe_load(text.split("---\n")[1])["date"] == "01.01.2024"