使用Perl进行HTML缩进

时间:2011-11-22 10:20:23

标签: html perl indentation

我有一个带有HTML代码的变量(例如$ content)(没有换行符 - 之前已删除)。如何在每个打开的标记后添加TAB缩进处理HTML代码,并在每个结束标记后减少缩进级别?

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 个答案:

答案 0 :(得分:12)

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 :(得分:1)

manual page表示tidy不会生成包含标签的输出。但它很简单,可以对输出进行后处理以解决这个问题。

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

使用现有工具必须比自己发明它更好的解决方案。但是,如果你坚持,那么你至少应该使用像Perl的HTML :: Parser这样的预先编写的解析器。

我还应该指出,您对问题的说明似乎不正确。您说您想在每个开始标记后添加标签。但是您的示例输出不会对&lt; title&gt;,&lt; h1&gt;执行此操作。或&amp; p&gt;标签

答案 2 :(得分:1)

我使用的选项是CGI::Pretty

答案 3 :(得分:0)

您还可以尝试Marpa::HTML引用其随播广告实验室html_fmt的来源,了解如何定位文档的特定部分以进行操作。我没有使用它,今天不能尝试5.10但是它看起来很不错。