aboutsummaryrefslogtreecommitdiff
path: root/IkiWiki
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
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')
-rw-r--r--IkiWiki/Plugin/link.pm83
-rw-r--r--IkiWiki/Plugin/skeleton.pm16
-rw-r--r--IkiWiki/Render.pm21
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);
}