Class: Jekyll::Item

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

Direct Known Subclasses

Post, Thing

Constant Summary collapse

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

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Convertible

#content_type, #do_layout, #read_yaml, #to_s, #transform

Constructor Details

#initialize(site, source, dir, name) ⇒ Item

Initialize this Item instance. site is the Site base is the String path to the dir containing the item file name is the String filename of the item file

Returns



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/jekyll/item.rb', line 34

def initialize(site, source, dir, name)
  @under_scored_dir ||= '_posts'
  @kind ||= 'post'

  @site = site
  @base = File.join(source, dir, @under_scored_dir)
  @name = name

  self.categories = dir.split('/').reject { |x| x.empty? }
  self.process(name)
  self.read_yaml(@base, name)

  if self.data.has_key?('published') && self.data['published'] == false
    self.published = false
  else
    self.published = true
  end

  if self.data.has_key?("tag")
    self.tags = [self.data["tag"]]
  elsif self.data.has_key?("tags")
    self.tags = self.data['tags']
  else
    self.tags = []
  end

  if self.categories.empty?
    if self.data.has_key?('category')
      self.categories << self.data['category']
    elsif self.data.has_key?('categories')
      # Look for categories in the YAML-header, either specified as
      # an array or a string.
      if self.data['categories'].kind_of? String
        self.categories = self.data['categories'].split
      else
        self.categories = self.data['categories']
      end
    end
  end
end

Class Attribute Details

.lsiObject

Returns the value of attribute lsi.



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

def lsi
  @lsi
end

Instance Attribute Details

#categoriesObject



24
25
26
# File 'lib/jekyll/item.rb', line 24

def categories
  @categories ||= []
end

#contentObject

Returns the value of attribute content.



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

def content
  @content
end

#dataObject

Returns the value of attribute data.



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

def data
  @data
end

#dateObject

Returns the value of attribute date.



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

def date
  @date
end

#extObject

Returns the value of attribute ext.



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

def ext
  @ext
end

#outputObject

Returns the value of attribute output.



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

def output
  @output
end

#publishedObject

Returns the value of attribute published.



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

def published
  @published
end

#siteObject

Returns the value of attribute site.



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

def site
  @site
end

#slugObject

Returns the value of attribute slug.



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

def slug
  @slug
end

#tagsObject

Returns the value of attribute tags.



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

def tags
  @tags
end

Class Method Details

.valid?(name) ⇒ Boolean

Item name validator. Item filenames must be like:

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

Returns

Returns:

  • (Boolean)


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

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

Instance Method Details

#<=>(other) ⇒ Object

Spaceship is based on Post#date, slug

Returns -1, 0, 1



78
79
80
81
82
83
84
# File 'lib/jekyll/item.rb', line 78

def <=>(other)
  cmp = self.date <=> other.date
  if 0 == cmp
   cmp = self.slug <=> other.slug
  end
  return cmp
end

#add_top_level_dir(string) ⇒ Object



157
158
159
160
161
162
163
# File 'lib/jekyll/item.rb', line 157

def add_top_level_dir(string)
  if @top_level_dir
    "#{@top_level_dir}/#{string}"
  else
    string
  end
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/" if the permalink style is :date, otherwise nothing

Returns



103
104
105
# File 'lib/jekyll/item.rb', line 103

def dir
  File.dirname(url)
end

#idObject

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

Returns



153
154
155
# File 'lib/jekyll/item.rb', line 153

def id
  add_top_level_dir(File.join(self.dir, self.slug))
end

#inspectObject



240
241
242
# File 'lib/jekyll/item.rb', line 240

def inspect
  "<Item(#{@kind}): #{self.id}>"
end

#nextObject



244
245
246
247
248
249
250
251
252
# File 'lib/jekyll/item.rb', line 244

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

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

Returns



112
113
114
# File 'lib/jekyll/item.rb', line 112

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

#previousObject



254
255
256
257
258
259
260
261
# File 'lib/jekyll/item.rb', line 254

def previous
  pos = self.site.posts.index(self)
  if pos && pos > 0
    self.site.posts[pos-1]
  else
    nil
  end
end

#process(name) ⇒ Object

Extract information from the post filename name is the String filename of the post file

Returns nothing



90
91
92
93
94
95
# File 'lib/jekyll/item.rb', line 90

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

Calculate related posts.

Returns []



168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
# File 'lib/jekyll/item.rb', line 168

def related_items(items)
  return [] unless items.size > 1

  if self.site.lsi
    self.class.lsi ||= begin
      puts "Running the classifier... this could take a while."
      lsi = Classifier::LSI.new
      items.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
    (items - [self])[0..9]
  end
end

#render(layouts, site_payload) ⇒ Object

Add any necessary layouts to this post layouts is a Hash of => "layout" site_payload is the site payload hash

Returns nothing



192
193
194
195
196
197
198
199
200
201
202
# File 'lib/jekyll/item.rb', line 192

def render(layouts, site_payload)
  # construct payload
  payload =
  {
    "site" => { "related_items" => related_items(site_payload["site"]["#{@kind}s"]) },
    "page" => self.to_liquid
  }
  payload = payload.deep_merge(site_payload)

  do_layout(payload, layouts)
end

#templateObject



116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/jekyll/item.rb', line 116

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"
  else
    self.site.permalink_style.to_s
  end
end

#to_liquidObject

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

Returns



227
228
229
230
231
232
233
234
235
236
237
238
# File 'lib/jekyll/item.rb', line 227

def to_liquid
  { "title"      => self.data["title"] || self.slug.split('-').select {|w| w.capitalize! || w }.join(' '),
    "url"        => self.url,
    "date"       => self.date,
    "id"         => self.id,
    "categories" => self.categories,
    "next"       => self.next,
    "previous"   => self.previous,
    "tags"       => self.tags,
    "content"    => self.content,
    "kind"       => @kind }.deep_merge(self.data)
end

#urlObject

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

Returns



133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# File 'lib/jekyll/item.rb', line 133

def url
  return permalink if permalink

  @url ||= {
    "year"       => date.strftime("%Y"),
    "month"      => date.strftime("%m"),
    "day"        => date.strftime("%d"),
    "title"      => CGI.escape(slug),
    "categories" => categories.sort.join('/')
  }.inject(template) { |result, token|
    result.gsub(/:#{token.first}/, token.last)
  }.gsub(/\/\//, "/")

  @url = add_top_level_dir(@url)
end

#write(dest) ⇒ Object

Write the generated post file to the destination directory. dest is the String path to the destination dir

Returns nothing



208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
# File 'lib/jekyll/item.rb', line 208

def write(dest)
  FileUtils.mkdir_p(File.join(dest, dir))

  # The url needs to be unescaped in order to preserve the correct filename
  path = File.join(dest, CGI.unescape(self.url))

  if template[/\.html$/].nil?
    FileUtils.mkdir_p(path)
    path = File.join(path, "index.html")
  end

  File.open(path, 'w') do |f|
    f.write(self.output)
  end
end