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: ""
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
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
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