Отступ HTML с Perl - PullRequest
       1

Отступ HTML с Perl

2 голосов
/ 22 ноября 2011

У меня есть переменная (например, $ content) с HTML-кодом (без разрывов строк - ранее была удалена). Как обработать HTML-код с добавлением отступа TAB после каждого открытого тега и уменьшить уровень отступа после каждого закрывающего тега?

P.S. Мне не нужен внешний скрипт или программа (например, приборка). Мне нужно сделать это в моем собственном сценарии.

Например: исходный контент:

<!DOCTYPE html><html><head><title>test</title></head>   <body>  <h1>hello!</h1><p>It works!</p></body></html>

необходимый результат:

<!DOCTYPE html>
<html>
    <head>
        <title>test</title>
    </head>
    <body>
        <h1>hello!</h1>
        <p>It works!</p>
    </body>
</html>

Ответы [ 4 ]

12 голосов
/ 22 ноября 2011
use HTML::HTML5::Parser qw();
use HTML::HTML5::Writer qw();
use XML::LibXML::PrettyPrint qw();

print HTML::HTML5::Writer->new(
    start_tags => 'force',
    end_tags => 'force',
)->document(
    XML::LibXML::PrettyPrint->new_for_html(
        indent_string => "\t"
    )->pretty_print(
        HTML::HTML5::Parser->new->parse_string(
            '<!DOCTYPE html><html><head><title>test</title></head>   <body>  <h1>hello!</h1><p>It works!</p></body></html>'
        )
    )
);

<!DOCTYPE html><html>
    <head>
        <title>test</title>
    </head>
    <body>
        <h1>hello!</h1>
        <p>It works!</p>
    </body>
</html>
1 голос
/ 24 ноября 2011

Я использовал опцию CGI :: Pretty .

1 голос
/ 22 ноября 2011

Страница справочника говорит, что tidy не будет выдавать вывод, содержащий вкладки.Но достаточно просто обработать вывод, чтобы справиться с этим.

$ tidy -indent foo.html | perl -pe 's|^( +)|"\t" x ((length $1) / 2)|e;'

Использование существующего инструмента должно быть гораздо лучшим решением, чем изобретать его самостоятельно.Но если вы настаиваете, то вам следует, по крайней мере, использовать предварительно написанный синтаксический анализатор, такой как Perl: HTML :: Parser.

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

или & p>.

0 голосов
/ 23 ноября 2011

Вы также можете попробовать Marpa :: HTML , ссылаясь на источник его вспомогательной / демонстрационной утилиты html_fmt , чтобы увидеть, как нацеливать определенные части документа для манипулирования.Я не использовал его и не могу попробовать сегодня из-за недостатка 5.10, но похоже, что это может быть хорошим совпадением.

...