diff --git a/.gitignore b/.gitignore
index 92e4ce11..de43f334 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,5 @@
test/dest/
*.gem
pkg/
+*.swp
+*~
diff --git a/README.textile b/README.textile
index c08efb6b..0ed13e8f 100644
--- a/README.textile
+++ b/README.textile
@@ -255,6 +255,15 @@ h3. Predefined Post Variables
/year/month/day/title.html then you can set this variable and it will
be used as the final URL.
+ published
+ Set to false if you don't want a post to show up when the site is
+ generated.
+
+ category/categories
+ Instead of placing posts inside of folders, you can specify one or more
+ categories that the post belongs to. When the site is generated the post
+ will act as though it had been set with these categories normally.
+
h3. Custom Variables
Any variables in the front matter that are not predefined are mixed into the
@@ -372,7 +381,7 @@ within a Liquid template as follows:
{% for post in site.categories.foo %}
-
{{ post.date | date_to_string }} - {{ post.title }}
+ {{ post.date | date_to_string }} - {{ post.title }}
{% endfor %}
diff --git a/lib/jekyll/post.rb b/lib/jekyll/post.rb
index 07068184..0e2af904 100644
--- a/lib/jekyll/post.rb
+++ b/lib/jekyll/post.rb
@@ -18,7 +18,7 @@ module Jekyll
name =~ MATCHER
end
- attr_accessor :date, :slug, :ext, :categories, :topics
+ attr_accessor :date, :slug, :ext, :categories, :topics, :published
attr_accessor :data, :content, :output
# Initialize this Post instance.
@@ -38,6 +38,20 @@ module Jekyll
self.process(name)
self.read_yaml(@base, name)
+
+ if self.data.has_key?('published') && self.data['published'] == false
+ self.published = false
+ else
+ self.published = true
+ end
+
+ if self.categories.empty?
+ if self.data.has_key?('category')
+ self.categories << self.data['category']
+ elsif self.data.has_key?('categories')
+ self.categories = self.data['categories'].split
+ end
+ end
end
# Spaceship is based on Post#date
diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb
index 187effbe..9b96ee6e 100644
--- a/lib/jekyll/site.rb
+++ b/lib/jekyll/site.rb
@@ -63,8 +63,11 @@ module Jekyll
entries.each do |f|
if Post.valid?(f)
post = Post.new(self.source, dir, f)
- self.posts << post
- post.categories.each { |c| self.categories[c] << post }
+
+ if post.published
+ self.posts << post
+ post.categories.each { |c| self.categories[c] << post }
+ end
end
end
diff --git a/test/helper.rb b/test/helper.rb
index 9aabcdd2..611d6d60 100644
--- a/test/helper.rb
+++ b/test/helper.rb
@@ -1,6 +1,7 @@
require File.join(File.dirname(__FILE__), *%w[.. lib jekyll])
require 'test/unit'
+require 'redgreen'
include Jekyll
@@ -10,4 +11,4 @@ end
def clear_dest
FileUtils.rm_rf(dest_dir)
-end
\ No newline at end of file
+end
diff --git a/test/source/_posts/2008-02-02-not-published.textile b/test/source/_posts/2008-02-02-not-published.textile
new file mode 100644
index 00000000..5ff418dc
--- /dev/null
+++ b/test/source/_posts/2008-02-02-not-published.textile
@@ -0,0 +1,8 @@
+---
+layout: default
+title: Not published!
+published: false
+category: publish_test
+---
+
+This should *not* be published!
diff --git a/test/source/_posts/2008-02-02-published.textile b/test/source/_posts/2008-02-02-published.textile
new file mode 100644
index 00000000..78651408
--- /dev/null
+++ b/test/source/_posts/2008-02-02-published.textile
@@ -0,0 +1,8 @@
+---
+layout: default
+title: Publish
+category: publish_test
+---
+
+This should be published.
+
diff --git a/test/source/_posts/2009-01-27-categories.textile b/test/source/_posts/2009-01-27-categories.textile
new file mode 100644
index 00000000..189fe29f
--- /dev/null
+++ b/test/source/_posts/2009-01-27-categories.textile
@@ -0,0 +1,7 @@
+---
+layout: default
+title: Categories in YAML
+categories: foo bar baz
+---
+
+Best *post* ever
diff --git a/test/source/_posts/2009-01-27-category.textile b/test/source/_posts/2009-01-27-category.textile
new file mode 100644
index 00000000..2881e4c9
--- /dev/null
+++ b/test/source/_posts/2009-01-27-category.textile
@@ -0,0 +1,7 @@
+---
+layout: default
+title: Category in YAML
+category: foo
+---
+
+Best *post* ever
diff --git a/test/test_generated_site.rb b/test/test_generated_site.rb
index 24e5ef1a..0762d299 100644
--- a/test/test_generated_site.rb
+++ b/test/test_generated_site.rb
@@ -3,20 +3,30 @@ require File.dirname(__FILE__) + '/helper'
class TestGeneratedSite < Test::Unit::TestCase
def setup
clear_dest
- source = File.join(File.dirname(__FILE__), *%w[source])
- @s = Site.new(source, dest_dir)
+ @source = File.join(File.dirname(__FILE__), *%w[source])
+ @s = Site.new(@source, dest_dir)
@s.process
@index = File.read(File.join(dest_dir, 'index.html'))
end
def test_site_posts_in_index
# confirm that {{ site.posts }} is working
- puts @s.posts.size
assert @index.include?("#{@s.posts.size} Posts")
end
def test_post_content_in_index
# confirm that the {{ post.content }} is rendered OK
- assert @index.include?('This is cool
')
+ latest_post = Dir[File.join(@source, '_posts/*')].last
+ post = Post.new(@source, '', File.basename(latest_post))
+ Jekyll.content_type = post.determine_content_type
+ post.transform
+ assert @index.include?(post.content)
+ end
+
+ def test_unpublished_posts_are_hidden
+ published = Dir[File.join(dest_dir, 'publish_test/2008/02/02/*.html')].map {|f| File.basename(f)}
+
+ assert_equal 1, published.size
+ assert_equal "published.html", published.first
end
end
diff --git a/test/test_post.rb b/test/test_post.rb
index 713eec02..0a118df3 100644
--- a/test/test_post.rb
+++ b/test/test_post.rb
@@ -70,6 +70,28 @@ class TestPost < Test::Unit::TestCase
assert_equal "{{ page.title }}
\nBest post ever
", p.content
end
+
+ def test_published
+ p = Post.new(File.join(File.dirname(__FILE__), *%w[source]), '', "2008-02-02-published.textile")
+ assert_equal true, p.published
+ end
+
+ def test_not_published
+ p = Post.new(File.join(File.dirname(__FILE__), *%w[source]), '', "2008-02-02-not-published.textile")
+ assert_equal false, p.published
+ end
+
+ def test_yaml_category
+ p = Post.new(File.join(File.dirname(__FILE__), *%w[source]), '', "2009-01-27-category.textile")
+ assert p.categories.include?('foo')
+ end
+
+ def test_yaml_categories
+ p = Post.new(File.join(File.dirname(__FILE__), *%w[source]), '', "2009-01-27-categories.textile")
+ assert p.categories.include?('foo')
+ assert p.categories.include?('bar')
+ assert p.categories.include?('baz')
+ end
def test_render
p = Post.new(File.join(File.dirname(__FILE__), *%w[source]), '', "2008-10-18-foo-bar.textile")
@@ -110,4 +132,4 @@ class TestPost < Test::Unit::TestCase
assert_equal "<<<
\nTom Preston-Werner github.com/mojombo
\n\nThis is cool
>>>", p.output
end
-end
\ No newline at end of file
+end
diff --git a/test/test_site.rb b/test/test_site.rb
index 03bf1669..e19eefcd 100644
--- a/test/test_site.rb
+++ b/test/test_site.rb
@@ -2,8 +2,8 @@ require File.dirname(__FILE__) + '/helper'
class TestSite < Test::Unit::TestCase
def setup
- source = File.join(File.dirname(__FILE__), *%w[source])
- @s = Site.new(source, dest_dir)
+ @source = File.join(File.dirname(__FILE__), *%w[source])
+ @s = Site.new(@source, dest_dir)
end
def test_site_init
@@ -18,16 +18,19 @@ class TestSite < Test::Unit::TestCase
def test_read_posts
@s.read_posts('')
-
- assert_equal 4, @s.posts.size
+ posts = Dir[File.join(@source, '_posts/*')]
+ assert_equal posts.size - 1, @s.posts.size
end
def test_site_payload
clear_dest
@s.process
- assert_equal 7, @s.posts.length
- assert_equal ["category", "foo", "z_category"].sort, @s.categories.keys.sort
- assert_equal 1, @s.categories['foo'].length
+ posts = Dir[File.join(@source, "**", "_posts/*")]
+ categories = %w(bar baz category foo z_category publish_test).sort
+
+ assert_equal posts.size - 1, @s.posts.size
+ assert_equal categories, @s.categories.keys.sort
+ assert_equal 3, @s.categories['foo'].size
end
end