X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/dd3274ce734e3af0ca6a7940f69201d8d4b84fda..94268a46cd30fc72b51714e42e9db741eb29cc73:/IkiWiki/Plugin/link.pm

diff --git a/IkiWiki/Plugin/link.pm b/IkiWiki/Plugin/link.pm
index d41965bd3..f6c3573f7 100644
--- a/IkiWiki/Plugin/link.pm
+++ b/IkiWiki/Plugin/link.pm
@@ -7,7 +7,7 @@ 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 $email_regexp = qr/^.+@.+$/;
 my $url_regexp = qr/^(?:[^:]+:\/\/|mailto:).*/i;
 
 sub import {
@@ -64,25 +64,37 @@ sub checkconfig () {
 	}
 }
 
-sub is_externallink ($$) {
+sub is_externallink ($$;$$) {
 	my $page = shift;
 	my $url = shift;
-	if ($url =~ /$email_regexp/) {
+	my $anchor = shift;
+	my $force = shift;
+	
+	if (defined $anchor) {
+		$url.="#".$anchor;
+	}
+
+	if (! $force && $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 ($;@) {
+sub externallink ($$;$) {
 	my $url = shift;
+	my $anchor = shift;
 	my $pagetitle = shift;
 
+	if (defined $anchor) {
+		$url.="#".$anchor;
+	}
+
 	# build pagetitle
-	if (!($pagetitle)) {
+	if (! $pagetitle) {
 		$pagetitle = $url;
 		# use only the email address as title for mailto: urls
 		if ($pagetitle =~ /^mailto:.*/) {
@@ -90,8 +102,8 @@ sub externallink ($;@) {
 		}
 	}
 
-	# handle email-addresses (without mailto:):
-	if ($url =~ /$email_regexp/) {
+	if ($url !~ /$url_regexp/) {
+		# handle email addresses (without mailto:)
 		$url = "mailto:" . $url;
 	}
 
@@ -106,15 +118,15 @@ sub linkify (@) {
 	$params{content} =~ s{(\\?)$link_regexp}{
 		defined $2
 			? ( $1 
-				? "[[$2|$3".($4 ? "#$4" : "")."]]" 
-				: is_externallink($page, $3 . ($4 ? "#$4" : ""))
-					? externallink("$3" . ($4 ? "#$4" : ""), $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" : "")."]]"
-				: is_externallink($page, $3 . ($4 ? "#$4" : ""))
-					? externallink("$3" . ($4 ? "#$4" : ""))
+				? "[[$3".(defined $4 ? "#$4" : "")."]]"
+				: is_externallink($page, $3, $4)
+					? externallink($3, $4)
 					: htmllink($page, $destpage, linkpage($3),
 						anchor => $4))
 	}eg;
@@ -128,7 +140,7 @@ sub scan (@) {
 	my $content=$params{content};
 
 	while ($content =~ /(?<!\\)$link_regexp/g) {
-		if (! is_externallink($page, $2 . ($3 ? "#$3" : ""))) {
+		if (! is_externallink($page, $2, $3, 1)) {
 			add_link($page, linkpage($2));
 		}
 	}
@@ -141,7 +153,7 @@ sub renamepage (@) {
 	my $new=$params{newpage};
 
 	$params{content} =~ s{(?<!\\)$link_regexp}{
-		if (! is_externallink($page, $2 . ($3 ? "#$3" : ""))) {
+		if (! is_externallink($page, $2, $3)) {
 			my $linktext=$2;
 			my $link=$linktext;
 			if (bestlink($page, linkpage($linktext)) eq $old) {