More improvements to mediawiki fragment escaping
authorTom Hughes <tom@compton.nu>
Fri, 15 May 2015 14:34:12 +0000 (15:34 +0100)
committerTom Hughes <tom@compton.nu>
Fri, 15 May 2015 14:34:12 +0000 (15:34 +0100)
It turns out that the PHP urlencode encodes more characters than
the ruby URI.encode does by default, so specify our own characters
to encode based on http://php.net/manual/en/function.urlencode.php
with the extra exclusion of colon, which the mediawiki code reverses
after the encoding is done.

Fixes #967

app/helpers/browse_helper.rb
test/helpers/browse_helper_test.rb

index a2d0e440ddbd9700667544f60b9a46fb32e5c4cf..5d0a18fd96373b86d9705a9e7514a2883b8b9fe2 100644 (file)
@@ -140,7 +140,7 @@ module BrowseHelper
       # Must break it up to correctly build the url
       value = $1
       section = "#" + $2
-      encoded_section = "#" + URI.encode($2.gsub(" ", "_")).gsub("%3A", ":").gsub("%", ".")
+      encoded_section = "#" + URI.encode($2.gsub(/ +/, "_"), /[^A-Za-z0-9:_]/).gsub("%", ".")
     else
       section = ""
       encoded_section = ""
index c4f0e8c31d97c46248605bce0b7a298c6874861f..7878d10e082eddef78f32f4a3990a77cfde61284 100644 (file)
@@ -196,6 +196,10 @@ class BrowseHelperTest < ActionView::TestCase
     assert_equal "http://de.wikipedia.org/wiki/de:Alte Brücke (Heidelberg)?uselang=en#Br.C3.BCckenaffe", link[:url]
     assert_equal "de:Alte Brücke (Heidelberg)#Brückenaffe", link[:title]
 
+    link = wikipedia_link("wikipedia", "de:Liste der Baudenkmäler in Eichstätt#Brückenstraße 1, Ehemaliges Bauernhaus")
+    assert_equal "http://de.wikipedia.org/wiki/de:Liste der Baudenkmäler in Eichstätt?uselang=en#Br.C3.BCckenstra.C3.9Fe_1.2C_Ehemaliges_Bauernhaus", link[:url]
+    assert_equal "de:Liste der Baudenkmäler in Eichstätt#Brückenstraße 1, Ehemaliges Bauernhaus", link[:title]
+
     I18n.locale = "pt-BR"
 
     link = wikipedia_link("wikipedia", "zh-classical:Test#Section")