gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:03:27 25 4
gpt4 key购买 nike

我是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com