From a66c4780ccbf6dc4236548210ed1667038fe8ffe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20M=C3=BCller?= Date: Sun, 5 Nov 2017 16:17:51 +0100 Subject: [PATCH] filter relative_url should keep absolute urls with scheme/authority (#6490) Merge pull request 6490 --- lib/jekyll/filters/url_filters.rb | 5 ++++- test/test_filters.rb | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/filters/url_filters.rb b/lib/jekyll/filters/url_filters.rb index 151c4e71..9d86a0fb 100644 --- a/lib/jekyll/filters/url_filters.rb +++ b/lib/jekyll/filters/url_filters.rb @@ -20,13 +20,16 @@ module Jekyll ).normalize.to_s end - # Produces a URL relative to the domain root based on site.baseurl. + # Produces a URL relative to the domain root based on site.baseurl + # unless it is already an absolute url with an authority (host). # # input - the URL to make relative to the domain root # # Returns a URL relative to the domain root as a String. def relative_url(input) return if input.nil? + return input if Addressable::URI.parse(input.to_s).absolute? + parts = [sanitized_baseurl, input] Addressable::URI.parse( parts.compact.map { |part| ensure_leading_slash(part.to_s) }.join diff --git a/test/test_filters.rb b/test/test_filters.rb index 588a1f30..39f7a66f 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -526,6 +526,21 @@ class TestFilters < JekyllUnitTest filter = make_filter_mock({ "baseurl" => Value.new(proc { "/baseurl/" }) }) assert_equal "/baseurl#{page_url}", filter.relative_url(page_url) end + + should "transform protocol-relative url" do + url = "//example.com/" + assert_equal "/base//example.com/", @filter.relative_url(url) + end + + should "not modify an absolute url with scheme" do + url = "file:///file.html" + assert_equal url, @filter.relative_url(url) + end + + should "not normalize absolute international URLs" do + url = "https://example.com/错误" + assert_equal "https://example.com/错误", @filter.relative_url(url) + end end context "strip_index filter" do