From 3768d90278a76bc7cd405ceed9d8b029c9efc489 Mon Sep 17 00:00:00 2001 From: ChaYoung You Date: Sat, 5 Jul 2014 18:54:26 +0900 Subject: [PATCH] Use category in downcase only for URL (Resolves #1739) --- features/post_data.feature | 8 ++-- lib/jekyll/post.rb | 6 +-- ...13-07-22-post-excerpt-with-layout.markdown | 1 + test/source/_posts/2013-12-20-properties.text | 2 +- ...07-05-another-mixed-case-category.markdown | 7 +++ .../2014-07-05-mixed-case-category.markdown | 7 +++ test/test_excerpt.rb | 4 +- test/test_generated_site.rb | 2 +- test/test_post.rb | 46 ++++++++++++++++--- test/test_site.rb | 2 +- 10 files changed, 66 insertions(+), 19 deletions(-) create mode 100644 test/source/_posts/2014-07-05-another-mixed-case-category.markdown create mode 100644 test/source/_posts/2014-07-05-mixed-case-category.markdown diff --git a/features/post_data.feature b/features/post_data.feature index 0ecaeef6..736fc936 100644 --- a/features/post_data.feature +++ b/features/post_data.feature @@ -141,7 +141,7 @@ Feature: Post data And I have a simple layout that contains "Post categories: {{ page.categories | array_to_sentence_string }}" When I run jekyll build Then the _site directory should exist - And I should see "Post categories: scifi and movies" in "_site/scifi/movies/2009/03/27/star-wars.html" + And I should see "Post categories: scifi and Movies" in "_site/scifi/movies/2009/03/27/star-wars.html" Scenario: Use post.categories variable when category is in YAML Given I have a _posts directory @@ -163,7 +163,7 @@ Feature: Post data And I have a simple layout that contains "Post category: {{ page.categories }}" When I run jekyll build Then the _site directory should exist - And I should see "Post category: movies" in "_site/movies/2009/03/27/star-wars.html" + And I should see "Post category: Movies" in "_site/movies/2009/03/27/star-wars.html" Scenario: Use post.categories variable when categories are in YAML Given I have a _posts directory @@ -197,8 +197,8 @@ Feature: Post data And I have a simple layout that contains "Post categories: {{ page.categories | array_to_sentence_string }}" When I run jekyll build Then the _site directory should exist - And I should see "Post categories: scifi and movies" in "_site/scifi/movies/2009/03/27/star-wars.html" - And I should see "Post categories: scifi and movies" in "_site/scifi/movies/2013/03/17/star-trek.html" + And I should see "Post categories: scifi and Movies" in "_site/scifi/movies/2009/03/27/star-wars.html" + And I should see "Post categories: SciFi and movies" in "_site/scifi/movies/2013/03/17/star-trek.html" Scenario Outline: Use page.path variable Given I have a /_posts directory diff --git a/lib/jekyll/post.rb b/lib/jekyll/post.rb index b13deff8..b1496de3 100644 --- a/lib/jekyll/post.rb +++ b/lib/jekyll/post.rb @@ -52,7 +52,7 @@ module Jekyll @base = containing_dir(source, dir) @name = name - self.categories = dir.downcase.split('/').reject { |x| x.empty? } + self.categories = dir.split('/').reject { |x| x.empty? } process(name) read_yaml(@base, name) @@ -80,7 +80,7 @@ module Jekyll categories_from_data = Utils.pluralized_array_from_hash(data, 'category', 'categories') self.categories = ( Array(categories) + categories_from_data - ).map {|c| c.to_s.downcase}.flatten.uniq + ).map { |c| c.to_s }.flatten.uniq end def populate_tags @@ -218,7 +218,7 @@ module Jekyll :title => slug, :i_day => date.strftime("%-d"), :i_month => date.strftime("%-m"), - :categories => (categories || []).map { |c| c.to_s }.join('/'), + :categories => (categories || []).map { |c| c.to_s.downcase }.join('/'), :short_month => date.strftime("%b"), :short_year => date.strftime("%y"), :y_day => date.strftime("%j"), diff --git a/test/source/_posts/2013-07-22-post-excerpt-with-layout.markdown b/test/source/_posts/2013-07-22-post-excerpt-with-layout.markdown index 07b0e5f3..49586606 100644 --- a/test/source/_posts/2013-07-22-post-excerpt-with-layout.markdown +++ b/test/source/_posts/2013-07-22-post-excerpt-with-layout.markdown @@ -5,6 +5,7 @@ categories: - bar - baz - z_category +- MixedCase tags: - first - second diff --git a/test/source/_posts/2013-12-20-properties.text b/test/source/_posts/2013-12-20-properties.text index 94ded598..c0d72ce7 100644 --- a/test/source/_posts/2013-12-20-properties.text +++ b/test/source/_posts/2013-12-20-properties.text @@ -1,5 +1,5 @@ --- -categories: foo bar baz +categories: foo bar baz MixedCase foo: bar layout: default tags: ay bee cee diff --git a/test/source/_posts/2014-07-05-another-mixed-case-category.markdown b/test/source/_posts/2014-07-05-another-mixed-case-category.markdown new file mode 100644 index 00000000..419ddab5 --- /dev/null +++ b/test/source/_posts/2014-07-05-another-mixed-case-category.markdown @@ -0,0 +1,7 @@ +--- +layout: default +title: Another Mixed Case Category in YAML +category: Mixedcase +--- + +Best *post* ever diff --git a/test/source/_posts/2014-07-05-mixed-case-category.markdown b/test/source/_posts/2014-07-05-mixed-case-category.markdown new file mode 100644 index 00000000..92a67904 --- /dev/null +++ b/test/source/_posts/2014-07-05-mixed-case-category.markdown @@ -0,0 +1,7 @@ +--- +layout: default +title: Mixed Case Category in YAML +category: MixedCase +--- + +Best *post* ever diff --git a/test/test_excerpt.rb b/test/test_excerpt.rb index b6300fde..e5523ad6 100644 --- a/test/test_excerpt.rb +++ b/test/test_excerpt.rb @@ -80,9 +80,9 @@ class TestExcerpt < Test::Unit::TestCase context "#to_liquid" do should "contain the proper page data to mimick the post liquid" do assert_equal "Post Excerpt with Layout", @excerpt.to_liquid["title"] - assert_equal "/bar/baz/z_category/2013/07/22/post-excerpt-with-layout.html", @excerpt.to_liquid["url"] + assert_equal "/bar/baz/z_category/mixedcase/2013/07/22/post-excerpt-with-layout.html", @excerpt.to_liquid["url"] assert_equal Time.parse("2013-07-22"), @excerpt.to_liquid["date"] - assert_equal %w[bar baz z_category], @excerpt.to_liquid["categories"] + assert_equal %w[bar baz z_category MixedCase], @excerpt.to_liquid["categories"] assert_equal %w[first second third jekyllrb.com], @excerpt.to_liquid["tags"] assert_equal "_posts/2013-07-22-post-excerpt-with-layout.markdown", @excerpt.to_liquid["path"] end diff --git a/test/test_generated_site.rb b/test/test_generated_site.rb index ca3124c5..0b157e85 100644 --- a/test/test_generated_site.rb +++ b/test/test_generated_site.rb @@ -14,7 +14,7 @@ class TestGeneratedSite < Test::Unit::TestCase end should "ensure post count is as expected" do - assert_equal 42, @site.posts.size + assert_equal 44, @site.posts.size end should "insert site.posts into the index" do diff --git a/test/test_post.rb b/test/test_post.rb index 98a3ff4b..44cc9664 100644 --- a/test/test_post.rb +++ b/test/test_post.rb @@ -31,13 +31,13 @@ class TestPost < Test::Unit::TestCase post = setup_post('2013-12-20-properties.text') attrs = { - categories: %w(foo bar baz), + categories: %w(foo bar baz MixedCase), content: "All the properties.\n\nPlus an excerpt.\n", date: Time.new(2013, 12, 20), - dir: "/foo/bar/baz/2013/12/20", + dir: "/foo/bar/baz/mixedcase/2013/12/20", excerpt: "All the properties.\n\n", foo: 'bar', - id: "/foo/bar/baz/2013/12/20/properties", + id: "/foo/bar/baz/mixedcase/2013/12/20/properties", layout: 'default', name: nil, path: "_posts/2013-12-20-properties.text", @@ -45,7 +45,7 @@ class TestPost < Test::Unit::TestCase published: nil, tags: %w(ay bee cee), title: 'Properties Post', - url: "/foo/bar/baz/2013/12/20/properties.html" + url: "/foo/bar/baz/mixedcase/2013/12/20/properties.html" } attrs.each do |attr, val| @@ -253,14 +253,26 @@ class TestPost < Test::Unit::TestCase context "with space (categories)" do setup do - @post.categories << "French cuisine" - @post.categories << "Belgian beer" + @post.categories << "french cuisine" + @post.categories << "belgian beer" @post.process(@fake_file) end should "process the url correctly" do assert_equal "/:categories/:year/:month/:day/:title.html", @post.template - assert_equal "/French%20cuisine/Belgian%20beer/2008/09/09/foo-bar.html", @post.url + assert_equal "/french%20cuisine/belgian%20beer/2008/09/09/foo-bar.html", @post.url + end + end + + context "with mixed case (category)" do + setup do + @post.categories << "MixedCase" + @post.process(@fake_file) + end + + should "process the url correctly" do + assert_equal "/:categories/:year/:month/:day/:title.html", @post.template + assert_equal "/mixedcase/2008/09/09/foo-bar.html", @post.url end end @@ -517,6 +529,12 @@ class TestPost < Test::Unit::TestCase assert !post.categories.include?(2013) end + should "recognize mixed case category in yaml" do + post = setup_post("2014-07-05-mixed-case-category.markdown") + assert post.categories.include?('MixedCase') + assert !post.categories.include?('mixedcase') + end + should "recognize tag in yaml" do post = setup_post("2009-05-18-tag.textile") assert post.tags.include?('code') @@ -589,6 +607,20 @@ class TestPost < Test::Unit::TestCase 'escape-+ %20[].html')) end + should "write properly when category has different letter case" do + %w(2014-07-05-mixed-case-category.markdown 2014-07-05-another-mixed-case-category.markdown).each do |file| + post = setup_post(file) + do_render(post) + post.write(dest_dir) + end + + assert File.directory?(dest_dir) + assert File.exist?(File.join(dest_dir, 'mixedcase', '2014', '07', '05', + 'mixed-case-category.html')) + assert File.exist?(File.join(dest_dir, 'mixedcase', '2014', '07', '05', + 'another-mixed-case-category.html')) + end + should "write properly without html extension" do post = setup_post("2008-10-18-foo-bar.textile") post.site.permalink_style = ":title" diff --git a/test/test_site.rb b/test/test_site.rb index a343b1c9..898a0235 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -212,7 +212,7 @@ class TestSite < Test::Unit::TestCase posts = Dir[source_dir("**", "_posts", "**", "*")] posts.delete_if { |post| File.directory?(post) && !Post.valid?(post) } - categories = %w(2013 bar baz category foo z_category publish_test win).sort + categories = %w(2013 bar baz category foo z_category MixedCase Mixedcase publish_test win).sort assert_equal posts.size - @num_invalid_posts, @site.posts.size assert_equal categories, @site.categories.keys.sort