more explicit types
[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 # this tells the site template to add a link to the RSS feed
13
14       category_title_prefix = site.config['blog']['title'] + ": "
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       return if site.config['blog'].nil?
24       dir = site.config['blog']['category_dir'] || 'categories'
25       if site.layouts.key? 'category_index'
26         site.categories.each_key do |category|
27           site.pages << CategoryPage.new(site, site.source, dir, "#{category}.html", category, 'category_index.html')
28         end
29       end
30       if site.layouts.key? 'category_feed'
31         site.categories.each_key do |category|
32           site.pages << CategoryPage.new(site, site.source, dir, "#{category}.xml", category, 'category_feed.html')
33         end
34       end
35     end
36   end
37
38   # Adds some extra filters used during the category creation process.
39   module CategoryFilter
40
41     # Outputs a list of categories as comma-separated <a> links. This is used
42     # to output the category list for each post on a category page.
43     #
44     #  +categories+ is the list of categories to format.
45     #
46     # Returns string
47     def category_links(categories)
48       cat_base_dir = File.join(@context.registers[:site].config['baseurl'], @context.registers[:site].config['blog']['category_dir'])
49       categories = categories.sort!.map do |category|
50         category_url = File.join(cat_base_dir, "#{category}.html")
51         "<a class='category' href='#{category_url}'>#{category.capitalize}</a>"
52       end
53
54       case categories.length
55       when 0
56         ""
57       when 1
58         categories[0].to_s
59       else
60         categories.join(', ')
61       end
62     end
63   end
64 end
65
66 Liquid::Template.register_filter(Jekyll::CategoryFilter)