Class: Jekyll::Post

Inherits:
Object
  • Object
show all
Includes:
Comparable, Convertible
Defined in:
lib/jekyll/post.rb

Constant Summary collapse

MATCHER =
/^(\d+-\d+-\d+)-(.*)(\.[^.]+)$/

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(base, name) ⇒ Post

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>



30
31
32
33
34
35
36
37
38
39
# File 'lib/jekyll/post.rb', line 30

def initialize(base, name)
  @base = base
  @name = name
  @categories = base.split('/').reject { |p| ['.', '_posts'].include? p }
  
  self.process(name)
  self.read_yaml(base, name)
  #Removed to avoid munging of liquid tags, replaced in convertible.rb#48
  #self.transform
end

Class Attribute Details

.lsiObject

Returns the value of attribute lsi.



8
9
10
# File 'lib/jekyll/post.rb', line 8

def lsi
  @lsi
end

Instance Attribute Details

#categoriesObject

Returns the value of attribute categories.



21
22
23
# File 'lib/jekyll/post.rb', line 21

def categories
  @categories
end

#contentObject

Returns the value of attribute content.



22
23
24
# File 'lib/jekyll/post.rb', line 22

def content
  @content
end

#dataObject

Returns the value of attribute data.



22
23
24
# File 'lib/jekyll/post.rb', line 22

def data
  @data
end

#dateObject

Returns the value of attribute date.



21
22
23
# File 'lib/jekyll/post.rb', line 21

def date
  @date
end

#extObject

Returns the value of attribute ext.



21
22
23
# File 'lib/jekyll/post.rb', line 21

def ext
  @ext
end

#outputObject

Returns the value of attribute output.



22
23
24
# File 'lib/jekyll/post.rb', line 22

def output
  @output
end

#slugObject

Returns the value of attribute slug.



21
22
23
# File 'lib/jekyll/post.rb', line 21

def slug
  @slug
end

Class Method Details

.valid?(name) ⇒ Boolean

Post name validator. Post filenames must be like:

2008-11-05-my-awesome-post.textile

Returns <Bool>

Returns:

  • (Boolean)


17
18
19
# File 'lib/jekyll/post.rb', line 17

def self.valid?(name)
  name =~ MATCHER
end

Instance Method Details

#<=>(other) ⇒ Object

Spaceship is based on Post#date

Returns -1, 0, 1



44
45
46
# File 'lib/jekyll/post.rb', line 44

def <=>(other)
  self.date <=> other.date
end

#add_layout(layouts, site_payload) ⇒ Object

Add any necessary layouts to this post

+layouts+ is a Hash of {"name" => "layout"}
+site_payload+ is the site payload hash

Returns nothing



126
127
128
129
130
131
# File 'lib/jekyll/post.rb', line 126

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}}))
end

#dirObject

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/”

Returns <String>



65
66
67
68
69
70
71
72
# File 'lib/jekyll/post.rb', line 65

def dir
  path = (@categories && !@categories.empty?) ? '/' + @categories.join('/') : ''
  if permalink
    permalink.to_s.split("/")[0..-2].join("/")
  else
    "#{path}" + date.strftime("/%Y/%m/%d/")
  end
end

#idObject

The UID for this post (useful in feeds) e.g. /2008/11/05/my-awesome-post

Returns <String>



95
96
97
# File 'lib/jekyll/post.rb', line 95

def id
  self.dir + self.slug
end

The full path and filename of the post. Defined in the YAML of the post body (Optional)

Returns <String>



79
80
81
# File 'lib/jekyll/post.rb', line 79

def permalink
  self.data && self.data['permalink']
end

#process(name) ⇒ Object

Extract information from the post filename

+name+ is the String filename of the post file

Returns nothing



52
53
54
55
56
57
# File 'lib/jekyll/post.rb', line 52

def process(name)
  m, date, slug, ext = *name.match(MATCHER)
  self.date = Time.parse(date)
  self.slug = slug
  self.ext = ext
end

Calculate related posts.

Returns [<Post>]



102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/jekyll/post.rb', line 102

def related_posts(posts)
  return [] unless posts.size > 1
  
  if Jekyll.lsi
    self.class.lsi ||= begin
      puts "Running the classifier... this could take a while."
      lsi = Classifier::LSI.new
      posts.each { |x| $stdout.print(".");$stdout.flush;lsi.add_item(x) }
      puts ""
      lsi
    end

    related = self.class.lsi.find_related(self.content, 11)
    related - [self]
  else
    (posts - [self])[0..9]
  end
end

#summaryObject

Returns nil, or a Markdown formatted summary if a summary is set in the YAML front matter



148
149
150
# File 'lib/jekyll/post.rb', line 148

def summary
  self.data['summary'] ? RedCloth.new(self.data['summary']).to_html : nil
end

#to_liquidObject

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

Returns <Hash>



155
156
157
158
159
160
161
162
# File 'lib/jekyll/post.rb', line 155

def to_liquid
  self.data.merge({ "title" => self.data["title"] || "",
    "url" => self.url,
    "date" => self.date,
    "id" => self.id,
    "summary" => self.summary,
    "content" => self.content })
end

#urlObject

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

Returns <String>



87
88
89
# File 'lib/jekyll/post.rb', line 87

def url
  self.dir + self.slug + ".html"
end

#write(dest) ⇒ Object

Write the generated post file to the destination directory.

+dest+ is the String path to the destination dir

Returns nothing



137
138
139
140
141
142
143
144
# File 'lib/jekyll/post.rb', line 137

def write(dest)
  FileUtils.mkdir_p(File.join(dest, dir))
  
  path = File.join(dest, self.url)
  File.open(path, 'w') do |f|
    f.write(self.output)
  end
end