summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/VNDB/Handler/Tags.pm36
1 files changed, 22 insertions, 14 deletions
diff --git a/lib/VNDB/Handler/Tags.pm b/lib/VNDB/Handler/Tags.pm
index df91a1c3..edd73496 100644
--- a/lib/VNDB/Handler/Tags.pm
+++ b/lib/VNDB/Handler/Tags.pm
@@ -74,21 +74,13 @@ sub tagpage {
p;
my @p = @{$t->{parents}};
- my @r;
- for (0..$#p) {
- if($_ && $p[$_-1]{lvl} < $p[$_]{lvl}) {
- pop @r for (1..($p[$_]{lvl}-$p[$_-1]{lvl}));
- }
- if($_ < $#p && $p[$_+1]{lvl} < $p[$_]{lvl}) {
- push @r, $p[$_];
- } elsif($#p == $_ || $p[$_+1]{lvl} >= $p[$_]{lvl}) {
- a href => '/g', mt '_tagp_indexlink';
- for ($p[$_], reverse @r) {
- txt ' > ';
- a href => "/g$_->{id}", $_->{name};
- }
- txt " > $t->{name}\n";
+ for my $p (_parenttags(@p)) {
+ a href => '/g', mt '_tagp_indexlink';
+ for (reverse @$p) {
+ txt ' > ';
+ a href => "/g$_->{id}", $_->{name};
}
+ txt " > $t->{name}\n";
}
if(!@p) {
a href => '/g', mt '_tagp_indexlink';
@@ -128,6 +120,22 @@ sub tagpage {
$self->htmlFooter;
}
+
+# arg: tag hashref
+# returns: [ [ tag1, tag2, tag3 ], [ tag1, tag2, tag5 ] ]
+sub _parenttags {
+ my @r;
+ for my $t (@_) {
+ for (@{$t->{'sub'}}) {
+ my @p = _parenttags($_);
+ push @r, [ $t, @p?@{$p[0]}:() ];
+ }
+ push @r, [$t] if !@{$t->{'sub'}};
+ }
+ return @r;
+}
+
+
# used for on both /g and /g+
sub _childtags {
my($self, $t, $index) = @_;