From 4763514861457c295cadb7dbc7c0697ce682004f Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 11 Feb 2008 22:48:27 -0500 Subject: * 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. --- IkiWiki/Plugin/link.pm | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 IkiWiki/Plugin/link.pm (limited to 'IkiWiki/Plugin/link.pm') 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 =~ /(?