class Jekyll::Post
Constants
- ATTRIBUTES_FOR_LIQUID
Attributes for Liquid templates
- EXCERPT_ATTRIBUTES_FOR_LIQUID
- MATCHER
Valid post name regex.
Attributes
Public Class Methods
Initialize this Post
instance.
site - The Site
. base - The String path to the dir containing the post file. name - The String filename of the post file.
Returns the new Post
.
# File lib/jekyll/post.rb, line 48 def initialize(site, source, dir, name) @site = site @dir = dir @base = self.containing_dir(source, dir) @name = name self.categories = dir.downcase.split('/').reject { |x| x.empty? } self.process(name) self.read_yaml(@base, name) if self.data.has_key?('date') self.date = Time.parse(self.data["date"].to_s) end self.published = self.published? self.populate_categories self.populate_tags end
Public Instance Methods
Compares Post
objects. First compares the Post
date. If the dates are equal, it compares the Post
slugs.
other - The other Post
we are comparing to.
Returns -1, 0, 1
# File lib/jekyll/post.rb, line 144 def <=>(other) cmp = self.date <=> other.date if 0 == cmp cmp = self.slug <=> other.slug end return cmp end
Get the full path to the directory containing the post files
# File lib/jekyll/post.rb, line 88 def containing_dir(source, dir) return File.join(source, dir, '_posts') end
Obtain destination path.
dest - The String path to the destination dir.
Returns destination file path String.
# File lib/jekyll/post.rb, line 267 def destination(dest) # The url needs to be unescaped in order to preserve the correct filename path = File.join(dest, CGI.unescape(self.url)) path = File.join(path, "index.html") if path[/\.html$/].nil? path end
The generated directory into which the post will be placed upon generation. This is derived from the permalink or, if permalink is absent, set to the default date e.g. “/2008/11/05/” if the permalink style is :date, otherwise nothing.
Returns the String directory.
# File lib/jekyll/post.rb, line 172 def dir File.dirname(url) end
The post excerpt. This is either a custom excerpt set in YAML front matter or the result of extract_excerpt.
Returns excerpt string.
# File lib/jekyll/post.rb, line 107 def excerpt self.data.fetch('excerpt', self.extracted_excerpt.to_s) end
The UID for this post (useful in feeds). e.g. /2008/11/05/my-awesome-post
Returns the String UID.
# File lib/jekyll/post.rb, line 231 def id File.join(self.dir, self.slug) end
Returns the shorthand String identifier of this Post
.
# File lib/jekyll/post.rb, line 275 def inspect "<Post: #{self.id}>" end
# File lib/jekyll/post.rb, line 279 def next pos = self.site.posts.index(self) if pos && pos < self.site.posts.length-1 self.site.posts[pos+1] else nil end 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
# File lib/jekyll/post.rb, line 129 def path self.data.fetch('path', self.relative_path.sub(/\A\//, '')) end
The full path and filename of the post. Defined in the YAML of the post body (optional).
Returns the String permalink.
# File lib/jekyll/post.rb, line 180 def permalink self.data && self.data['permalink'] end
# File lib/jekyll/post.rb, line 76 def populate_categories if self.categories.empty? self.categories = self.data.pluralized_array('category', 'categories').map {|c| c.to_s.downcase} end self.categories.flatten! end
# File lib/jekyll/post.rb, line 289 def previous pos = self.site.posts.index(self) if pos && pos > 0 self.site.posts[pos-1] else nil end end
Extract information from the post filename.
name - The String filename of the post file.
Returns nothing.
# File lib/jekyll/post.rb, line 157 def process(name) m, cats, date, slug, ext = *name.match(MATCHER) self.date = Time.parse(date) self.slug = slug self.ext = ext rescue ArgumentError raise FatalException.new("Post #{name} does not have a valid date.") end
# File lib/jekyll/post.rb, line 68 def published? if self.data.has_key?('published') && self.data['published'] == false false else true end end
Read the YAML frontmatter.
base - The String path to the dir containing the file. name - The String filename of the file.
Returns nothing.
Jekyll::Convertible#read_yaml
# File lib/jekyll/post.rb, line 98 def read_yaml(base, name) super(base, name) self.extracted_excerpt = self.extract_excerpt end
The path to the post source file, relative to the site source
# File lib/jekyll/post.rb, line 134 def relative_path File.join(@dir, '_posts', @name) end
Add any necessary layouts to this post.
layouts - A Hash
of {“name” => “layout”}. site_payload - The site payload hash.
Returns nothing.
# File lib/jekyll/post.rb, line 248 def render(layouts, site_payload) # construct payload payload = { "site" => { "related_posts" => related_posts(site_payload["site"]["posts"]) }, "page" => self.to_liquid(EXCERPT_ATTRIBUTES_FOR_LIQUID) }.deep_merge(site_payload) if generate_excerpt? self.extracted_excerpt.do_layout(payload, {}) end do_layout(payload.merge({"page" => self.to_liquid}), layouts) end
# File lib/jekyll/post.rb, line 184 def template case self.site.permalink_style when :pretty "/:categories/:year/:month/:day/:title/" when :none "/:categories/:title.html" when :date "/:categories/:year/:month/:day/:title.html" when :ordinal "/:categories/:year/:y_day/:title.html" else self.site.permalink_style.to_s end end
Public: the Post
title, from the YAML Front-Matter or from the slug
Returns the post title
# File lib/jekyll/post.rb, line 114 def title self.data.fetch("title", self.titleized_slug) end
Turns the post slug into a suitable title
# File lib/jekyll/post.rb, line 119 def titleized_slug self.slug.split('-').select {|w| w.capitalize! || w }.join(' ') end
The generated relative url of this post.
Returns the String url.
# File lib/jekyll/post.rb, line 202 def url @url ||= URL.new({ :template => template, :placeholders => url_placeholders, :permalink => permalink }).to_s end
Returns a hash of URL
placeholder names (as symbols) mapping to the desired placeholder replacements. For details see “url.rb”
# File lib/jekyll/post.rb, line 212 def url_placeholders { :year => date.strftime("%Y"), :month => date.strftime("%m"), :day => date.strftime("%d"), :title => CGI.escape(slug), :i_day => date.strftime("%d").to_i.to_s, :i_month => date.strftime("%m").to_i.to_s, :categories => (categories || []).map { |c| URI.escape(c.to_s) }.join('/'), :short_month => date.strftime("%b"), :y_day => date.strftime("%j"), :output_ext => self.output_ext } end
Protected Instance Methods
# File lib/jekyll/post.rb, line 300 def extract_excerpt if generate_excerpt? Jekyll::Excerpt.new(self) else "" end end
# File lib/jekyll/post.rb, line 308 def generate_excerpt? !(site.config['excerpt_separator'].to_s.empty?) end