]> git.wincent.com - wikitext.git/commitdiff
Allow email addresses inside external link text
authorWincent Colaiuta <win@wincent.com>
Sun, 4 Mar 2012 00:25:21 +0000 (16:25 -0800)
committerWincent Colaiuta <win@wincent.com>
Sun, 4 Mar 2012 00:35:14 +0000 (16:35 -0800)
Previously we allowed:

  [mailto:user@example.com text]

but dealt poorly with:

  [mailto:user@example.com user@example.com]

While that might seem like a contrived example (because you could
dispense with the explicit external link entirely and instead rely on
the standard auto-linkification) it also meant that we couldn't handle
perfectly reasonable and useful input like:

  [mailto:user@example.com contact me at user@example.com for info]

Note the problem wasn't just limited to URIs with the "mailto:" schema;
we also choked on stuff like:

  [http://google.com/?q=user@example.com Google for user@example.com]

Reported here:

  https://wincent.com/issues/1955

Signed-off-by: Wincent Colaiuta <win@wincent.com>
ext/parser.c
spec/external_link_spec.rb

index 3c38e2b13b07bf4d1f7923cdcde4f4f7952786bc..bee86e8051109855b087debe9f396721f6b5e34f 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright 2007-2011 Wincent Colaiuta. All rights reserved.
+// Copyright 2007-2012 Wincent Colaiuta. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are met:
@@ -1964,6 +1964,9 @@ VALUE Wikitext_parser_parse(int argc, VALUE *argv, VALUE self)
                     wiki_emit_pending_crlf_if_necessary(parser);
                     str_append(parser->output, token->start, TOKEN_LEN(token));
                 }
+                else if (IN(EXT_LINK_START))
+                    // must be capturing and this must be part of the link text
+                    str_append(parser->capture, token->start, TOKEN_LEN(token));
                 else
                 {
                     wiki_pop_excess_elements(parser);
index 1e909d8372b9eedb48736946f79cf9fd5a1aec09..4b7c99eafb385bfbae37b16ff173ea49cec77965 100644 (file)
@@ -1,5 +1,5 @@
 # encoding: utf-8
-# Copyright 2007-2010 Wincent Colaiuta. All rights reserved.
+# Copyright 2007-2012 Wincent Colaiuta. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are met:
@@ -49,16 +49,35 @@ describe Wikitext::Parser, 'external links' do
     @parser.parse('[svn://google.com/ Google]').should == expected
   end
 
-  it 'should format valid external mailto links' do
-    expected = %Q{<p><a href="mailto:user@example.com" class="mailto">john</a></p>\n}
+  it 'formats valid external mailto links' do
+    expected = %{<p><a href="mailto:user@example.com" class="mailto">john</a></p>\n}
     @parser.parse('[mailto:user@example.com john]').should == expected
   end
 
-  it 'should not treat raw email addresses as valid link targets' do
-    expected = %Q{<p>[<a href="mailto:user@example.com" class="mailto">user@example.com</a> john]</p>\n}
+  it 'does not treat raw email addresses as valid link targets' do
+    expected = %{<p>[<a href="mailto:user@example.com" class="mailto">user@example.com</a> john]</p>\n}
     @parser.parse('[user@example.com john]').should == expected
   end
 
+  it 'formats external mailto links where the linktext is itself an email' do
+    # reported here: https://wincent.com/issues/1955
+    expected = %{<p><a href="mailto:user@example.com" class="mailto">user@example.com</a></p>\n}
+    @parser.parse('[mailto:user@example.com user@example.com]').should == expected
+
+    # just in case that example seems a little contrived and trivial (you could
+    # work around it by instead just writing "user@example.com" in your markup),
+    # here's a more obviously useful one
+    expected = %{<p><a href="mailto:user@example.com" class="mailto">email me at user@example.com for more info</a></p>\n}
+    @parser.parse('[mailto:user@example.com email me at user@example.com for more info]').should == expected
+  end
+
+  it 'allows email addreses in link text' do
+    # more general case of bug reported here: https://wincent.com/issues/1955
+    expected = %{<p><a href="http://google.com/?q=user@example.com" class="external">Google for user@example.com</a></p>\n}
+    @parser.parse('[http://google.com/?q=user@example.com Google for user@example.com]').should == expected
+
+  end
+
   it 'should format absolute path links' do
     expected = %Q{<p><a href="/foo/bar">fb</a></p>\n} # note no "external" class
     @parser.parse('[/foo/bar fb]').should == expected