aboutsummaryrefslogtreecommitdiff
blob: 66bf9a3cd55360990680020a849857a48be37512 (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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
module Gentoo
  module Tags
    class NavigationTag < Liquid::Tag
      def initialize(tag_name, level, tokens)
        super
        @level = level.strip
      end

      def render(context)
        all_pages = context.registers[:site].pages
        current_page = context.registers[:page]

        if @level == 'primary'
          primary(all_pages, current_page)
        elsif @level == 'secondary'
          secondary(all_pages, current_page)
        elsif @level == 'tertiary'
          tertiary(all_pages, current_page)
        elsif @level =~ /^sitemap:(.*)$/
          sitemap(all_pages, $1)
        else
          'unknown navigation level'
        end
      end

      private

      def primary(all_pages, current_page)
        pages = all_pages.select { |page| page.data['nav1-show'] == true }

        generate(pages, current_page, '1')
      end

      def secondary(all_pages, current_page)
        pages = all_pages.select { |page| page.data['nav1'] == current_page['nav1'] && page.data['nav2-show'] == true }

        generate(pages, current_page, '2')
      end

      def tertiary(all_pages, current_page)
        pages = all_pages.select do |page|
          page.data['nav1'] == current_page['nav1'] &&
          page.data['nav2'] == current_page['nav2'] &&
          page.data['nav3-show'] == true
        end

        generate(pages, current_page, '3')
      end

      def sitemap(all_pages, nav1)
        pages = all_pages.select { |page| page.data['nav1'] == nav1 && page.data['nav2-show'] == true }

        generate(pages, {}, '2')
      end

      def generate(all_pages, current_page, level)
        level_show = 'nav%s-show' % level
        level_weight = 'nav%s-weight' % level
        level_str = 'nav%s' % level

        pages = all_pages.select { |page| page.data[level_show] == true }
        pages.sort! do |a, b|
          if a.data.key?(level_weight) && b.data.key?(level_weight)
            a.data[level_weight] <=> b.data[level_weight]
          else
            a_title = a.data['navtitle'] || a.data['title']
            b_title = b.data['navtitle'] || b.data['title']

            a_title <=> b_title
          end
        end

        html = ''
        pages.each do |page|
          css_class = current_page[level_str] == page.data[level_str] ? 'active' : ''

          html += "<li class=\"%s\">" % css_class

          if page.data.key? 'redirect'
            html += '<a href="' + page.data['redirect'] + '">'
          else
            html += '<a href="' + page.url.gsub('index.html', '') + '">'
          end

          if page.data.key? 'navtitle'
            html += page.data['navtitle']
          else
            html += page.data['title']
          end

          html += "</a></li>\n"
        end

        html
      end
    end
  end
end

Liquid::Template.register_tag('navigation', Gentoo::Tags::NavigationTag)