diff --git a/lib/jekyll/post.rb b/lib/jekyll/post.rb index a7afa800..9824ef02 100644 --- a/lib/jekyll/post.rb +++ b/lib/jekyll/post.rb @@ -10,6 +10,21 @@ module Jekyll # Valid post name regex. MATCHER = /^(.+\/)*(\d+-\d+-\d+)-(.*)(\.[^.]+)$/ + # Attributes for Liquid templates + ATTRIBUTES_FOR_LIQUID = %w[ + title + url + date + id + categories + next + previous + tags + content + excerpt + path + ] + # Post name validator. Post filenames must be like: # 2008-11-05-my-awesome-post.textile # @@ -39,35 +54,37 @@ module Jekyll self.categories = dir.downcase.split('/').reject { |x| x.empty? } self.process(name) - begin - self.read_yaml(@base, name) - rescue Exception => msg - raise FatalException.new("#{msg} in #{@base}/#{name}") - end + self.read_yaml(@base, name) - # If we've added a date and time to the YAML, use that instead of the - # filename date. Means we'll sort correctly. if self.data.has_key?('date') - # ensure Time via to_s and reparse self.date = Time.parse(self.data["date"].to_s) end + self.published = self.published? + + self.populate_categories + self.populate_tags + end + + def published? if self.data.has_key?('published') && self.data['published'] == false - self.published = false + false else - self.published = true + true end + end - self.tags = self.data.pluralized_array("tag", "tags") - + def populate_categories if self.categories.empty? self.categories = self.data.pluralized_array('category', 'categories').map {|c| c.downcase} end - - self.tags.flatten! self.categories.flatten! end + def populate_tags + self.tags = self.data.pluralized_array("tag", "tags").flatten + end + # Get the full path to the directory containing the post files def containing_dir(source, dir) return File.join(source, dir, '_posts') @@ -96,6 +113,23 @@ module Jekyll end end + # Public: the Post title, from the YAML Front-Matter or from the slug + # + # Returns the post title + def title + self.data["title"] || self.slug.split('-').select {|w| w.capitalize! || w }.join(' ') + end + + # Public: the path to the post relative to the site source, + # from the YAML Front-Matter or from a combination of + # the directory it's in, "_posts", and the name of the + # post file + # + # Returns the path to the file relative to the site source + def path + self.data['path'] || File.join(@dir, '_posts', @name).sub(/\A\//, '') + end + # Compares Post objects. First compares the Post date. If the dates are # equal, it compares the Post slugs. # @@ -212,16 +246,7 @@ module Jekyll return [] unless posts.size > 1 if self.site.lsi - self.class.lsi ||= begin - puts "Starting the classifier..." - lsi = Classifier::LSI.new(:auto_rebuild => false) - $stdout.print(" Populating LSI... ");$stdout.flush - posts.each { |x| $stdout.print(".");$stdout.flush;lsi.add_item(x) } - $stdout.print("\n Rebuilding LSI index... ") - lsi.build_index - puts "" - lsi - end + build_index related = self.class.lsi.find_related(self.content, 11) related - [self] @@ -230,6 +255,19 @@ module Jekyll end end + def build_index + self.class.lsi ||= begin + puts "Starting the classifier..." + lsi = Classifier::LSI.new(:auto_rebuild => false) + $stdout.print(" Populating LSI... "); $stdout.flush + posts.each { |x| $stdout.print("."); $stdout.flush; lsi.add_item(x) } + $stdout.print("\n Rebuilding LSI index... ") + lsi.build_index + puts "" + lsi + end + end + # Add any necessary layouts to this post. # # layouts - A Hash of {"name" => "layout"}. @@ -262,18 +300,10 @@ module Jekyll # # Returns the representative Hash. def to_liquid - self.data.deep_merge({ - "title" => self.data["title"] || self.slug.split('-').select {|w| w.capitalize! || w }.join(' '), - "url" => self.url, - "date" => self.date, - "id" => self.id, - "categories" => self.categories, - "next" => self.next, - "previous" => self.previous, - "tags" => self.tags, - "content" => self.content, - "excerpt" => self.excerpt, - "path" => self.data['path'] || File.join(@dir, '_posts', @name).sub(/\A\//, '') }) + further_data = Hash[ATTRIBUTES_FOR_LIQUID.map { |attribute| + [attribute, send(attribute)] + }] + data.deep_merge(further_data) end # Returns the shorthand String identifier of this Post.