X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/e16746a52f40f478af1b634c532d90c25cc0ec76..532ec56a5f2131809f8a2709f2f1d5c1e5d0a19c:/IkiWiki/Plugin/toc.pm?ds=sidebyside

diff --git a/IkiWiki/Plugin/toc.pm b/IkiWiki/Plugin/toc.pm
index c36ce2893..dff9d9aa5 100644
--- a/IkiWiki/Plugin/toc.pm
+++ b/IkiWiki/Plugin/toc.pm
@@ -4,36 +4,50 @@ package IkiWiki::Plugin::toc;
 
 use warnings;
 use strict;
-use IkiWiki;
+use IkiWiki 2.00;
 use HTML::Parser;
 
 sub import { #{{{
-	IkiWiki::hook(type => "preprocess", id => "toc",
-		call => \&preprocess);
-	IkiWiki::hook(type => "format", id => "toc",
-		call => \&format);
+	hook(type => "getsetup", id => "toc", call => \&getsetup);
+	hook(type => "preprocess", id => "toc", call => \&preprocess);
+	hook(type => "format", id => "toc", call => \&format);
 } # }}}
 
-my @tocs;
+sub getsetup () { #{{{
+	return
+		plugin => {
+			safe => 1,
+			rebuild => undef,
+		},
+} #}}}
+
+my %tocpages;
 
 sub preprocess (@) { #{{{
 	my %params=@_;
 
-	$params{levels}=1 unless exists $params{levels};
+	if ($params{page} eq $params{destpage}) {
+		$params{levels}=1 unless exists $params{levels};
 
-	# It's too early to generate the toc here, so just record the
-	# info.
-	push @tocs, \%params;
+		# It's too early to generate the toc here, so just record the
+		# info.
+		$tocpages{$params{destpage}}=\%params;
 
-	return "\n[[toc $#tocs]]\n";
+		return "\n<div class=\"toc\"></div>\n";
+	}
+	else {
+		# Don't generate toc in an inlined page, doesn't work
+		# right.
+		return "";
+	}
 } # }}}
 
-sub format ($) { #{{{
-	my $content=shift;
+sub format (@) { #{{{
+	my %params=@_;
+	my $content=$params{content};
 	
-	return $content unless @tocs && $content=~/\[\[toc (\d+)\]\]/ && $#tocs >= $1;
-	my $id=$1;
-	my %params=%{$tocs[$id]};
+	return $content unless exists $tocpages{$params{page}};
+	%params=%{$tocpages{$params{page}}};
 
 	my $p=HTML::Parser->new(api_version => 3);
 	my $page="";
@@ -49,7 +63,7 @@ sub format ($) { #{{{
 		if ($tagname =~ /^h(\d+)$/i) {
 			my $level=$1;
 			my $anchor="index".++$anchors{$level}."h$level";
-			$page.="$text<a name=\"$anchor\" />";
+			$page.="$text<a name=\"$anchor\"></a>";
 	
 			# Take the first header level seen as the topmost level,
 			# even if there are higher levels seen later on.
@@ -81,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;
@@ -107,9 +129,7 @@ sub format ($) { #{{{
 		$index.=&$indent."</ol>\n";
 	}
 
-	# Ignore cruft around the toc marker, probably <p> tags added by
-	# markdown which shouldn't appear in a list anyway.
-	$page=~s/\n.*\[\[toc $id\]\].*\n/$index/;
+	$page=~s/(<div class=\"toc\">)/$1\n$index/;
 	return $page;
 }