From: Anton Khorev Date: Fri, 28 Mar 2025 02:45:16 +0000 (+0300) Subject: Remove /wiki prefix from wiki urls in linkify X-Git-Tag: live~73^2 X-Git-Url: https://git.openstreetmap.org./rails.git/commitdiff_plain/dfd67489c93bc9bb0ed989bd16eca5e4b4ff67be?ds=sidebyside Remove /wiki prefix from wiki urls in linkify --- diff --git a/config/settings.yml b/config/settings.yml index 775df2c11..416fb1931 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -144,6 +144,8 @@ linkify_hosts_replacement: "osm.org" linkify_wiki_hosts: ["wiki.openstreetmap.org", "wiki.osm.org", "wiki.openstreetmap.com", "wiki.openstreetmaps.org", "osm.wiki", "www.osm.wiki", "wiki.osm.wiki"] # Shorter host to replace wiki hosts linkify_wiki_hosts_replacement: "osm.wiki" +# Regexp for wiki prefix that can be removed +linkify_wiki_optional_path_prefix: "^/wiki(?=/[A-Z])" # External authentication credentials #google_auth_id: "" #google_auth_secret: "" diff --git a/lib/rich_text.rb b/lib/rich_text.rb index 1147cbc60..792497307 100644 --- a/lib/rich_text.rb +++ b/lib/rich_text.rb @@ -77,15 +77,25 @@ module RichText link_attr = 'rel="nofollow noopener noreferrer"' Rinku.auto_link(ERB::Util.html_escape(text), mode, link_attr) do |url| url = shorten_host(url, Settings.linkify_hosts, Settings.linkify_hosts_replacement) - shorten_host(url, Settings.linkify_wiki_hosts, Settings.linkify_wiki_hosts_replacement) + shorten_host(url, Settings.linkify_wiki_hosts, Settings.linkify_wiki_hosts_replacement) do |path| + path.sub(Regexp.new(Settings.linkify_wiki_optional_path_prefix || ""), "") + end end.html_safe end private def shorten_host(url, hosts, hosts_replacement) - %r{^https?://([^/]*)(.*)$}.match(url) do |m| - "#{hosts_replacement}#{m[2]}" if hosts_replacement && hosts&.include?(m[1]) + %r{^(https?://([^/]*))(.*)$}.match(url) do |m| + scheme_host, host, path = m.captures + if hosts&.include?(host) + path = yield(path) if block_given? + if hosts_replacement + "#{hosts_replacement}#{path}" + else + "#{scheme_host}#{path}" + end + end || url end || url end end diff --git a/test/lib/rich_text_test.rb b/test/lib/rich_text_test.rb index c04a4b3ae..4ec85bcf9 100644 --- a/test/lib/rich_text_test.rb +++ b/test/lib/rich_text_test.rb @@ -269,8 +269,22 @@ class RichTextTest < ActiveSupport::TestCase end end - def test_text_to_html_linkify_wiki_replace - with_settings(:linkify_wiki_hosts => ["replace-me-wiki.example.com"], :linkify_wiki_hosts_replacement => "wiki.example.com") do + def test_text_to_html_linkify_wiki_replace_prefix + with_settings(:linkify_wiki_hosts => ["replace-me-wiki.example.com"], :linkify_wiki_hosts_replacement => "wiki.example.com", + :linkify_wiki_optional_path_prefix => "^/wiki(?=/[A-Z])") do + r = RichText.new("text", "foo https://replace-me-wiki.example.com/wiki/Tag:surface%3Dmetal bar") + assert_html r do + assert_dom "a", :count => 1, :text => "wiki.example.com/Tag:surface%3Dmetal" do + assert_dom "> @href", "https://replace-me-wiki.example.com/wiki/Tag:surface%3Dmetal" + assert_dom "> @rel", "nofollow noopener noreferrer" + end + end + end + end + + def test_text_to_html_linkify_wiki_replace_prefix_undefined + with_settings(:linkify_wiki_hosts => ["replace-me-wiki.example.com"], :linkify_wiki_hosts_replacement => "wiki.example.com", + :linkify_wiki_optional_path_prefix => nil) do r = RichText.new("text", "foo https://replace-me-wiki.example.com/wiki/Tag:surface%3Dmetal bar") assert_html r do assert_dom "a", :count => 1, :text => "wiki.example.com/wiki/Tag:surface%3Dmetal" do @@ -281,6 +295,32 @@ class RichTextTest < ActiveSupport::TestCase end end + def test_text_to_html_linkify_wiki_replace_undefined_prefix + with_settings(:linkify_wiki_hosts => ["replace-me-wiki.example.com"], :linkify_wiki_hosts_replacement => nil, + :linkify_wiki_optional_path_prefix => "^/wiki(?=/[A-Z])") do + r = RichText.new("text", "foo https://replace-me-wiki.example.com/wiki/Tag:surface%3Dmetal bar") + assert_html r do + assert_dom "a", :count => 1, :text => "https://replace-me-wiki.example.com/Tag:surface%3Dmetal" do + assert_dom "> @href", "https://replace-me-wiki.example.com/wiki/Tag:surface%3Dmetal" + assert_dom "> @rel", "nofollow noopener noreferrer" + end + end + end + end + + def test_text_to_html_linkify_wiki_replace_prefix_no_match + with_settings(:linkify_wiki_hosts => ["replace-me-wiki.example.com"], :linkify_wiki_hosts_replacement => "wiki.example.com", + :linkify_wiki_optional_path_prefix => "^/wiki(?=/[A-Z])") do + r = RichText.new("text", "foo https://replace-me-wiki.example.com/wiki/w bar") + assert_html r do + assert_dom "a", :count => 1, :text => "wiki.example.com/wiki/w" do + assert_dom "> @href", "https://replace-me-wiki.example.com/wiki/w" + assert_dom "> @rel", "nofollow noopener noreferrer" + end + end + end + end + def test_text_to_html_email r = RichText.new("text", "foo example@example.com bar") assert_html r do