下面的过滤器代码片段做了一些非常简单的事情。如果顶级 SVG 组使用包含在匹配列表中的标签进行标记,则强制其可见性 (< g style="display:) 并且该组以及未分组的代码将按原样复制到标准输出(刷新) .否则,该组从流中删除(清除)。
问题是:据我了解,每个整个组(可能很大)依次解析并存储在内存中,这不是必需的,因为只是开始标签被检查和修改。在开始标签之后停止读取文件然后飞到匹配的</g>结束标签的代码修改是什么,是否复制遍历的代码,除了嵌套之外不解析任何内容标签?
我读到 start_tag_handler 应该这样做,但我无法正确使用刷新或清除。作为奖励,返回 if $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;
}
}