LINUX.ORG.RU

HTML pretty-printing

 ,


0

1

Кто-нибудь встречал модуль или имеет хотя бы идею того, как сделать pretty-printing HTML'a в консоль? Нужно обрабоать теги <b> и <font color= backgroundcolor= > и вывести в консоль текст с соответствующими аттрибутами. Раскрашивать аутпут через Terminal::ANSIColor я научился, а вот как кошерно распарсить HTML, не догоняю. Регулярки не айс, т.к. как <b> может быть вложен в <font> так и наоборот. И да, желательно без библиотек с сипана, к ним нет доступа.

XML и HTML не пригодны для парсинга регулярными выражениями. К сожалению, здесь нужны именно специальные парсеры: HTML::Parser/HTML::TreeBuilder.

И да, желательно без библиотек с сипана, к ним нет доступа.

Почему?

AITap ★★★★★
()
Ответ на: комментарий от AITap

потому что закрытая сетка без доступа в общий интернет. физического доступа к машинам тоже нет. так что либо обходиться тем что уже есть, либо писать свой велосипед.

про то что html регулярками не парсится, я знаю. но в моем случае нужно обрабатывать только небольшое его подмножество, поэтому совсем не хочется воротить полноценный xml-парсер

marvin_yorke ★★★
() автор топика
Ответ на: комментарий от marvin_yorke

потому что закрытая сетка без доступа в общий интернет.

И ничего нельзя придумать? Дистрибутивные пакеты поставить, CPAN'овые поставить на другой машине в local::lib и перекинуть?

Тогда что-то вроде:
1) Создаём 3 списка для хранения значений цветов и <b>
2) Перебираем теги: for split /(<[^>]+>)/,$text {
2) Встретив открывающий тег (/^<([^/>][^>]*)>$/), записываем текущее значение в соответствующий список и печатаем ANSI-последовательность для нового цвета/жирности
3) Встретив закрывающий тег (/^<(/[^>]+)>$/), shift'аем соответствующий список и печатаем полученную из него ANSI-последовательность
4) Встретив любую другую последовательность символов, печатаем её
5) }

AITap ★★★★★
()

Бустовские регулярки с нежадным поиском типа "[abcd]*?" и "[abcd]+?" спасут отца русской демократии. А вообще полный парсер, возможно, и не нужен, достаточно завести стек тегов и пройтись по файлу из начала в конец, а при увеличении или уменьшении размера стека либо ничего не делать (если тег не конвертируется), либо ставить соотв. эскейп последовательность. Только главное не забывать, что HTML код не всегда валиден - нужно сравнивать обнаруженный тег с тегами в стеке, начиная от вершины.

Вот.

quiet_readonly ★★★★
()

Вдогонку: состояния вроде как вполне описываются строкой, задающей эскейп-последовательность.

quiet_readonly ★★★★
()
Ответ на: комментарий от AITap

Тогда что-то вроде:
1) Создаём 3 списка для хранения значений цветов и <b>
2) Перебираем теги: for split /(<[^>]+>)/,$text {
2) Встретив открывающий тег (/^<([^/>][^>]*)>$/), записываем текущее значение в соответствующий список и печатаем ANSI-последовательность для нового цвета/жирности
3) Встретив закрывающий тег (/^<(/[^>]+)>$/), shift'аем соответствующий список и печатаем полученную из него ANSI-последовательность
4) Встретив любую другую последовательность символов, печатаем её
5) }

отлично, думаю в моем случае это как раз то что нужно, сейчас попробую

marvin_yorke ★★★
() автор топика
Ответ на: комментарий от marvin_yorke

Может HTML Tidy в комбинации Mojo::DOM? знаю что моджо надо тянуть с CPAN, но его можно скачать как тарбол и подключить через use lib './mojo';

outtaspace ★★★
()
Ответ на: комментарий от AITap

спасибо, реализовал такой вариант, с небольшими поправками - вроде работает
получилось примерно так http://pastebin.com/JZKFMNWH
т.к. Term::ANSIColor не умеет отключать опции цвета по одной, только сбрасывать в дефолт (а умеет ли терминал вообще? емнип, нет), то пришлось делать сброс, а потом проходить по массиву цветов и устанавливать их заново для тех значений, которые в нем остались

marvin_yorke ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.