diff --git a/README.md b/README.md index 1beb872..df0bea5 100644 --- a/README.md +++ b/README.md @@ -220,7 +220,8 @@ weil CommonMark keine `[^…]`-Syntax kennt. - **Formelbasierte EPUBs:** Am besten sind EPUBs mit MathML oder TeX im `alt`-Text (z. B. Springer). - **SVG-Formeln** bleiben SVG (nie gerastert) und werden im Bericht als Formel markiert. - **Layouttabellen / komplexe Tabellen** (`colspan`, `rowspan`, Blockinhalte in Zellen, verschachtelte - Tabellen) bleiben als bereinigtes HTML im Markdown erhalten, mit Warnung. Einfache Tabellen werden + Tabellen, senkrechte Striche `|` in Code, Formeln oder Link-Zielen – GFM würde die Zeile dort in + zusätzliche Zellen zerlegen) bleiben als bereinigtes HTML im Markdown erhalten, mit Warnung. Einfache Tabellen werden GFM-Pipe-Tabellen. Einzellige Layouttabellen werden als normaler Text ausgegeben. - **Syntax-Highlighting:** Farb-Spans, ``/`` in Listings und Zeilennummern werden entfernt. Einrückung, Tabs, `<`, `>`, `&`, `$`, `|`, Backslashes und Backticks bleiben exakt erhalten. Die Sprache diff --git a/epub2md/html_converter.py b/epub2md/html_converter.py index b007651..ae76927 100644 --- a/epub2md/html_converter.py +++ b/epub2md/html_converter.py @@ -694,8 +694,19 @@ class Renderer: return f"Blockelemente ({local(e.tag)}) in Zellen" if local(e.tag) == "math" and e.get("display") == "block": return "abgesetzte Formeln in Zellen" + if self._raw_pipe(e): + return "senkrechte Striche (|) in Code, Formel oder Link" return "" + def _raw_pipe(self, e: Any) -> bool: + """'|' in content that is emitted unescaped (code span, math, link target, image) would split a GFM row.""" + name = local(e.tag) + if is_inline_code(e) or name in ("kbd", "math"): + return "|" in text_content(e) + if name in ("a", "img", "image", "svg"): + return any("|" in v for v in e.attrib.values()) + return False + # ================================================================== inline def inline_children(self, el: Any) -> list[Piece]: diff --git a/tests/test_qa_regressions.py b/tests/test_qa_regressions.py new file mode 100644 index 0000000..11793e0 --- /dev/null +++ b/tests/test_qa_regressions.py @@ -0,0 +1,23 @@ +"""Regression tests for defects found in the independent QA run (.qa/QA_REPORT.md, IDs QA2-…).""" + +import re + +from conftest import Book, Doc + + +def _pipe_rows(text: str) -> list[str]: + return [ln for ln in text.splitlines() if ln.startswith("| ")] + + +def test_pipe_in_inline_code_does_not_split_gfm_table(convert): + """QA2-01: GFM splits table cells at every unescaped '|', also inside code spans and link targets.""" + body = ("

Operatoren

" + "" + "" + "
OperatorBedeutung
||logisches ODER
a | bLink
") + run = convert(Book(docs=[Doc("c.xhtml", body)])) + text = run.chapter("001") + for row in _pipe_rows(text): + cells = re.split(r"(?