Merge pull request #1849 from afeld/sort-attributes
This commit is contained in:
commit
a2fd8ba7c3
|
@ -58,3 +58,16 @@ Feature: Embed filters
|
||||||
Then the _site directory should exist
|
Then the _site directory should exist
|
||||||
And I should see "By <p><em>Obi-wan</em></p>" in "_site/2009/03/27/star-wars.html"
|
And I should see "By <p><em>Obi-wan</em></p>" in "_site/2009/03/27/star-wars.html"
|
||||||
|
|
||||||
|
Scenario: Sort by an arbitrary variable
|
||||||
|
Given I have a _layouts directory
|
||||||
|
And I have the following page:
|
||||||
|
| title | layout | value | content |
|
||||||
|
| Page-1 | default | 8 | Something |
|
||||||
|
And I have the following page:
|
||||||
|
| title | layout | value | content |
|
||||||
|
| Page-2 | default | 6 | Something |
|
||||||
|
And I have a default layout that contains "{{ site.pages | sort:'value' | map:'title' | join:', ' }}"
|
||||||
|
When I run jekyll
|
||||||
|
Then the _site directory should exist
|
||||||
|
And I should see exactly "Page-2, Page-1" in "_site/page-1.html"
|
||||||
|
And I should see exactly "Page-2, Page-1" in "_site/page-2.html"
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
def file_content_from_hash(input_hash)
|
||||||
|
matter_hash = input_hash.reject { |k, v| k == "content" }
|
||||||
|
matter = matter_hash.map { |k, v| "#{k}: #{v}\n" }.join.chomp
|
||||||
|
|
||||||
|
content = if input_hash['input'] && input_hash['filter']
|
||||||
|
"{{ #{input_hash['input']} | #{input_hash['filter']} }}"
|
||||||
|
else
|
||||||
|
input_hash['content']
|
||||||
|
end
|
||||||
|
|
||||||
|
<<EOF
|
||||||
|
---
|
||||||
|
#{matter}
|
||||||
|
---
|
||||||
|
#{content}
|
||||||
|
EOF
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
Before do
|
Before do
|
||||||
FileUtils.mkdir(TEST_DIR)
|
FileUtils.mkdir(TEST_DIR)
|
||||||
Dir.chdir(TEST_DIR)
|
Dir.chdir(TEST_DIR)
|
||||||
|
@ -62,42 +81,28 @@ Given /^I have an? (.*) directory$/ do |dir|
|
||||||
FileUtils.mkdir_p(dir)
|
FileUtils.mkdir_p(dir)
|
||||||
end
|
end
|
||||||
|
|
||||||
Given /^I have the following (draft|post)s?(?: (in|under) "([^"]+)")?:$/ do |status, direction, folder, table|
|
Given /^I have the following (draft|page|post)s?(?: (in|under) "([^"]+)")?:$/ do |status, direction, folder, table|
|
||||||
table.hashes.each do |post|
|
table.hashes.each do |input_hash|
|
||||||
title = slug(post['title'])
|
title = slug(input_hash['title'])
|
||||||
ext = post['type'] || 'textile'
|
ext = input_hash['type'] || 'textile'
|
||||||
before, after = location(folder, direction)
|
before, after = location(folder, direction)
|
||||||
|
|
||||||
if "draft" == status
|
case status
|
||||||
folder_post = '_drafts'
|
when "draft"
|
||||||
|
dest_folder = '_drafts'
|
||||||
filename = "#{title}.#{ext}"
|
filename = "#{title}.#{ext}"
|
||||||
elsif "post" == status
|
when "page"
|
||||||
parsed_date = Time.xmlschema(post['date']) rescue Time.parse(post['date'])
|
dest_folder = ''
|
||||||
folder_post = '_posts'
|
filename = "#{title}.#{ext}"
|
||||||
|
when "post"
|
||||||
|
parsed_date = Time.xmlschema(input_hash['date']) rescue Time.parse(input_hash['date'])
|
||||||
|
dest_folder = '_posts'
|
||||||
filename = "#{parsed_date.strftime('%Y-%m-%d')}-#{title}.#{ext}"
|
filename = "#{parsed_date.strftime('%Y-%m-%d')}-#{title}.#{ext}"
|
||||||
end
|
end
|
||||||
|
|
||||||
path = File.join(before, folder_post, after, filename)
|
path = File.join(before, dest_folder, after, filename)
|
||||||
|
|
||||||
matter_hash = {}
|
|
||||||
%w(title layout tag tags category categories published author path date permalink).each do |key|
|
|
||||||
matter_hash[key] = post[key] if post[key]
|
|
||||||
end
|
|
||||||
matter = matter_hash.map { |k, v| "#{k}: #{v}\n" }.join.chomp
|
|
||||||
|
|
||||||
content = if post['input'] && post['filter']
|
|
||||||
"{{ #{post['input']} | #{post['filter']} }}"
|
|
||||||
else
|
|
||||||
post['content']
|
|
||||||
end
|
|
||||||
|
|
||||||
File.open(path, 'w') do |f|
|
File.open(path, 'w') do |f|
|
||||||
f.write <<EOF
|
f.write file_content_from_hash(input_hash)
|
||||||
---
|
|
||||||
#{matter}
|
|
||||||
---
|
|
||||||
#{content}
|
|
||||||
EOF
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -171,5 +171,18 @@ module Jekyll
|
||||||
f.write(self.output)
|
f.write(self.output)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Accessor for data properties by Liquid.
|
||||||
|
#
|
||||||
|
# property - The String name of the property to retrieve.
|
||||||
|
#
|
||||||
|
# Returns the String value or nil if the property isn't included.
|
||||||
|
def [](property)
|
||||||
|
if self.class::ATTRIBUTES_FOR_LIQUID.include?(property)
|
||||||
|
send(property)
|
||||||
|
else
|
||||||
|
data[property]
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -9,9 +9,11 @@ module Jekyll
|
||||||
|
|
||||||
# Attributes for Liquid templates
|
# Attributes for Liquid templates
|
||||||
ATTRIBUTES_FOR_LIQUID = %w[
|
ATTRIBUTES_FOR_LIQUID = %w[
|
||||||
url
|
|
||||||
content
|
content
|
||||||
|
dir
|
||||||
|
name
|
||||||
path
|
path
|
||||||
|
url
|
||||||
]
|
]
|
||||||
|
|
||||||
# Initialize a new Page.
|
# Initialize a new Page.
|
||||||
|
|
|
@ -9,6 +9,7 @@ module Jekyll
|
||||||
EXCERPT_ATTRIBUTES_FOR_LIQUID = %w[
|
EXCERPT_ATTRIBUTES_FOR_LIQUID = %w[
|
||||||
title
|
title
|
||||||
url
|
url
|
||||||
|
dir
|
||||||
date
|
date
|
||||||
id
|
id
|
||||||
categories
|
categories
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
---
|
||||||
|
categories: foo bar baz
|
||||||
|
foo: bar
|
||||||
|
layout: default
|
||||||
|
tags: ay bee cee
|
||||||
|
title: Properties Post
|
||||||
|
---
|
||||||
|
|
||||||
|
All the properties.
|
||||||
|
|
||||||
|
Plus an excerpt.
|
|
@ -0,0 +1,8 @@
|
||||||
|
---
|
||||||
|
foo: bar
|
||||||
|
layout: default
|
||||||
|
permalink: /properties/
|
||||||
|
title: Properties Page
|
||||||
|
---
|
||||||
|
|
||||||
|
All the properties.
|
|
@ -120,7 +120,7 @@ class TestFilters < Test::Unit::TestCase
|
||||||
case g["name"]
|
case g["name"]
|
||||||
when "default"
|
when "default"
|
||||||
assert g["items"].is_a?(Array), "The list of grouped items for 'default' is not an Array."
|
assert g["items"].is_a?(Array), "The list of grouped items for 'default' is not an Array."
|
||||||
assert_equal 3, g["items"].size
|
assert_equal 4, g["items"].size
|
||||||
when "nil"
|
when "nil"
|
||||||
assert g["items"].is_a?(Array), "The list of grouped items for 'nil' is not an Array."
|
assert g["items"].is_a?(Array), "The list of grouped items for 'nil' is not an Array."
|
||||||
assert_equal 2, g["items"].size
|
assert_equal 2, g["items"].size
|
||||||
|
|
|
@ -47,6 +47,29 @@ class TestPage < Test::Unit::TestCase
|
||||||
assert_equal "deal.with.dots", @page.basename
|
assert_equal "deal.with.dots", @page.basename
|
||||||
end
|
end
|
||||||
|
|
||||||
|
should "make properties accessible through #[]" do
|
||||||
|
page = setup_page('properties.html')
|
||||||
|
attrs = {
|
||||||
|
content: "All the properties.\n",
|
||||||
|
dir: "/properties/",
|
||||||
|
excerpt: nil,
|
||||||
|
foo: 'bar',
|
||||||
|
layout: 'default',
|
||||||
|
name: "properties.html",
|
||||||
|
path: "properties.html",
|
||||||
|
permalink: '/properties/',
|
||||||
|
published: nil,
|
||||||
|
title: 'Properties Page',
|
||||||
|
url: "/properties/"
|
||||||
|
}
|
||||||
|
|
||||||
|
attrs.each do |attr, val|
|
||||||
|
attr_str = attr.to_s
|
||||||
|
result = page[attr_str]
|
||||||
|
assert_equal val, result, "For <page[\"#{attr_str}\"]>:"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context "with pretty url style" do
|
context "with pretty url style" do
|
||||||
setup do
|
setup do
|
||||||
@site.permalink_style = :pretty
|
@site.permalink_style = :pretty
|
||||||
|
|
|
@ -25,6 +25,34 @@ class TestPost < Test::Unit::TestCase
|
||||||
assert !Post.valid?("blah")
|
assert !Post.valid?("blah")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
should "make properties accessible through #[]" do
|
||||||
|
post = setup_post('2013-12-20-properties.text')
|
||||||
|
|
||||||
|
attrs = {
|
||||||
|
categories: %w(foo bar baz),
|
||||||
|
content: "All the properties.\n\nPlus an excerpt.\n",
|
||||||
|
date: Time.new(2013, 12, 20),
|
||||||
|
dir: "/foo/bar/baz/2013/12/20",
|
||||||
|
excerpt: "All the properties.\n\n",
|
||||||
|
foo: 'bar',
|
||||||
|
id: "/foo/bar/baz/2013/12/20/properties",
|
||||||
|
layout: 'default',
|
||||||
|
name: nil,
|
||||||
|
# path: "properties.html",
|
||||||
|
permalink: nil,
|
||||||
|
published: nil,
|
||||||
|
tags: %w(ay bee cee),
|
||||||
|
title: 'Properties Post',
|
||||||
|
url: "/foo/bar/baz/2013/12/20/properties.html"
|
||||||
|
}
|
||||||
|
|
||||||
|
attrs.each do |attr, val|
|
||||||
|
attr_str = attr.to_s
|
||||||
|
result = post[attr_str]
|
||||||
|
assert_equal val, result, "For <post[\"#{attr_str}\"]>:"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context "processing posts" do
|
context "processing posts" do
|
||||||
setup do
|
setup do
|
||||||
@post = Post.allocate
|
@post = Post.allocate
|
||||||
|
|
|
@ -157,7 +157,7 @@ class TestSite < Test::Unit::TestCase
|
||||||
should "sort pages alphabetically" do
|
should "sort pages alphabetically" do
|
||||||
stub.proxy(Dir).entries { |entries| entries.reverse }
|
stub.proxy(Dir).entries { |entries| entries.reverse }
|
||||||
@site.process
|
@site.process
|
||||||
sorted_pages = %w(.htaccess about.html bar.html contacts.html deal.with.dots.html foo.md index.html index.html sitemap.xml symlinked-file)
|
sorted_pages = %w(.htaccess about.html bar.html contacts.html deal.with.dots.html foo.md index.html index.html properties.html sitemap.xml symlinked-file)
|
||||||
assert_equal sorted_pages, @site.pages.map(&:name)
|
assert_equal sorted_pages, @site.pages.map(&:name)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -183,7 +183,7 @@ class TestSite < Test::Unit::TestCase
|
||||||
|
|
||||||
assert_equal posts.size - @num_invalid_posts, @site.posts.size
|
assert_equal posts.size - @num_invalid_posts, @site.posts.size
|
||||||
assert_equal categories, @site.categories.keys.sort
|
assert_equal categories, @site.categories.keys.sort
|
||||||
assert_equal 4, @site.categories['foo'].size
|
assert_equal 5, @site.categories['foo'].size
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'error handling' do
|
context 'error handling' do
|
||||||
|
|
Loading…
Reference in New Issue