diff --git a/Markdown.pl b/Markdown.pl
index af40566..8894d89 100755
--- a/Markdown.pl
+++ b/Markdown.pl
@@ -115,7 +115,7 @@ BEGIN {
my %g_escape_table;
BEGIN {
$g_escape_table{""} = "\2\3";
- foreach my $char (split //, "\\\`*_~{}[]()>#+-.!|:") {
+ foreach my $char (split //, "\\\`*_~{}[]()>#+-.!|:<") {
$g_escape_table{$char} = block_id($char,1);
}
}
@@ -568,10 +568,10 @@ sub _StripLinkDefinitions {
my $title = _strip($5);
$url =~ s/\\\n\s*//gs;
if ($id ne "") {
- $g_urls{$id} = _EncodeAmpsAndAngles($url);
+ # These values always get passed through _MakeATag or _MakeIMGTag later
+ $g_urls{$id} = $url;
if (defined($title) && $title ne "") {
$g_titles{$id} = $title;
- $g_titles{$id} =~ s/\042/"/g;
}
}
}
@@ -818,10 +818,12 @@ sub _MakeATag {
defined($text) or $text="";
defined($title) or $title="";
- my $result = "" . $text . "";
+ return $result . $g_escape_table{'>'} .
+ $text . $g_escape_table{'<'}."/a".$g_escape_table{'>'};
}
@@ -977,7 +979,7 @@ sub _MakeIMGTag {
defined($title) or $title="";
return "" unless $url ne "";
- my $result = "";
+ $result .= $g_escape_table{'>'};
return $result;
}
@@ -2025,11 +2028,13 @@ sub _ProcessURLTag {
while ($tag =~ /\G([^\s\042\047>]+=)([\042\047])((?:(?!\2)(?!>).)*)(\2\s*)/gc) {
my ($p, $q, $v, $s) = ($1, $2, $3, $4);
if (lc($p) eq $att && $v ne "") {
- $v = _HTMLEncode(_PrefixURL($v));
+ $v = _EncodeAttText(_PrefixURL($v));
}
$out .= $p . $q . $v . $s;
}
$out .= substr($tag, pos($tag));
+ substr($out,0,1) = $g_escape_table{'<'};
+ substr($out,-1,1) = $g_escape_table{'>'};
return $out;
}
@@ -2102,7 +2107,7 @@ sub _EncodeBackslashEscapes {
sub _DoAutoLinks {
local $_ = shift;
- s{<((https?|ftps?):[^'\042>\s]+)>}{<$1>}gi;
+ s{<((https?|ftps?):[^'\042>\s]+)>(?!\s*)}{_MakeATag($1, "<".$1.">")}gise;
# Email addresses: