linkmap: Add option to omit disconnected pages from the map.
authorJoey Hess <joey@gnu.kitenet.net>
Fri, 1 Jan 2010 08:37:59 +0000 (03:37 -0500)
committerJoey Hess <joey@gnu.kitenet.net>
Fri, 1 Jan 2010 08:37:59 +0000 (03:37 -0500)
IkiWiki/Plugin/linkmap.pm
debian/changelog
doc/ikiwiki/directive/linkmap.mdwn

index 9540bd112f397cd5cd98e89eb54572737aefa839..28acbda32abdbb4a9abd022d96a9906b81e987b7 100644 (file)
@@ -49,6 +49,7 @@ sub genmap ($) {
        my $mapnum=shift;
        return "" unless exists $maps{$mapnum};
        my %params=%{$maps{$mapnum}};
+       my $connected=IkiWiki::yesno($params{connected});
 
        # Get all the items to map.
        my %mapitems = map { $_ => urlto($_, $params{destpage}) }
@@ -79,24 +80,38 @@ sub genmap ($) {
        print OUT "charset=\"utf-8\";\n";
        print OUT "ratio=compress;\nsize=\"".($params{width}+0).", ".($params{height}+0)."\";\n"
                if defined $params{width} and defined $params{height};
+       my %shown;
+       my $show=sub {
+               my $item=shift;
+               if (! $shown{$item}) {
+                       print OUT "\"$item\" [shape=box,href=\"$mapitems{$item}\"];\n";
+                       $shown{$item}=1;
+               }
+       };
        foreach my $item (keys %mapitems) {
-               print OUT "\"$item\" [shape=box,href=\"$mapitems{$item}\"];\n";
+               $show->($item) unless $connected;
                foreach my $link (map { bestlink($item, $_) } @{$links{$item}}) {
-                       print OUT "\"$item\" -> \"$link\";\n"
-                               if $mapitems{$link};
+                       next unless length $link and $mapitems{$link};
+                       foreach my $endpoint ($item, $link) {
+                               $show->($endpoint);
+                       }
+                       print OUT "\"$item\" -> \"$link\";\n";
                }
        }
        print OUT "}\n";
-       close OUT;
+       close OUT || error gettext("failed to run dot");
 
        local $/=undef;
        my $ret="<object data=\"".urlto($dest, $params{destpage}).
               "\" type=\"image/png\" usemap=\"#linkmap$mapnum\">\n".
                <IN>.
                "</object>";
-       close IN;
+       close IN || error gettext("failed to run dot");
        
        waitpid $pid, 0;
+       if ($?) {
+               error gettext("failed to run dot");
+       }
        $SIG{PIPE}="DEFAULT";
        error gettext("failed to run dot") if $sigpipe;
 
index 984351415b1293610db48ee5dfa94e2d2eb97f8d..eb9bf496ffc5f54dca838ac79d268ff598d539bc 100644 (file)
@@ -11,6 +11,7 @@ ikiwiki (3.20091219) UNRELEASED; urgency=low
   * comments: Add a checksum to the name of comment pages, to
     avoid merge conflicts when comments are posted to two branches of a
     site.
+  * linkmap: Add option to omit disconnected pages from the map.
 
  -- Joey Hess <joeyh@debian.org>  Fri, 25 Dec 2009 14:31:22 -0500
 
index 38cf0fd119a8892a4fb1deddf1047a196a5a6f1a..baa6fff61f04f7ab294d9ece42264dc32cf8fc6e 100644 (file)
@@ -7,9 +7,7 @@ graph showing the links between a set of pages in the wiki. Example usage:
 
 Only links between mapped pages will be shown; links pointing to or from
 unmapped pages will be omitted. If the pages to include are not specified,
-the links between all pages (and other files) in the wiki are mapped. For
-best results, only a small set of pages should be mapped, since otherwise
-the map can become very large, unwieldy, and complicated.
+the links between all pages (and other files) in the wiki are mapped. 
 
 Here are descriptions of all the supported parameters to the `linkmap`
 directive:
@@ -18,5 +16,14 @@ directive:
 * `height`, `width` - Limit the size of the map to a given height and width,
   in inches. Both must be specified for the limiting to take effect, otherwise
   the map's size is not limited.
+* `connected` - Controls whether to include pages on the map that link to
+  no other pages (connected=no, the default), or to only show pages that
+  link to others (connected=yes).
+
+For best results, only a small set of pages should be mapped, since
+otherwise the map can become very large, unwieldy, and complicated.
+If too many pages are included, the map may get so large that graphviz
+cannot render it. Using the `connected` parameter is a good way to prune
+out pages that clutter the map.
 
 [[!meta robots="noindex, follow"]]