Photos
Blog
Projects
vanrenterghem.biz
projects
/
git.ikiwiki.info.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
po.t: fix expected results
[git.ikiwiki.info.git]
/
IkiWiki
/
Plugin
/
toc.pm
diff --git
a/IkiWiki/Plugin/toc.pm
b/IkiWiki/Plugin/toc.pm
index 797bfc6bd526b7489e98046dd2ce752d4f85a0cd..ac07b9af6b860f0e5a36909197b4d98d0388fa41 100644
(file)
--- a/
IkiWiki/Plugin/toc.pm
+++ b/
IkiWiki/Plugin/toc.pm
@@
-4,29
+4,46
@@
package IkiWiki::Plugin::toc;
use warnings;
use strict;
use warnings;
use strict;
-use IkiWiki
2
.00;
+use IkiWiki
3
.00;
use HTML::Parser;
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);
hook(type => "preprocess", id => "toc", call => \&preprocess);
hook(type => "format", id => "toc", call => \&format);
-} # }}}
+}
+
+sub getsetup () {
+ return
+ plugin => {
+ safe => 1,
+ rebuild => undef,
+ section => "widget",
+ },
+}
my %tocpages;
my %tocpages;
-sub preprocess (@) {
#{{{
+sub preprocess (@) {
my %params=@_;
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.
- $tocpages{$params{destpage}}=\%params;
+
# It's too early to generate the toc here, so just record the
+
# info.
+
$tocpages{$params{destpage}}=\%params;
- return "\n<div class=\"toc\"></div>\n";
-} # }}}
+ return "\n<div class=\"toc\"></div>\n";
+ }
+ else {
+ # Don't generate toc in an inlined page, doesn't work
+ # right.
+ return "";
+ }
+}
-sub format (@) {
#{{{
+sub format (@) {
my %params=@_;
my $content=$params{content};
my %params=@_;
my $content=$params{content};
@@
-37,8
+54,8
@@
sub format (@) { #{{{
my $page="";
my $index="";
my %anchors;
my $page="";
my $index="";
my %anchors;
- my $
curlevel
;
- my $
startlevel=0
;
+ my $
startlevel=($params{startlevel} ? $params{startlevel} : 0)
;
+ my $
curlevel=$startlevel-1
;
my $liststarted=0;
my $indent=sub { "\t" x $curlevel };
$p->handler(start => sub {
my $liststarted=0;
my $indent=sub { "\t" x $curlevel };
$p->handler(start => sub {
@@
-47,14
+64,19
@@
sub format (@) { #{{{
if ($tagname =~ /^h(\d+)$/i) {
my $level=$1;
my $anchor="index".++$anchors{$level}."h$level";
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,
+ # 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.
if (! $startlevel) {
$startlevel=$level;
$curlevel=$startlevel-1;
}
# even if there are higher levels seen later on.
if (! $startlevel) {
$startlevel=$level;
$curlevel=$startlevel-1;
}
+ elsif (defined $params{startlevel} &&
+ $level < $params{startlevel}) {
+ return;
+ }
elsif ($level < $startlevel) {
$level=$startlevel;
}
elsif ($level < $startlevel) {
$level=$startlevel;
}
@@
-79,17
+101,25
@@
sub format (@) { #{{{
}
$liststarted=0;
}
}
$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("", @_);
$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");
}, "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;
}
else {
$page.=$text;