HTML::TreeBuilderのエスケープ処理がよくなっている
のやつ、最近の更新で直ってるみたいだ。
HTML::Widget を試してみようとインストールしようとしたら、エスケープ関係のテストでこけて、それを追ってみたら気づいた。
--- ONLY 消し忘れ
追加実装をしているときのテスト書くときは結構 --- ONLY とか消し忘れてそのままコミットしてしまうなぁ。
デフォルトで出来るテストスクリプトにそれのチェックするのも入れるかな。
他になんかあるかな。
prototype &
run {
my $block = shift;
is(process($block->foo), $block->bar, $block->name);
};
って引数に関数渡せる。
これは perldoc perlsub の Prototypes の項目に載ってる
An "&" requires an anonymous subroutine, which, if passed as the first argument, does not require the "sub" keyword or a subsequent comma.
プロトタイプで & を第一引数に指定した場合その無名関数には sub つけなくても良い。
これは割と使えそうだ。
たとえば、STDERRとかになんか出力しちゃううざいモジュールを使ってtestを書いているときに
sub execute(&) {
my ($out, $err);
tie_output( *STDOUT, $out );
tie_output( *STDERR, $err );
my $res = shift->();
untie *STDOUT;
untie *STDERR;
$res;
}
とか作っとくと
my $res = execute { $suck_module_output_stderr->method };
とかでSTDERRだすことなくそのモジュールのテストかける。いいのー。
grep とかな実装しかあんまりみないから新鮮に見えるのかな。
OSXもうだめかもわからん
run_like が成功するときと失敗するときがあってこまった。
run_like input => 'results';
みたいなときなんかinputのフィルタがかからないときがあったりして失敗してるくさく、なんだと思ったら、うちのOSXの問題だったみたいだ。
use_ok を1個するだけのテストでも何回もやってるとこけたりする。ひどい。。
こけるときも毎回違う出力。
$ prove -lv t/04simpleuse.t
t/04simpleuse....dubious
Test returned status 0 (wstat 10, 0xa)
FAILED--1 test script could be run, alas--no output ever seen
とかよくわからんのだったり、
$ prove -lv t/04simpleuse.t
zsh: segmentation fault prove -lv t/04simpleuse.t
セグフォってみたり。。
$ prove -lv t/04simpleuse.t
Operator or semicolon missing before %opts at /System/Library/Perl/5.8.6/Pod/Usage.pm line 487.
Ambiguous use of % resolved as operator % at /System/Library/Perl/5.8.6/Pod/Usage.pm line 487.
Bareword "key3" not allowed while "strict subs" in use at /System/Library/Perl/5.8.6/Pod/Usage.pm line 482.
Bareword "opts" not allowed while "strict subs" in use at /System/Library/Perl/5.8.6/Pod/Usage.pm line 482.
Compilation failed in require at /usr/bin/prove line 12.
BEGIN failed--compilation aborted at /usr/bin/prove line 12.
こんなすごいのもでたよ。
再起動したらとりあえずなんか直ったくさいけど。もー、やばいわうちのmac。
HDDぶっこわれてんかなーとおもってfsckってみたけど問題なさげだったし。なんだろうほんと。
Test::Base
のpod一通り読んで、手持ちのアプリのテストを書いてみたりした。
なるほど、なかなか良いわぁ。簡単なテストはフィルタちょろっと書くだけでOKってのはいいな。
大抵のモジュールはSYNOPSIS見れば大体使い方がわかるものだけど(というかそういう風に書くよね)、Test::Baseはドキュメント読んでからじゃないとSYNOPSIS意味不明だったりするのもingyクオリティ。
あと、ドキュメントにもちらほらtypoが。
はてなブックマーク - CLON - 2006/10/08 - 手軽にモジュールのバージョンを得る perl -MDBIx::Class\ 999
kdaiba Perl perldocのどこに書いてあるんだろう
- perldoc -f use
- perldoc perlrun (の-Mのところ)
とかでしょうか。
手軽にモジュールのバージョンを得る perl -MDBIx::Class\ 999
$ perl -MDBIx::Class\ 999 DBIx::Class version 999 required--this is only version 0.07002. BEGIN failed--compilation aborted.
なるほど、こうすれば手軽にモジュールのバージョンを得られるのか。(バージョン指定のuse)
自分の使ってるマシンではaliasでモジュールのバージョンを求めるの設定してるのでいらないけど、そうじゃないところで使うのによさそう。
これはひどい、のか?
と言及を受けました。いやひどくないですごめんなさい。そうだなぁ、エスケープしてないのがおかしいんだものな。
でもまぁ日本語までエスケープされるのは困るわけで。
Text::Textile なんかも同じように日本語もエスケープしちゃうけど、オプションで charset('utf-8') とかできて、こうするとutf8文字はエスケープしなくできる。
こういうの欲しいなー。
HTML::TreeBuilderいいんだけど。。
escape関係が微妙なんだよなぁ。
use strict;
use warnings;
use HTML::TreeBuilder;
my $html = 'K&C and K&C';
my $tree = HTML::TreeBuilder->new;
$tree->parse($html);
$tree->eof;
print $tree->as_XML;
これで帰ってくるのは
<html><head></head><body>K&C and K&C</body></html>
これはひどい。
unsafeなものだけescapeしてsafeなものはしないので、escapeがソースとはずれてしまう。
& だけじゃなくて <>やマルチバイト系全部こうなる。
Plaggerでは HTML::Element::_xml_escape を上書きして対応してるけど、ちょろっと使う場合にいつもそれを書くはめんどいので、
$tree->parse( encode_entities($html, '&') );
とか、&を余分にエスケープしてからパースさせるようにして
decode_entities( $tree->as_XML );
とかして取り出している。
ものすごくBKです。なんとかならんかなぁ。
subtechグループ - Bulknews::Subtech - [Perl] Dumping variables Everywhere without use()
なるほどー! dumpたしかにつかったことない。。
しかし、ビルドイン関数って上書きは出来るけど追加は出来ないんかなぁ。