]> sipb.mit.edu Git - ikiwiki.git/commitdiff
Merge branch 'master' of ssh://git.ikiwiki.info
authorJoey Hess <joey@kitenet.net>
Mon, 4 Mar 2013 22:32:40 +0000 (18:32 -0400)
committerJoey Hess <joey@kitenet.net>
Mon, 4 Mar 2013 22:32:40 +0000 (18:32 -0400)
IkiWiki/Plugin/map.pm
debian/changelog
doc/bugs/map_generates_malformed_HTML.mdwn
t/map.t [new file with mode: 0755]
t/permalink.t

index 38f090ff782f8799edbe074b9778477809f9d045..4a9bf58dbc1a446ae72f37f13089af05fdc7b221 100644 (file)
@@ -72,6 +72,9 @@ sub preprocess (@) {
                $common_prefix=IkiWiki::dirname($common_prefix);
        }
 
+       # Set this to 1 or more spaces to pretty-print maps for debugging
+       my $spaces = "";
+
        # Create the map.
        my $parent="";
        my $indent=0;
@@ -94,33 +97,37 @@ sub preprocess (@) {
                        if defined $common_prefix && length $common_prefix;
                my $depth = ($item =~ tr/\//\//) + 1;
                my $baseitem=IkiWiki::dirname($item);
-               my $parentbase=IkiWiki::dirname($parent);
-               while (length $parentbase && length $baseitem && $baseitem !~ /^\Q$parentbase\E(\/|$)/) {
-                       $parentbase=IkiWiki::dirname($parentbase);
+               while (length $parent && length $baseitem && $baseitem !~ /^\Q$parent\E(\/|$)/) {
+                       $parent=IkiWiki::dirname($parent);
                        last if length $addparent && $baseitem =~ /^\Q$addparent\E(\/|$)/;
                        $addparent="";
-                       $indent--;
-                       $map .= "</li>\n";
-                       if ($indent > 0) {
-                               $map .= "</ul>\n";
+                       $map .= ($spaces x $indent) . "</li>\n";
+                       if ($indent > 1) {
+                               $map .= ($spaces x $indent) . "</ul><map:collapse>\n";
                        }
+                       $indent--;
                }
                while ($depth < $indent) {
-                       $indent--;
-                       $map .= "</li>\n";
-                       if ($indent > 0) {
-                               $map .= "</ul>\n";
+                       $map .= ($spaces x $indent) . "</li>\n";
+                       if ($indent > 1) {
+                               $map .= ($spaces x $indent) . "</ul>\n";
                        }
+                       $indent--;
                }
                my @bits=split("/", $item);
                my $p="";
-               $indent++  unless length $parent;
                $p.="/".shift(@bits) for 1..$indent;
                while ($depth > $indent) {
-                       if (@bits && !(length $parent && "/$parent" eq $p)) {
+                       $indent++;
+                       if ($indent > 1) {
+                               $map .= ($spaces x $indent) . "<ul><map:collapse>\n";
+                       }
+                       if ($depth > $indent) {
+                               $p.="/".shift(@bits);
                                $addparent=$p;
                                $addparent=~s/^\///;
-                               $map .= "<li>"
+                               $map .= ($spaces x $indent) . "<li>\n";
+                               $map .= ($spaces x $indent)
                                        .htmllink($params{page}, $params{destpage},
                                                 "/".$common_prefix.$p, class => "mapparent",
                                                 noimageinline => 1)
@@ -130,14 +137,10 @@ sub preprocess (@) {
                        else {
                                $openli=0;
                        }
-                       $indent++;
-                       $p.="/".shift(@bits) if @bits;
-                       if ($indent > 1) {
-                               $map .= "<ul>\n";
-                       }
                }
-               $map .= "</li>\n" if $openli;
-               $map .= "<li>"
+               $map .= ($spaces x $indent) . "</li>\n" if $openli;
+               $map .= ($spaces x $indent) . "<li>\n";
+               $map .= ($spaces x $indent)
                        .htmllink($params{page}, $params{destpage}, 
                                "/".$common_prefix."/".$item,
                                @linktext,
@@ -147,9 +150,12 @@ sub preprocess (@) {
                $parent=$item;
        }
        while ($indent > 0) {
+               $map .= ($spaces x $indent) . "</li>\n";
                $indent--;
-               $map .= "</li>\n</ul>\n";
+               $map .= ($spaces x $indent) . "</ul>\n";
        }
+       $map =~ s{\n *</ul><map:collapse>\n *<ul><map:collapse>\n}{\n}gs;
+       $map =~ s{<map:collapse>}{}g;
        $map .= "</div>\n";
        return $map;
 }
index 54e7c902406792acfbd39f7cfe1f35ab3621687e..1657ffcb608c53c51be26462ee05569ac8b4cfaa 100644 (file)
@@ -3,6 +3,8 @@ ikiwiki (3.20130213) UNRELEASED; urgency=low
   * Allow dots in directive parameter names. (tango)
   * Add missing plugin section, and deal with missing sections with a warning.
   * Detect plugins with a broken getsetup and warn.
+  * map: Correct reversion introduced in version 3.20110225 that could
+    generate invalid html. (smcv)
 
  -- Joey Hess <joeyh@debian.org>  Fri, 15 Feb 2013 17:23:12 -0400
 
index e094264f45504f7d32b6e123a335bae9a1d533a1..890a6ef7fe790b94311fcc1d89ced8752bf34941 100644 (file)
@@ -32,3 +32,5 @@ HTML with redundant `</ul><ul>` pairs, marks the redundant
 pairs, and edits them out afterwards - but it works. If anyone can come
 up with a cleaner algorithm that avoids generating the redundant tags
 in the first place, that would be even better. --[[smcv]]
+
+> [[merged|done]] (not thrilled at this solution, but it works) --[[Joey]] 
diff --git a/t/map.t b/t/map.t
new file mode 100755 (executable)
index 0000000..7f3df61
--- /dev/null
+++ b/t/map.t
@@ -0,0 +1,235 @@
+#!/usr/bin/perl
+package IkiWiki;
+
+use warnings;
+use strict;
+use XML::Twig;
+use Test::More;
+
+BEGIN { use_ok("IkiWiki"); }
+BEGIN { use_ok("IkiWiki::Render"); }
+BEGIN { use_ok("IkiWiki::Plugin::map"); }
+BEGIN { use_ok("IkiWiki::Plugin::mdwn"); }
+
+ok(! system("rm -rf t/tmp; mkdir t/tmp"));
+
+$config{verbose} = 1;
+$config{srcdir} = 't/tmp';
+$config{underlaydir} = 't/tmp';
+$config{underlaydirbase} = '.';
+$config{templatedir} = 'templates';
+$config{usedirs} = 1;
+$config{htmlext} = 'html';
+$config{wiki_file_chars} = "-[:alnum:]+/.:_";
+$config{userdir} = "users";
+$config{tagbase} = "tags";
+$config{default_pageext} = "mdwn";
+$config{wiki_file_prune_regexps} = [qr/^\./];
+$config{autoindex_commit} = 0;
+
+is(checkconfig(), 1);
+
+%oldrenderedfiles=%pagectime=();
+%pagesources=%pagemtime=%oldlinks=%links=%depends=%typedlinks=%oldtypedlinks=
+%destsources=%renderedfiles=%pagecase=%pagestate=();
+
+my @pages = qw(
+alpha
+alpha/1
+alpha/1/i
+alpha/1/ii
+alpha/1/iii
+alpha/1/iv
+alpha/2
+alpha/2/a
+alpha/2/b
+alpha/3
+beta
+);
+
+foreach my $page (@pages) {
+       # we use a non-default extension for these, so they're distinguishable
+       # from programmatically-created pages
+       $pagesources{$page} = "$page.mdwn";
+       $destsources{$page} = "$page.mdwn";
+       $pagemtime{$page} = $pagectime{$page} = 1000000;
+       writefile("$page.mdwn", "t/tmp", "your ad here");
+}
+
+sub comment {
+       my $str = shift;
+       $str =~ s/^/# /gm;
+       print $str;
+}
+
+sub node {
+       my $name = shift;
+       my $kids = shift;
+       my %stuff = @_;
+
+       return { %stuff, name => $name, kids => $kids };
+}
+
+sub check_nodes {
+       my $ul = shift;
+       my $expected = shift;
+
+       is($ul->tag, 'ul');
+
+       # expected is a list of hashes
+       # ul is a list of li
+       foreach my $li ($ul->children) {
+               my @kids = $li->children;
+
+               is($li->tag, 'li');
+
+               my $expectation = shift @$expected;
+
+               is($kids[0]->tag, 'a');
+               my $a = $kids[0];
+
+               if ($expectation->{parent}) {
+                       is($a->att('class'), 'mapparent');
+               }
+               else {
+                       is($a->att('class'), 'mapitem');
+               }
+
+               is_deeply([$a->text], [$expectation->{name}]);
+
+               if (@{$expectation->{kids}}) {
+                       is(scalar @kids, 2);
+
+                       check_nodes($kids[1], $expectation->{kids});
+               }
+               else {
+                       is_deeply([@kids], [$a]);
+               }
+       }
+}
+
+sub check {
+       my $pagespec = shift;
+       my $expected = shift;
+       comment("*** $pagespec ***\n");
+
+       my $html = IkiWiki::Plugin::map::preprocess(pages => $pagespec,
+               page => 'map',
+               destpage => 'map');
+       comment($html);
+       my $tree = XML::Twig->new(pretty_print => 'indented');
+       eval {
+               $tree->parse($html);
+       };
+       if ($@) {
+               print "malformed XML: $@\n$html\n";
+               ok(0);
+       }
+       my $fragment = $tree->root;
+
+       is($fragment->tag, 'div');
+       is($fragment->att('class'), 'map');
+
+       if (@$expected) {
+               check_nodes(($fragment->children)[0], $expected);
+       }
+       else {
+               ok(! $fragment->children);
+       }
+
+       $tree->dispose;
+}
+
+check('doesnotexist', []);
+
+check('alpha', [node('alpha', [])]);
+
+check('alpha/*',
+       [
+               node('1', [
+                       node('i', []),
+                       node('ii', []),
+                       node('iii', []),
+                       node('iv', []),
+               ]),
+               node('2', [
+                       node('a', []),
+                       node('b', []),
+               ]),
+               node('3', []),
+       ]);
+
+check('alpha or alpha/*',
+       [
+               node('alpha', [
+                       node('1', [
+                               node('i', []),
+                               node('ii', []),
+                               node('iii', []),
+                               node('iv', []),
+                       ]),
+                       node('2', [
+                               node('a', []),
+                               node('b', []),
+                       ]),
+                       node('3', []),
+               ]),
+       ]);
+
+check('alpha or alpha/1 or beta',
+       [
+               node('alpha', [
+                       node('1', []),
+               ]),
+               node('beta', []),
+       ]);
+
+check('alpha/1 or beta',
+       [
+               node('alpha', [
+                       node('1', []),
+               ], parent => 1),
+               node('beta', []),
+       ]);
+
+check('alpha/1/i* or alpha/2/a or beta',
+       [
+               node('alpha', [
+                       node('1', [
+                               node('i', []),
+                               node('ii', []),
+                               node('iii', []),
+                               node('iv', []),
+                       ], parent => 1),
+                       node('2', [
+                               node('a', []),
+                       ], parent => 1),
+               ], parent => 1),
+               node('beta', []),
+       ]);
+
+check('alpha/1/i* or alpha/2/a',
+       [
+               node('1', [
+                       node('i', []),
+                       node('ii', []),
+                       node('iii', []),
+                       node('iv', []),
+               ], parent => 1),
+               node('2', [
+                       node('a', []),
+               ], parent => 1),
+       ]);
+
+check('alpha/1/i*',
+       [
+               node('i', []),
+               node('ii', []),
+               node('iii', []),
+               node('iv', []),
+       ]);
+
+ok(! system("rm -rf t/tmp"));
+done_testing;
+
+1;
index 81d4d18206e860f672f7689222ef45c526dcc0a5..36be984c56fd80aa88796d65bb98dee64f06fe23 100755 (executable)
@@ -3,6 +3,7 @@ use warnings;
 use strict;
 use Test::More 'no_plan';
 
+ok(! system("rm -rf t/tmp"));
 ok(! system("mkdir t/tmp"));
 ok(! system("make -s ikiwiki.out"));
 ok(! system("perl -I. ./ikiwiki.out -plugin inline -url=http://example.com -cgiurl=http://example.com/ikiwiki.cgi -rss -atom -underlaydir=underlays/basewiki -set underlaydirbase=underlays -templatedir=templates t/tinyblog t/tmp/out"));