middleman-pagegroups 1.0.2 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +8 -1
  3. data/.yardopts +8 -0
  4. data/CHANGELOG.md +24 -4
  5. data/README.md +5 -5
  6. data/Rakefile +201 -7
  7. data/documentation_project/Gemfile +2 -2
  8. data/documentation_project/config.rb +15 -19
  9. data/documentation_project/source/documentation/100_nested_folder/another_file.html.md.erb +19 -0
  10. data/documentation_project/source/documentation/100_nested_folder/index.html.md.erb +25 -0
  11. data/documentation_project/source/documentation/100_nested_folder/one_file.html.md.erb +11 -0
  12. data/documentation_project/source/documentation/100_nested_folder/stray.txt +6 -0
  13. data/documentation_project/source/documentation/10_concepts.html.md.erb +1 -1
  14. data/documentation_project/source/documentation/20_directory_organization.html.md.erb +12 -10
  15. data/documentation_project/source/documentation/40_resources.html.md.erb +3 -68
  16. data/documentation_project/source/documentation/50_helpers.html.md.erb +41 -163
  17. data/documentation_project/source/documentation/60_sample_partials.html.md.erb +23 -22
  18. data/documentation_project/source/documentation/80_config.html.md.erb +6 -0
  19. data/documentation_project/source/documentation/90_cli.html.md.erb +47 -0
  20. data/documentation_project/source/partials/_yard_config.erb +744 -0
  21. data/documentation_project/source/partials/_yard_helpers.erb +710 -0
  22. data/documentation_project/source/partials/_yard_helpers_css.erb +523 -0
  23. data/documentation_project/source/partials/_yard_helpers_extended.erb +56 -0
  24. data/documentation_project/source/partials/_yard_resources.erb +540 -0
  25. data/documentation_project/source/stylesheets/_middlemac_minimal.scss +287 -0
  26. data/features/helpers_and_resources.feature +120 -0
  27. data/features/support/env.rb +20 -0
  28. data/fixtures/middleman_pagegroups_app/config.rb +17 -0
  29. data/fixtures/middleman_pagegroups_app/source/20_sub_folder_02/index.html.md.erb +8 -0
  30. data/fixtures/middleman_pagegroups_app/source/20_sub_folder_02/not_legitimate.html.md.erb +8 -0
  31. data/fixtures/middleman_pagegroups_app/source/20_sub_folder_02/sibling_one.html.md.erb +8 -0
  32. data/fixtures/middleman_pagegroups_app/source/20_sub_folder_02/sibling_two.html.md.erb +8 -0
  33. data/fixtures/middleman_pagegroups_app/source/_partial.md.erb +111 -0
  34. data/fixtures/middleman_pagegroups_app/source/index.html.md.erb +23 -0
  35. data/fixtures/middleman_pagegroups_app/source/layout.erb +6 -0
  36. data/fixtures/middleman_pagegroups_app/source/sub_folder_01/10_sibling_one.html.md.erb +7 -0
  37. data/fixtures/middleman_pagegroups_app/source/sub_folder_01/20_sibling_two.html.md.erb +7 -0
  38. data/fixtures/middleman_pagegroups_app/source/sub_folder_01/30_sibling_three.html.md.erb +7 -0
  39. data/fixtures/middleman_pagegroups_app/source/sub_folder_01/index.html.md.erb +9 -0
  40. data/lib/middleman-pagegroups/extension.rb +468 -110
  41. data/lib/middleman-pagegroups/partials.rb +9 -12
  42. data/lib/middleman-pagegroups/version.rb +1 -1
  43. data/middleman-pagegroups.gemspec +10 -2
  44. data/yard/readme.md +5 -0
  45. data/yard/template-grouped/default/module/html/method_details_list.erb +11 -0
  46. data/yard/template-partials/default/method_details/setup.rb +4 -0
  47. data/yard/template-partials/default/module/html/attribute_details.erb +9 -0
  48. data/yard/template-partials/default/module/html/method_details_list.erb +10 -0
  49. data/yard/template-partials/default/module/setup.rb +6 -0
  50. data/yard/template-partials/default/onefile/html/layout.erb +1 -0
  51. data/yard/template-partials/default/onefile/html/setup.rb +4 -0
  52. data/yard/yard_extensions.rb +109 -0
  53. metadata +105 -7
