Пять правок по итогам четырёх книг из to_read
Извлечение (pdf2html.py), каждая правка вызвана конкретной книгой: * колонтитул опознаётся по повтору текста в верхнем поле на многих полосах, а не по одной позиции. Позиционный признак рубит и настоящие заголовки: у Вернона («DDD Distilled») глава начинается ровно с верха полосы и короче 80 знаков, так пропали 14 заголовков из 15. Это ровно тот второй проход, о котором говорил ponytail-комментарий на прежнем фильтре; * блок режется, если шапка набрана крупнее следующего за ней текста. У Вернона 85 подзаголовков лежали в одном блоке с первым абзацем раздела: оглавление теряло второй уровень, а абзац начинался с заголовка без точки; * порог раздела снижен с 1.15 до 1.10 кегля текста. У Вернона подзаголовок 17.2 при тексте 15.0 — ровно на пять сотых ниже прежнего порога, и все 85 разделов уезжали в прозу. Тот же множитель, что у разреза блока, иначе разрез и классификация расходятся; * кандидатом в главы не может быть кегль, у которого в блоках нет букв. У Нейгарда («Release it!») номер главы набран кеглем 100 отдельным блоком («1», «2», …), и главой объявлялся он, а настоящие заголовки в 30 пунктов уезжали в разделы — оглавление выходило пустым. Отбор по наличию букв, а не по длине: «Preface» — семь знаков, порог по длине отсекал бы и его. Упаковка (pack_epub.py): XML 1.0 запрещает управляющие символы, а из PDF они приезжают регулярно. У Бейера («Site Reliability Engineering») 33 главы из 45 не разбирались как XML из-за одного такого знака в начале абзаца, и читалка спотыкается на таком файле молча. Чистим на упаковке, а не надеемся на извлечение. Тест на это добавлен и проверен: с обезвреженной правкой он падает. SKILL.md приведён в соответствие с репозиторием. Шаг упаковки с 25.08 делает pack_epub.py, а текст всё ещё требовал calibre на PATH — из-за этого проверка инструментов давала ложный отказ. Замерено 05.09.2026: ebook-convert отсутствует на всех трёх здешних машинах, и все четыре книги собрались без него. За calibre остался только .azw3 для Kindle. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XCiPWRi3Jqy4saD2LwU1Dp
This commit is contained in:
@@ -17,6 +17,12 @@ import sys
|
||||
import zipfile
|
||||
from pathlib import Path
|
||||
|
||||
# XML 1.0 запрещает управляющие символы, а из PDF они приезжают регулярно:
|
||||
# у Бейера («Site Reliability Engineering») 33 главы из 45 не разбирались как
|
||||
# XML из-за одного такого знака в начале абзаца. Читалка спотыкается молча,
|
||||
# поэтому чистим на упаковке, а не надеемся на извлечение.
|
||||
BAD_XML = re.compile(r"[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]")
|
||||
|
||||
H1 = re.compile(r"^<h1[^>]*>(.*?)</h1>$")
|
||||
IMG = re.compile(r'<img src="images/([^"]+)"')
|
||||
NS = 'xmlns="http://www.w3.org/1999/xhtml"'
|
||||
@@ -66,7 +72,7 @@ def series_meta(meta):
|
||||
|
||||
|
||||
def build(src, out, meta):
|
||||
text = src.read_text(encoding="utf-8")
|
||||
text = BAD_XML.sub("", src.read_text(encoding="utf-8"))
|
||||
css = re.search(r"<style>(.*?)</style>", text, re.S)
|
||||
css = css.group(1) if css else ""
|
||||
body = re.search(r"<body>(.*)</body>", text, re.S)
|
||||
|
||||
Reference in New Issue
Block a user