0

下面的过滤器代码片段做了一些非常简单的事情。如果顶级 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;
  }
}
4

1 回答 1

0

首先,如果 $indent 作为 Perl var 没有设置为 Twig 期望的属性值之一(“nice”、“indented”等),则不会做任何事情。

其次,我不太确定你的目标是什么。似乎您的记忆问题仅在于您不想要的元素。如果是这样,您可能不需要使用 tag_handlers。

您可以通过在“|”上加入 @matching 来显式匹配所需的元素 在用户定义的处理程序的 Xpath 中。我也会在你的解析行之后刷新 $twig。

#return if $g->parent->gi eq "g";如果你的 XPath<g>是绝对的,你也不需要这个,例如'/root/parent/g'.

my $twig_handlers = {
      'g[string(label) =~ /['.join('|',@matchlist).']/]' => sub { g_handler($_) },
   };

my $twig = new XML::Twig( 
      twig_roots => { 'g' => 1 },
      twig_handlers => $twig_handlers,
      twig_print_outside_roots => 1, pretty_print => $indent,);

sub g_handler { 
   my $g = shift;
   my $label=$g->att("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;
   }
}
于 2013-11-13T21:23:25.330 回答