2012-01-18 3 views
3

Я новичок в Perl (Strawberry Perl v5.12.3 в Windows 7), пытаясь написать сценарий, который поможет мне с повторяющейся задачей форматирования HTML. Файлы должны быть отредактированы вручную в будущем, и я хочу, чтобы они были удобными для людей, поэтому после обработки с использованием пакета HTML (HTML :: TreeBuilder и т. Д.) Я пишу результат в файл, используя HTML::PrettyPrinter. Все это хорошо работает, и вывод PrettyPrinter очень приятный и удобочитаемый. Тем не менее, PrettyPrinter не работает с самозакрывающимися тегами; в основном, похоже, что косая черта рассматривается как атрибут HTML. С входной как:Perl: HTML :: PrettyPrinter - Обработка самозакрывающихся тегов

<img /> 

PrettyPrinter возвращается:

<img /="/" > 

Что я могу сделать, чтобы избежать этого, кроме предварительной обработки с регулярным выражением, чтобы удалить обратный слеш?

Не уверен, что это будет полезно, но здесь моя установка для красивой печати:

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), 
} 

ответ

1

Вы можете печатать отформатированы читаемую HTML человека с помощью метода TreeBuilder:

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

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

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

UPD:

хорошо ... тогда мы можем исправить PrettyPrinter. Это не чистый модуль Perl так что позволяет видеть ... Понятия не имею, где на окнах Perl модули для меня это /usr/local/share/perl/5.10.1/HTML/PrettyPrinter.pm

может быть не элегантный решение, но я буду работать. это суб синтаксического анализа пар атрибут/значение, немного исправить, и это добавит сингл «/» в конце

~ линии 756 в PrettyPrinter.pm Я пометил жала, что я добавил с ### < < < < < < в конце

# 
# 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"',...); 
} 
+0

Спасибо за ответ. Однако ни одно из них не является решением. Даже если вы предложили вариант отступов табуляции, 'print $ h-> as_HTML' все еще запутывает вещи нечетным образом, что человек никогда не будет (например, все h2 запускаются вместе в одной строке с предыдущим p-тегом) , Следовательно, использование PrettyPrinter. Я думаю, вы неправильно поняли мой пример, связанный с PrettyPrinter. Нет ничего плохого в моих тегах img. PrettyPrinter печатает _all_ самозакрывающиеся теги в качестве стандартных тегов с атрибутом/property, установленным на «/», например. '
' становится '
' – SenatorForLife

+0

Я обновил сообщение о том, как исправить модуль. надеюсь, это поможет – Dimanoid

+0

Это, похоже, работает очень красиво, спасибо! Я определенно слишком много новичка Perl, чтобы разобраться с взломом самостоятельно. Для других пользователей Strawberry Perl вот где HTML :: PrettyPrinter появился на моей машине после установки с помощью cpanm: C: \ strawberry \ perl \ site \ lib \ HTML \ PrettyPrinter.pm – SenatorForLife