summaryrefslogtreecommitdiff
path: root/_site_build/_plugins/category_indexes.rb
blob: 10dae02163be3a5f6c81e48d3e1b4a60e1d629c8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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
module Jekyll
  # Monkey patch so that both GenerateCategoryIndexes and CategoryFilter have access to this method.
  class Site
    # A very simple implementation.
    def parameterize(string, sep = '-')
      string.downcase.gsub(/[^a-z0-9\-_]+/, sep)
    end
  end

  class CategoryIndex < Page
    def initialize(site, base, dir, category)
      @site = site
      @base = base
      @dir = dir
      @name = 'index.html'

      self.process(@name)
      self.read_yaml(File.join(base, '_layouts'), 'category_index.html')
      self.data['category'] = category

      title_prefix = site.config['category_title_prefix'] || 'Category: '
      self.data['title'] = "#{title_prefix}#{category}"

      description_prefix = site.config['category_meta_description_prefix'] || 'Category: '
      self.data['description'] = "#{description_prefix}#{category}"
    end
  end

  class GenerateCategoryIndexes < Generator
    safe true
    priority :low

    def generate(site)
      if site.config['generate_category_indexes'] && site.layouts.key?('category_index')
        dir = site.config['category_dir'] || 'categories'
        site.categories.keys.each do |category|
          write_category_index(site, File.join("/#{dir}", site.parameterize(category)), category)
        end
      end
    end

    def write_category_index(site, dir, category)
      index = CategoryIndex.new(site, site.source, dir, category)
      index.render(site.layouts, site.site_payload)
      index.write(site.dest)
      site.pages << index
    end
  end

  module CategoryFilter
    def category_links(categories)
      site = @context.registers[:site]
      directory = site.config['category_dir'] || 'categories'
      categories = categories.sort.map do |item|
        '<a href="/' + directory + '/' + site.parameterize(item) + '/" rel="category tag" target="_self" title="View all posted in ' + item +'">' + item + '</a>'
      end
      categories.join(', ')
    end
  end

end

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