From 28393fe90e5b0813899a6b95ca9695d707f1c28b Mon Sep 17 00:00:00 2001
From: Gergely Pap <5883922+gergelypap@users.noreply.github.com>
Date: Thu, 13 Nov 2025 11:52:41 +0100
Subject: [PATCH] Fix Wikipedia tag handling to support multiple links
Co-authored-by: Pablo Brasero <36066+pablobm@users.noreply.github.com>
---
app/helpers/browse_tags_helper.rb | 39 +++++---
test/helpers/browse_tags_helper_test.rb | 120 ++++++++++++++++--------
2 files changed, 107 insertions(+), 52 deletions(-)
diff --git a/app/helpers/browse_tags_helper.rb b/app/helpers/browse_tags_helper.rb
index bf3d9d9dc..1358e740f 100644
--- a/app/helpers/browse_tags_helper.rb
+++ b/app/helpers/browse_tags_helper.rb
@@ -14,8 +14,11 @@ module BrowseTagsHelper
end
def format_value(key, value)
- if wp = wikipedia_link(key, value)
- link_to h(wp[:title]), wp[:url], :title => t("browse.tag_details.wikipedia_link", :page => wp[:title])
+ if wp = wikipedia_links(key, value)
+ wp = wp.map do |w|
+ link_to(h(w[:title]), w[:url], :title => t("browse.tag_details.wikipedia_link", :page => w[:title]))
+ end
+ safe_join(wp, ";")
elsif wdt = wikidata_links(key, value)
# IMPORTANT: Note that wikidata_links() returns an array of hashes, unlike for example wikipedia_link(),
# which just returns one such hash.
@@ -71,7 +74,7 @@ module BrowseTagsHelper
url
end
- def wikipedia_link(key, value)
+ def wikipedia_links(key, value)
# Some k/v's are wikipedia=http://en.wikipedia.org/wiki/Full%20URL
return nil if %r{^https?://}.match?(value)
@@ -84,20 +87,26 @@ module BrowseTagsHelper
return nil
end
- # This regex should match Wikipedia language codes, everything
- # from de to zh-classical
- if value =~ /^([a-z-]{2,12}):(.+)$/i
- lang = Regexp.last_match(1)
- title_section = Regexp.last_match(2)
- else
- title_section = value
- end
+ # Value could be a semicolon-separated list of Wikipedia pages
+ value.split(";").map do |wiki_value|
+ wiki_value = wiki_value.strip
+
+ # This regex should match Wikipedia language codes, everything
+ # from de to zh-classical
+ if wiki_value =~ /^([a-z-]{2,12}):(.+)$/i
+ page_lang = Regexp.last_match(1)
+ title_section = Regexp.last_match(2)
+ else
+ page_lang = lang
+ title_section = wiki_value
+ end
- title, section = title_section.split("#", 2)
- url = "https://#{lang}.wikipedia.org/wiki/#{wiki_encode(title)}?uselang=#{I18n.locale}"
- url += "##{wiki_encode(section)}" if section
+ title, section = title_section.split("#", 2)
+ url = "https://#{page_lang}.wikipedia.org/wiki/#{wiki_encode(title)}?uselang=#{I18n.locale}"
+ url += "##{wiki_encode(section)}" if section
- { :url => url, :title => value }
+ { :url => url, :title => wiki_value }
+ end
end
def wiki_encode(s)
diff --git a/test/helpers/browse_tags_helper_test.rb b/test/helpers/browse_tags_helper_test.rb
index 064de3d75..8e1f9922a 100644
--- a/test/helpers/browse_tags_helper_test.rb
+++ b/test/helpers/browse_tags_helper_test.rb
@@ -42,6 +42,10 @@ class BrowseTagsHelperTest < ActionView::TestCase
html = format_value("wikipedia", "Test")
assert_dom_equal "Test", html
+ html = format_value("wikipedia", "de:Berlin;en:London")
+ assert_dom_equal "de:Berlin;en:London",
+ html
+
html = format_value("wikidata", "Q42")
dom = Rails::Dom::Testing.html_document_fragment.parse html
assert_select dom, "a[title='The Q42 item on Wikidata'][href$='www.wikidata.org/entity/Q42?uselang=en']", :text => "Q42"
@@ -186,57 +190,99 @@ class BrowseTagsHelperTest < ActionView::TestCase
assert_equal "\nQ4006", links[3][:title]
end
- def test_wikipedia_link
- link = wikipedia_link("wikipedia", "http://en.wikipedia.org/wiki/Full%20URL")
- assert_nil link
+ def test_wikipedia_links
+ links = wikipedia_links("wikipedia", "http://en.wikipedia.org/wiki/Full%20URL")
+ assert_nil links
- link = wikipedia_link("wikipedia", "https://en.wikipedia.org/wiki/Full%20URL")
- assert_nil link
+ links = wikipedia_links("wikipedia", "https://en.wikipedia.org/wiki/Full%20URL")
+ assert_nil links
- link = wikipedia_link("wikipedia", "Test")
- assert_equal "https://en.wikipedia.org/wiki/Test?uselang=en", link[:url]
- assert_equal "Test", link[:title]
+ links = wikipedia_links("wikipedia", "Test")
+ assert_equal 1, links.length
+ assert_equal "https://en.wikipedia.org/wiki/Test?uselang=en", links[0][:url]
+ assert_equal "Test", links[0][:title]
- link = wikipedia_link("wikipedia", "de:Test")
- assert_equal "https://de.wikipedia.org/wiki/Test?uselang=en", link[:url]
- assert_equal "de:Test", link[:title]
+ links = wikipedia_links("wikipedia", "de:Test")
+ assert_equal 1, links.length
+ assert_equal "https://de.wikipedia.org/wiki/Test?uselang=en", links[0][:url]
+ assert_equal "de:Test", links[0][:title]
- link = wikipedia_link("wikipedia:fr", "Portsea")
- assert_equal "https://fr.wikipedia.org/wiki/Portsea?uselang=en", link[:url]
- assert_equal "Portsea", link[:title]
+ links = wikipedia_links("wikipedia:fr", "Portsea")
+ assert_equal 1, links.length
+ assert_equal "https://fr.wikipedia.org/wiki/Portsea?uselang=en", links[0][:url]
+ assert_equal "Portsea", links[0][:title]
- link = wikipedia_link("wikipedia:fr", "de:Test")
- assert_equal "https://de.wikipedia.org/wiki/Test?uselang=en", link[:url]
- assert_equal "de:Test", link[:title]
+ links = wikipedia_links("wikipedia:fr", "de:Test")
+ assert_equal 1, links.length
+ assert_equal "https://de.wikipedia.org/wiki/Test?uselang=en", links[0][:url]
+ assert_equal "de:Test", links[0][:title]
- link = wikipedia_link("wikipedia", "de:Englischer Garten (München)#Japanisches Teehaus")
- assert_equal "https://de.wikipedia.org/wiki/Englischer_Garten_%28M%C3%BCnchen%29?uselang=en#Japanisches_Teehaus", link[:url]
- assert_equal "de:Englischer Garten (München)#Japanisches Teehaus", link[:title]
+ links = wikipedia_links("wikipedia", "de:Englischer Garten (München)#Japanisches Teehaus")
+ assert_equal 1, links.length
+ assert_equal "https://de.wikipedia.org/wiki/Englischer_Garten_%28M%C3%BCnchen%29?uselang=en#Japanisches_Teehaus", links[0][:url]
+ assert_equal "de:Englischer Garten (München)#Japanisches Teehaus", links[0][:title]
- link = wikipedia_link("wikipedia", "de:Alte Brücke (Heidelberg)#Brückenaffe")
- assert_equal "https://de.wikipedia.org/wiki/Alte_Br%C3%BCcke_%28Heidelberg%29?uselang=en#Br%C3%BCckenaffe", link[:url]
- assert_equal "de:Alte Brücke (Heidelberg)#Brückenaffe", link[:title]
+ links = wikipedia_links("wikipedia", "de:Alte Brücke (Heidelberg)#Brückenaffe")
+ assert_equal 1, links.length
+ assert_equal "https://de.wikipedia.org/wiki/Alte_Br%C3%BCcke_%28Heidelberg%29?uselang=en#Br%C3%BCckenaffe", links[0][:url]
+ assert_equal "de:Alte Brücke (Heidelberg)#Brückenaffe", links[0][:title]
- link = wikipedia_link("wikipedia", "de:Liste der Baudenkmäler in Eichstätt#BrückenstraÃe 1, Ehemaliges Bauernhaus")
- assert_equal "https://de.wikipedia.org/wiki/Liste_der_Baudenkm%C3%A4ler_in_Eichst%C3%A4tt?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]
+ links = wikipedia_links("wikipedia", "de:Liste der Baudenkmäler in Eichstätt#BrückenstraÃe 1, Ehemaliges Bauernhaus")
+ assert_equal 1, links.length
+ assert_equal "https://de.wikipedia.org/wiki/Liste_der_Baudenkm%C3%A4ler_in_Eichst%C3%A4tt?uselang=en#Br%C3%BCckenstra%C3%9Fe_1%2C_Ehemaliges_Bauernhaus", links[0][:url]
+ assert_equal "de:Liste der Baudenkmäler in Eichstätt#BrückenstraÃe 1, Ehemaliges Bauernhaus", links[0][:title]
- link = wikipedia_link("wikipedia", "en:Are Years What? (for Marianne Moore)")
- assert_equal "https://en.wikipedia.org/wiki/Are_Years_What%3F_%28for_Marianne_Moore%29?uselang=en", link[:url]
- assert_equal "en:Are Years What? (for Marianne Moore)", link[:title]
+ links = wikipedia_links("wikipedia", "en:Are Years What? (for Marianne Moore)")
+ assert_equal 1, links.length
+ assert_equal "https://en.wikipedia.org/wiki/Are_Years_What%3F_%28for_Marianne_Moore%29?uselang=en", links[0][:url]
+ assert_equal "en:Are Years What? (for Marianne Moore)", links[0][:title]
I18n.with_locale "pt-BR" do
- link = wikipedia_link("wikipedia", "zh-classical:Test#Section")
- assert_equal "https://zh-classical.wikipedia.org/wiki/Test?uselang=pt-BR#Section", link[:url]
- assert_equal "zh-classical:Test#Section", link[:title]
+ links = wikipedia_links("wikipedia", "zh-classical:Test#Section")
+ assert_equal 1, links.length
+ assert_equal "https://zh-classical.wikipedia.org/wiki/Test?uselang=pt-BR#Section", links[0][:url]
+ assert_equal "zh-classical:Test#Section", links[0][:title]
end
- link = wikipedia_link("subject:wikipedia", "en:Catherine McAuley")
- assert_equal "https://en.wikipedia.org/wiki/Catherine_McAuley?uselang=en", link[:url]
- assert_equal "en:Catherine McAuley", link[:title]
+ links = wikipedia_links("subject:wikipedia", "en:Catherine McAuley")
+ assert_equal 1, links.length
+ assert_equal "https://en.wikipedia.org/wiki/Catherine_McAuley?uselang=en", links[0][:url]
+ assert_equal "en:Catherine McAuley", links[0][:title]
- link = wikipedia_link("foo", "Test")
- assert_nil link
+ links = wikipedia_links("artist:wikipedia", "en:Pablo Picasso")
+ assert_equal 1, links.length
+ assert_equal "https://en.wikipedia.org/wiki/Pablo_Picasso?uselang=en", links[0][:url]
+ assert_equal "en:Pablo Picasso", links[0][:title]
+
+ links = wikipedia_links("architect:wikipedia", "en:Frank Lloyd Wright")
+ assert_equal 1, links.length
+ assert_equal "https://en.wikipedia.org/wiki/Frank_Lloyd_Wright?uselang=en", links[0][:url]
+ assert_equal "en:Frank Lloyd Wright", links[0][:title]
+
+ links = wikipedia_links("buried:wikipedia", "en:Stephen Hawking")
+ assert_equal 1, links.length
+ assert_equal "https://en.wikipedia.org/wiki/Stephen_Hawking?uselang=en", links[0][:url]
+ assert_equal "en:Stephen Hawking", links[0][:title]
+
+ links = wikipedia_links("foo", "Test")
+ assert_nil links
+
+ # Multiple values separated by ;
+ links = wikipedia_links("wikipedia", "Test;Hello")
+ assert_equal 2, links.length
+ assert_equal "https://en.wikipedia.org/wiki/Test?uselang=en", links[0][:url]
+ assert_equal "Test", links[0][:title]
+ assert_equal "https://en.wikipedia.org/wiki/Hello?uselang=en", links[1][:url]
+ assert_equal "Hello", links[1][:title]
+
+ links = wikipedia_links("wikipedia", "de:Berlin;en:London;fr:Paris")
+ assert_equal 3, links.length
+ assert_equal "https://de.wikipedia.org/wiki/Berlin?uselang=en", links[0][:url]
+ assert_equal "de:Berlin", links[0][:title]
+ assert_equal "https://en.wikipedia.org/wiki/London?uselang=en", links[1][:url]
+ assert_equal "en:London", links[1][:title]
+ assert_equal "https://fr.wikipedia.org/wiki/Paris?uselang=en", links[2][:url]
+ assert_equal "fr:Paris", links[2][:title]
end
def test_wikimedia_commons_link
--
2.39.5