Выровненный простой текст из HTML

Мне нужно простое текстовое представление произвольного файла HTML (например, сообщение в блоге). Пока это не проблема, существуют десятки конвертеров HTML в txt. Однако текст в абзацах (читай «p элементы») должен быть выровнен в представлении обычного текста (до определенного количества столбцов) и, если возможно, расставлен через дефис, чтобы обеспечить лучший читаемый результат. Кроме того, результирующий текстовый файл должен быть в кодировке UTF-8 или UTF-16.

Простая текстовая беседа, которую я могу вести с помощью XSLT, почти тривиальна. Но обоснование текста выходит за рамки его возможностей (не совсем так, потому что XSLT является полным по Тьюрингу, но достаточно близким к реальности).

FOP и XSL-FO также не работают. Они делают то, что просили, но обычный текстовый вывод FOP ужасен (разработчики говорят, что он не предназначен для такого использования).

Я также экспериментировал с HTML -> XSLT -> Roff, но я застрял с groff, и его поддержка Unicode далека от оптимальной. Поскольку есть такие символы, как многоточие ("...") и типографически правильные кавычки, довольно громоздко указать groff в таблице стилей XSLT escape-последовательности для десятков символов Unicode.

Другим способом может быть преобразование в TeX и вывод в виде простого текста, но я никогда раньше не пробовал это с (La)TeX.

Возможно, я пропустил что-то очень простое. Есть ли у кого-нибудь идея, как я могу достичь вышеизложенного? Кстати: Решение желательно должно работать без root-прав на установку, с PHP, Python, Perl, XSLT или любой программой, найденной в полуприличном дистрибутиве Linux.


person Boldewyn    schedule 30.10.2009    source источник


Ответы (3)


Попробуйте Питон. Используйте BeautifulSoup для анализа HTML. модуль переноса текста позволит вам отформатировать текст.

Однако отсутствуют две функции. Чтобы выровнять текст, вам нужно будет добавить пробелы в каждую строку, но это не должно быть большой проблемой (см. этот пример кода).

Для расстановки переносов попробуйте этот проект.

person Aaron Digulla    schedule 30.10.2009
comment
Это немного BYO, но да, с небольшой логикой, реализованной между textwrap и переносами, это может работать. Мне нравится чистый Python-подход. - person Boldewyn; 30.10.2009

Если вы знакомы с Emacs, вы можете открыть файл HTML в Emacs-W3M (т.е. M-x w3m-find-file foo.html) , сохраните отображаемую страницу как обычный текстовый файл, а затем вызовите для нее M-x set-justification-full.

Вы даже можете написать небольшую функцию для выполнения этой работы:

(defun my-html-to-justifed-text (html-file text-file)
  "Convert HTML-FILE to plain TEXT-FILE."
  (find-file html-file)
  (w3m-rendering-buffer)
  (set-justification-full (point-min) (point-max))
  (write-file text-file))

(my-html-to-justifed-text "~/tmp/2.html" "~/tmp/2.txt")
person viam0Zah    schedule 10.11.2009
comment
Это тоже хорошо, и мне нравится решение на Лиспе... Я принимаю ответ Аарона, потому что он также включает часть с переносами, но спасибо, что показали, на что способен Emacs. - person Boldewyn; 10.11.2009

Ссылки или lynx стоит попробовать, см. переключатель -dump. Часть кодирования вы можете легко решить отдельно, используя iconv или что-то подобное.

person zoul    schedule 30.10.2009
comment
Рысь не оправдывает, не так ли? Насколько я знаю, он полностью игнорирует CSS (который мало полезен для терминальных браузеров). Итак, это просто преобразование HTML в текст, что довольно просто и с другими методами. Прости. - person Boldewyn; 30.10.2009
comment
А вы пробовали какие-то варианты ссылок? Они намного лучше подходят для форматирования, некоторые из них также могут поддерживать выравнивание. - person zoul; 30.10.2009
comment
Может быть, я что-то упустил, но я не нашел ни Lynx, ни Links, ни Elinks, ни Links-hacked, ни w3m, делающих выравнивание или даже перенос. - person Boldewyn; 02.11.2009
comment
Ах, тогда извините, я просто предположил. - person zoul; 02.11.2009
comment
Без проблем! На самом деле, мне бы очень хотелось, чтобы браузер на основе терминала поддерживал медиа-тип CSS @tty. - person Boldewyn; 03.11.2009