@@ -0,0 +1,8 @@
1
+ ---
2
+ title: sub_folder_02 index page
3
+ blurb: This is the index page for the group sub_folder_02.
4
+ navigate: false
5
+ ---
6
+
7
+ #<%= current_page.data.title %>
8
+ <%= current_page.data.blurb %>
@@ -0,0 +1,8 @@
1
+ ---
2
+ title: not legitimate page
3
+ blurb: This page will be built and is part of the group, but isn't included
4
+ in any automatic navigation.
5
+ ---
6
+
7
+ #<%= current_page.data.title %>
8
+ <%= current_page.data.blurb %>
@@ -0,0 +1,8 @@
1
+ ---
2
+ title: sibling_one
3
+ blurb: This is the sibling_one page in sub_folder_02.
4
+ order: 10
5
+ ---
6
+
7
+ #<%= current_page.data.title %>
8
+ <%= current_page.data.blurb %>
@@ -0,0 +1,8 @@
1
+ ---
2
+ title: sibling_two
3
+ blurb: This is the sibling_two page in sub_folder_02.
4
+ order: 20
5
+ ---
6
+
7
+ #<%= current_page.data.title %>
8
+ <%= current_page.data.blurb %>
@@ -0,0 +1,111 @@
1
+ ## page_classes helper
2
+
3
+ ~~~
4
+ page_classes: <%= page_classes %>
5
+ ~~~
6
+
7
+ * * *
8
+
9
+ ## Resource Extensions
10
+
11
+ ~~~
12
+ current_resource.breadcrumbs:<%= current_resource.breadcrumbs || 'nil' %>
13
+ ~~~
14
+
15
+ ~~~
16
+ current_resource.brethren:<%= current_resource.brethren || 'nil' %>
17
+ ~~~
18
+
19
+ ~~~
20
+ current_resource.brethren_next:<%= current_resource.brethren_next || 'nil' %>
21
+ ~~~
22
+
23
+ ~~~
24
+ current_resource.brethren_previous:<%= current_resource.brethren_previous || 'nil' %>
25
+ ~~~
26
+
27
+ ~~~
28
+ current_resource.group_count:<%= current_resource.group_count || 'nil' %>
29
+ ~~~
30
+
31
+ ~~~
32
+ current_resource.legitimate_children:<%= current_resource.legitimate_children || 'nil' %>
33
+ ~~~
34
+
35
+ ~~~
36
+ current_resource.navigator_eligible:<%= current_resource.navigator_eligible? || 'nil' %>
37
+ ~~~
38
+
39
+ ~~~
40
+ current_resource.page_group:<%= current_resource.page_group || 'nil' %>
41
+ ~~~
42
+
43
+ ~~~
44
+ current_resource.page_name:<%= current_resource.page_name || 'nil' %>
45
+ ~~~
46
+
47
+ ~~~
48
+ current_resource.page_sequence:<%= current_resource.page_sequence || 'nil' %>
49
+ ~~~
50
+
51
+ ~~~
52
+ current_resource.parent:<%= current_resource.parent || 'nil' %>
53
+ ~~~
54
+
55
+ ~~~
56
+ current_resource.sort_order:<%= current_resource.sort_order || 'nil' %>
57
+ ~~~
58
+
59
+ * * *
60
+
61
+ ## Content Helpers
62
+
63
+ nav_breadcrumbs:
64
+
65
+ ~~~
66
+ <%= nav_breadcrumbs %>
67
+ ~~~
68
+
69
+ nav_breadcrumbs_alt:
70
+
71
+ ~~~
72
+ <%= nav_breadcrumbs_alt %>
73
+ ~~~
74
+
75
+ nav_brethren:
76
+
77
+ ~~~
78
+ <%= nav_brethren %>
79
+ ~~~
80
+
81
+ nav_brethren_index:
82
+
83
+ ~~~
84
+ <%= nav_brethren_index %>
85
+ ~~~
86
+
87
+ nav_legitimate_children:
88
+
89
+ ~~~
90
+ <%= nav_legitimate_children %>
91
+ ~~~
92
+
93
+ nav_prev_next:
94
+
95
+ ~~~
96
+ <%= nav_prev_next %>
97
+ ~~~
98
+
99
+ nav_toc_index:
100
+
101
+ ~~~
102
+ <%= nav_toc_index %>
103
+ ~~~
104
+
105
+ nav_toc_index (from top):
106
+
107
+ ~~~
108
+ <%= nav_toc_index(:start => current_page.breadcrumbs.first) %>
109
+ ~~~
110
+
111
+ * * *
@@ -0,0 +1,23 @@
1
+ ---
2
+ title: Main Index Page
3
+ blurb: This is the main index file.
4
+ navigate: false
5
+ ---
6
+
7
+ #<%= current_page.data.title %>
8
+ <%= current_page.data.blurb %>
9
+
10
+ * * *
11
+
12
+ ## CSS Helpers
13
+
14
+ - nav_breadcrumbs_alt_class: <%= nav_breadcrumbs_alt_class %>
15
+ - nav_breadcrumbs_alt_label: <%= nav_breadcrumbs_alt_label %>
16
+ - nav_breadcrumbs_class: <%= nav_breadcrumbs_class %>
17
+ - nav_brethren_class: <%= nav_brethren_class %>
18
+ - nav_brethren_index_class: <%= nav_brethren_index_class %>
19
+ - nav_legitimate_children_class: <%= nav_legitimate_children_class %>
20
+ - nav_prev_next_class: <%= nav_prev_next_class %>
21
+ - nav_prev_next_label_next: <%= nav_prev_next_label_next %>
22
+ - nav_prev_next_label_prev: <%= nav_prev_next_label_prev %>
23
+ - nav_toc_index_class: <%= nav_toc_index_class %>
@@ -0,0 +1,6 @@
1
+ <%= nav_toc_index(:start => current_page.breadcrumbs.first) %>
2
+
3
+ <%= yield %>
4
+
5
+ <hr>
6
+ <%= partial 'partial' %>
@@ -0,0 +1,7 @@
1
+ ---
2
+ title: sibling_one
3
+ blurb: This is the sibling_one page in sub_folder_01.
4
+ ---
5
+
6
+ #<%= current_page.data.title %>
7
+ <%= current_page.data.blurb %>
@@ -0,0 +1,7 @@
1
+ ---
2
+ title: sibling_two
3
+ blurb: This is the sibling_two page in sub_folder_01.
4
+ ---
5
+
6
+ #<%= current_page.data.title %>
7
+ <%= current_page.data.blurb %>
@@ -0,0 +1,7 @@
1
+ ---
2
+ title: sibling_three
3
+ blurb: This is the sibling_three page in sub_folder_01.
4
+ ---
5
+
6
+ #<%= current_page.data.title %>
7
+ <%= current_page.data.blurb %>
@@ -0,0 +1,9 @@
1
+ ---
2
+ title: sub_folder_01 index page
3
+ blurb: This is the index page for the group sub_folder_01.
4
+ order: 10
5
+ navigate: true
6
+ ---
7
+
8
+ #<%= current_page.data.title %>
9
+ <%= current_page.data.blurb %>
@@ -1,10 +1,12 @@
1
- ################################################################################
2
- # extension.rb
3
- # This file constitutes the framework for the bulk of this extension.
4
- ################################################################################
5
1
  require 'middleman-core'
