swedbank-pay-design-guide-jekyll-theme 1.9.0 → 1.9.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -21,36 +21,31 @@ module SwedbankPay
21
21
  def build_markup(pages, current_page)
22
22
  return '' if pages.empty?
23
23
 
24
- current_path = current_path(current_page)
25
24
  markup = ''
26
25
 
27
26
  pages.each do |page|
28
- next if page.ignore?
27
+ current_page_name = current_page.respond_to?(:name) ? current_page.name : current_page.to_s
29
28
 
30
- sub_items_markup = sub_items_markup(page, current_path)
31
- markup << item_markup(page, current_path, page.level, sub_items_markup)
32
- end
29
+ if page.hidden_for?(current_page)
30
+ Jekyll.logger.debug(" Sidebar: #{page.name} is hidden for #{current_page_name}")
31
+ next
32
+ elsif page.hidden?
33
+ Jekyll.logger.debug(" Sidebar: Hidden page #{page.name} is not hidden for #{current_page_name}")
34
+ end
33
35
 
34
- markup
35
- end
36
-
37
- def current_path(current_page)
38
- if current_page.nil?
39
- Jekyll.logger.warn(' Sidebar: Nil current_page')
40
- return ''
36
+ sub_items_markup = sub_items_markup(page, current_page)
37
+ markup << item_markup(page, current_page, sub_items_markup, false)
41
38
  end
42
39
 
43
- return current_page if current_page.is_a? String
44
- return current_page.path if current_page.respond_to?(:path)
45
-
46
- Jekyll.logger.warn(" Sidebar: #{current_page.class} ('#{current_page}') does not respond to :path.")
47
-
48
- ''
40
+ markup
49
41
  end
50
42
 
51
- def item_markup(page, current_path, level, sub_items_markup)
52
- title_markup = title_markup(page, level)
53
- item_class = item_class(page, current_path, level)
43
+ def item_markup(page, current_page, sub_items_markup, is_leaf)
44
+ # If we're rendering a leaf node, just set the level to a non-zero value
45
+ # to get the 'nav-subgroup' class and such.
46
+ level = is_leaf ? -1 : page.level
47
+ title_markup = title_markup(page, level, is_leaf)
48
+ item_class = item_class(page, current_page, level, is_leaf)
54
49
  group_heading_class = group_heading_class(level)
55
50
 
56
51
  "<li class=\"#{item_class}\">
@@ -62,8 +57,8 @@ module SwedbankPay
62
57
  </li>"
63
58
  end
64
59
 
65
- def item_class(page, current_path, level)
66
- active = active?(page, current_path, level)
60
+ def item_class(page, current_page, level, is_leaf)
61
+ active = page.active?(current_page, is_leaf: is_leaf)
67
62
  item_class = group_class(level)
68
63
  item_class += ' active' if active
69
64
  item_class
@@ -78,17 +73,18 @@ module SwedbankPay
78
73
  "#{group_class}-heading"
79
74
  end
80
75
 
81
- def title_markup(page, level)
82
- section_title = section_title(page)
83
- return "<span>#{section_title}</span>" if level.zero?
76
+ def title_markup(page, level, is_leaf)
77
+ lead_title = lead_title(page)
78
+ return "<span>#{lead_title}</span>" if level.zero?
79
+
80
+ main_title = main_title(page, is_leaf)
84
81
 
85
- item_title = item_title(page)
86
- "<a href=\"#{page.path}\">#{item_title}</a>"
82
+ "<a href=\"#{page.path}\">#{main_title}</a>"
87
83
  end
88
84
 
89
- def sub_items_markup(page, current_path)
90
- headers_markup = headers_markup(page, current_path)
91
- child_markup = build_markup(page.children, current_path)
85
+ def sub_items_markup(page, current_page)
86
+ headers_markup = headers_markup(page, current_page)
87
+ child_markup = build_markup(page.children, current_page)
92
88
 
93
89
  return '' if headers_markup.empty? && child_markup.empty?
94
90
 
@@ -98,17 +94,18 @@ module SwedbankPay
98
94
  </ul>"
99
95
  end
100
96
 
101
- def headers_markup(page, current_path)
97
+ def headers_markup(page, current_page)
102
98
  # If there's no page headers, only return a leaf item for the page itself.
