diff --git a/scripts/pdf2html.py b/scripts/pdf2html.py index d5763e4..254ee45 100644 --- a/scripts/pdf2html.py +++ b/scripts/pdf2html.py @@ -39,6 +39,7 @@ MAX_IMG_SHARE = 0.6 # доля площади страницы: больше # Запасное опознание листинга, когда издатель вычистил и имена шрифтов, и флаги: # кегль мельче основного текста плюс пунктуация, которой в прозе не бывает. CODEY = re.compile(r"[{}();\[\]<>=*/#]|::|->") +SOFT_HYPHEN = "\u00ad" def style(font, flags=0): @@ -137,7 +138,10 @@ def block_text(b, pre=False): # слова. Ни склейки строк, ни де-дефисации здесь быть не должно. rows = ["".join(span_html(s, plain=True) for s in l["spans"]) for l in b["lines"]] - return "\n".join(rows).rstrip() + # В настоящем коде мягкого переноса не бывает: если он тут есть, блок + # опознан как листинг ошибочно (обычно это таблица опций), и слово надо + # склеить, а не оставить разорванным переводом строки. + return "\n".join(rows).replace(SOFT_HYPHEN + "\n", "").rstrip() out = [] for i, l in enumerate(b["lines"]): line = "".join(span_html(s) for s in l["spans"]) @@ -145,7 +149,12 @@ def block_text(b, pre=False): continue if out: prev = out[-1] - if prev.endswith("-") and not prev.endswith("--"): + # Русские издания переносят мягким дефисом U+00AD, а не обычным: + # без этой ветки строки склеиваются через пробел и слово рвётся + # пополам («введен ные»). Измерено на Шоттсе (Питер, 2020). + if prev.endswith(SOFT_HYPHEN): + out[-1] = prev[:-1] + elif prev.endswith("-") and not prev.endswith("--"): out[-1] = prev[:-1] # de-hyphenate else: out.append(" ") @@ -154,6 +163,8 @@ def block_text(b, pre=False): txt = re.sub(r"(\s*)", r"\1", txt) txt = re.sub(r"(\s*)", r"\1", txt) txt = re.sub(r"(?<=\S) {2,}(?=\S)", " ", txt) + # Мягкие переносы внутри строки читалке не нужны и ломают поиск по тексту. + txt = txt.replace(SOFT_HYPHEN, "") return txt.strip()