html - Perl:HTML::PrettyPrinter - 处理自闭合标签

标签 html perl

我是 Perl(Windows 7 上的 Strawberry Perl v5.12.3)的新手,试图编写一个脚本来帮助我完成重复的 HTML 格式化任务。这些文件将来需要手动编辑,我希望它们是人性化的,所以在使用 HTML 包(HTML::TreeBuilder 等)处理后,我将结果写入文件使用 HTML::PrettyPrinter .所有这些都运行良好,而且 PrettyPrinter 的输出非常好并且易​​于阅读。但是,PrettyPrinter 不能很好地处理自闭合标签;基本上,它似乎将斜杠视为 HTML 属性。输入如下:

<img />

PrettyPrinter 返回:

<img /="/" >

除了使用正则表达式进行预处理以删除反斜杠之外,我还能做些什么来避免这种情况?

不确定它是否有用,但这是我的 pretty-print 设置:

my $hpp = HTML::PrettyPrinter->new('linelength' => 120, 'quote_attr' => 1);
$hpp->allow_forced_nl(1);

my $output = new FileHandle ">output.html";
if (defined $output) {
    $hpp->select($output);
    my $linearray_ref = $hpp->format($internal);
    undef $output;
    $hpp->select(undef),
}

最佳答案

您可以使用 TreeBuilder 方法打印格式化的人类可读 html:

$h = HTML::TreeBuilder->new_from_content($html);
print $h->as_HTML('',"\t");

但如果您仍然喜欢这个有问题的 pretty-print ,请尝试删除问题标签,不知道为什么有人需要...

$h = HTML::TreeBuilder->new_from_content($html);
while(my $n = $h->look_down(_tag=>img,'src'=>undef)) { $n->delete }

更新:

好吧...那么我们可以修复 PrettyPrinter。它是纯 perl 模块,所以让我们看看...... 不知道 Windows perl 模块对我来说是什么地方 /usr/local/share/perl/5.10.1/HTML/PrettyPrinter.pm

也许不是一个优雅的解决方案,但我希望它会起作用。 这个子解析属性/值对,稍微修复一下,它会在末尾添加单个“/”

~PrettyPrinter.pm 中的第 756 行 我在最后用 ###<<<<<< 标记了我添加的刺痛

#
# format the attributes
#
sub _attributes {
  my ($self, $e) = @_;
  my @result = (); # list of ATTR="value" strings to return

  my $self_closing = 0; ###<<<<<<
  my @attrs = $e->all_external_attr();  # list (name0, val0, name1, val1, ...)

  while (@attrs) {
    my ($a,$v) = (shift @attrs,shift @attrs);  # get current name, value pair
    if($a eq '/') {     ###<<<<<<
      $self_closing=1;  ###<<<<<<
      next;             ###<<<<<<
    }                   ###<<<<<<

    # string for output: 1. attribute name
    my $s = $self->uppercase? "\U$a" : $a;.

    # value part, skip for boolean attributes if desired
    unless ($a eq lc($v) &&
      $self->min_bool_attr &&.
      exists($HTML::Tagset::boolean_attr{$e->tag}) &&
      (ref($HTML::Tagset::boolean_attr{$e->tag}).
        ? $HTML::Tagset::boolean_attr{$e->tag}{$a}.
        : $HTML::Tagset::boolean_attr{$e->tag} eq $a)) {
      my $q = '';
      # quote value?
      if ($self->quote_attr || $v =~ tr/a-zA-Z0-9.-//c) {
        # use single quote if value contains double quotes but no single quotes
        $q = ($v =~ tr/"//  && $v !~ tr/'//) ? "'" : '"'; # catch emacs ");
      }
      # add value part
      $s .= '='.$q.(encode_entities($v,$q.$self->entities)).$q;
   }
   # add string to resulting list
   push @result, $s;
  }

  push @result,'/' if $self_closing;  ###<<<<<<
  return @result;  # return list ('attr="val"','attr="val"',...);
}

关于html - Perl:HTML::PrettyPrinter - 处理自闭合标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8912585/

相关文章:

Perl:哈希引用访问键数组

perl - 使用 perl 单线器的 Csh 别名在创建别名时评估,而不是在使用别名时评估

perl - perl 中的 Unicode,mkdir 练习

PHP DOM 解析器移动关闭 Div 标记

html - 将 CSS 的边距归零是一个好习惯吗?

html - 在 dd 上使用表格单元格

xml - 如何从 Perl 脚本定义 Makefile 变量?

linux - 使用错误参数的 Perl 程序

javascript - Phaser js php 排行榜

javascript - Jinja2 : call function on click