]> git.wincent.com - wikitext.git/commitdiff
Eat leading whitespace during link encoding
authorWincent Colaiuta <win@wincent.com>
Wed, 6 Feb 2008 13:59:54 +0000 (14:59 +0100)
committerWincent Colaiuta <win@wincent.com>
Wed, 6 Feb 2008 13:59:54 +0000 (14:59 +0100)
As mentioned in e8b3b86, we need to eat whitespace here.

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

index fb37440f7c4b97fea63fe786b3d90cfca6440ef1..00d06ff7d3f93bffae80a702f8d98d1edf13d00b 100644 (file)
@@ -459,10 +459,7 @@ inline VALUE _Wikitext_parser_sanitize_link_target(VALUE self, VALUE string)
             rb_raise(rb_eRangeError, "invalid link text (\">\" may not appear in link text)");
         }
         else if (*src == ' ' && src == start)
-        {
-            // do nothing: we eat leading space
-            start++;
-        }
+            start++;                    // we eat leading space
         else if (*src >= 0x20 && *src <= 0x7e)    // printable ASCII
         {
             *dest = *src;
@@ -504,6 +501,7 @@ inline static VALUE _Wikitext_parser_encode_link_target(VALUE self, VALUE in)
 {
     in                      = StringValue(in);
     char        *input      = RSTRING_PTR(in);
+    char        *start      = input;            // remember this so we can check if we're at the start
     long        len         = RSTRING_LEN(in);
     char        *end        = input + len;
     static char hex[]       = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
@@ -544,6 +542,8 @@ inline static VALUE _Wikitext_parser_encode_link_target(VALUE self, VALUE in)
             (*input == '.') ||
             (*input == '~'))
             *dest++ = *input;
+        else if (*input == ' ' && input == start)
+            start++;                    // we eat leading space
         else    // everything else gets URL-encoded
         {
             *dest++ = '%';
index 718043ffb8b608cb524f1369980bccaf02fc34d1..a42bab6b64b417923241e500a7b92dc1625baab5 100755 (executable)
@@ -26,10 +26,17 @@ describe Wikitext, 'encoding a link target' do
     Wikitext::Parser.encode_link_target('').should == ''
   end
 
-  it 'should convert spaces into "%20"' do
+  it 'should convert embedded spaces into "%20"' do
     Wikitext::Parser.encode_link_target('hello world').should == 'hello%20world'
   end
 
+  it 'should eat leading spaces' do
+    Wikitext::Parser.encode_link_target(' hello world').should == 'hello%20world'
+    Wikitext::Parser.encode_link_target('  hello world').should == 'hello%20world'
+    Wikitext::Parser.encode_link_target('   hello world').should == 'hello%20world'
+    Wikitext::Parser.encode_link_target('    hello world').should == 'hello%20world'
+  end
+
   it 'should convert reserved symbols into percent escapes' do
     Wikitext::Parser.encode_link_target('http://www.apple.com/q?foo').should == 'http%3a%2f%2fwww.apple.com%2fq%3ffoo'
   end