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()