class Jekyll::Post

Constants

ATTRIBUTES_FOR_LIQUID

Attributes for Liquid templates

EXCERPT_ATTRIBUTES_FOR_LIQUID
MATCHER

Valid post name regex.

Attributes

categories[RW]
content[RW]
data[RW]
date[RW]
ext[RW]
extracted_excerpt[RW]
name[R]
output[RW]
published[RW]
site[RW]
slug[RW]
tags[RW]

Public Class Methods

new(site, source, dir, name) click to toggle source

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
valid?(name) click to toggle source

Post name validator. Post filenames must be like: 2008-11-05-my-awesome-post.textile

Returns true if valid, false if not.

# File lib/jekyll/post.rb, line 31
def self.valid?(name)
  name =~ MATCHER
end

Public Instance Methods

<=>(other) click to toggle source

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
containing_dir(source, dir) click to toggle source

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
destination(dest) click to toggle source

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
dir() click to toggle source

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
excerpt() click to toggle source

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
id() click to toggle source

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
inspect() click to toggle source

Returns the shorthand String identifier of this Post.

# File lib/jekyll/post.rb, line 275
def inspect
  "<Post: #{self.id}>"
end
next() click to toggle source
# 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
path() click to toggle source

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
populate_categories() click to toggle source
# 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
populate_tags() click to toggle source
# File lib/jekyll/post.rb, line 83
def populate_tags
  self.tags = self.data.pluralized_array("tag", "tags").flatten
end
previous() click to toggle source
# 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
process(name) click to toggle source

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
published?() click to toggle source
# 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_yaml(base, name) click to toggle source

Read the YAML frontmatter.

base - The String path to the dir containing the file. name - The String filename of the file.

Returns nothing.

Calls superclass method 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
relative_path() click to toggle source

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
render(layouts, site_payload) click to toggle source

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
template() click to toggle source
# 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
title() click to toggle source

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
titleized_slug() click to toggle source

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
url() click to toggle source

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
url_placeholders() click to toggle source

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

extract_excerpt() click to toggle source
# File lib/jekyll/post.rb, line 300
def extract_excerpt
  if generate_excerpt?
    Jekyll::Excerpt.new(self)
  else
    ""
  end
end
generate_excerpt?() click to toggle source
# File lib/jekyll/post.rb, line 308
def generate_excerpt?
  !(site.config['excerpt_separator'].to_s.empty?)
end