6
2
  require 'middleman-pagegroups/partials'
7
3
 
4
+ ################################################################################
5
+ # This extension provides advanced navigation tools and helpers for grouping
6
+ # pages by topic and navigating between them. It includes support for tables
7
+ # of content, related pages, breadcrumbs, and more.
8
+ # @author Jim Derry <balthisar@gmail.com>
9
+ ################################################################################
8
10
  class MiddlemanPageGroups < ::Middleman::Extension
9
11
 
10
12
 
@@ -26,20 +28,157 @@ class MiddlemanPageGroups < ::Middleman::Extension
26
28
  option :nav_prev_next_label_next, 'Next', 'Default "next" label text for the nav_prev_next helper/partial.'
27
29
  option :nav_toc_index_class, nil, 'Default css class for the nav_toc_index helper/partial.'
28
30
 
31
+ # @!group Extension Configuration
32
+
33
+ # @!attribute [rw] options[:strip_file_prefixes]=
34
+ # If `true` leading numbers used for sorting files will be removed for
35
+ # presentation purposes. This makes it possible to neatly organize your
36
+ # source files in their presentation order on your filesystem but output
37
+ # nice filenames without ugly prefix numbers.
38
+ # @param [Boolean] value `true` or `false` to enable or disable this feature.
39
+ # @return [Boolean] Returns the current value of this option.
40
+
41
+ # @!attribute [rw] options[:extend_page_class]=
42
+ # If true then the default **Middleman** `page_class` helper will be extended
43
+ # to include simple `group` and `page_name` for each resource.
44
+ # @param [Boolean] value `true` or `false` to enable or disable this feature.
45
+ # @return [Boolean] Returns the current value of this option.
46
+
47
+ # @!attribute [rw] options[:nav_breadcrumbs_class]=
48
+ # Default css class for the `nav_breadcrumbs` helper/partial.
49
+ # @param [String] value The `class` attribute value to use for this item’s
50
+ # containing element.
51
+ # @return [String] Returns the current value of this option.
52
+
53
+ # @!attribute [rw] options[:nav_breadcrumbs_alt_class]=
54
+ # Default css class for the `nav_breadcrumbs_alt` helper/partial.
55
+ # @param [String] value The `class` attribute value to use for this item’s
56
+ # containing element.
57
+ # @return [String] Returns the current value of this option.
58
+
59
+ # @!attribute [rw] options[:nav_breadcrumbs_alt_label]=
60
+ # Default "current page" label for the `nav_breadcrumbs_alt` helper/partial.
61
+ # @param [String] value The `class` attribute value to use for this item’s
62
+ # containing element.
63
+ # @return [String] Returns the current value of this option.
64
+
65
+ # @!attribute [rw] options[:nav_brethren_class]=
66
+ # Default css class for the `nav_brethren` helper/partial.
67
+ # @param [String] value The `class` attribute value to use for this item’s
68
+ # containing element.
69
+ # @return [String] Returns the current value of this option.
70
+
71
+ # @!attribute [rw] options[:nav_brethren_index_class]=
72
+ # Default css class for the `nav_brethren_index` helper/partial.
73
+ # @param [String] value The `class` attribute value to use for this item’s
74
+ # containing element.
75
+ # @return [String] Returns the current value of this option.
76
+
77
+ # @!attribute [rw] options[:nav_legitimate_children_class]=
78
+ # Default css class for the `nav_legitimate_children` helper/partial.
79
+ # @param [String] value The `class` attribute value to use for this item’s
80
+ # containing element.
81
+ # @return [String] Returns the current value of this option.
82
+
83
+ # @!attribute [rw] options[:nav_prev_next_class]=
84
+ # Default css class for the `nav_prev_next` helper/partial.
85
+ # @param [String] value The `class` attribute value to use for this item’s
86
+ # containing element.
87
+ # @return [String] Returns the current value of this option.
88
+
89
+ # @!attribute [rw] options[:nav_prev_next_label_prev]=
90
+ # Default "previous" label text for the `nav_prev_next` helper/partial.
91
+ # @param [String] value The `class` attribute value to use for this item’s
92
+ # containing element.
93
+ # @return [String] Returns the current value of this option.
94
+
95
+ # @!attribute [rw] options[:nav_prev_next_label_next]=
96
+ # Default "next" label text for the `nav_prev_next` helper/partial.
97
+ # @param [String] value The `class` attribute value to use for this item’s
98
+ # containing element.
99
+ # @return [String] Returns the current value of this option.
100
+
101
+ # @!attribute [rw] options[:nav_toc_index_class]=
102
+ # Default css class for the `nav_toc_index` helper/partial.
103
+ # @param [String] value The `class` attribute value to use for this item’s
104
+ # containing element.
105
+ # @return [String] Returns the current value of this option.
106
+
107
+ # @!endgroup
108
+
29
109
 
30
110
  ############################################################
31
111
  # Sitemap manipulators.
32
112
  # Add new methods to each resource.
33
113
  ############################################################
114
+
115
+ #--------------------------------------------------------
116
+ # We must ensure that for any directory the index_file
117
+ # is first. This is so that we can check it for a page
118
+ # order and rename the containing directory in output.
119
+ # @!visibility private
120
+ #--------------------------------------------------------
121
+ def resource_sort_comparator( x, y )
122
+ if File.basename(x.path) == app.config[:index_file]
123
+ -1
124
+ else
125
+ if File.dirname(x.path) == File.dirname(y.path)
126
+ return File.basename(x.path) <=> File.basename(y.path)
127
+ else
128
+ return File.dirname(x.path) <=> File.dirname(y.path)
129
+ end
130
+ end
131
+ end
132
+
133
+
134
+ #--------------------------------------------------------
135
+ # Add our own resource methods to each resource in the
136
+ # site map.
137
+ # @!visibility private
138
+ #--------------------------------------------------------
34
139
  def manipulate_resource_list(resources)
