aboutsummaryrefslogtreecommitdiff
path: root/IkiWiki/Plugin/link.pm
diff options
context:
space:
mode:
authorJoey Hess <joey@kodama.kitenet.net>2008-02-11 22:48:27 -0500
committerJoey Hess <joey@kodama.kitenet.net>2008-02-11 22:48:27 -0500
commit4763514861457c295cadb7dbc7c0697ce682004f (patch)
tree159272cf44815ca8ffa24a363c24d2a5b384c94b /IkiWiki/Plugin/link.pm
parent5163646e264633480d8562f2419bdaca597148c1 (diff)
downloadikiwiki-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.pm83
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