X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/f32369f66924e0c008370c29462af57fd218267a..b857b229d8ff3601bbf01fafa51a3b3d3da928d8:/IkiWiki/Plugin/pedigree.pm?ds=sidebyside diff --git a/IkiWiki/Plugin/pedigree.pm b/IkiWiki/Plugin/pedigree.pm index efe6c3e77..1bc9ee14d 100644 --- a/IkiWiki/Plugin/pedigree.pm +++ b/IkiWiki/Plugin/pedigree.pm @@ -17,36 +17,72 @@ sub pedigree ($) { #{{{ my @ret; my $path=""; my $title=$config{wikiname}; - my $i; + my $i=0; my @pagepath=(split("/", $page)); - my $pageloc=@pagepath - 1; + my $pagedepth=@pagepath; foreach my $dir (@pagepath) { next if $dir eq 'index'; push @ret, { url => urlto($path, $page), page => $title, - level => $i, + absdepth => $i, is_root => ($i eq 0), - is_first_child => ($i eq 1), - is_mother => ($i eq ($pageloc - 1)), - is_grand_mother => ($i eq ($pageloc - 2)) + is_second_ancestor => ($i eq 1), + is_grand_mother => ($i eq ($pagedepth - 2)), + is_mother => ($i eq ($pagedepth - 1)), }; $path.="/".$dir; - $title=pagetitle($dir); + $title=IkiWiki::pagetitle($dir); $i++; } return @ret; } #}}} +sub forget_oldest ($@) { #{{{ + my $offset=shift; + my @pedigree=@_; + my @ret; + my $parent; + unless ($offset ge scalar(@pedigree)) { + for (my $i=0; $i < $offset; $i++) { + shift @pedigree; + } + while (@pedigree) { + # Doing so does not modify the original @pedigree, we've + # got our own copy of its "content" (i.e. a pile of + # references to hashes)... + $parent=shift @pedigree; + # ... but we have no copy of the referenced hashes, so we + # actually are modifying them in-place, which + # means the second (and following) calls to + # this function overwrite the previous one's + # reldepth values => known bug if PEDIGREE_BUT_ROOT and + # PEDIGREE_BUT_TWO_OLDEST are used in the same template + $parent->{reldepth}=($parent->{absdepth} - $offset); + push @ret, $parent; + } + } + return @ret; +} #}}} + sub pagetemplate (@) { #{{{ my %params=@_; my $page=$params{page}; my $template=$params{template}; - if ($template->query(name => "pedigree")) { - $template->param(pedigree => [pedigree($page)]); - } + my @pedigree=pedigree($page) + if ($template->query(name => "pedigree") + or $template->query(name => "pedigree_but_root") + or $template->query(name => "pedigree_but_two_oldest") + ); + + $template->param(pedigree => \@pedigree) + if ($template->query(name => "pedigree")); + $template->param(pedigree_but_root => [forget_oldest(1, @pedigree)]) + if ($template->query(name => "pedigree_but_root")); + $template->param(pedigree_but_two_oldest => [forget_oldest(2, @pedigree)]) + if ($template->query(name => "pedigree_but_two_oldest")); } # }}}