add categories
[web.git] / personal / _plugins / categories.rb
1 module Jekyll
2
3   class CategoryPage < Page
4     def initialize(site, base, dir, name, category, layout)
5       @site = site
6       @base = base
7       @dir = dir
8       @name = name
9
10       self.process(@name)
11       self.read_yaml(File.join(base, '_layouts'), layout)
12       self.data['category'] = category
13
14       category_title_prefix = site.config['blog']['category_title_prefix'] || 'Category: '
15       self.data['title'] = "#{category_title_prefix}#{category.capitalize}"
16     end
17   end
18
19   class CategoryPageGenerator < Generator
20     safe true
21
22     def generate(site)
23       dir = site.config['blog']['category_dir'] || 'categories'
24       if site.layouts.key? 'category_index'
25         site.categories.each_key do |category|
26           site.pages << CategoryPage.new(site, site.source, dir, "#{category}.html", category, 'category_index.html')
27         end
28       end
29       if site.layouts.key? 'category_feed'
30         site.categories.each_key do |category|
31           site.pages << CategoryPage.new(site, site.source, dir, "#{category}.xml", category, 'category_feed.html')
32         end
33       end
34     end
35   end
36
37   # Adds some extra filters used during the category creation process.
38   module Filters
39
40     # Outputs a list of categories as comma-separated <a> links. This is used
41     # to output the category list for each post on a category page.
42     #
43     #  +categories+ is the list of categories to format.
44     #
45     # Returns string
46     def category_links(categories)
47       base_dir = @context.registers[:site].config['blog']['category_dir']
48       categories = categories.sort!.map do |category|
49         category_url = File.join(base_dir, "#{category}.html")
50         # Make sure the category directory begins with a slash.
51         category_dir = "/#{category_dir}" unless category_dir =~ /^\//
52         "<a class='category' href='#{category_url}'>#{category.capitalize}</a>"
53       end
54
55       case categories.length
56       when 0
57         ""
58       when 1
59         categories[0].to_s
60       else
61         categories.join(', ')
62       end
63     end
64   end
65 end