2008-02-12 04:48:27 +01:00
|
|
|
#!/usr/bin/perl
|
|
|
|
package IkiWiki::Plugin::link;
|
|
|
|
|
|
|
|
use warnings;
|
|
|
|
use strict;
|
|
|
|
use IkiWiki 2.00;
|
|
|
|
|
|
|
|
my $link_regexp;
|
|
|
|
|
|
|
|
sub import { #{{{
|
2008-08-03 22:40:12 +02:00
|
|
|
hook(type => "getsetup", id => "link", call => \&getsetup);
|
2008-02-12 04:48:27 +01:00
|
|
|
hook(type => "checkconfig", id => "link", call => \&checkconfig);
|
|
|
|
hook(type => "linkify", id => "link", call => \&linkify);
|
|
|
|
hook(type => "scan", id => "link", call => \&scan);
|
2008-07-24 00:57:27 +02:00
|
|
|
hook(type => "renamepage", id => "link", call => \&renamepage);
|
2008-02-12 04:48:27 +01:00
|
|
|
} # }}}
|
|
|
|
|
2008-08-03 22:40:12 +02:00
|
|
|
sub getsetup () { #{{{
|
|
|
|
return
|
|
|
|
plugin => {
|
|
|
|
safe => 1,
|
|
|
|
rebuild => 1,
|
|
|
|
},
|
|
|
|
} #}}}
|
|
|
|
|
2008-02-12 04:48:27 +01:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
} # }}}
|
|
|
|
|
2008-07-24 00:14:20 +02:00
|
|
|
sub renamepage (@) { #{{{
|
|
|
|
my %params=@_;
|
|
|
|
my $page=$params{page};
|
|
|
|
my $old=$params{oldpage};
|
|
|
|
my $new=$params{newpage};
|
|
|
|
|
|
|
|
$params{content} =~ s{(?<!\\)$link_regexp}{
|
2008-07-24 00:57:27 +02:00
|
|
|
my $linktext=$2;
|
|
|
|
my $link=$linktext;
|
2008-07-24 18:36:10 +02:00
|
|
|
if (bestlink($page, IkiWiki::linkpage($linktext)) eq $old) {
|
2008-07-24 03:04:11 +02:00
|
|
|
$link=IkiWiki::pagetitle($new, 1);
|
2008-07-24 18:36:10 +02:00
|
|
|
$link=~s/ /_/g;
|
2008-07-24 01:03:37 +02:00
|
|
|
if ($linktext =~ m/.*\/*?[A-Z]/) {
|
|
|
|
# preserve leading cap of last component
|
|
|
|
my @bits=split("/", $link);
|
|
|
|
$link=join("/", @bits[0..$#bits-1], ucfirst($bits[$#bits]));
|
2008-07-24 00:14:20 +02:00
|
|
|
}
|
2008-07-24 00:57:27 +02:00
|
|
|
if (index($linktext, "/") == 0) {
|
|
|
|
# absolute link
|
|
|
|
$link="/$link";
|
2008-07-24 00:14:20 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
defined $1
|
|
|
|
? ( "[[$1|$link".($3 ? "#$3" : "")."]]" )
|
|
|
|
: ( "[[$link". ($3 ? "#$3" : "")."]]" )
|
|
|
|
}eg;
|
|
|
|
|
|
|
|
return $params{content};
|
|
|
|
} #}}}
|
|
|
|
|
2008-02-12 04:48:27 +01:00
|
|
|
1
|