Class: Jekyll::Post
- Inherits:
-
Object
- Object
- Jekyll::Post
- Includes:
- Comparable, Convertible
- Defined in:
- lib/jekyll/post.rb
Constant Summary collapse
- MATCHER =
/^(.+\/)*(\d+-\d+-\d+(?:_\d+-\d+)?)-(.*)(\.[^.]+)$/
Class Attribute Summary collapse
-
.lsi ⇒ Object
Returns the value of attribute lsi.
Instance Attribute Summary collapse
-
#categories ⇒ Object
Returns the value of attribute categories.
-
#content ⇒ Object
Returns the value of attribute content.
-
#data ⇒ Object
Returns the value of attribute data.
-
#date ⇒ Object
The post date and time.
-
#ext ⇒ Object
Returns the value of attribute ext.
-
#output ⇒ Object
Returns the value of attribute output.
-
#published ⇒ Object
Returns the value of attribute published.
-
#site ⇒ Object
Returns the value of attribute site.
-
#slug ⇒ Object
Returns the value of attribute slug.
-
#tags ⇒ Object
Returns the value of attribute tags.
Class Method Summary collapse
-
.valid?(name) ⇒ Boolean
Post name validator.
Instance Method Summary collapse
-
#<=>(other) ⇒ Object
Spaceship is based on Post#date, slug.
-
#dir ⇒ Object
The generated directory into which the post will be placed upon generation.
-
#extract_title_from_first_header_or_slug ⇒ Object
Attempt to extract title from topmost header or slug.
-
#generated_path ⇒ Object
The generated relative path of this post e.g.
-
#id ⇒ Object
The UID for this post (useful in feeds) e.g.
-
#initialize(site, source, dir, name) ⇒ Post
constructor
Initialize this Post instance.
- #inspect ⇒ Object
- #next ⇒ Object
-
#path ⇒ Object
The path to the post file.
-
#permalink ⇒ Object
The full path and filename of the post.
- #previous ⇒ Object
-
#process(name) ⇒ Object
Extract information from the post filename
name
is the String filename of the post file. -
#related_posts(posts) ⇒ Object
Calculate related posts.
-
#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. - #template ⇒ Object
-
#title ⇒ Object
The post title.
-
#to_liquid ⇒ Object
Convert this post into a Hash for use in Liquid templates.
-
#url ⇒ Object
The generated relative url of this post e.g.
-
#write(dest) ⇒ Object
Write the generated post file to the destination directory.
Methods included from Convertible
#content_type, #do_layout, #read_yaml, #render_haml_in_context, #to_s, #transform
Constructor Details
#initialize(site, source, dir, name) ⇒ Post
Initialize this Post instance.
+site+ is the Site
+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
+tags+ is an Array of Strings for the tags for this post
Returns <Post>
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 |
# File 'lib/jekyll/post.rb', line 35 def initialize(site, source, dir, name) @site = site @base = File.join(source, dir, '_posts') @name = name self.categories = dir.split('/').reject { |x| x.empty? } self.process(name) self.data = self.site.post_defaults.dup self.read_yaml(@base, name) extract_title_from_first_header_or_slug # #If we've added a date and time to the yaml, use that instead of the filename date #Means we'll sort correctly. if self.data.has_key?('date') # ensure Time via to_s and reparse self.date = Time.parse(self.data["date"].to_s) end if self.data.has_key?('published') && self.data['published'] == false self.published = false else self.published = true end self. = self.data.pluralized_array("tag", "tags") if self.categories.empty? self.categories = self.data.pluralized_array('category', 'categories') end end |
Class Attribute Details
.lsi ⇒ Object
Returns the value of attribute lsi.
8 9 10 |
# File 'lib/jekyll/post.rb', line 8 def lsi @lsi end |
Instance Attribute Details
#categories ⇒ Object
Returns the value of attribute categories.
25 26 27 |
# File 'lib/jekyll/post.rb', line 25 def categories @categories end |
#content ⇒ Object
Returns the value of attribute content.
24 25 26 |
# File 'lib/jekyll/post.rb', line 24 def content @content end |
#data ⇒ Object
Returns the value of attribute data.
24 25 26 |
# File 'lib/jekyll/post.rb', line 24 def data @data end |
#date ⇒ Object
The post date and time
Returns <Time>
166 167 168 |
# File 'lib/jekyll/post.rb', line 166 def date @date end |
#ext ⇒ Object
Returns the value of attribute ext.
24 25 26 |
# File 'lib/jekyll/post.rb', line 24 def ext @ext end |
#output ⇒ Object
Returns the value of attribute output.
24 25 26 |
# File 'lib/jekyll/post.rb', line 24 def output @output end |
#published ⇒ Object
Returns the value of attribute published.
25 26 27 |
# File 'lib/jekyll/post.rb', line 25 def published @published end |
#site ⇒ Object
Returns the value of attribute site.
23 24 25 |
# File 'lib/jekyll/post.rb', line 23 def site @site end |
#slug ⇒ Object
Returns the value of attribute slug.
25 26 27 |
# File 'lib/jekyll/post.rb', line 25 def slug @slug end |
#tags ⇒ Object
Returns the value of attribute tags.
25 26 27 |
# File 'lib/jekyll/post.rb', line 25 def @tags end |
Class Method Details
.valid?(name) ⇒ Boolean
Post name validator. Post filenames must be like:
2008-11-05-my-awesome-post.textile
or:
2008-11-05_12-45-my-awesome-post.textile
Returns <Bool>
19 20 21 |
# File 'lib/jekyll/post.rb', line 19 def self.valid?(name) name =~ MATCHER end |
Instance Method Details
#<=>(other) ⇒ Object
Spaceship is based on Post#date, slug
Returns -1, 0, 1
70 71 72 73 74 75 76 |
# File 'lib/jekyll/post.rb', line 70 def <=>(other) cmp = self.date <=> other.date if 0 == cmp cmp = self.slug <=> other.slug end return cmp end |
#dir ⇒ Object
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 <String>
96 97 98 |
# File 'lib/jekyll/post.rb', line 96 def dir File.dirname(generated_path) end |
#extract_title_from_first_header_or_slug ⇒ Object
Attempt to extract title from topmost header or slug.
Returns <String>
246 247 248 249 250 251 252 253 254 255 256 257 |
# File 'lib/jekyll/post.rb', line 246 def extract_title_from_first_header_or_slug # Done before the transformation to HTML, or it won't go into <title>s. self.data["title"] ||= case content_type when 'textile' self.content[/\A\s*h\d\.\s*(.+)/, 1] # h1. Header when 'markdown' self.content[/\A\s*#+\s*(.+)\s*#*$/, 1] || # "# Header" self.content[/\A\s*(\S.*)\r?\n\s*(-+|=+)\s*$/, 1] # "Header\n=====" end self.data["title"] ||= self.slug.split('-').select {|w| w.capitalize! || w }.join(' ') end |
#generated_path ⇒ Object
The generated relative path of this post e.g. /2008/11/05/my-awesome-post.html
Returns <String>
126 127 128 129 130 131 132 133 134 135 136 137 138 |
# File 'lib/jekyll/post.rb', line 126 def generated_path return permalink if permalink @generated_path ||= { "year" => date.strftime("%Y"), "month" => date.strftime("%m"), "day" => date.strftime("%d"), "title" => CGI.escape(slug), "categories" => categories.join('/') }.inject(template) { |result, token| result.gsub(/:#{token.first}/, token.last) }.gsub("//", "/") end |
#id ⇒ Object
The UID for this post (useful in feeds) e.g. /2008/11/05/my-awesome-post
Returns <String>
152 153 154 |
# File 'lib/jekyll/post.rb', line 152 def id File.join(self.dir, self.slug) end |
#inspect ⇒ Object
274 275 276 |
# File 'lib/jekyll/post.rb', line 274 def inspect "<Post: #{self.id}>" end |
#next ⇒ Object
278 279 280 281 282 283 284 285 286 |
# File 'lib/jekyll/post.rb', line 278 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 ⇒ Object
The path to the post file.
Returns <String>
180 181 182 |
# File 'lib/jekyll/post.rb', line 180 def path File.(File.join(@base, @name)) end |
#permalink ⇒ Object
The full path and filename of the post. Defined in the YAML of the post body (Optional)
Returns <String>
105 106 107 |
# File 'lib/jekyll/post.rb', line 105 def permalink self.data && self.data['permalink'] end |
#previous ⇒ Object
288 289 290 291 292 293 294 295 |
# File 'lib/jekyll/post.rb', line 288 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
82 83 84 85 86 87 88 |
# File 'lib/jekyll/post.rb', line 82 def process(name) m, cats, date, slug, ext = *name.match(MATCHER) date = date.sub(/_(\d+)-(\d+)\Z/, ' \1:\2') # Make optional time part parsable. self.date = Time.parse(date) self.slug = slug self.ext = ext end |
#related_posts(posts) ⇒ Object
Calculate related posts.
Returns [<Post>]
187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 |
# File 'lib/jekyll/post.rb', line 187 def (posts) return [] unless posts.size > 1 if self.site.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 = self.class.lsi.(self.content, 11) - [self] else (posts - [self])[0..9] end end |
#render(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
211 212 213 214 215 216 217 218 219 220 221 |
# File 'lib/jekyll/post.rb', line 211 def render(layouts, site_payload) # construct payload payload = { "site" => { "related_posts" => (site_payload["site"]["posts"]) }, "page" => self.to_liquid } payload = payload.deep_merge(site_payload) do_layout(payload, layouts) end |
#template ⇒ Object
109 110 111 112 113 114 115 116 117 118 119 120 |
# File 'lib/jekyll/post.rb', line 109 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 |
#title ⇒ Object
The post title
Returns <String>
159 160 161 |
# File 'lib/jekyll/post.rb', line 159 def title self.data && self.data["title"] end |
#to_liquid ⇒ Object
Convert this post into a Hash for use in Liquid templates.
Returns <Hash>
262 263 264 265 266 267 268 269 270 271 272 |
# File 'lib/jekyll/post.rb', line 262 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., "content" => self.content }.deep_merge(self.data) end |
#url ⇒ Object
The generated relative url of this post e.g. /2008/11/05/my-awesome-post
Returns <String>
144 145 146 |
# File 'lib/jekyll/post.rb', line 144 def url site.config['multiviews'] ? generated_path.sub(/\.html$/, '') : generated_path end |
#write(dest) ⇒ Object
Write the generated post file to the destination directory.
+dest+ is the String path to the destination dir
Returns nothing
227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 |
# File 'lib/jekyll/post.rb', line 227 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 |