Escape fragment identifiers in wikipedia URLs

Fixes #967
This commit is contained in:
Tom Hughes 2015-05-14 20:34:25 +01:00
parent b2784c4d2d
commit b40353b9b0
2 changed files with 15 additions and 3 deletions

View file

@ -1,3 +1,5 @@
require "uri"
module BrowseHelper module BrowseHelper
def printable_name(object, version = false) def printable_name(object, version = false)
if object.id.is_a?(Array) if object.id.is_a?(Array)
@ -133,17 +135,19 @@ module BrowseHelper
return nil return nil
end end
if value =~ /^([^#]*)(#.*)/ if value =~ /^([^#]*)#(.*)/
# Contains a reference to a section of the wikipedia article # Contains a reference to a section of the wikipedia article
# Must break it up to correctly build the url # Must break it up to correctly build the url
value = $1 value = $1
section = $2 section = "#" + $2
encoded_section = "#" + URI.encode($2.gsub(" ", "_")).gsub("%3A", ":").gsub("%", ".")
else else
section = "" section = ""
encoded_section = ""
end end
{ {
:url => "http://#{lang}.wikipedia.org/wiki/#{value}?uselang=#{I18n.locale}#{section}", :url => "http://#{lang}.wikipedia.org/wiki/#{value}?uselang=#{I18n.locale}#{encoded_section}",
:title => value + section :title => value + section
} }
end end

View file

@ -188,6 +188,14 @@ class BrowseHelperTest < ActionView::TestCase
assert_equal "http://fr.wikipedia.org/wiki/de:Test?uselang=en", link[:url] assert_equal "http://fr.wikipedia.org/wiki/de:Test?uselang=en", link[:url]
assert_equal "de:Test", link[:title] assert_equal "de:Test", link[:title]
link = wikipedia_link("wikipedia", "de:Englischer Garten (München)#Japanisches Teehaus")
assert_equal "http://de.wikipedia.org/wiki/de:Englischer Garten (München)?uselang=en#Japanisches_Teehaus", link[:url]
assert_equal "de:Englischer Garten (München)#Japanisches Teehaus", link[:title]
link = wikipedia_link("wikipedia", "de:Alte Brücke (Heidelberg)#Brückenaffe")
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]
I18n.locale = "pt-BR" I18n.locale = "pt-BR"
link = wikipedia_link("wikipedia", "zh-classical:Test#Section") link = wikipedia_link("wikipedia", "zh-classical:Test#Section")