From 27d5d9d126b6b675ad273ebd63095df0c921a264 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Antoine=20Beaupr=C3=A9?= <anarcat@debian.org>
Date: Wed, 12 Apr 2017 15:42:42 -0400
Subject: [PATCH] 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.
---
 IkiWiki/Plugin/toc.pm | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

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;
-- 
GitLab