summaryrefslogtreecommitdiff
path: root/IkiWiki/Plugin
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
parent5163646e264633480d8562f2419bdaca597148c1 (diff)
* 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')
-rw-r--r--IkiWiki/Plugin/link.pm83
-rw-r--r--IkiWiki/Plugin/skeleton.pm16
2 files changed, 99 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
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=@_;