Merge pull request #5572 from jekyll/fix-underscore-in-permalink
Merge pull request 5572
This commit is contained in:
		
						commit
						88a338d345
					
				|  | @ -84,17 +84,36 @@ module Jekyll | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|  |     # We include underscores in keys to allow for 'i_month' and so forth. | ||||||
|  |     # This poses a problem for keys which are followed by an underscore | ||||||
|  |     # but the underscore is not part of the key, e.g. '/:month_:day'. | ||||||
|  |     # That should be :month and :day, but our key extraction regexp isn't | ||||||
|  |     # smart enough to know that so we have to make it an explicit | ||||||
|  |     # possibility. | ||||||
|  |     def possible_keys(key) | ||||||
|  |       if key.end_with?("_") | ||||||
|  |         [key, key.chomp("_")] | ||||||
|  |       else | ||||||
|  |         [key] | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|     def generate_url_from_drop(template) |     def generate_url_from_drop(template) | ||||||
|       template.gsub(%r!:([a-z_]+)!) do |match| |       template.gsub(%r!:([a-z_]+)!) do |match| | ||||||
|         key = match.sub(":".freeze, "".freeze) |         pool = possible_keys(match.sub(":".freeze, "".freeze)) | ||||||
|         unless @placeholders.key?(key) | 
 | ||||||
|           raise NoMethodError, "The URL template key #{key} doesn't exist!" |         winner = pool.find { |key| @placeholders.key?(key) } | ||||||
|         end |         if winner.nil? | ||||||
|         if @placeholders[key].nil? |           raise NoMethodError, | ||||||
|           "".freeze |             "The URL template doesn't have #{pool.join(" or ")} keys. "\ | ||||||
|         else |               "Check your permalink template!" | ||||||
|           self.class.escape_path(@placeholders[key]) |  | ||||||
|         end |         end | ||||||
|  | 
 | ||||||
|  |         value = @placeholders[winner] | ||||||
|  |         value = "" if value.nil? | ||||||
|  |         replacement = self.class.escape_path(value) | ||||||
|  | 
 | ||||||
|  |         match.sub(":#{winner}", replacement) | ||||||
|       end.gsub(%r!//!, "/".freeze) |       end.gsub(%r!//!, "/".freeze) | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -103,6 +103,21 @@ class JekyllUnitTest < Minitest::Test | ||||||
|     RSpec::Mocks.teardown |     RSpec::Mocks.teardown | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|  |   def fixture_document(relative_path) | ||||||
|  |     site = fixture_site({ | ||||||
|  |       "collections" => { | ||||||
|  |         "methods" => { | ||||||
|  |           "output" => true | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }) | ||||||
|  |     site.read | ||||||
|  |     matching_doc = site.collections["methods"].docs.find do |doc| | ||||||
|  |       doc.relative_path == relative_path | ||||||
|  |     end | ||||||
|  |     [site, matching_doc] | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|   def fixture_site(overrides = {}) |   def fixture_site(overrides = {}) | ||||||
|     Jekyll::Site.new(site_configuration(overrides)) |     Jekyll::Site.new(site_configuration(overrides)) | ||||||
|   end |   end | ||||||
|  |  | ||||||
|  | @ -54,17 +54,7 @@ class TestURL < JekyllUnitTest | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     should "handle UrlDrop as a placeholder in addition to a hash" do |     should "handle UrlDrop as a placeholder in addition to a hash" do | ||||||
|       site = fixture_site({ |       _, matching_doc = fixture_document("_methods/escape-+ #%20[].md") | ||||||
|         "collections" => { |  | ||||||
|           "methods" => { |  | ||||||
|             "output" => true |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
|       }) |  | ||||||
|       site.read |  | ||||||
|       matching_doc = site.collections["methods"].docs.find do |doc| |  | ||||||
|         doc.relative_path == "_methods/escape-+ #%20[].md" |  | ||||||
|       end |  | ||||||
|       assert_equal "/methods/escape-+-20/escape-20.html", URL.new( |       assert_equal "/methods/escape-+-20/escape-20.html", URL.new( | ||||||
|         :template     => "/methods/:title/:name:output_ext", |         :template     => "/methods/:title/:name:output_ext", | ||||||
|         :placeholders => matching_doc.url_placeholders |         :placeholders => matching_doc.url_placeholders | ||||||
|  | @ -81,18 +71,16 @@ class TestURL < JekyllUnitTest | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     should "ignore NoMethodErrors when a placeholder is not found" do |     should "check for key without trailing underscore" do | ||||||
|       site = fixture_site({ |       _, matching_doc = fixture_document("_methods/configuration.md") | ||||||
|         "collections" => { |       assert_equal "/methods/configuration-configuration_methods_configuration", URL.new( | ||||||
|           "methods" => { |         :template     => "/methods/:name-:slug_:collection_:title", | ||||||
|             "output" => true |         :placeholders => matching_doc.url_placeholders | ||||||
|           } |       ).to_s | ||||||
|         } |  | ||||||
|       }) |  | ||||||
|       site.read |  | ||||||
|       matching_doc = site.collections["methods"].docs.find do |doc| |  | ||||||
|         doc.relative_path == "_methods/escape-+ #%20[].md" |  | ||||||
|     end |     end | ||||||
|  | 
 | ||||||
|  |     should "raise custom error when URL placeholder doesn't have key" do | ||||||
|  |       _, matching_doc = fixture_document("_methods/escape-+ #%20[].md") | ||||||
|       assert_raises NoMethodError do |       assert_raises NoMethodError do | ||||||
|         URL.new( |         URL.new( | ||||||
|           :template     => "/methods/:headline", |           :template     => "/methods/:headline", | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue