map: The fix for #449285 was buggy and broke display of parents in certian circumstances.

The use of $dummy was not sufficient, because it only stuck around for the
first element after a dummy parent, and was then lost. Instead, use a
$addparent that contains the actual dummy parent, so it can be compared
with the new item to see if we're still under that parent or have moved to
another one.
master
Joey Hess 2008-08-23 13:10:49 -04:00
parent d84e43faac
commit 9b10f5eab2
3 changed files with 14 additions and 51 deletions

View File

@ -80,7 +80,7 @@ sub preprocess (@) { #{{{
my $parent="";
my $indent=0;
my $openli=0;
my $dummy=0;
my $addparent="";
my $map = "<div class='map'>\n<ul>\n";
foreach my $item (sort keys %mapitems) {
my @linktext = (length $mapitems{$item} ? (linktext => $mapitems{$item}) : ());
@ -88,17 +88,16 @@ sub preprocess (@) { #{{{
if defined $common_prefix && length $common_prefix;
my $depth = ($item =~ tr/\//\//) + 1;
my $baseitem=IkiWiki::dirname($item);
print STDERR "!! parent: $parent baseitem: $baseitem\n";
while (length $parent && length $baseitem && $baseitem !~ /^\Q$parent\E(\/|$)/) {
$parent=IkiWiki::dirname($parent);
last if !$dummy && length $parent && $baseitem =~ /^\Q$parent\E(\/|$)/;
last if length $addparent && $baseitem =~ /^\Q$addparent\E(\/|$)/;
$addparent="";
$indent--;
$map .= "</li>\n";
if ($indent > 0) {
$map .= "</ul>\n";
}
}
$dummy=0;
while ($depth < $indent) {
$indent--;
$map .= "</li>\n";
@ -116,14 +115,14 @@ sub preprocess (@) { #{{{
}
if ($depth > $indent) {
$p.="/".shift(@bits);
#$p=~s/^\///;
$addparent=$p;
$addparent=~s/^\///;
$map .= "<li>"
.htmllink($params{page}, $params{destpage},
"/".$common_prefix.$p, class => "mapparent",
noimageinline => 1)
."\n";
$openli=1;
$dummy=1;
}
else {
$openli=0;

2
debian/changelog vendored
View File

@ -5,6 +5,8 @@ ikiwiki (2.62) UNRELEASED; urgency=low
instead, and prompt if it fails.
* Fix bug in wikiname sanitisation in the setup automator.
* ikiwiki-makerepo: Added support for monotone. (Thomas Keller)
* map: The fix for #449285 was buggy and broke display of parents in certian
circumstances.
-- Joey Hess <joeyh@debian.org> Thu, 21 Aug 2008 16:20:58 -0400

View File

@ -76,49 +76,11 @@ One solution could also use the [[plugins/autoindex]] plugin to make sure that p
Note: This patch adds items to a map while it is in a foreach loop over a sorted list of keys from that same map. Changing a map while iterating through it is normally problematic. I'm assuming the sort insulates the code from this - I do not need to iterate over any of the newly added elements.
diff --git a/IkiWiki/Plugin/map.pm b/IkiWiki/Plugin/map.pm
index 5b6a843..16de45e 100644
--- a/IkiWiki/Plugin/map.pm
+++ b/IkiWiki/Plugin/map.pm
@@ -67,6 +67,39 @@ sub preprocess (@) { #{{{
# are removed.
add_depends($params{page}, join(" or ", keys %mapitems));
+ # Include all the parent directories in the map
+ my $lastbase="";
+ my $commonbase = "";
+ $commonbase = $common_prefix if defined $common_prefix && length $common_prefix;
+ foreach my $item (sort keys %mapitems) {
+ $item=~s/^\Q$common_prefix\E\///
+ if defined $common_prefix && length $common_prefix;
+ my $itembase=IkiWiki::dirname($item);
+ if ($itembase ne $lastbase) {
+ # find the common dir
+ my @a=split(/\//, $itembase);
+ my @b=split(/\//, $lastbase);
+ my $common_dir=$commonbase;
+ while (@a && @b && $a[0] eq $b[0]) {
+ if (length $common_dir) {
+ $common_dir.="/";
+ }
+ $common_dir.=shift(@a);
+ shift @b;
+ }
+ # add all the dirs down to the current base
+ while (@a) {
+ if (length $common_dir) {
+ $common_dir.="/";
+ }
+ $common_dir.=shift(@a);
+ $mapitems{$common_dir}=''
+ unless defined $mapitems{$common_dir};
+ }
+ $lastbase = $itembase;
+ }
+ }
+
# Create the map.
my $parent="";
my $indent=0;
-- [[users/Will]]
> The patch is subtly buggy and just papers over the actual bug with a
> lot of extra code. Thanks for trying to come up with a patch for this
> annyoingly complicated bug.. I think I've fixed the underlying bug now.
> --[[Joey]]
>
> [[tag done]]