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:
parent
13617c8d3e
commit
65c90c67ca
4 changed files with 36 additions and 7 deletions
12
CHANGELOG.md
12
CHANGELOG.md
|
|
@ -5,16 +5,18 @@ Versionsnummern nach [Semantic Versioning](https://semver.org/lang/de/).
|
||||||
|
|
||||||
## [Unveröffentlicht]
|
## [Unveröffentlicht]
|
||||||
|
|
||||||
### Geändert
|
|
||||||
|
|
||||||
- Seitenmarken (`--page-markers`) aus einem Kastentitel stehen jetzt vor dem Kasten statt im fetten Titel,
|
|
||||||
wie bei Überschriften.
|
|
||||||
|
|
||||||
### Neu
|
### Neu
|
||||||
|
|
||||||
- `pandoc/print.css`: Druck-Layout für PDFs mit weasyprint (A4, Seitenzahlen, Kapitel auf neuer Seite,
|
- `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.
|
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
|
### Behoben
|
||||||
|
|
||||||
- `pandoc/callouts.lua`: Die Kästen blieben ohne Rahmen, wenn man Pandoc zusätzlich `-H`/`--include-in-header`
|
- `pandoc/callouts.lua`: Die Kästen blieben ohne Rahmen, wenn man Pandoc zusätzlich `-H`/`--include-in-header`
|
||||||
|
|
|
||||||
|
|
@ -313,7 +313,9 @@ Beim Zusammenfügen passiert Folgendes:
|
||||||
- Kapitelüberschriften bleiben `#`, jedes Kapitel beginnt also mit einer H1. Pandoc behandelt sie als
|
- Kapitelüberschriften bleiben `#`, jedes Kapitel beginnt also mit einer H1. Pandoc behandelt sie als
|
||||||
Kapitel.
|
Kapitel.
|
||||||
- Der Buch-Kopf enthält nur Felder, die im EPUB vorhanden sind (`title`, `subtitle`, `author`, `lang`,
|
- 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
|
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,
|
den Kapitelanfang und erzeugt eine Warnung auf stderr. Die Zusammenfassung nennt Kapitelanzahl,
|
||||||
|
|
|
||||||
|
|
@ -89,6 +89,18 @@ def load_book(out_dir: Path) -> tuple[dict, list[ChapterFile]]:
|
||||||
return report, chapters
|
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:
|
def default_target(out_dir: Path, report: dict) -> Path:
|
||||||
name = (report.get("input") or {}).get("name") or (out_dir.name + ".epub")
|
name = (report.get("input") or {}).get("name") or (out_dir.name + ".epub")
|
||||||
stem = name[:-5] if name.lower().endswith(".epub") else name
|
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"),
|
("publisher", "publisher"), ("date", "published"), ("identifier", "identifier"),
|
||||||
("rights", "rights"), ("description", "description")):
|
("rights", "rights"), ("description", "description")):
|
||||||
if md.get(src):
|
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:
|
if fm:
|
||||||
parts.append("---\n" + to_yaml(fm) + "---")
|
parts.append("---\n" + to_yaml(fm) + "---")
|
||||||
if toc:
|
if toc:
|
||||||
|
|
|
||||||
|
|
@ -71,3 +71,16 @@ def test_merge_invalid_directory(tmp_path):
|
||||||
assert merge_main([str(tmp_path / "gibt-es-nicht")]) == 1
|
assert merge_main([str(tmp_path / "gibt-es-nicht")]) == 1
|
||||||
(tmp_path / "leer").mkdir()
|
(tmp_path / "leer").mkdir()
|
||||||
assert merge_main([str(tmp_path / "leer")]) == 1
|
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"
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue