map: don't create useless </ul><ul> sequences
authorGiuseppe Bilotta <giuseppe.bilotta@gmail.com>
Sun, 30 Jan 2011 22:02:46 +0000 (23:02 +0100)
committerJoey Hess <joey@kitenet.net>
Wed, 9 Feb 2011 18:39:28 +0000 (14:39 -0400)
With the previous logic, same-level items would go down one level and
then again up one level closing and re-opening UL tags each time. The
resulting redundant lists caused whitespace layout issues in the
rendered pages.

Adjust the "moving up?" logic to check if the current item base is
different from the previous item _base_. Adjust the "going down?" logic
by moving it to an earlier phase and checking for (1) parent item not being
what it should be and (2) remaining bits; the root is grown unconditionally as
long as (2) is verified.

IkiWiki/Plugin/map.pm

index ce3ac1d24e93be888ca9e81f597f55d8b2f41424..38f090ff782f8799edbe074b9778477809f9d045 100644 (file)
@@ -94,8 +94,9 @@ sub preprocess (@) {
                        if defined $common_prefix && length $common_prefix;
                my $depth = ($item =~ tr/\//\//) + 1;
                my $baseitem=IkiWiki::dirname($item);
-               while (length $parent && length $baseitem && $baseitem !~ /^\Q$parent\E(\/|$)/) {
-                       $parent=IkiWiki::dirname($parent);
+               my $parentbase=IkiWiki::dirname($parent);
+               while (length $parentbase && length $baseitem && $baseitem !~ /^\Q$parentbase\E(\/|$)/) {
+                       $parentbase=IkiWiki::dirname($parentbase);
                        last if length $addparent && $baseitem =~ /^\Q$addparent\E(\/|$)/;
                        $addparent="";
                        $indent--;
@@ -113,14 +114,10 @@ sub preprocess (@) {
                }
                my @bits=split("/", $item);
                my $p="";
+               $indent++  unless length $parent;
                $p.="/".shift(@bits) for 1..$indent;
                while ($depth > $indent) {
-                       $indent++;
-                       if ($indent > 1) {
-                               $map .= "<ul>\n";
-                       }
-                       if ($depth > $indent) {
-                               $p.="/".shift(@bits);
+                       if (@bits && !(length $parent && "/$parent" eq $p)) {
                                $addparent=$p;
                                $addparent=~s/^\///;
                                $map .= "<li>"
@@ -133,6 +130,11 @@ sub preprocess (@) {
                        else {
                                $openli=0;
                        }
+                       $indent++;
+                       $p.="/".shift(@bits) if @bits;
+                       if ($indent > 1) {
+                               $map .= "<ul>\n";
+                       }
                }
                $map .= "</li>\n" if $openli;
                $map .= "<li>"