lib/jekyll/post.rb in mojombo-jekyll-0.2.0 vs lib/jekyll/post.rb in mojombo-jekyll-0.3.0

- old
+ new

@@ -1,41 +1,45 @@ module Jekyll class Post include Comparable include Convertible - + class << self attr_accessor :lsi end - MATCHER = /^(\d+-\d+-\d+)-(.*)(\.[^.]+)$/ + MATCHER = /^(.+\/)*(\d+-\d+-\d+)-(.*)(\.[^.]+)$/ # Post name validator. Post filenames must be like: # 2008-11-05-my-awesome-post.textile # # Returns <Bool> def self.valid?(name) name =~ MATCHER end - attr_accessor :date, :slug, :ext + attr_accessor :date, :slug, :ext, :categories, :topics attr_accessor :data, :content, :output # Initialize this Post instance. # +base+ is the String path to the dir containing the post file # +name+ is the String filename of the post file + # +categories+ is an Array of Strings for the categories for this post # # Returns <Post> - def initialize(base, name) - @base = base + def initialize(source, dir, name) + @base = File.join(source, dir, '_posts') @name = name + self.categories = dir.split('/').reject { |x| x.empty? } + + parts = name.split('/') + self.topics = parts.size > 1 ? parts[0..-2] : [] + self.process(name) - self.read_yaml(base, name) - #Removed to avoid munging of liquid tags, replaced in convertible.rb#48 - #self.transform + self.read_yaml(@base, name) end # Spaceship is based on Post#date # # Returns -1, 0, 1 @@ -46,11 +50,11 @@ # Extract information from the post filename # +name+ is the String filename of the post file # # Returns nothing def process(name) - m, date, slug, ext = *name.match(MATCHER) + m, cats, date, slug, ext = *name.match(MATCHER) self.date = Time.parse(date) self.slug = slug self.ext = ext end @@ -59,13 +63,16 @@ # permalink is absent, set to the default date # e.g. "/2008/11/05/" # # Returns <String> def dir - permalink ? - permalink.to_s.split("/")[0..-2].join("/") : - date.strftime("/%Y/%m/%d/") + if permalink + permalink.to_s.split("/")[0..-2].join("/") + else + prefix = self.categories.empty? ? '' : '/' + self.categories.join('/') + prefix + date.strftime("/%Y/%m/%d/") + end end # The full path and filename of the post. # Defined in the YAML of the post body # (Optional) @@ -88,11 +95,11 @@ # # Returns <String> def id self.dir + self.slug end - + # Calculate related posts. # # Returns [<Post>] def related_posts(posts) return [] unless posts.size > 1 @@ -116,15 +123,20 @@ # Add any necessary layouts to this post # +layouts+ is a Hash of {"name" => "layout"} # +site_payload+ is the site payload hash # # Returns nothing - def add_layout(layouts, site_payload) - # construct post payload - related = related_posts(site_payload["site"]["posts"]) - payload = {"page" => self.to_liquid.merge(self.data)} - do_layout(payload, layouts, site_payload.merge({"site" => {"related_posts" => related}})) + def render(layouts, site_payload) + # construct payload + payload = + { + "site" => { "related_posts" => related_posts(site_payload["site"]["posts"]) }, + "page" => self.to_liquid + } + payload = payload.deep_merge(site_payload) + + do_layout(payload, layouts) end # Write the generated post file to the destination directory. # +dest+ is the String path to the destination dir # @@ -144,10 +156,15 @@ def to_liquid { "title" => self.data["title"] || "", "url" => self.url, "date" => self.date, "id" => self.id, - "content" => self.content } + "topics" => self.topics, + "content" => self.content }.deep_merge(self.data) + end + + def inspect + "<Post: #{self.id}>" end end end