« Femoのメンテナンスおよびサーバ移動を5月24日24時から行います | メイン | [Femo]はてな記法の自動リンクサポート »

"Parsing of undecoded UTF-8 will give garbage .." in Text::Hatena::HTMLFilter

以前にも書いたけど、

 stderr: Parsing of undecoded UTF-8 will give garbage when decoding entities at /usr/lib/perl5/site_perl/5.8.6/Text/Hatena/HTMLFilter.pm line 36.

はHTML::Parserのwarningsで、消すにはHTML::Parserに渡す前にutf8 flagをたてるしかなさそう。

そこで、Text::Hatena ver. 0.12のText::Hatena::HTMLFilterをいじくってみた。
基本は、Parserに渡す前にutf8 flagを立てる。
また、Text::Hatenaのtexthandler(autolink処理)に渡す前にはflagをoff、出力する時は、基本off
というところで、parse、texthandler、htmlの各メソッドを以下のようにしてみた。

sub parse {
    my $self = shift;
    my $html = shift or return;
    if ( Encode::is_utf8($html) ) {
        $self->{original_is_utf8} = 1;
    }
    else {
        Encode::_utf8_on($html);
    }
    $self->{parser}->parse($html);
}

sub texthandler {
    my $self = shift;
    return sub {
        my $text = shift;
        Encode::_utf8_off($text) if Encode::is_utf8($text);
        $text =
          &{ $self->{context}->texthandler }( $text, $self->{context}, $self );
        Encode::_utf8_on($text) unless Encode::is_utf8($text);
        $self->{html} .= $text;
      }
}

sub html {
    my $self = shift;
    my $html = $self->{html};
    Encode::_utf8_off($html) if Encode::is_utf8($html) && !$self->{original_is_utf8};
    $html;
}


Text::Hatenaは基本flagはoffの想定できているんだけど、utf8前提っぽいところもあるから、flagはonにしていた方が楽じゃないかなぁ。。