lib/jekyll/site.rb in mojombo-jekyll-0.5.1 vs lib/jekyll/site.rb in mojombo-jekyll-0.5.2

- old
+ new

@@ -1,10 +1,10 @@ module Jekyll class Site - attr_accessor :config, :layouts, :posts, :categories, :exclude - attr_accessor :source, :dest, :lsi, :pygments, :permalink_style + attr_accessor :config, :layouts, :posts, :categories, :exclude, + :source, :dest, :lsi, :pygments, :permalink_style, :tags # Initialize the site # +config+ is a Hash containing site configurations details # # Returns <Site> @@ -23,11 +23,12 @@ end def reset self.layouts = {} self.posts = [] - self.categories = Hash.new { |hash, key| hash[key] = Array.new } + self.categories = Hash.new { |hash, key| hash[key] = [] } + self.tags = Hash.new { |hash, key| hash[key] = [] } end def setup # Check to see if LSI is enabled. require 'classifier' if self.lsi @@ -74,10 +75,12 @@ MaRuKu::Globals[:html_png_url] = self.config['maruku']['png_url'] end rescue LoadError puts "The maruku gem is required for markdown support!" end + else + raise "Invalid Markdown processor: '#{self.config['markdown']}' -- did you mean 'maruku' or 'rdiscount'?" end end def textile(content) RedCloth.new(content).to_html @@ -124,10 +127,11 @@ post = Post.new(self, self.source, dir, f) if post.published self.posts << post post.categories.each { |c| self.categories[c] << post } + post.tags.each { |c| self.tags[c] << post } end end end self.posts.sort! @@ -135,11 +139,12 @@ # second pass renders each post now that full site payload is available self.posts.each do |post| post.render(self.layouts, site_payload) end - self.categories.values.map { |cats| cats.sort! { |a, b| b <=> a} } + self.categories.values.map { |ps| ps.sort! { |a, b| b <=> a} } + self.tags.values.map { |ps| ps.sort! { |a, b| b <=> a} } rescue Errno::ENOENT => e # ignore missing layout dir end # Write each post to <dest>/<year>/<month>/<day>/<slug> @@ -170,15 +175,18 @@ # might not be available yet to other templates as {{ site.posts }} if directories.include?('_posts') directories.delete('_posts') read_posts(dir) end + [directories, files].each do |entries| entries.each do |f| if File.directory?(File.join(base, f)) next if self.dest.sub(/\/$/, '') == File.join(base, f) transform_pages(File.join(dir, f)) + elsif Pager.pagination_enabled?(self.config, f) + paginate_posts(f, dir) else first3 = File.open(File.join(self.source, dir, f)) { |fd| fd.read(3) } if first3 == "---" # file appears to have a YAML header so process it as a page @@ -209,19 +217,17 @@ # The Hash payload containing site-wide data # # Returns {"site" => {"time" => <Time>, # "posts" => [<Post>], - # "categories" => [<Post>], - # "topics" => [<Post>] }} + # "categories" => [<Post>]} def site_payload - {"site" => { - "time" => Time.now, - "posts" => self.posts.sort { |a,b| b <=> a }, - "categories" => post_attr_hash('categories'), - "topics" => post_attr_hash('topics') - }} + {"site" => self.config.merge({ + "time" => Time.now, + "posts" => self.posts.sort { |a,b| b <=> a }, + "categories" => post_attr_hash('categories'), + "tags" => post_attr_hash('tags')})} end # Filter out any files/directories that are hidden or backup files (start # with "." or "#" or end with "~") or contain site content (start with "_") # unless they are "_posts" directories or web server files such as @@ -229,9 +235,32 @@ def filter_entries(entries) entries = entries.reject do |e| unless ['_posts', '.htaccess'].include?(e) ['.', '_', '#'].include?(e[0..0]) || e[-1..-1] == '~' || self.exclude.include?(e) end + end + end + + # Paginates the blog's posts. Renders the index.html file into paginated directories, ie: page2, page3... + # and adds more wite-wide data + # + # {"paginator" => { "page" => <Number>, + # "per_page" => <Number>, + # "posts" => [<Post>], + # "total_posts" => <Number>, + # "total_pages" => <Number>, + # "previous_page" => <Number>, + # "next_page" => <Number> }} + def paginate_posts(file, dir) + all_posts = self.posts.sort { |a,b| b <=> a } + pages = Pager.calculate_pages(all_posts, self.config['paginate'].to_i) + pages += 1 + (1..pages).each do |num_page| + pager = Pager.new(self.config, num_page, all_posts, pages) + page = Page.new(self, self.source, dir, file) + page.render(self.layouts, site_payload.merge({'paginator' => pager.to_hash})) + suffix = "page#{num_page}" if num_page > 1 + page.write(self.dest, suffix) end end end end