]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/commitdiff
use heading identifiers in TOC links
authorAntoine Beaupré <anarcat@debian.org>
Wed, 12 Apr 2017 19:42:42 +0000 (15:42 -0400)
committerSimon McVittie <smcv@debian.org>
Tue, 16 May 2017 07:55:23 +0000 (08:55 +0100)
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

index ac07b9af6b860f0e5a36909197b4d98d0388fa41..4d29e704050f65dd8d22b57f655a1a2b70e19a57 100644 (file)
@@ -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;