From: Antoine Beaupré <anarcat@debian.org>
Date: Wed, 12 Apr 2017 19:42:42 +0000 (-0400)
Subject: use heading identifiers in TOC links
X-Git-Tag: debian/3.20170622~41
X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/commitdiff_plain/b5b48d5bb56105e1188b78131de2d575e918969c?ds=inline

use heading identifiers in TOC links

reasoning: if headings have identifiers, they are probably more useful
anchors than the automatically generated anchors we build in the toc
plugin. this can happen if, for example, you use the `multimarkdown`
plugin, which inserts `id` tags for every header it encounters. this
also leverages the `headinganchors` plugin nicely.

keeps backwards-compatibility with old toc-generated #indexXhY
anchors.
---

diff --git a/IkiWiki/Plugin/toc.pm b/IkiWiki/Plugin/toc.pm
index ac07b9af6..4d29e7040 100644
--- a/IkiWiki/Plugin/toc.pm
+++ b/IkiWiki/Plugin/toc.pm
@@ -59,13 +59,16 @@ sub format (@) {
 	my $liststarted=0;
 	my $indent=sub { "\t" x $curlevel };
 	$p->handler(start => sub {
-		my $tagname=shift;
-		my $text=shift;
+		my ($tagname, $text, $attr) = @_;
 		if ($tagname =~ /^h(\d+)$/i) {
 			my $level=$1;
 			my $anchor="index".++$anchors{$level}."h$level";
 			$page.="$text<a name=\"$anchor\"></a>";
-	
+			# if the heading already has a unique ID, use that instead in TOC
+			if ($attr->{id}) {
+				$anchor = $attr->{id};
+			}
+
 			# Unless we're given startlevel as a parameter,
 			# take the first header level seen as the topmost level,
 			# even if there are higher levels seen later on.
@@ -124,7 +127,7 @@ sub format (@) {
 		else {
 			$page.=$text;
 		}
-	}, "tagname, text");
+	}, "tagname, text, attr");
 	$p->handler(default => sub { $page.=join("", @_) }, "text");
 	$p->parse($content);
 	$p->eof;