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
parent
d84e43faac
commit
9b10f5eab2
|
@ -80,7 +80,7 @@ sub preprocess (@) { #{{{
|
||||||
my $parent="";
|
my $parent="";
|
||||||
my $indent=0;
|
my $indent=0;
|
||||||
my $openli=0;
|
my $openli=0;
|
||||||
my $dummy=0;
|
my $addparent="";
|
||||||
my $map = "<div class='map'>\n<ul>\n";
|
my $map = "<div class='map'>\n<ul>\n";
|
||||||
foreach my $item (sort keys %mapitems) {
|
foreach my $item (sort keys %mapitems) {
|
||||||
my @linktext = (length $mapitems{$item} ? (linktext => $mapitems{$item}) : ());
|
my @linktext = (length $mapitems{$item} ? (linktext => $mapitems{$item}) : ());
|
||||||
|
@ -88,17 +88,16 @@ sub preprocess (@) { #{{{
|
||||||
if defined $common_prefix && length $common_prefix;
|
if defined $common_prefix && length $common_prefix;
|
||||||
my $depth = ($item =~ tr/\//\//) + 1;
|
my $depth = ($item =~ tr/\//\//) + 1;
|
||||||
my $baseitem=IkiWiki::dirname($item);
|
my $baseitem=IkiWiki::dirname($item);
|
||||||
print STDERR "!! parent: $parent baseitem: $baseitem\n";
|
|
||||||
while (length $parent && length $baseitem && $baseitem !~ /^\Q$parent\E(\/|$)/) {
|
while (length $parent && length $baseitem && $baseitem !~ /^\Q$parent\E(\/|$)/) {
|
||||||
$parent=IkiWiki::dirname($parent);
|
$parent=IkiWiki::dirname($parent);
|
||||||
last if !$dummy && length $parent && $baseitem =~ /^\Q$parent\E(\/|$)/;
|
last if length $addparent && $baseitem =~ /^\Q$addparent\E(\/|$)/;
|
||||||
|
$addparent="";
|
||||||
$indent--;
|
$indent--;
|
||||||
$map .= "</li>\n";
|
$map .= "</li>\n";
|
||||||
if ($indent > 0) {
|
if ($indent > 0) {
|
||||||
$map .= "</ul>\n";
|
$map .= "</ul>\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$dummy=0;
|
|
||||||
while ($depth < $indent) {
|
while ($depth < $indent) {
|
||||||
$indent--;
|
$indent--;
|
||||||
$map .= "</li>\n";
|
$map .= "</li>\n";
|
||||||
|
@ -116,14 +115,14 @@ sub preprocess (@) { #{{{
|
||||||
}
|
}
|
||||||
if ($depth > $indent) {
|
if ($depth > $indent) {
|
||||||
$p.="/".shift(@bits);
|
$p.="/".shift(@bits);
|
||||||
#$p=~s/^\///;
|
$addparent=$p;
|
||||||
|
$addparent=~s/^\///;
|
||||||
$map .= "<li>"
|
$map .= "<li>"
|
||||||
.htmllink($params{page}, $params{destpage},
|
.htmllink($params{page}, $params{destpage},
|
||||||
"/".$common_prefix.$p, class => "mapparent",
|
"/".$common_prefix.$p, class => "mapparent",
|
||||||
noimageinline => 1)
|
noimageinline => 1)
|
||||||
."\n";
|
."\n";
|
||||||
$openli=1;
|
$openli=1;
|
||||||
$dummy=1;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$openli=0;
|
$openli=0;
|
||||||
|
|
|
@ -5,6 +5,8 @@ ikiwiki (2.62) UNRELEASED; urgency=low
|
||||||
instead, and prompt if it fails.
|
instead, and prompt if it fails.
|
||||||
* Fix bug in wikiname sanitisation in the setup automator.
|
* Fix bug in wikiname sanitisation in the setup automator.
|
||||||
* ikiwiki-makerepo: Added support for monotone. (Thomas Keller)
|
* 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
|
-- Joey Hess <joeyh@debian.org> Thu, 21 Aug 2008 16:20:58 -0400
|
||||||
|
|
||||||
|
|
|
@ -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.
|
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]]
|
-- [[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]]
|
||||||
|
|
Loading…
Reference in New Issue