diff options
author | Bernd Zeimetz <bernd@bzed.de> | 2010-06-14 01:18:33 +0200 |
---|---|---|
committer | Bernd Zeimetz <bernd@bzed.de> | 2010-06-19 03:14:16 +0200 |
commit | dd3274ce734e3af0ca6a7940f69201d8d4b84fda (patch) | |
tree | e57d00c4dd56de93adb2b969c58dc66bed08b35b /IkiWiki | |
parent | 99a4096397d9ee5ce65084ac80cc6ff3a0879df5 (diff) | |
download | ikiwiki-dd3274ce734e3af0ca6a7940f69201d8d4b84fda.tar ikiwiki-dd3274ce734e3af0ca6a7940f69201d8d4b84fda.tar.gz |
Enhance the link plugin to handle external links.
The following ways to create a link are supported now:
[[url]]
[[text|url]]
url can be one of the following:
- an internal wikilink: will be handled as before
- any other kind of URL, including mailto: proper links will be created:
<a href="url">url</a>
<a href="url">text</a>
- an email address:
<a href="mailto:url">url</a>
<a href="mailto:url">text</a>
Diffstat (limited to 'IkiWiki')
-rw-r--r-- | IkiWiki/Plugin/link.pm | 89 |
1 files changed, 67 insertions, 22 deletions
diff --git a/IkiWiki/Plugin/link.pm b/IkiWiki/Plugin/link.pm index 3838aec09..d41965bd3 100644 --- a/IkiWiki/Plugin/link.pm +++ b/IkiWiki/Plugin/link.pm @@ -7,6 +7,9 @@ use IkiWiki 3.00; my $link_regexp; +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); @@ -57,8 +60,42 @@ 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; + } + + return "<a href=\"$url\">$pagetitle</a>"; } sub linkify (@) { @@ -70,12 +107,16 @@ sub linkify (@) { defined $2 ? ( $1 ? "[[$2|$3".($4 ? "#$4" : "")."]]" - : htmllink($page, $destpage, linkpage($3), - anchor => $4, linktext => 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, 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}; @@ -87,7 +128,9 @@ sub scan (@) { my $content=$params{content}; while ($content =~ /(?<!\\)$link_regexp/g) { - add_link($page, linkpage($2)); + if (! is_externallink($page, $2 . ($3 ? "#$3" : ""))) { + add_link($page, linkpage($2)); + } } } @@ -98,24 +141,26 @@ sub renamepage (@) { my $new=$params{newpage}; $params{content} =~ s{(?<!\\)$link_regexp}{ - my $linktext=$2; - my $link=$linktext; - if (bestlink($page, linkpage($linktext)) eq $old) { - $link=pagetitle($new, 1); - $link=~s/ /_/g; - if ($linktext =~ m/.*\/*?[A-Z]/) { - # preserve leading cap of last component - my @bits=split("/", $link); - $link=join("/", @bits[0..$#bits-1], ucfirst($bits[$#bits])); - } - if (index($linktext, "/") == 0) { - # absolute link - $link="/$link"; + if (! is_externallink($page, $2 . ($3 ? "#$3" : ""))) { + my $linktext=$2; + my $link=$linktext; + if (bestlink($page, linkpage($linktext)) eq $old) { + $link=pagetitle($new, 1); + $link=~s/ /_/g; + if ($linktext =~ m/.*\/*?[A-Z]/) { + # preserve leading cap of last component + my @bits=split("/", $link); + $link=join("/", @bits[0..$#bits-1], ucfirst($bits[$#bits])); + } + if (index($linktext, "/") == 0) { + # absolute link + $link="/$link"; + } } + defined $1 + ? ( "[[$1|$link".($3 ? "#$3" : "")."]]" ) + : ( "[[$link". ($3 ? "#$3" : "")."]]" ) } - defined $1 - ? ( "[[$1|$link".($3 ? "#$3" : "")."]]" ) - : ( "[[$link". ($3 ? "#$3" : "")."]]" ) }eg; return $params{content}; |