以下のフィルター コード スニペットは、非常に単純なことを行います。最上位の SVG グループがマッチリストに含まれるラベルでタグ付けされている場合、その可視性が強制され (< g style="display:)、グループと非グループ コードがそのまま標準出力にコピーされます (フラッシュ) 。 . そうでなければ、グループはストリームから削除されます (パージ).
問題は次のとおりです: 私が理解しているように、各グループ全体 (大きい場合があります) が順番に解析され、メモリに格納されます。タグが検査され、変更されます. 開始タグの後にファイルの読み取りを停止し、一致する < /g> 終了タグに移動するためのコード変更は何でしょうか, トラバースされたコードをコピーするかどうかにかかわらず, のネスト以外は何も解析しません.タグ?
start_tag_handler がそれを行うことになっていることを読みましたが、フラッシュまたはパージを正しく使用することができませんでした。おまけとして、 $g->parent->gi eq "g"; の場合に返されます。これは、内部グループが (外部グループの前に) 処理されなくなるため、不要になる可能性があります。
もちろん、エラーの報告は大歓迎です: trifle: $indent は何もしないようです。何か間違っていますか?@ http://www.papou.byethost9.com/notes/svg-sieve/
svg-sieve -d all でデバッグを使用してインライン例をテストするための
完全なコードと例。
svg-sieve -d ma -l Ixelles,language=ru,names=ru Brussels-municipalities.svg > Brussels-Ixelles-ru.svg
-d mi レイヤーを検出します。
< 感謝回数=1000 />
アンドレ。
my $twig = new XML::Twig( twig_roots => { 'g' => \&g },
twig_print_outside_roots => 1, pretty_print => "$indent",);
sub g { my ($t, $g) = @_;
return if $g->parent->gi eq "g";
my $label=$g->att("inkscape:label");
$label or $label=$g->att("id");
if ( $label ~~ @matchlist | $label =~ /^BASE-/) {
my $style=$g->att("style");
$style =~ s/display:[^;]*(;?)/display:inline\1/;
$g->set_att( style => "$style");
$g-> flush;
} else {
$g-> purge;
}
}