diff options
author | Joey Hess <joey@kodama.kitenet.net> | 2008-02-11 22:48:27 -0500 |
---|---|---|
committer | Joey Hess <joey@kodama.kitenet.net> | 2008-02-11 22:48:27 -0500 |
commit | 4763514861457c295cadb7dbc7c0697ce682004f (patch) | |
tree | 159272cf44815ca8ffa24a363c24d2a5b384c94b /IkiWiki/Plugin/link.pm | |
parent | 5163646e264633480d8562f2419bdaca597148c1 (diff) | |
download | ikiwiki-4763514861457c295cadb7dbc7c0697ce682004f.tar ikiwiki-4763514861457c295cadb7dbc7c0697ce682004f.tar.gz |
* Add the linkify and scan hooks. These hooks can be used to implement
custom, first-class types of wikilinks.
* Move standard wikilink implementation to a new wikilink plugin, which
will of course be enabled by default.
Diffstat (limited to 'IkiWiki/Plugin/link.pm')
-rw-r--r-- | IkiWiki/Plugin/link.pm | 83 |
1 files changed, 83 insertions, 0 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 |