2012-01-18 17 views
3

私はPerl(Windows 7のStrawberry Perl v5.12.3)の新人です。繰り返し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

あなたはTreeBuilder方法でフォーマットされた人間が読めるHTML印刷することができます。

$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モジュールはそう見ることができます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"',...); 
} 
+0

感謝。しかし、どちらも解決策ではありません。あなたが示唆したタブインデントオプションでさえ、 'print $ h-> as_HTML'は人間が決して奇妙な方法で一緒に実行します(例えば、すべてのh2が前のpタグと同じ行で一緒に実行されます) 。したがって、PrettyPrinterの使用。私はあなたがPrettyPrinterに関する私の模範的な例を誤解したと思います。私のimgタグには何も問題はありません。 - PrettyPrinterは_all_自己クローズタグを標準タグとして、/プロパティを "/"に設定して印刷します。 '
'は「
」 – SenatorForLife

+0

になりました。モジュールの修正方法に関する記事を更新しました。これが助けてくれることを願って – Dimanoid

+0

これは非常にきれいに動作するようです、ありがとう!私は間違いなく、自分自身でハックを見つけたPerlの初心者です。他のStrawberry Perlユーザーには、cpanm:C:\ strawberry \ perl \ site \ lib \ HTML \ PrettyPrinter.pm – SenatorForLife

関連する問題