103
- return leaf_markup(page.path, page.title.item, page.level) unless page.headers?
99
+ main_title = page.title.nil? ? nil : page.title.main
100
+ return leaf_markup(page.path, main_title, page.level) unless page.headers?
104
101
 
105
102
  # If there's no children, only return the headers as leaf node items.
106
- return page.headers.map { |h| header_markup(page, h) }.join('') if page.children.empty?
103
+ return page.headers.map { |h| header_markup(page, h) }.join('') unless page.children?
107
104
 
108
105
  headers_markup = page.headers.map { |h| header_markup(page, h) }.join('')
109
106
  headers_markup = "<ul class=\"nav-ul\">#{headers_markup}</ul>"
110
107
 
111
- item_markup(page, current_path, page.level + 1, headers_markup)
108
+ item_markup(page, current_page, headers_markup, true)
112
109
  end
113
110
 
114
111
  def header_markup(page, header)
@@ -123,19 +120,35 @@ module SwedbankPay
123
120
  "<li class=\"#{leaf_class}\"><a href=\"#{href}\">#{title}</a></li>"
124
121
  end
125
122
 
126
- def active?(page, current_path, level)
127
- level.zero? ? page.active?(current_path) : page.path == current_path
123
+ def lead_title(page)
124
+ return page.title.lead unless page.title.nil? || page.title.lead.nil?
125
+ return page.parent.title.to_s unless page.parent.nil? || page.parent.title.nil?
126
+
127
+ ''
128
128
  end
129
129
 
130
- def section_title(page)
131
- return page.title.section unless page.title.section.nil?
132
- return page.parent.title.to_s unless page.parent.nil? || page.parent.title.nil?
130
+ def main_title(page, is_leaf)
131
+ unless page.nil? || page.title.nil?
132
+ lead_title = lead_title(page)
133
+ parent_lead_title = parent_lead_title(page)
134
+ main_title = page.title.main
135
+
136
+ # If the lead title is different to the parent's or we're not on a leaf
137
+ # node item, use the lead title as the main title. This causes 'section: Card'
138
+ # to be used as title for the Card item, but allows the nav-subgroup-heading
139
+ # 'Introduction' item to use the main title 'Introduction'.
140
+ main_title = lead_title unless lead_title == parent_lead_title || is_leaf
141
+
142
+ return main_title || page.title.to_s
143
+ end
133
144
 
134
145
  ''
135
146
  end
136
147
 
137
- def item_title(page)
138
- page.title.item
148
+ def parent_lead_title(page)
149
+ return page.parent.title.lead unless page.parent.nil? || page.parent.title.nil?
150
+
151
+ nil
139
152
  end
140
153
  end
141
154
  end
@@ -1,50 +1,77 @@
1
- # frozen_string_literal: false
1
+ # frozen_string_literal: true
2
2
 
3
3
  require 'jekyll'
4
+ require 'nokogiri'
4
5
  require_relative 'sidebar_path'
5
6
  require_relative 'sidebar_page_title'
6
7
  require_relative 'sidebar_page_collection'
7
8
  require_relative 'sidebar_text_builder'
8
9
 
9
10
  module SwedbankPay
10
- # Represents a page in the Sidebar
11
+ # Represents a jekyll_page in the Sidebar
11
12
  class SidebarPage
12
13
  FIXNUM_MAX = (2**(0.size * 8 - 2) - 1)
13
14
 
14
- attr_reader :path, :title, :level, :order, :children, :name
15
- attr_accessor :headers, :filename, :doc, :sidebar_container, :number, :parent
15
+ attr_reader :path, :title, :level, :order, :children, :name, :filename, :doc
16
+ attr_accessor :headers, :sidebar_container, :number, :parent
16
17
 
17
- def initialize(page)
18
- raise ArgumentError, 'Page must be a Jekyll::Page' unless page.is_a? Jekyll::Page
18
+ def initialize(jekyll_page)
19
+ raise ArgumentError, 'jekyll_page cannot be nil' if jekyll_page.nil?
20
+ raise ArgumentError, 'jekyll_page must be a Jekyll::Page' unless jekyll_page.is_a? Jekyll::Page
19
21
 
20
- sidebar_path = SidebarPath.new(page['url'])
22
+ @filename = jekyll_page.destination('')
23
+ @jekyll_page = jekyll_page
24
+ sidebar_path = SidebarPath.new(jekyll_page['url'])
21
25
  @path = sidebar_path.to_s
