diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index 97b7b677..187effbe 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -2,7 +2,7 @@ module Jekyll class Site attr_accessor :source, :dest - attr_accessor :layouts, :posts + attr_accessor :layouts, :posts, :categories # Initialize the site # +source+ is String path to the source directory containing @@ -16,6 +16,7 @@ module Jekyll self.dest = dest self.layouts = {} self.posts = [] + self.categories = Hash.new { |hash, key| hash[key] = Array.new } end # Do the actual work of processing the site and generating the @@ -63,6 +64,7 @@ module Jekyll if Post.valid?(f) post = Post.new(self.source, dir, f) self.posts << post + post.categories.each { |c| self.categories[c] << post } end end @@ -72,6 +74,7 @@ module Jekyll end self.posts.sort! + self.categories.values.map { |cats| cats.sort! { |a, b| b <=> a} } rescue Errno::ENOENT => e # ignore missing layout dir end @@ -101,6 +104,8 @@ module Jekyll entries = entries.reject do |e| (e != '_posts') and ['.', '_'].include?(e[0..0]) unless ['.htaccess'].include?(e) end + directories = entries.select { |e| File.directory?(File.join(base, e)) } + files = entries.reject { |e| File.directory?(File.join(base, e)) } # we need to make sure to process _posts *first* otherwise they # might not be available yet to other templates as {{ site.posts }} @@ -108,23 +113,24 @@ module Jekyll entries.delete('_posts') read_posts(dir) end - - entries.each do |f| - if File.directory?(File.join(base, f)) - next if self.dest.sub(/\/$/, '') == File.join(base, f) - transform_pages(File.join(dir, f)) - else - first3 = File.open(File.join(self.source, dir, f)) { |fd| fd.read(3) } - - if first3 == "---" - # file appears to have a YAML header so process it as a page - page = Page.new(self.source, dir, f) - page.render(self.layouts, site_payload) - page.write(self.dest) + [directories, files].each do |entries| + entries.each do |f| + if File.directory?(File.join(base, f)) + next if self.dest.sub(/\/$/, '') == File.join(base, f) + transform_pages(File.join(dir, f)) else - # otherwise copy the file without transforming it - FileUtils.mkdir_p(File.join(self.dest, dir)) - FileUtils.cp(File.join(self.source, dir, f), File.join(self.dest, dir, f)) + first3 = File.open(File.join(self.source, dir, f)) { |fd| fd.read(3) } + + if first3 == "---" + # file appears to have a YAML header so process it as a page + page = Page.new(self.source, dir, f) + page.render(self.layouts, site_payload) + page.write(self.dest) + else + # otherwise copy the file without transforming it + FileUtils.mkdir_p(File.join(self.dest, dir)) + FileUtils.cp(File.join(self.source, dir, f), File.join(self.dest, dir, f)) + end end end end diff --git a/test/source/category/_posts/2008-9-23-categories.textile b/test/source/category/_posts/2008-9-23-categories.textile new file mode 100644 index 00000000..7b5bc39c --- /dev/null +++ b/test/source/category/_posts/2008-9-23-categories.textile @@ -0,0 +1,6 @@ +--- +layout: default +title: Categories +--- + +Categories _should_ work \ No newline at end of file diff --git a/test/source/z_category/_posts/2008-9-23-categories.textile b/test/source/z_category/_posts/2008-9-23-categories.textile new file mode 100644 index 00000000..6a5e0090 --- /dev/null +++ b/test/source/z_category/_posts/2008-9-23-categories.textile @@ -0,0 +1,6 @@ +--- +layout: default +title: Categories +--- + +Categories _should_ work. Even if ordered after index. \ No newline at end of file diff --git a/test/test_generated_site.rb b/test/test_generated_site.rb index 56e5e422..24e5ef1a 100644 --- a/test/test_generated_site.rb +++ b/test/test_generated_site.rb @@ -11,6 +11,7 @@ class TestGeneratedSite < Test::Unit::TestCase def test_site_posts_in_index # confirm that {{ site.posts }} is working + puts @s.posts.size assert @index.include?("#{@s.posts.size} Posts") end