X-Git-Url: http://git.tremily.us/?a=blobdiff_plain;f=IkiWiki%2FPlugin%2Flink.pm;h=87e06ca899b51868646346a77670835caa7deb07;hb=a965e024302c900df9a77ed9eccc8609d2986571;hp=3799209d062ad4308cebb3cead4e5f2617a87508;hpb=21add7ffa87a5e622d18bdbb24c638c15bdb3800;p=ikiwiki.git diff --git a/IkiWiki/Plugin/link.pm b/IkiWiki/Plugin/link.pm index 3799209d0..87e06ca89 100644 --- a/IkiWiki/Plugin/link.pm +++ b/IkiWiki/Plugin/link.pm @@ -3,10 +3,13 @@ package IkiWiki::Plugin::link; use warnings; use strict; -use IkiWiki 2.00; +use IkiWiki 3.00; my $link_regexp; +my $email_regexp = qr/^.+@.+$/; +my $url_regexp = qr/^(?:[^:]+:\/\/|mailto:).*/i; + sub import { hook(type => "getsetup", id => "link", call => \&getsetup); hook(type => "checkconfig", id => "link", call => \&checkconfig); @@ -20,6 +23,7 @@ sub getsetup () { plugin => { safe => 1, rebuild => 1, + section => "core", }, } @@ -56,8 +60,52 @@ sub checkconfig () { )? # optional \]\] # end of link - }x, + }x; + } +} + +sub is_externallink ($$;$) { + my $page = shift; + my $url = shift; + my $anchor = shift; + + if (defined $anchor) { + $url.="#".$anchor; + } + + 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. + return (! (bestlink($page, linkpage($url)))) + } + return ($url =~ /$url_regexp/) +} + +sub externallink ($$;$) { + my $url = shift; + my $anchor = shift; + my $pagetitle = shift; + + if (defined $anchor) { + $url.="#".$anchor; + } + + # build pagetitle + if (! $pagetitle) { + $pagetitle = $url; + # use only the email address as title for mailto: urls + if ($pagetitle =~ /^mailto:.*/) { + $pagetitle =~ s/^mailto:([^?]+).*/$1/; + } } + + if ($url !~ /$url_regexp/) { + # handle email addresses (without mailto:) + $url = "mailto:" . $url; + } + + return "$pagetitle"; } sub linkify (@) { @@ -68,13 +116,17 @@ sub linkify (@) { $params{content} =~ s{(\\?)$link_regexp}{ defined $2 ? ( $1 - ? "[[$2|$3".($4 ? "#$4" : "")."]]" - : htmllink($page, $destpage, linkpage($3), - anchor => $4, linktext => pagetitle($2))) + ? "[[$2|$3".(defined $4 ? "#$4" : "")."]]" + : is_externallink($page, $3, $4) + ? externallink($3, $4, $2) + : htmllink($page, $destpage, linkpage($3), + anchor => $4, linktext => pagetitle($2))) : ( $1 - ? "[[$3".($4 ? "#$4" : "")."]]" - : htmllink($page, $destpage, linkpage($3), - anchor => $4)) + ? "[[$3".(defined $4 ? "#$4" : "")."]]" + : is_externallink($page, $3, $4) + ? externallink($3, $4) + : htmllink($page, $destpage, linkpage($3), + anchor => $4)) }eg; return $params{content}; @@ -86,7 +138,9 @@ sub scan (@) { my $content=$params{content}; while ($content =~ /(?