22
26
  @parent = sidebar_path.parent
23
27
  @level = sidebar_path.level
24
28
  @name = sidebar_path.name
25
- @hide_from_sidebar = page['hide_from_sidebar'].nil? ? false : page['hide_from_sidebar']
26
- @title = page_title(page)
27
- @order = menu_order(page)
29
+ @hide_from_sidebar = jekyll_page['hide_from_sidebar'].nil? ? false : jekyll_page['hide_from_sidebar']
30
+ @title = SidebarPageTitle.parse(jekyll_page, self)
31
+ @order = menu_order(jekyll_page)
28
32
  @children = SidebarPageCollection.new(self)
29
33
  end
30
34
 
31
- def active?(current_path)
35
+ def active?(current, is_leaf: false)
36
+ current_path = find_path(current)
37
+
32
38
  return true if @path == current_path
33
39
 
34
- @children.each do |child|
35
- return true if child.active?(current_path)
40
+ # If we're on a leaf node item, such as when rendering the first header
41
+ # item of a sub-group, its children's active state must be disregarded.
42
+ unless is_leaf
43
+ @children.each do |child|
44
+ return true if child.active?(current_path, is_leaf: is_leaf)
45
+ end
36
46
  end
37
47
 
38
48
  false
39
49
  end
40
50
 
41
- def ignore?
51
+ def hidden?
42
52
  return true if @title.nil?
43
53
  return true if @hide_from_sidebar
44
54
 
45
55
  false
46
56
  end
47
57
 
58
+ def hidden_for?(other_page)
59
+ # The current page should be hidden for the other page unless the
60
+ # other page is also hidden.
61
+ hidden = hidden?
62
+
63
+ if other_page.nil? || !other_page.is_a?(SidebarPage)
64
+ Jekyll.logger.debug(" Sidebar: Other page '#{other_page}' is nil or not a SidebarPage")
65
+ return hidden
66
+ end
67
+
68
+ # If the other page is hidden, the current page should not be hidden
69
+ # from it.
70
+ return false if other_page.hidden? && in_same_section_as?(other_page)
71
+
72
+ hidden
73
+ end
74
+
48
75
  def children=(children)
49
76
  @children = SidebarPageCollection.new(self, children)
50
77
  end
@@ -71,6 +98,18 @@ module SwedbankPay
71
98
  @order <=> other.order
72
99
  end
73
100
 
101
+ def enrich_jekyll
102
+ if @title.nil?
103
+ Jekyll.logger.debug(" Sidebar: No title for #{@name}")
104
+ return
105
+ end
106
+
107
+ Jekyll.logger.debug(" Sidebar: <#{@path}>.lead_title('#{@title.lead}').main_title('#{@title.main}')")
108
+
109
+ @jekyll_page.data['lead_title'] = @title.lead
110
+ @jekyll_page.data['main_title'] = @title.main
111
+ end
112
+
74
113
  def save
75
114
  Jekyll.logger.debug(" Writing Sidebar: #{filename}")
76
115
 
@@ -80,27 +119,30 @@ module SwedbankPay
80
119
  end
81
120
  end
82
121
 
122
+ def children?
123
+ !children.nil? && children.any?
124
+ end
125
+
83
126
  def headers?
84
127
  !headers.nil? && headers.any?
85
128
  end
86
129
 
87
130
  def coordinate
88
131
  return @number.to_s if @parent.nil?
132
+ return @number.to_s unless @parent.respond_to? :coordinate
89
133
 
90
134
  "#{@parent.coordinate}.#{@number}"
91
135
  end
92
136
 
93
- private
94
-
95
- def page_title(page)
96
- title = page['title']
97
- return nil if title.nil?
98
-
99
- SidebarPageTitle.new(title)
137
+ def load
138
+ @doc = File.open(@filename) { |f| Nokogiri::HTML(f) }
139
+ @doc
100
140
  end
101
141
 
102
- def menu_order(page)
103
- order = page['menu_order']
142
+ private
143
+
144
+ def menu_order(jekyll_page)
145
+ order = jekyll_page['menu_order']
104
146
  return FIXNUM_MAX if order.nil? || order.to_s.empty?
105
147
 
106
148
  order.to_i
@@ -113,5 +155,27 @@ module SwedbankPay
113
155
  def child_of?(path)