35
140
 
36
- resources.each do |resource|
141
+ resources.sort { |a,b| resource_sort_comparator(a,b) }
142
+ .each do |resource|
143
+
144
+ #--------------------------------------------------------
145
+ # Return the parent of the resource. This implementation
146
+ # corrects a bug in **Middleman** as of 4.1.7 wherein
147
+ # **Middleman** doesn’t return the parent if the the
148
+ # directory has been renamed for output.
149
+ # @return [Sitemap::Resource] The resource instance of
150
+ # the resource’s parent.
151
+ #--------------------------------------------------------
152
+ def resource.parent
153
+ root = path.sub(/^#{::Regexp.escape(traversal_root)}/, '')
154
+ parts = root.split('/')
155
+
156
+ tail = parts.pop
157
+ is_index = (tail == @app.config[:index_file])
158
+
159
+ if parts.empty?
160
+ return is_index ? nil : @store.find_resource_by_path(@app.config[:index_file])
161
+ end
162
+
163
+ test_expr = parts.join('\\/')
164
+ # eponymous reverse-lookup
165
+ found = @store.resources.find do |candidate|
166
+ candidate.path =~ %r{^#{test_expr}(?:\.[a-zA-Z0-9]+|\/)$}
167
+ end
168
+
169
+ if found
170
+ found
171
+ else
172
+ parts.pop if is_index
173
+ @store.find_resource_by_path("#{parts.join('/')}/#{@app.config[:index_file]}")
174
+ end
175
+ end
37
176
 
38
177
  #--------------------------------------------------------
39
- # page_name
40
- # Make page_name available for each page. This is the
41
- # file base name after any renaming has occurred.
42
- # Useful for assigning classes, etc.
178
+ # Make `page_name` available for each resource. This is
179
+ # the file’s base name after any renaming has occurred.
180
+ # Useful for assigning classes, etc.
181
+ # @return [String] The `page_name` of the current page.
43
182
  #--------------------------------------------------------
44
183
  def resource.page_name
45
184
  File.basename( self.destination_path, '.*' )
@@ -47,22 +186,26 @@ class MiddlemanPageGroups < ::Middleman::Extension
47
186
 
48
187
 
49
188
  #--------------------------------------------------------
50
- # page_group
51
- # Make page_group available for each page. This is
52
- # the source parent directory (not the request path).
53
- # Useful for for assigning classes, and/or group
54
- # conditionals.
189
+ # Make `page_group` available for each resource.
190
+ # Useful for for assigning classes, and/or group
191
+ # conditionals.
192
+ # @return [String] The `page_group` of the current page.
55
193
  #--------------------------------------------------------
56
194
  def resource.page_group
57
- File.basename( File.split( self.source_file )[0] )
195
+ result = File.basename( File.split( self.destination_path )[0] )
196
+ if result == '.'
197
+ result = @app.config[:source]
198
+ end
199
+ result
58
200
  end
59
201
 
60
202
 
61
203
  #--------------------------------------------------------
62
- # group_count
63
- # Returns the quantity of pages in the current
64
- # page’s group. This is NOT the count of the number
65
- # of an index page's legitimate children.
204
+ # Returns the quantity of pages in the current page’s
205
+ # group, including this current page, i.e., the number
206
+ # of `brethren + 1`.
207
+ # @return [Integer] The total number of pages in the
208
+ # this page’s current group.
66
209
  #--------------------------------------------------------
67
210
  def resource.group_count
68
211
  self.brethren.count + 1
@@ -70,10 +213,15 @@ class MiddlemanPageGroups < ::Middleman::Extension
70
213
 
71
214
 
72
215
  #--------------------------------------------------------
73
- # sort_order
74
- # Returns the page sort order or 0. This is set
75
- # initial population of the resource map, and made
76
- # available here.
216
+ # Returns the page sort order or 0 if no page sort order
217
+ # was applied.
218
+ #
219
+ # Pages without a sort order can still be linked to;
220
+ # they simply aren't brethren or legitimate children,
221
+ # and so don’t participate in any of the automatic
222
+ # navigation features.
223
+ # @return [Integer] The current resource’s sort order
224
+ # within its group, or 0 if no sort order was applied.
77
225
  #--------------------------------------------------------
78
226
  def resource.sort_order
79
227
  options[:sort_order]
@@ -81,10 +229,12 @@ class MiddlemanPageGroups < ::Middleman::Extension
81
229
 
82
230
 
83
231
  #--------------------------------------------------------
84
- # page_sequence
85
- # Returns the page sequence amongst all of the
86
- # brethren. Can be uses as a page number surrogate.
87
- # Base 1.
232
+ # Returns the page sequence amongst all of the brethren,
233
+ # and can be used as a page number surrogate. The first
234
+ # page is 1. Pages without a sort order will have a `nil`
235
+ # `page_sequence`.
236
+ # @return [Integer, Nil] The current page sequence of
237
+ # this resource among its brethren.
88
238
  #--------------------------------------------------------
89
239
  def resource.page_sequence
90
240
  if self.sort_order == 0
@@ -100,15 +250,17 @@ class MiddlemanPageGroups < ::Middleman::Extension
100
250
 
101
251
 
102
252
  #--------------------------------------------------------
103
- # brethren
104
- # Returns an array of all of the siblings of the
105
- # specified page, taking into account their
106
- # eligibility for display.
107
- # - is not already the current page.
108
- # - has a sort_order.
109
- # - is not ignored.
110
- # Returned array will be:
111
- # - sorted by sort_order.
253
+ # Returns an array of all of the siblings of this page,
254
+ # taking into account their eligibility for display.
255
+ #
256
+ # * is not already the current page.
257
+ # * has a `sort_order`.
258
+ # * is not ignored.
259
+ #
260
+ # The returned array will be sorted by each item’s
261
+ # `sort_order`.
262
+ # @return [Array<Sitemap::Resource>] An array of
263
+ # resources.
112
264
  #--------------------------------------------------------
113
265
  def resource.brethren
114
266
  self.siblings
@@ -118,8 +270,10 @@ class MiddlemanPageGroups < ::Middleman::Extension
118
270
 
119
271
 
120
272
  #--------------------------------------------------------
121
- # brethren_next
122
- # Returns the next sibling based on order or nil.
273
+ # Returns the next sibling based on order, or `nil` if
274
+ # there is no next sibling.
275
+ # @return [Sitemap::Resource] The resource instance of
276
+ # the next sibling.
123
277
  #--------------------------------------------------------
124
278
  def resource.brethren_next
125
279
  if self.sort_order == 0
@@ -131,8 +285,10 @@ class MiddlemanPageGroups < ::Middleman::Extension
131
285
 
132
286
 
133
287
  #--------------------------------------------------------
134
- # brethren_previous
135
- # Returns the previous sibling based on order or nil.
288
+ # Returns the previous sibling based on order, or `nil`
289
+ # if there is no previous sibling.
290
+ # @return [Sitemap::Resource] The resource instance of
291
+ # the previous sibling.
136
292
  #--------------------------------------------------------
137
293
  def resource.brethren_previous
138
294
  if self.sort_order == 0
@@ -144,12 +300,17 @@ class MiddlemanPageGroups < ::Middleman::Extension
144
300
 
145
301
 
146
302
  #--------------------------------------------------------
147
- # navigator_eligible?
148
- # Determine whether a page is eligible to include a
149
- # previous/next page control based on:
150
- # - the group is set to allow navigation (:navigate)
151
- # - this page is not excluded from navigation. (:navigator => false)
152
- # - this page has a sort_order.
303
+ # Determines whether a page is eligible to include a
304
+ # previous/next page control. This is based on:
305
+ #
306
+ # * The group is set to allow navigation via the
307
+ # `:navigate` front matter key.
308
+ # * This page is not excluded from navigation via the
309
+ # use of `:navigator => false` in its front matter.
310
+ # * This page has a `sort_order`.
311
+ #
312
+ # @return (Boolean) Returns `true` if this pages is
313
+ # eligible for a previous/next page control.
153
314
  #--------------------------------------------------------
154
315
  def resource.navigator_eligible?
155
316
  group_navigates = self.parent && self.parent.data['navigate'] == true
@@ -160,14 +321,18 @@ class MiddlemanPageGroups < ::Middleman::Extension
160
321
 
161
322
 
162
323
  #--------------------------------------------------------
163
- # legitimate_children
164
- # Returns an array of all of the children of the
165
- # specified page, taking into account their
166
- # eligibility for display.
167
- # - has a sort_order.
168
- # - is not ignored.
169
- # Returned array will be:
170
- # - sorted by sort_order.
324
+ # Returns an array of all of the children of this
325
+ # resource, taking into account their eligibility for
326
+ # display. Each child is legitimate if it:
327
+ #
328
+ # * has a sort_order.
329
+ # * is not ignored.
330
+ #
331
+ # The returned array will be sorted by each item’s
332
+ # `sort_order`.
333
+ #
334
+ # @return [Array<Sitemap::Resource>] An array of
335
+ # resources.
171
336
  #--------------------------------------------------------
172
337
  def resource.legitimate_children
173
338
  self.children
@@ -177,9 +342,9 @@ class MiddlemanPageGroups < ::Middleman::Extension
177
342
 
178
343
 
179
344
  #--------------------------------------------------------
180
- # breadcrumbs
181
- # Returns an array of pages leading to the current
182
- # page.
345
+ # Returns an array of resources leading to this resource.
346
+ # @return [Array<Sitemap::Resource>] An array of
347
+ # resources.
183
348
  #--------------------------------------------------------
184
349
  def resource.breadcrumbs
185
350
  hierarchy = [] << self
@@ -201,22 +366,71 @@ class MiddlemanPageGroups < ::Middleman::Extension
201
366
  # If :strip_file_prefixes, then additionally we will
202
367
  # prettify the output page name.
203
368
  #========================================================
369
+ strip = @app.extensions[:MiddlemanPageGroups].options[:strip_file_prefixes]
370
+ page_name = File.basename(resource.path, '.*')
371
+ path_part = File.dirname(resource.destination_path)
372
+
204
373
  if resource.content_type && resource.content_type.start_with?('text/html', 'application/xhtml')
205
- page_name = File.basename( resource.path, '.*' )
374
+
375
+ file_renamed = false
376
+ # Set the resource's sort order if provided via various means.
206
377
  if resource.data.key?('order')
378
+ # Priority for ordering goes to the :order front matter key.
207
379
  sort_order = resource.data['order']
208
380
  elsif ( match = /^(\d*?)_/.match(page_name) )
381
+ # Otherwise if the file has an integer prefix we will use that.
382
+ sort_order = match[1]
383
+ elsif ( match = /^(\d*?)_/.match(path_part.split('/').last) ) && File.basename( resource.path ) == app.config[:index_file]
384
+ # Otherwise if we're an index file then set the sort order based on
385
+ # its containing group. Because we sorted the resources, we are sure
386
+ # that this is the first resource to be processed in this directory.
209
387
  sort_order = match[1]
210
- if @app.extensions[:MiddlemanPageGroups].options[:strip_file_prefixes]
211
- path_part = File.dirname( resource.destination_path )
212
- name_part = page_name.sub( "#{sort_order}_", '') + File.extname( resource.path )
213
- resource.destination_path = File.join( path_part, name_part )
214
- end
215
388
  else
216
389
  sort_order = nil
217
390
  end
218
391
 
392
+ # Remove the sort order indicator from the file or directory name.
393
+ # This will only change the output path for files that have a sort
394
+ # order. Other files in a renamed directory that needs to have their
395
+ # paths changed will be changed below.
396
+ if strip && sort_order
397
+ path_parts = path_part.split('/')
398
+ path_parts.last.sub!(/^(\d*?)_/, '')
399
+ path_part = path_parts.join('/')
400
+ name_part = page_name.sub( "#{sort_order}_", '') + File.extname( resource.path )
401
+ if path_part == '.'
402
+ resource.destination_path = name_part
403
+ else
404
+ resource.destination_path = File.join(path_part, name_part)
405
+ end
406
+ file_renamed = true
407
+ end
408
+
219
409
  resource.options[:sort_order] = sort_order.to_i
410
+
411
+ end
412
+
413
+ unless file_renamed
414
+
415
+ # For other files, check to see if there's an index file in this source
416
+ # directory. If so then our rules state it will have a sort order, which
417
+ # means we can ensure that our output path is without a sorting prefix.
418
+ # If there is, then make sure OUR immediate destination directory is
419
+ # the same as the index file’s, in case we've renamed it.
420
+ index_file = [path_part, app.config[:index_file] ].join('/')
421
+ index_found = resources.select { |r| r.path == index_file }[0]
422
+
423
+ if strip && index_found && index_found.options[:sort_order]
424
+ path_part = File.dirname(index_found.destination_path)
425
+ name_part = File.basename(resource.destination_path)
426
+ if path_part == '.'
427
+ resource.destination_path = name_part
428
+ else
429
+ resource.destination_path = File.join(path_part, name_part)
430
+ end
431
+
432
+ end
433
+
220
434
  end
221
435
 
222
436
 
@@ -237,9 +451,13 @@ class MiddlemanPageGroups < ::Middleman::Extension
237
451
 
238
452
 
239
453
  #--------------------------------------------------------
240
- # page_classes
241
- # Extend the built-in page_classes to include the
242
- # naked group and page name.
454
+ # Extend the built-in page_classes to include the naked
455
+ # group and page name. The features of this helper are
456
+ # enabled only if `options[:extend_page_class]` is
457
+ # `true`.
458
+ # @return [String] Returns the classes that correspond
459
+ # to the site hierarchy.
460
+ # @group Extended Helpers
243
461
  #--------------------------------------------------------
244
462
  def page_classes
245
463
  if extensions[:MiddlemanPageGroups].options[:extend_page_class]
@@ -256,11 +474,16 @@ class MiddlemanPageGroups < ::Middleman::Extension
256
474
  # them instead of installing partials.
257
475
  #########################################################
258
476
 
477
+
259
478
  #--------------------------------------------------------
260
- # nav_breadcrumbs( locals )
261
- # Generate the breadcrumbs partial.
262
- # locals:
263
- # [:klass] == class name for the list's <div>
479
+ # Generates a breadcrumbs structure as an `<ul>`. The
480
+ # trailing element is the current page.
481
+ # @param [Hash] locals A hash of key-value pairs that
482
+ # are passed to the structure as local variables.
483
+ # @option locals [String] :klass The `class` attribute
484
+ # value that should be assigned to the containing
485
+ # element.
486
+ # @return [String] An `<ul>` containing the breadcrumbs.
264
487
  #--------------------------------------------------------
265
488
  def nav_breadcrumbs( locals = {} )
266
489
  locals[:klass] = locals.delete(:class) if locals.key?(:class)
@@ -269,11 +492,17 @@ class MiddlemanPageGroups < ::Middleman::Extension
269
492
 
270
493
 
271
494
  #--------------------------------------------------------
272
- # nav_breadcrumbs_alt( locals )
273
- # Generate the breadcrumbs partial, alternate form.
274
- # locals:
275
- # [:klass] == class name for the list's <div>
276
- # [:label] == label for "Current page"
495
+ # Generates the breadcrumbs structure, alternate form,
496
+ # wherein the trailing element consists of a label
497
+ # indicating “current page,” as an `<ul>`.
498
+ # @param [Hash] locals A hash of key-value pairs that
499
+ # are passed to the structure as local variables.
500
+ # @option locals [String] :klass The `class` attribute
501
+ # value that should be assigned to the containing
502
+ # element.
503
+ # @option locals [String] :label The text for the label
504
+ # that means “Current page.”
505
+ # @return [String] An `<ul>` containing the breadcrumbs.
277
506
  #--------------------------------------------------------
278
507
  def nav_breadcrumbs_alt( locals = {} )
279
508
  locals[:klass] = locals.delete(:class) if locals.key?(:class)
@@ -281,12 +510,19 @@ class MiddlemanPageGroups < ::Middleman::Extension
281
510
  end
282
511
 
283
512
  #--------------------------------------------------------
284
- # nav_brethren( locals )
285
- # Generate a fuller list of related topics, including
286
- # blurbs if present.
287
- # locals:
288
- # [:klass] == class name for the list's <div>
289
- # [:start] == resource from which to start the list.
513
+ # Generates a fuller list of related topics as a `<dl>`,
514
+ # with a link to the page as the definition term and the
515
+ # page’s front matter `:blurb` as the definition
516
+ # definition.
517
+ # @param [Hash] locals A hash of key-value pairs that
518
+ # are passed to the structure as local variables.
519
+ # @option locals [String] :klass The `class` attribute
520
+ # value that should be assigned to the containing
521
+ # element.
522
+ # @option locals [Sitemap::Resource] :start The resource
523
+ # from which to start the list. If not specified,
524
+ # then this resource’s brethren will be listed.
525
+ # @return [String] A `<dl>` containing the list.
290
526
  #--------------------------------------------------------
291
527
  def nav_brethren( locals = {} )
292
528
  locals[:klass] = locals.delete(:class) if locals.key?(:class)
@@ -295,12 +531,17 @@ class MiddlemanPageGroups < ::Middleman::Extension
295
531
 
296
532
 
297
533
  #--------------------------------------------------------
298
- # nav_brethren_index( locals )
299
- # Generates a condensed list of brethren, omitting
300
- # blurbs.
301
- # locals:
302
- # [:klass] == class name for the list's <div>
303
- # [:start] == resource from which to start the list.
534
+ # Generates a condensed list of related topics as an
535
+ # `<ul>`, omitting the `:blurb` front matter data.
536
+ # @param [Hash] locals A hash of key-value pairs that
537
+ # are passed to the structure as local variables.
538
+ # @option locals [String] :klass The `class` attribute
539
+ # value that should be assigned to the containing
540
+ # element.
541
+ # @option locals [Sitemap::Resource] :start The resource
542
+ # from which to start the list. If not specified,
543
+ # then this resource’s brethren will be listed.
544
+ # @return [String] An `<ul>` containing the list.
304
545
  #--------------------------------------------------------
305
546
  def nav_brethren_index(locals = {})
306
547
  locals[:klass] = locals.delete(:class) if locals.key?(:class)
@@ -309,11 +550,19 @@ class MiddlemanPageGroups < ::Middleman::Extension
309
550
 
310
551
 
311
552
  #--------------------------------------------------------
312
- # nav_legitimate_children( locals )
313
- # Generate a list of legitimate children.
314
- # locals:
315
- # [:klass] == class name for the list's <div>
316
- # [:start] == resource from which to start the list.
553
+ # Generates a fuller list of child topics as a `<dl>`,
554
+ # with a link to the page as the definition term and the
555
+ # page’s front matter `:blurb` as the definition
556
+ # definition.
557
+ # @param [Hash] locals A hash of key-value pairs that
558
+ # are passed to the structure as local variables.
559
+ # @option locals [String] :klass The `class` attribute
560
+ # value that should be assigned to the containing
561
+ # element.
562
+ # @option locals [Sitemap::Resource] :start The resource
563
+ # from which to start the list. If not specified,
564
+ # then this resource’s children will be listed.
565
+ # @return [String] A `<dl>` containing the list.
317
566
  #--------------------------------------------------------
318
567
  def nav_legitimate_children(locals = {})
319
568
  locals[:klass] = locals.delete(:class) if locals.key?(:class)
@@ -322,12 +571,19 @@ class MiddlemanPageGroups < ::Middleman::Extension
322
571
 
323
572
 
324
573
  #--------------------------------------------------------
325
- # nav_prev_next( locals )
326
- # Generate a previous and next button.
327
- # locals:
328
- # [:klass] == class name for the list's <div>
329
- # [:label_previous] == label for previous button
330
- # [:label_next] == label for next button
574
+ # Generates a previous and next item as two anchors
575
+ # nested within a `<div>`. With appropriate CSS this
576
+ # can be rendered as a set of navigation buttons.
577
+ # @param [Hash] locals A hash of key-value pairs that
578
+ # are passed to the structure as local variables.
579
+ # @option locals [String] :klass The `class` attribute
580
+ # value that should be assigned to the containing
581
+ # element.
582
+ # @option locals [String] :label_previous The text for
583
+ # the label that means “Previous page.”
584
+ # @option locals [String] :label_next The text for the
585
+ # label that means “Next page.”
586
+ # @return [String] A `<div>` containing the links.
331
587
  #--------------------------------------------------------
332
588
  def nav_prev_next(locals = {})
333
589
  locals[:klass] = locals.delete(:class) if locals.key?(:class)
@@ -336,14 +592,18 @@ class MiddlemanPageGroups < ::Middleman::Extension
336
592
 
337
593
 
338
594
  #--------------------------------------------------------
339
- # nav_toc_index( locals )
340
- # Generate a nested table of contents.
341
- # locals:
342
- # [:start] == top-level starting resource.
343
- # [:klass] == class name for the list's <div>
344
- # Note in this case we're going to not use the haml
345
- # template because render won't support the recursion
346
- # we need.
595
+ # Generate a nested `<ul>` structure representing the
596
+ # complete table of contents from any particular
597
+ # starting point.
598
+ # @param [Hash] locals A hash of key-value pairs that
599
+ # are passed to the structure as local variables.
600
+ # @option locals [String] :klass The `class` attribute
601
+ # value that should be assigned to the containing
602
+ # element.
603
+ # @option locals [Sitemap::Resource] :start The resource
604
+ # from which to start the list. If not specified,
605
+ # then this resource will be used as the root.
606
+ # @return [String] An `<ul>` containing the list.
347
607
  #--------------------------------------------------------
348
608
  def nav_toc_index( locals = {} )
349
609
  recurse = locals.key?(:recurse) && locals[:recurse]
@@ -379,47 +639,146 @@ class MiddlemanPageGroups < ::Middleman::Extension
379
639
 
380
640
 
381
641
  #########################################################
382
- # expose selected defaults
383
- # We want our templates to be able to access the
384
- # extension options for default settings in partials.
642
+ # @!macro [new] class_helpers
643
+ # Both the built-in helpers and the partials (if you
644
+ # install them) use these helpers in order to access the
645
+ # configuration values. When writing your own partials
646
+ # it is generally unnecessary to use these helpers; you
647
+ # can simply assign your own class name.
648
+ #
649
+ # The provided helpers and partials use CSS classes, and
650
+ # if the class names collide with your own class names
651
+ # or fail to meet with your naming standards, then they
652
+ # can be changed using the extension options.
385
653
  #########################################################
386
654
 
655
+
656
+ #--------------------------------------------------------
657
+ # Returns the value of the the extension option
658
+ # `options[:nav_breadcrumbs_class]`.
659
+ #
660
+ # @!macro class_helpers
661
+ #
662
+ # @return [String] Returns the name of the class.
663
+ # @group CSS Class Helpers
664
+ #--------------------------------------------------------
387
665
  def nav_breadcrumbs_class
388
666
  extensions[:MiddlemanPageGroups].options[:nav_breadcrumbs_class]
389
667
  end
390
668
 
669
+ #--------------------------------------------------------
670
+ # Returns the value of the the extension option
671
+ # `options[:nav_breadcrumbs_alt_class]`.
672
+ #
673
+ # @!macro class_helpers
674
+ #
675
+ # @return [String] Returns the name of the class.
676
+ # @group CSS Class Helpers
677
+ #--------------------------------------------------------
391
678
  def nav_breadcrumbs_alt_class
392
679
  extensions[:MiddlemanPageGroups].options[:nav_breadcrumbs_alt_class]
393
680
  end
394
681
 
682
+ #--------------------------------------------------------
683
+ # Returns the value of the the extension option
684
+ # `options[:nav_breadcrumbs_alt_label]`.
685
+ #
686
+ # @!macro class_helpers
687
+ #
688
+ # @return [String] Returns the name of the class.
689
+ # @group CSS Class Helpers
690
+ #--------------------------------------------------------
395
691
  def nav_breadcrumbs_alt_label
396
692
  extensions[:MiddlemanPageGroups].options[:nav_breadcrumbs_alt_label]
397
693
  end
398
694
 
695
+ #--------------------------------------------------------
696
+ # Returns the value of the the extension option
697
+ # `options[:nav_brethren_class]`.
698
+ #
699
+ # @!macro class_helpers
700
+ #
701
+ # @return [String] Returns the name of the class.
702
+ # @group CSS Class Helpers
703
+ #--------------------------------------------------------
399
704
  def nav_brethren_class
400
705
  extensions[:MiddlemanPageGroups].options[:nav_brethren_class]
401
706
  end
402
707
 
708
+ #--------------------------------------------------------
709
+ # Returns the value of the the extension option
710
+ # `options[:nav_brethren_index_class]`.
711
+ #
712
+ # @!macro class_helpers
713
+ #
714
+ # @return [String] Returns the name of the class.
715
+ # @group CSS Class Helpers
716
+ #--------------------------------------------------------
403
717
  def nav_brethren_index_class
404
718
  extensions[:MiddlemanPageGroups].options[:nav_brethren_index_class]
405
719
  end
406
720
 
721
+ #--------------------------------------------------------
722
+ # Returns the value of the the extension option
723
+ # `options[:nav_legitimate_children_class]`.
724
+ #
725
+ # @!macro class_helpers
726
+ #
727
+ # @return [String] Returns the name of the class.
728
+ # @group CSS Class Helpers
729
+ #--------------------------------------------------------
407
730
  def nav_legitimate_children_class
408
731
  extensions[:MiddlemanPageGroups].options[:nav_legitimate_children_class]
409
732
  end
410
733
 
734
+ #--------------------------------------------------------
735
+ # Returns the value of the the extension option
736
+ # `options[:nav_prev_next_class]`.
737
+ #
738
+ # @!macro class_helpers
739
+ #
740
+ # @return [String] Returns the name of the class.
741
+ # @group CSS Class Helpers
742
+ #--------------------------------------------------------
411
743
  def nav_prev_next_class
412
744
  extensions[:MiddlemanPageGroups].options[:nav_prev_next_class]
413
745
  end
414
746
 
747
+ #--------------------------------------------------------
748
+ # Returns the value of the the extension option
749
+ # `options[:nav_prev_next_label_prev]`.
750
+ #
751
+ # @!macro class_helpers
752
+ #
753
+ # @return [String] Returns the name of the class.
754
+ # @group CSS Class Helpers
755
+ #--------------------------------------------------------
415
756
  def nav_prev_next_label_prev
416
757
  extensions[:MiddlemanPageGroups].options[:nav_prev_next_label_prev]
417
758
  end
418
759
 
760
+ #--------------------------------------------------------
761
+ # Returns the value of the the extension option
762
+ # `options[:nav_prev_next_label_next]`.
763
+ #
764
+ # @!macro class_helpers
765
+ #
766
+ # @return [String] Returns the name of the class.
767
+ # @group CSS Class Helpers
768
+ #--------------------------------------------------------
419
769
  def nav_prev_next_label_next
420
770
  extensions[:MiddlemanPageGroups].options[:nav_prev_next_label_next]
421
771
  end
422
772
 
773
+ #--------------------------------------------------------
774
+ # Returns the value of the the extension option
775
+ # `options[:nav_toc_index_class]`.
776
+ #
777
+ # @!macro class_helpers
778
+ #
779
+ # @return [String] Returns the name of the class.
780
+ # @group CSS Class Helpers
781
+ #--------------------------------------------------------
423
782
  def nav_toc_index_class
424
783
  extensions[:MiddlemanPageGroups].options[:nav_breadcrumbs_alt_class]
425
784
  end
@@ -427,5 +786,4 @@ class MiddlemanPageGroups < ::Middleman::Extension
427
786
 
428
787
  end #helpers
429
788
 
430
-
431
789
  end # class MiddlemanPageGroups