"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にしていた方が楽じゃないかなぁ。。