diff options
Diffstat (limited to 'IkiWiki')
-rw-r--r-- | IkiWiki/Plugin/link.pm | 83 | ||||
-rw-r--r-- | IkiWiki/Plugin/skeleton.pm | 16 | ||||
-rw-r--r-- | IkiWiki/Render.pm | 21 |
3 files changed, 112 insertions, 8 deletions
diff --git a/IkiWiki/Plugin/link.pm b/IkiWiki/Plugin/link.pm new file mode 100644 index 000000000..24579057c --- /dev/null +++ b/IkiWiki/Plugin/link.pm @@ -0,0 +1,83 @@ +#!/usr/bin/perl +package IkiWiki::Plugin::link; + +use warnings; +use strict; +use IkiWiki 2.00; + +my $link_regexp; + +sub import { #{{{ + hook(type => "checkconfig", id => "link", call => \&checkconfig); + hook(type => "linkify", id => "link", call => \&linkify); + hook(type => "scan", id => "link", call => \&scan); +} # }}} + +sub checkconfig () { #{{{ + if ($config{prefix_directives}) { + $link_regexp = qr{ + \[\[(?=[^!]) # beginning of link + (?: + ([^\]\|]+) # 1: link text + \| # followed by '|' + )? # optional + + ([^\n\r\]#]+) # 2: page to link to + (?: + \# # '#', beginning of anchor + ([^\s\]]+) # 3: anchor text + )? # optional + + \]\] # end of link + }x; + } + else { + $link_regexp = qr{ + \[\[ # beginning of link + (?: + ([^\]\|\n\s]+) # 1: link text + \| # followed by '|' + )? # optional + + ([^\s\]#]+) # 2: page to link to + (?: + \# # '#', beginning of anchor + ([^\s\]]+) # 3: anchor text + )? # optional + + \]\] # end of link + }x, + } +} #}}} + +sub linkify (@) { #{{{ + my %params=@_; + my $page=$params{page}; + my $destpage=$params{destpage}; + + $params{content} =~ s{(\\?)$link_regexp}{ + defined $2 + ? ( $1 + ? "[[$2|$3".($4 ? "#$4" : "")."]]" + : htmllink($page, $destpage, IkiWiki::linkpage($3), + anchor => $4, linktext => IkiWiki::pagetitle($2))) + : ( $1 + ? "[[$3".($4 ? "#$4" : "")."]]" + : htmllink($page, $destpage, IkiWiki::linkpage($3), + anchor => $4)) + }eg; + + return $params{content}; +} #}}} + +sub scan (@) { #{{{ + my %params=@_; + my $page=$params{page}; + my $content=$params{content}; + + while ($content =~ /(?<!\\)$link_regexp/g) { + push @{$links{$page}}, IkiWiki::linkpage($2); + } +} # }}} + +1 diff --git a/IkiWiki/Plugin/skeleton.pm b/IkiWiki/Plugin/skeleton.pm index 0e7f2e014..17a2162ff 100644 --- a/IkiWiki/Plugin/skeleton.pm +++ b/IkiWiki/Plugin/skeleton.pm @@ -14,6 +14,8 @@ sub import { #{{{ hook(type => "needsbuild", id => "skeleton", call => \&needsbuild); hook(type => "preprocess", id => "skeleton", call => \&preprocess); hook(type => "filter", id => "skeleton", call => \&filter); + hook(type => "linkify", id => "skeleton", call => \&linkify); + hook(type => "scan", id => "skeleton", call => \&scan); hook(type => "htmlize", id => "skeleton", call => \&htmlize); hook(type => "sanitize", id => "skeleton", call => \&sanitize); hook(type => "format", id => "skeleton", call => \&format); @@ -57,6 +59,20 @@ sub filter (@) { #{{{ return $params{content}; } # }}} +sub linkify (@) { #{{{ + my %params=@_; + + debug("skeleton plugin running as linkify"); + + return $params{content}; +} # }}} + +sub scan (@) { #{{{a + my %params=@_; + + debug("skeleton plugin running as scan"); +} # }}} + sub htmlize (@) { #{{{ my %params=@_; diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm index 2682e13ae..782818cdf 100644 --- a/IkiWiki/Render.pm +++ b/IkiWiki/Render.pm @@ -165,18 +165,23 @@ sub scan ($) { #{{{ # Always needs to be done, since filters might add links # to the content. $content=filter($page, $page, $content); - - my @links; - while ($content =~ /(?<!\\)$config{wiki_link_regexp}/g) { - push @links, linkpage($2); - } + if ($config{discussion}) { # Discussion links are a special case since they're # not in the text of the page, but on its template. - push @links, $page."/".gettext("discussion"); + $links{$page}=[ $page."/".gettext("discussion") ]; } - $links{$page}=\@links; - + else { + $links{$page}=[]; + } + + run_hooks(scan => sub { + shift->( + page => $page, + content => $content, + ); + }); + # Preprocess in scan-only mode. preprocess($page, $page, $content, 1); } |