0

以下のフィルター コード スニペットは、非常に単純なことを行います。最上位の 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;
  }
}
4

1 に答える 1