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