import re from conftest import Book, Doc PY = """def read_book(path): if path: return path.read_text(encoding="utf-8") # <utf-8> \treturn None""" def fenced_blocks(text: str) -> list[tuple[str, str]]: return re.findall(r"^(`{3,})([\w+-]*)\n(.*?)\n\1$", text, re.M | re.S) def test_python_indentation_and_special_chars(convert): body = f'

Code

{PY}
' run = convert(Book(docs=[Doc("c.xhtml", body)])) blocks = fenced_blocks(run.chapter("001")) assert len(blocks) == 1 fence, lang, code = blocks[0] assert lang == "python" assert code == PY.replace("<", "<").replace(">", ">") assert "<" not in code def test_shell_code_with_pipes_backslashes_and_dollar(convert): shell = "$ cat datei.txt | grep -v '^#' \\\n | sort && echo \"$HOME\" > out.txt" body = f"

Shell

{shell}
" run = convert(Book(docs=[Doc("c.xhtml", body)])) (_, lang, code), = fenced_blocks(run.chapter("001")) assert code == "$ cat datei.txt | grep -v '^#' \\\n | sort && echo \"$HOME\" > out.txt" assert lang == "" # no reliable language signal -> no label def test_backticks_in_code_get_longer_fence(convert): body = "

T

echo ```nested``` and `x`
" run = convert(Book(docs=[Doc("c.xhtml", body)])) (fence, _, code), = fenced_blocks(run.chapter("001")) assert fence == "````" assert code == "echo ```nested``` and `x`" def test_br_lines_and_highlight_spans_in_pre(convert): body = ('

C

#include <stdio.h>

' 'int main(void) {
printf("Hallo\\n");
}
') run = convert(Book(docs=[Doc("c.xhtml", body)])) (_, lang, code), = fenced_blocks(run.chapter("001")) assert lang == "c" assert code == '#include \n\nint main(void) {\n printf("Hallo\\n");\n} ' def test_listing_div_with_span_pre(convert): body = ('

K

def f(x):\n' ' return 2 * x\n\ndef g(x):\n return x
') run = convert(Book(docs=[Doc("c.xhtml", body)])) (_, lang, code), = fenced_blocks(run.chapter("001")) assert lang == "python" assert code == "def f(x):\n return 2 * x\n\ndef g(x):\n return x" def test_line_numbers_are_removed(convert): body = '

L

1a = 1
2b = 2
' run = convert(Book(docs=[Doc("c.xhtml", body)])) (_, _, code), = fenced_blocks(run.chapter("001")) assert code == "a = 1\nb = 2" def test_inline_code_variants(convert): body = ('

I

Nutze a*b_c, x | y und `tick` ' 'sowie Strg.

') run = convert(Book(docs=[Doc("c.xhtml", body)])) text = run.chapter("001") assert "`a*b_c`" in text assert "`x | y`" in text assert "`` `tick` ``" in text assert "Strg" in text def test_prose_is_not_forced_into_code(convert): body = "

P

Ein normaler Absatz mit Leerzeichen.

" run = convert(Book(docs=[Doc("c.xhtml", body)])) assert "```" not in run.chapter("001") assert "Ein normaler Absatz mit Leerzeichen." in run.chapter("001") def test_unlabeled_code_is_reported(convert): run = convert(Book(docs=[Doc("c.xhtml", "

U

foo bar
")])) assert run.report["code_blocks"]["languages"] == {"(keine)": 1}