lib/jekyll/post.rb in mojombo-jekyll-0.4.1 vs lib/jekyll/post.rb in mojombo-jekyll-0.5.0

- old
+ new

@@ -1,65 +1,88 @@ module Jekyll class Post include Comparable include Convertible - + class << self attr_accessor :lsi end - + MATCHER = /^(.+\/)*(\d+-\d+-\d+)-(.*)(\.[^.]+)$/ - + # Post name validator. Post filenames must be like: # 2008-11-05-my-awesome-post.textile # # Returns <Bool> def self.valid?(name) name =~ MATCHER end - - attr_accessor :date, :slug, :ext, :categories, :topics + + attr_accessor :site + attr_accessor :date, :slug, :ext, :categories, :topics, :published attr_accessor :data, :content, :output - + # 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 # # Returns <Post> - def initialize(source, dir, name) + def initialize(site, source, dir, name) + @site = site @base = File.join(source, dir, '_posts') @name = name - + self.categories = dir.split('/').reject { |x| x.empty? } - + parts = name.split('/') self.topics = parts.size > 1 ? parts[0..-2] : [] - + 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.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 - + # Spaceship is based on Post#date # # Returns -1, 0, 1 def <=>(other) self.date <=> other.date end - + # Extract information from the post filename # +name+ is the String filename of the post file # # Returns nothing def process(name) m, cats, date, slug, ext = *name.match(MATCHER) self.date = Time.parse(date) self.slug = slug self.ext = ext end - + # 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 # @@ -67,50 +90,51 @@ def dir if permalink permalink.to_s.split("/")[0..-2].join("/") + '/' else prefix = self.categories.empty? ? '' : '/' + self.categories.join('/') - if Jekyll.permalink_style == :date + if [:date, :pretty].include?(self.site.permalink_style) prefix + date.strftime("/%Y/%m/%d/") else prefix + '/' end end end - + # The full path and filename of the post. # Defined in the YAML of the post body # (Optional) # # Returns <String> def permalink self.data && self.data['permalink'] end - + # The generated relative url of this post # e.g. /2008/11/05/my-awesome-post.html # # Returns <String> def url - permalink || self.dir + self.slug + ".html" + ext = self.site.permalink_style == :pretty ? '' : '.html' + permalink || self.id + ext end - + # The UID for this post (useful in feeds) # e.g. /2008/11/05/my-awesome-post # # Returns <String> def id self.dir + self.slug end - + # Calculate related posts. # # Returns [<Post>] def related_posts(posts) return [] unless posts.size > 1 - - if Jekyll.lsi + + 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 "" @@ -121,11 +145,11 @@ related - [self] else (posts - [self])[0..9] end end - + # Add any necessary layouts to this post # +layouts+ is a Hash of {"name" => "layout"} # +site_payload+ is the site payload hash # # Returns nothing @@ -135,38 +159,45 @@ { "site" => { "related_posts" => related_posts(site_payload["site"]["posts"]) }, "page" => self.to_liquid } payload = payload.deep_merge(site_payload) - + do_layout(payload, layouts) end - + # Write the generated post file to the destination directory. # +dest+ is the String path to the destination dir # # Returns nothing def write(dest) FileUtils.mkdir_p(File.join(dest, dir)) - + path = File.join(dest, self.url) + + if self.site.permalink_style == :pretty + FileUtils.mkdir_p(path) + path = File.join(path, "index.html") + end + File.open(path, 'w') do |f| f.write(self.output) end end - + # Convert this post into a Hash for use in Liquid templates. # # Returns <Hash> 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, "topics" => self.topics, + "categories" => self.categories, "content" => self.content }.deep_merge(self.data) end - + def inspect "<Post: #{self.id}>" end end