114
156
  @path.split('/').length > @level && path.start_with?(@path)
115
157
  end
158
+
159
+ def find_path(current)
160
+ if current.nil?
161
+ Jekyll.logger.warn(' Sidebar: Nil current_page')
162
+ return ''
163
+ end
164
+
165
+ return current if current.is_a? String
166
+ return current.path if current.respond_to?(:path)
167
+
168
+ Jekyll.logger.warn(" Sidebar: #{current.class} ('#{current}') does not respond to :path.")
169
+
170
+ ''
171
+ end
172
+
173
+ def in_same_section_as?(other_page)
174
+ # If this or the other page is the root index page, just ignore the
175
+ # hidden state completely
176
+ return false if other_page.path == '/' || @path == '/'
177
+
178
+ other_page.path.start_with?(@path) || @path.start_with?(other_page.path)
179
+ end
116
180
  end
117
181
  end
@@ -1,4 +1,4 @@
1
- # frozen_string_literal: false
1
+ # frozen_string_literal: true
2
2
 
3
3
  require 'forwardable'
4
4
 
@@ -17,7 +17,6 @@ module SwedbankPay
17
17
  pages.each_with_index do |page, index|
18
18
  page.number = index
19
19
  page.parent = parent
20
- page.freeze
21
20
  @pages.push(page)
22
21
  end
23
22
  end
@@ -1,15 +1,32 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'jekyll'
4
+ require_relative 'sidebar_page'
5
+
3
6
  module SwedbankPay
4
7
  # Represents the title of a SidebarPage
5
8
  class SidebarPageTitle
6
- attr_reader :section, :item
9
+ attr_reader :main, :section
7
10
 
8
- def initialize(title)
9
- @title = title
10
- parts = title.split('')
11
- @section = parts.first.strip
12
- @item = parts.last.strip
11
+ def self.parse(jekyll_page, sidebar_page)
12
+ raise ArgumentError, 'jekyll_page cannot be nil' if jekyll_page.nil?
13
+ raise ArgumentError, 'jekyll_page must be a Jekyll::Page' unless jekyll_page.is_a? Jekyll::Page
14
+ raise ArgumentError, 'sidebar_page cannot be nil' if sidebar_page.nil?
15
+ raise ArgumentError, 'sidebar_page must be a SidebarPage' unless sidebar_page.is_a? SidebarPage
16
+
17
+ title = jekyll_page['title']
18
+ section = jekyll_page['section']
19
+
20
+ return nil if title.nil? && section.nil?
21
+
22
+ SidebarPageTitle.new(title, section, sidebar_page)
23
+ end
24
+
25
+ def lead
26
+ section = find_section(@page)
27
+ return section unless section.nil?
28
+
29
+ @lead
13
30
  end
14
31
 
15
32
  def to_s
@@ -25,5 +42,53 @@ module SwedbankPay
25
42
 
26
43
  @title <=> other.to_s
27
44
  end
45
+
46
+ private
47
+
48
+ def initialize(title, section, page)
49
+ raise ArgumentError, 'Both title and section cannot be nil' if title.nil? && section.nil?
50
+ raise ArgumentError, 'page cannot be nil' if page.nil?
51
+ raise ArgumentError, 'page must be a SidebarPage' unless page.is_a? SidebarPage
52
+
53
+ if title.nil?
54
+ raise ArgumentError, 'section must be a String' unless section.is_a? String
55
+
56
+ title = section
57
+ elsif section.nil?
58
+ raise ArgumentError, 'title must be a String' unless title.is_a? String
59
+ end
60
+
61
+ @page = page
62
+ @title = title
63
+ parts = title.split('–')
64
+ @section = section
65
+ @lead = parts.first.strip
66
+ @main = parts.last.strip
67
+ end
68
+
69
+ def find_section(page)
70
+ raise ArgumentError, 'page cannot be nil' if page.nil?
71
+ raise ArgumentError, 'page must be a SidebarPage' unless page.is_a? SidebarPage
72
+
73
+ # Return the 'section' front matter if it can be found on the current page.
74
+ section = section_from_front_matter(page)
75
+
76
+ return section unless section.nil?
77
+
78
+ # Recurse upwards to the root (until there is no parent).
79
+ section_from_parent(page)
80
+ end
81
+
82
+ def section_from_front_matter(page)
83
+ return nil if page.nil? || page.title.nil? || page.title.section.nil? || page.title.section.empty?
84
+
85
+ page.title.section
86
+ end
87
+
88
+ def section_from_parent(page)
89
+ return nil if page.nil? || page.parent.nil?
90
+
91
+ find_section(page.parent) unless page.nil? || page.parent.nil?
92
+ end
28
93
  end
