]> git.vpit.fr Git - perl/modules/LaTeX-TikZ.git/commitdiff
Only declare once each mod, tag-wise
authorVincent Pit <vince@profvince.com>
Wed, 21 Jul 2010 17:25:32 +0000 (19:25 +0200)
committerVincent Pit <vince@profvince.com>
Wed, 21 Jul 2010 17:25:32 +0000 (19:25 +0200)
lib/LaTeX/TikZ/Formatter.pm

index b3c242ad2ae5aa8f96c4fd50adddcc2f9a45e8eb..0838e46d0262176dc216efe45ba9dbf99ebf048f 100644 (file)
@@ -65,29 +65,42 @@ sub id {
  } qw/unit format scale width height origin/;
 }
 
-my $find_mods;
-$find_mods = do {
- no warnings 'recursion';
+my $find_mods = do {
+ our %seen;
 
- Sub::Name::subname('find_mods' => sub {
-  my ($set, $layers, $others) = @_;
+ my $find_mods_rec;
+ $find_mods_rec = do {
+  no warnings 'recursion';
+
+  Sub::Name::subname('find_mods_rec' => sub {
+   my ($set, $layers, $others) = @_;
+
+   for ($set->mods) {
+    my $tag = $_->tag;
+    next if $seen{$tag}++;
 
-  for ($set->mods) {
-   if ($_->isa('LaTeX::TikZ::Mod::Layer')) {
-    push @$layers, $_;
-   } else {
-    push @$others, $_;
+    if ($_->isa('LaTeX::TikZ::Mod::Layer')) {
+     push @$layers, $_;
+    } else {
+     push @$others, $_;
+    }
    }
-  }
 
-  my @subsets = $set->isa('LaTeX::TikZ::Set::Sequence')
-                ? $set->kids
-                : $set->isa('LaTeX::TikZ::Set::Path')
-                  ? $set->ops
-                  : ();
+   my @subsets = $set->isa('LaTeX::TikZ::Set::Sequence')
+                 ? $set->kids
+                 : $set->isa('LaTeX::TikZ::Set::Path')
+                   ? $set->ops
+                   : ();
+
+   $find_mods_rec->($_, $layers, $others) for @subsets;
+  });
+ };
+
+ Sub::Name::subname('find_mods' => sub {
+  local %seen = ();
 
-  $find_mods->($_, $layers, $others) for @subsets;
- })
+  $find_mods_rec->(@_);
+ });
 };
 
 sub render {