X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/dc89360f03796465df96093b5a18a4abd661b4a3..65bf8a278fa6a2aa13b4a1ffd98113aa1f3620f3:/IkiWiki/Plugin/toc.pm

diff --git a/IkiWiki/Plugin/toc.pm b/IkiWiki/Plugin/toc.pm
index 070c07b0e..a585564e7 100644
--- a/IkiWiki/Plugin/toc.pm
+++ b/IkiWiki/Plugin/toc.pm
@@ -4,17 +4,26 @@ package IkiWiki::Plugin::toc;
 
 use warnings;
 use strict;
-use IkiWiki 2.00;
+use IkiWiki 3.00;
 use HTML::Parser;
 
-sub import { #{{{
+sub import {
+	hook(type => "getsetup", id => "toc", call => \&getsetup);
 	hook(type => "preprocess", id => "toc", call => \&preprocess);
 	hook(type => "format", id => "toc", call => \&format);
-} # }}}
+}
+
+sub getsetup () {
+	return
+		plugin => {
+			safe => 1,
+			rebuild => undef,
+		},
+}
 
 my %tocpages;
 
-sub preprocess (@) { #{{{
+sub preprocess (@) {
 	my %params=@_;
 
 	if ($params{page} eq $params{destpage}) {
@@ -31,9 +40,9 @@ sub preprocess (@) { #{{{
 		# right.
 		return "";
 	}
-} # }}}
+}
 
-sub format (@) { #{{{
+sub format (@) {
 	my %params=@_;
 	my $content=$params{content};
 	
@@ -86,17 +95,25 @@ sub format (@) { #{{{
 				}
 				$liststarted=0;
 			}
+				
+			$index.=&$indent."</li>\n" unless $liststarted;
+			$liststarted=0;
+			$index.=&$indent."<li class=\"L$curlevel\">".
+				"<a href=\"#$anchor\">";
 	
 			$p->handler(text => sub {
 				$page.=join("", @_);
-				$index.=&$indent."</li>\n" unless $liststarted;
-				$liststarted=0;
-				$index.=&$indent."<li class=\"L$curlevel\">".
-					"<a href=\"#$anchor\">".
-					join("", @_).
-					"</a>\n";
-				$p->handler(text => undef);
+				$index.=join("", @_);
 			}, "dtext");
+			$p->handler(end => sub {
+				my $tagname=shift;
+				if ($tagname =~ /^h(\d+)$/i) {
+					$p->handler(text => undef);
+					$p->handler(end => undef);
+					$index.="</a>\n";
+				}
+				$page.=join("", @_);
+			}, "tagname, text");
 		}
 		else {
 			$page.=$text;