Дамп, собранный конвертером из PDF, теряет всю семантику: ни заголовков, ни
листингов, только абзацы с обфусцированными классами. Такие книги уезжали в
перевод одним куском, а код — вместе с текстом.
Теперь при нулевом числе заголовков или листингов разметка восстанавливается из
таблицы стилей книги: три самых крупных кегля становятся уровнями заголовков,
моноширинная гарнитура — листингом, соседние строки листинга склеиваются в один
блок. Книга со своей разметкой в этот путь не попадает.
Проверено на двух настоящих книгах: дамп APoSD — 1833 плоских абзаца стали 29
главами и 58 листингами; Страуструп с собственной разметкой не изменился.
- epub2html.py: EPUB -> тот же XHTML, что pdf2html.py, только стандартная
библиотека. Уровень глав определяется по книге, а не берётся из <h1>:
в EPUB там обычно название и части.
- pdf2html.py: листинг узнаётся по флагу моноширинного шрифта PyMuPDF,
переносы и отступы внутри <pre> сохраняются, де-дефисация к коду не
применяется.
- translate.py: <pre> исключён из проверок языка (английский код утягивал
долю кириллицы ниже порога приёмки), рабочий каталог привязан к книге,
устаревшие главы прошлого прогона чистятся, инлайновый <code> переживает
переводчика.
- bookhtml.py: общий каркас документа и CSS для обоих входов.
- Тесты: test_epub2html.py на собранном в памяти EPUB, четыре новых случая
в test_translate.py.