From 65c90c67ca525ce3b3a1a9a427c4140f4f682bae Mon Sep 17 00:00:00 2001 From: dschlueter Date: Tue, 6 Oct 2026 06:09:10 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20epub2md=5Fmerge=20k=C3=BCrzt=20ISO-Datu?= =?UTF-8?q?m=20im=20Buch-Kopf=20(13.01.2025)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- CHANGELOG.md | 12 +++++++----- README.md | 4 +++- epub2md/merge.py | 14 +++++++++++++- tests/test_merge.py | 13 +++++++++++++ 4 files changed, 36 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b5ac697..31115d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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` diff --git a/README.md b/README.md index 40a2c51..d6b1a89 100644 --- a/README.md +++ b/README.md @@ -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, diff --git a/epub2md/merge.py b/epub2md/merge.py index cba21ff..80ef7b9 100644 --- a/epub2md/merge.py +++ b/epub2md/merge.py @@ -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: diff --git a/tests/test_merge.py b/tests/test_merge.py index 91898ae..3e02003 100644 --- a/tests/test_merge.py +++ b/tests/test_merge.py @@ -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"