TomDoc lib/jekyll/post.rb.

This commit is contained in:
Tom Preston-Werner 2013-01-03 22:20:42 -08:00
parent 9328a1a0dd
commit 4c70c036e7
1 changed files with 40 additions and 34 deletions

View File

@ -8,12 +8,13 @@ module Jekyll
attr_accessor :lsi attr_accessor :lsi
end end
# Valid post name regex.
MATCHER = /^(.+\/)*(\d+-\d+-\d+)-(.*)(\.[^.]+)$/ MATCHER = /^(.+\/)*(\d+-\d+-\d+)-(.*)(\.[^.]+)$/
# Post name validator. Post filenames must be like: # Post name validator. Post filenames must be like:
# 2008-11-05-my-awesome-post.textile # 2008-11-05-my-awesome-post.textile
# #
# Returns <Bool> # Returns true if valid, false if not.
def self.valid?(name) def self.valid?(name)
name =~ MATCHER name =~ MATCHER
end end
@ -25,12 +26,13 @@ module Jekyll
attr_reader :name attr_reader :name
# Initialize this Post instance. # Initialize this Post instance.
# +site+ is the Site
# +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> # site - The Site.
# base - The String path to the dir containing the post file.
# name - The String filename of the post file.
# categories - An Array of Strings for the categories for this post.
#
# Returns the new Post.
def initialize(site, source, dir, name) def initialize(site, source, dir, name)
@site = site @site = site
@base = File.join(source, dir, '_posts') @base = File.join(source, dir, '_posts')
@ -44,8 +46,8 @@ module Jekyll
raise FatalException.new("#{msg} in #{@base}/#{name}") raise FatalException.new("#{msg} in #{@base}/#{name}")
end end
# If we've added a date and time to the yaml, use that instead of the # If we've added a date and time to the YAML, use that instead of the
# filename date Means we'll sort correctly. # filename date. Means we'll sort correctly.
if self.data.has_key?('date') if self.data.has_key?('date')
# ensure Time via to_s and reparse # ensure Time via to_s and reparse
self.date = Time.parse(self.data["date"].to_s) self.date = Time.parse(self.data["date"].to_s)
@ -67,7 +69,7 @@ module Jekyll
# Compares Post objects. First compares the Post date. If the dates are # Compares Post objects. First compares the Post date. If the dates are
# equal, it compares the Post slugs. # equal, it compares the Post slugs.
# #
# +other+ is the object we are comparing to. # other - The other Post we are comparing to.
# #
# Returns -1, 0, 1 # Returns -1, 0, 1
def <=>(other) def <=>(other)
@ -78,10 +80,11 @@ module Jekyll
return cmp return cmp
end end
# Extract information from the post filename # Extract information from the post filename.
# +name+ is the String filename of the post file
# #
# Returns nothing # name - The String filename of the post file.
#
# Returns nothing.
def process(name) def process(name)
m, cats, date, slug, ext = *name.match(MATCHER) m, cats, date, slug, ext = *name.match(MATCHER)
self.date = Time.parse(date) self.date = Time.parse(date)
@ -94,18 +97,17 @@ module Jekyll
# The generated directory into which the post will be placed # The generated directory into which the post will be placed
# upon generation. This is derived from the permalink or, if # upon generation. This is derived from the permalink or, if
# permalink is absent, set to the default date # permalink is absent, set to the default date
# e.g. "/2008/11/05/" if the permalink style is :date, otherwise nothing # e.g. "/2008/11/05/" if the permalink style is :date, otherwise nothing.
# #
# Returns <String> # Returns the String directory.
def dir def dir
File.dirname(url) File.dirname(url)
end end
# The full path and filename of the post. # The full path and filename of the post. Defined in the YAML of the post
# Defined in the YAML of the post body # body (optional).
# (Optional)
# #
# Returns <String> # Returns the String permalink.
def permalink def permalink
self.data && self.data['permalink'] self.data && self.data['permalink']
end end
@ -123,10 +125,10 @@ module Jekyll
end end
end end
# The generated relative url of this post # The generated relative url of this post.
# e.g. /2008/11/05/my-awesome-post.html # e.g. /2008/11/05/my-awesome-post.html
# #
# Returns <String> # Returns the String URL.
def url def url
return @url if @url return @url if @url
@ -153,17 +155,17 @@ module Jekyll
@url @url
end end
# The UID for this post (useful in feeds) # The UID for this post (useful in feeds).
# e.g. /2008/11/05/my-awesome-post # e.g. /2008/11/05/my-awesome-post
# #
# Returns <String> # Returns the String UID.
def id def id
File.join(self.dir, self.slug) File.join(self.dir, self.slug)
end end
# Calculate related posts. # Calculate related posts.
# #
# Returns [<Post>] # Returns an Array of related Posts.
def related_posts(posts) def related_posts(posts)
return [] unless posts.size > 1 return [] unless posts.size > 1
@ -183,11 +185,12 @@ module Jekyll
end end
end end
# Add any necessary layouts to this post # Add any necessary layouts to this post.
# +layouts+ is a Hash of {"name" => "layout"}
# +site_payload+ is the site payload hash
# #
# Returns nothing # layouts - A Hash of {"name" => "layout"}.
# site_payload - The site payload hash.
#
# Returns nothing.
def render(layouts, site_payload) def render(layouts, site_payload)
# construct payload # construct payload
payload = { payload = {
@ -199,9 +202,10 @@ module Jekyll
end end
# Obtain destination path. # Obtain destination path.
# +dest+ is the String path to the destination dir
# #
# Returns destination file path. # dest - The String path to the destination dir.
#
# Returns destination file path String.
def destination(dest) def destination(dest)
# The url needs to be unescaped in order to preserve the correct filename # The url needs to be unescaped in order to preserve the correct filename
path = File.join(dest, CGI.unescape(self.url)) path = File.join(dest, CGI.unescape(self.url))
@ -210,9 +214,10 @@ module Jekyll
end end
# Write the generated post file to the destination directory. # Write the generated post file to the destination directory.
# +dest+ is the String path to the destination dir
# #
# Returns nothing # dest - The String path to the destination dir.
#
# Returns nothing.
def write(dest) def write(dest)
path = destination(dest) path = destination(dest)
FileUtils.mkdir_p(File.dirname(path)) FileUtils.mkdir_p(File.dirname(path))
@ -223,7 +228,7 @@ module Jekyll
# Convert this post into a Hash for use in Liquid templates. # Convert this post into a Hash for use in Liquid templates.
# #
# Returns <Hash> # Returns the representative Hash.
def to_liquid def to_liquid
self.data.deep_merge({ self.data.deep_merge({
"title" => self.data["title"] || self.slug.split('-').select {|w| w.capitalize! || w }.join(' '), "title" => self.data["title"] || self.slug.split('-').select {|w| w.capitalize! || w }.join(' '),
@ -237,6 +242,7 @@ module Jekyll
"content" => self.content }) "content" => self.content })
end end
# Returns the shorthand String identifier of this Post.
def inspect def inspect
"<Post: #{self.id}>" "<Post: #{self.id}>"
end end