Parent

Included Modules

Files

Jekyll::Post

Constants

ATTRIBUTES_FOR_LIQUID

Attributes for Liquid templates

MATCHER

Valid post name regex.

Attributes

lsi[RW]
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 49
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 32
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 139
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 89
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 271
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 template[/\.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 175
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 108
def excerpt
  if self.data.has_key? 'excerpt'
    self.data['excerpt']
  else
    self.extracted_excerpt
  end
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 239
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 289
def inspect
  "<Post: #{self.id}>"
end
next() click to toggle source
# File lib/jekyll/post.rb, line 293
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['path'] || File.join(@dir, '_posts', @name).sub(/\A\//, '')
end
populate_categories() click to toggle source
# File lib/jekyll/post.rb, line 77
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 84
def populate_tags
  self.tags = self.data.pluralized_array("tag", "tags").flatten
end
previous() click to toggle source
# File lib/jekyll/post.rb, line 303
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 152
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 69
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.

# File lib/jekyll/post.rb, line 99
def read_yaml(base, name)
  super(base, name)
  self.extracted_excerpt = self.extract_excerpt
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 256
def render(layouts, site_payload)
  # construct payload
  payload = {
    "site" => { "related_posts" => related_posts(site_payload["site"]["posts"]) },
    "page" => self.to_liquid
  }.deep_merge(site_payload)

  do_layout(payload, layouts)
end
template() click to toggle source
# File lib/jekyll/post.rb, line 187
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 119
def title
  self.data["title"] || self.slug.split('-').select {|w| w.capitalize! || w }.join(' ')
end
to_liquid() click to toggle source

Convert this post into a Hash for use in Liquid templates.

Returns the representative Hash.

# File lib/jekyll/post.rb, line 281
def to_liquid
  further_data = Hash[ATTRIBUTES_FOR_LIQUID.map { |attribute|
    [attribute, send(attribute)]
  }]
  data.deep_merge(further_data)
end
transform() click to toggle source

Transform the contents and excerpt based on the content type.

Returns nothing.

# File lib/jekyll/post.rb, line 164
def transform
  super
  self.extracted_excerpt = converter.convert(self.extracted_excerpt)
end
url() click to toggle source

The generated relative url of this post. e.g. /2008/11/05/my-awesome-post.html

Returns the String URL.

# File lib/jekyll/post.rb, line 206
def url
  return @url if @url

  url = if permalink
    permalink
  else
    {
      "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
    }.inject(template) { |result, token|
      result.gsub(/:#{Regexp.escape token.first}/, token.last)
    }.gsub(/\/\//, "/")
  end

  # sanitize url
  @url = url.split('/').reject{ |part| part =~ /^\.+$/ }.join('/')
  @url += "/" if url =~ /\/$/
  @url.gsub!(/\A([^\/])/, '/\1')
  @url
end

Protected Instance Methods

extract_excerpt() click to toggle source

Internal: Extract excerpt from the content

By default excerpt is your first paragraph of a post: everything before the first two new lines:

---
title: Example
---

First paragraph with [link][1].

Second paragraph.

[1]: http://example.com/

This is fairly good option for Markdown and Textile files. But might cause problems for HTML posts (which is quite unusual for Jekyll). If default excerpt delimiter is not good for you, you might want to set your own via configuration option `excerpt_separator`. For example, following is a good alternative for HTML posts:

# file: _config.yml
excerpt_separator: "<!-- more -->"

Notice that all markdown-style link references will be appended to the excerpt. So the example post above will have this excerpt source:

First paragraph with [link][1].

[1]: http://example.com/

Excerpts are rendered same time as content is rendered.

Returns excerpt String

# File lib/jekyll/post.rb, line 348
def extract_excerpt
  separator     = self.site.config['excerpt_separator']
  head, _, tail = self.content.partition(separator)

  "" << head << "\n\n" << tail.scan(/^\[[^\]]+\]:.+$/).join("\n")
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.