From 6bdb77b0d8f3cd05cfd44c03f4c0ae327af9b0e5 Mon Sep 17 00:00:00 2001 From: Marwin Hochfelsner <50826859+hlfan@users.noreply.github.com> Date: Fri, 5 Jun 2026 00:16:37 +0000 Subject: [PATCH] Remove secondary wiki prefix list --- app/helpers/browse_tags_helper.rb | 26 +++++++++---------- test/helpers/browse_tags_helper_test.rb | 33 ++++++++++++------------- 2 files changed, 28 insertions(+), 31 deletions(-) diff --git a/app/helpers/browse_tags_helper.rb b/app/helpers/browse_tags_helper.rb index 3d9ea7088..9563d586f 100644 --- a/app/helpers/browse_tags_helper.rb +++ b/app/helpers/browse_tags_helper.rb @@ -1,9 +1,11 @@ # frozen_string_literal: true module BrowseTagsHelper - # https://wiki.openstreetmap.org/wiki/Key:wikipedia#Secondary_Wikipedia_links - # https://wiki.openstreetmap.org/wiki/Key:wikidata#Secondary_Wikidata_links - SECONDARY_WIKI_PREFIXES = "architect|artist|brand|buried|flag|genus|manufacturer|model|(?:official_|old_)?name:etymology|network|(?:heritage:|old_)?operator|owner|species|subject|taxon" + SECONDARY_WIKI_PREFIX_PATTERN = /[a-z:_-]+:/ + QID_PATTERN = /[Qq][1-9][0-9]*/ + + # regex to match all wikipedia locale project identifiers + WIKIPEDIA_PROJECT_IDENTIFIER_PATTERN = /[a-z]{2,3}(?:-[a-z]{2,3})?|be-tarask|roa-tara|simple|zh-classical|zh-min-nan/ def format_key(key) if url = wiki_link("key", key) @@ -80,10 +82,7 @@ module BrowseTagsHelper # Some k/v's are wikipedia=http://en.wikipedia.org/wiki/Full%20URL return nil if %r{^https?://}.match?(value) - case key - when "wikipedia", /^(#{SECONDARY_WIKI_PREFIXES}):wikipedia/o - lang = "en" - when /^wikipedia:(\S+)$/ + if key =~ /^(?:#{SECONDARY_WIKI_PREFIX_PATTERN})?wikipedia(?::(#{WIKIPEDIA_PROJECT_IDENTIFIER_PATTERN}))?$/o lang = Regexp.last_match(1) else return nil @@ -93,13 +92,13 @@ module BrowseTagsHelper 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 + if wiki_value =~ /^(#{WIKIPEDIA_PROJECT_IDENTIFIER_PATTERN}):(.+)$/oi page_lang = Regexp.last_match(1) title_section = Regexp.last_match(2) else page_lang = lang + return nil unless page_lang + title_section = wiki_value end @@ -117,15 +116,14 @@ module BrowseTagsHelper def wikidata_links(key, value) # The simple wikidata-tag (this is limited to only one value) - if key == "wikidata" && value =~ /^[Qq][1-9][0-9]*$/ + if key == "wikidata" && value =~ /^#{QID_PATTERN}$/o return [{ :url => "//www.wikidata.org/entity/#{value}?uselang=#{I18n.locale}", :title => value }] - # Key has to be one of the accepted wikidata-tags - elsif key =~ /(#{SECONDARY_WIKI_PREFIXES}):wikidata/o && + elsif key =~ /^#{SECONDARY_WIKI_PREFIX_PATTERN}wikidata$/o && # Value has to be a semicolon-separated list of wikidata-IDs (whitespaces allowed before and after semicolons) - value =~ /^[Qq][1-9][0-9]*(\s*;\s*[Qq][1-9][0-9]*)*$/ + value =~ /^#{QID_PATTERN}(?:\s*;\s*#{QID_PATTERN})*$/o # Splitting at every semicolon to get a separate hash for each wikidata-ID return value.split(";").map do |id| { :title => id, :url => "//www.wikidata.org/entity/#{id.strip}?uselang=#{I18n.locale}" } diff --git a/test/helpers/browse_tags_helper_test.rb b/test/helpers/browse_tags_helper_test.rb index 8891eda7a..161bd72b5 100644 --- a/test/helpers/browse_tags_helper_test.rb +++ b/test/helpers/browse_tags_helper_test.rb @@ -39,8 +39,8 @@ class BrowseTagsHelperTest < ActionView::TestCase html = format_value("phone", "+1 (234) 567-890 ; +22334455") assert_dom_equal "+1 (234) 567-890; +22334455", html - html = format_value("wikipedia", "Test") - assert_dom_equal "Test", html + html = format_value("wikipedia", "en:Test") + assert_dom_equal "en:Test", html html = format_value("wikipedia", "de:Berlin;en:London") assert_dom_equal "de:Berlin;en:London", @@ -160,16 +160,11 @@ class BrowseTagsHelperTest < ActionView::TestCase ### Prefixed wikidata-tags - # Not anything is accepted as prefix (only limited set) - links = wikidata_links("anything:wikidata", "Q13") - assert_nil links - - # This for example is an allowed key + # examples for secondary wikidata keys links = wikidata_links("operator:wikidata", "Q24") assert_equal "//www.wikidata.org/entity/Q24?uselang=en", links[0][:url] assert_equal "Q24", links[0][:title] - # This verified buried is working links = wikidata_links("buried:wikidata", "Q24") assert_equal "//www.wikidata.org/entity/Q24?uselang=en", links[0][:url] assert_equal "Q24", links[0][:title] @@ -178,7 +173,11 @@ class BrowseTagsHelperTest < ActionView::TestCase assert_equal "//www.wikidata.org/entity/Q26899?uselang=en", links[0][:url] assert_equal "Q26899", links[0][:title] - # Another allowed key, this time with multiple values and I18n + links = wikidata_links("name:etymology:wikidata", "Q121745508") + assert_equal "//www.wikidata.org/entity/Q121745508?uselang=en", links[0][:url] + assert_equal "Q121745508", links[0][:title] + + # Another one with multiple values and I18n I18n.with_locale "dsb" do links = wikidata_links("brand:wikidata", "Q936;Q2013;Q1568346") assert_equal 3, links.length @@ -201,6 +200,9 @@ class BrowseTagsHelperTest < ActionView::TestCase assert_equal "\rQ364\t\n\r ", links[2][:title] assert_equal "//www.wikidata.org/entity/Q4006?uselang=en", links[3][:url] assert_equal "\nQ4006", links[3][:title] + + links = wikidata_links("source:species:wikidata", "PlantNet.org AI") + assert_nil links end def test_wikipedia_links @@ -211,9 +213,7 @@ class BrowseTagsHelperTest < ActionView::TestCase assert_nil links 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] + assert_nil links links = wikipedia_links("wikipedia", "de:Test") assert_equal 1, links.length @@ -282,11 +282,7 @@ class BrowseTagsHelperTest < ActionView::TestCase # 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] + assert_nil links links = wikipedia_links("wikipedia", "de:Berlin;en:London;fr:Paris") assert_equal 3, links.length @@ -296,6 +292,9 @@ class BrowseTagsHelperTest < ActionView::TestCase 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] + + links = wikipedia_links("fixme:wikipedia", "The wikipedia tag links to a list article, not an article about this specific feature.") + assert_nil links end def test_wikimedia_commons_link -- 2.47.3