X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/8b3d2ab0bcd5b79c30d6e07dd8f363431d94dd72..07a08122d926ab6b7741c94bc6c0038ffe0113fb:/IkiWiki/Plugin/link.pm diff --git a/IkiWiki/Plugin/link.pm b/IkiWiki/Plugin/link.pm index 529610710..d41965bd3 100644 --- a/IkiWiki/Plugin/link.pm +++ b/IkiWiki/Plugin/link.pm @@ -3,18 +3,31 @@ package IkiWiki::Plugin::link; use warnings; use strict; -use IkiWiki 2.00; +use IkiWiki 3.00; my $link_regexp; -sub import { #{{{ +my $email_regexp = qr/^(?:[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/i; +my $url_regexp = qr/^(?:[^:]+:\/\/|mailto:).*/i; + +sub import { + hook(type => "getsetup", id => "link", call => \&getsetup); hook(type => "checkconfig", id => "link", call => \&checkconfig); hook(type => "linkify", id => "link", call => \&linkify); hook(type => "scan", id => "link", call => \&scan); hook(type => "renamepage", id => "link", call => \&renamepage); -} # }}} +} + +sub getsetup () { + return + plugin => { + safe => 1, + rebuild => 1, + section => "core", + }, +} -sub checkconfig () { #{{{ +sub checkconfig () { if ($config{prefix_directives}) { $link_regexp = qr{ \[\[(?=[^!]) # beginning of link @@ -47,11 +60,45 @@ sub checkconfig () { #{{{ )? # optional \]\] # end of link - }x, + }x; + } +} + +sub is_externallink ($$) { + my $page = shift; + my $url = shift; + if ($url =~ /$email_regexp/) { + # url looks like an email address, so we assume it + # is supposed to be an external link if there is no + # page with that name. + $url =~ s/#.*//; + return (! (bestlink($page, linkpage($url)))) + } + return ($url =~ /$url_regexp/) +} + +sub externallink ($;@) { + my $url = shift; + my $pagetitle = shift; + + # build pagetitle + if (!($pagetitle)) { + $pagetitle = $url; + # use only the email address as title for mailto: urls + if ($pagetitle =~ /^mailto:.*/) { + $pagetitle =~ s/^mailto:([^?]+).*/$1/; + } + } + + # handle email-addresses (without mailto:): + if ($url =~ /$email_regexp/) { + $url = "mailto:" . $url; } -} #}}} -sub linkify (@) { #{{{ + return "$pagetitle"; +} + +sub linkify (@) { my %params=@_; my $page=$params{page}; my $destpage=$params{destpage}; @@ -60,54 +107,63 @@ sub linkify (@) { #{{{ defined $2 ? ( $1 ? "[[$2|$3".($4 ? "#$4" : "")."]]" - : htmllink($page, $destpage, IkiWiki::linkpage($3), - anchor => $4, linktext => IkiWiki::pagetitle($2))) + : is_externallink($page, $3 . ($4 ? "#$4" : "")) + ? externallink("$3" . ($4 ? "#$4" : ""), $2) + : htmllink($page, $destpage, linkpage($3), + anchor => $4, linktext => pagetitle($2))) : ( $1 ? "[[$3".($4 ? "#$4" : "")."]]" - : htmllink($page, $destpage, IkiWiki::linkpage($3), - anchor => $4)) + : is_externallink($page, $3 . ($4 ? "#$4" : "")) + ? externallink("$3" . ($4 ? "#$4" : "")) + : htmllink($page, $destpage, linkpage($3), + anchor => $4)) }eg; return $params{content}; -} #}}} +} -sub scan (@) { #{{{ +sub scan (@) { my %params=@_; my $page=$params{page}; my $content=$params{content}; while ($content =~ /(?