module Jekyll

  class CategoryPage < Page
    def initialize(site, base, dir, name, category, layout)
      @site = site
      @base = base
      @dir = dir
      @name = name

      self.process(@name)
      self.read_yaml(File.join(base, '_layouts'), layout)
      self.data['category'] = category # this tells the site template to add a link to the RSS feed

      category_title_prefix = site.config['blog']['title'] + ": "
      self.data['title'] = "#{category_title_prefix}#{category.capitalize}"
    end
  end

  class CategoryPageGenerator < Generator
    safe true

    def generate(site)
      return if site.config['blog'].nil?
      dir = site.config['blog']['category_dir'] || 'categories'
      if site.layouts.key? 'category_index'
        site.categories.each_key do |category|
          site.pages << CategoryPage.new(site, site.source, dir, "#{category}.html", category, 'category_index.html')
        end
      end
      if site.layouts.key? 'category_feed'
        site.categories.each_key do |category|
          site.pages << CategoryPage.new(site, site.source, dir, "#{category}.xml", category, 'category_feed.html')
        end
      end
    end
  end

  # Adds some extra filters used during the category creation process.
  module CategoryFilter

    # Outputs a list of categories as comma-separated <a> links. This is used
    # to output the category list for each post on a category page.
    #
    #  +categories+ is the list of categories to format.
    #
    # Returns string
    def category_links(categories)
      cat_base_dir = File.join(@context.registers[:site].config['baseurl'], @context.registers[:site].config['blog']['category_dir'])
      categories = categories.sort!.map do |category|
        category_url = File.join(cat_base_dir, "#{category}.html")
        "<a class='category' href='#{category_url}'>#{category.capitalize}</a>"
      end

      case categories.length
      when 0
        ""
      when 1
        categories[0].to_s
      else
        categories.join(', ')
      end
    end
  end
end

Liquid::Template.register_filter(Jekyll::CategoryFilter)