29
94
  end
@@ -1,39 +1,65 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'jekyll'
4
+ require 'jekyll-redirect-from'
3
5
  require_relative 'sidebar_path'
4
6
 
5
7
  module SwedbankPay
6
8
  # The Sidebar renderer
7
9
  class SidebarParser
10
+ attr_reader :pages
11
+
8
12
  def initialize(site)
9
- @site = site
13
+ raise ArgumentError, 'Site cannot be nil' if site.nil?
14
+ raise ArgumentError, 'Site must be a Jekyll::Site' unless site.is_a? Jekyll::Site
15
+
16
+ @pages = convert(site.pages)
10
17
  end
11
18
 
12
- def parse(pages)
13
- destination = @site.config['destination']
19
+ def parse(tree)
20
+ raise ArgumentError, 'tree cannot be nil' if tree.nil?
21
+ raise ArgumentError, 'tree must be a SidebarTreeBuilder' unless tree.is_a? SidebarTreeBuilder
14
22
 
15
- Dir.glob("#{destination}/**/*.html") do |filename|
16
- doc = File.open(filename) { |f| Nokogiri::HTML(f) }
17
- path = SidebarPath.new(filename).to_s
18
- page = pages[path]
23
+ parse_html(tree)
24
+ end
25
+
26
+ private
19
27
 
20
- raise ArgumentError, "No page found for '#{path}'." if page.nil?
28
+ def convert(pages)
29
+ pages_hash = {}
21
30
 
22
- page.doc = doc
23
- page.filename = filename
24
- page.headers = find_headers(doc)
25
- page.sidebar_container = find_sidebar_container(filename, doc)
31
+ pages.each do |jekyll_page|
32
+ if skippable? jekyll_page
33
+ Jekyll.logger.debug(" Sidebar: Skipping <#{jekyll_page['url']}>")
34
+ next
35
+ end
36
+
37
+ sidebar_page = SidebarPage.new(jekyll_page)
38
+ pages_hash[sidebar_page.path] = sidebar_page
26
39
  end
27
40
 
28
- pages
41
+ pages_hash
29
42
  end
30
43
 
31
- private
44
+ def parse_html(pages)
45
+ return if pages.nil? || pages.empty?
46
+
47
+ pages.each do |page|
48
+ page.load
49
+ page.headers = find_headers(page)
50
+ page.sidebar_container = find_sidebar_container(page)
51
+ page.freeze
32
52
 
33
- def find_headers(doc)
53
+ parse_html(page.children)
54
+ end
55
+
56
+ pages
57
+ end
58
+
59
+ def find_headers(page)
34
60
  headers = []
35
61
 
36
- doc.xpath('//h2').each do |header|
62
+ page.doc.xpath('//h2').each do |header|
37
63
  next unless header['id']
38
64
 
39
65
  child_markup = header.last_element_child
@@ -48,15 +74,22 @@ module SwedbankPay
48
74
  headers
49
75
  end
50
76
 
51
- def find_sidebar_container(filename, doc)
52
- sidebar_containers = doc.xpath('//*[@id="dx-sidebar-main-nav-ul"]')
77
+ def find_sidebar_container(page)
78
+ sidebar_containers = page.doc.xpath('//*[@id="dx-sidebar-main-nav-ul"]')
53
79
 
54
- unless sidebar_containers.any?
55
- Jekyll.logger.debug(" Sidebar: No sidebar container found in #{filename}")
80
+ if sidebar_containers.empty?
81
+ Jekyll.logger.error(" Sidebar: No sidebar container found in <#{page.filename}>!")
56
82
  return nil
57
83
  end
58
84
 
59
85
  sidebar_containers.first
60
86
  end
87
+
88
+ def skippable?(jekyll_page)
89
+ return true if jekyll_page.is_a? JekyllRedirectFrom::RedirectPage
90
+ return true if jekyll_page.is_a? JekyllRedirectFrom::PageWithoutAFile
91
+
92
+ false
93
+ end
61
94
  end
62
95
  end