guides_style_18f 0.1.10 → 0.1.11

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4ec06589d99c8ef75a5ca6fe9c89ec8851294fc9
4
- data.tar.gz: 452a1cd611819aaed7b7adf051c3ac2921a543c3
3
+ metadata.gz: b865432024e19d9efd28bbd172864cbd05617067
4
+ data.tar.gz: 5c90ae1698a6598a898aa00af9660913d9a14784
5
5
  SHA512:
6
- metadata.gz: 368e204227dcb1711ff7579b4b407e89846f2284e58dc543845107483b2723075c0dc7a7f5ec46dbc85f41abf0573043bdf744695d6e62f5fc4a9b6d402f4166
7
- data.tar.gz: 5cea0ecbd854accbf789b551e308a92c500cbfdf41791e76ac0bdb223a924e27c647b9e224652f730022ce3a99aac89afdc2291c58f664f3b0324b3baec9cb23
6
+ metadata.gz: 421affe591c3bbc4b6551b4362281aa5abdd1cbc44989c55e909f6dd1a8ac071a5726b00706f45e336fee7a4e270fd08134325505dcaf491ea836baa19a19abb
7
+ data.tar.gz: 33cf1a0b7ffe68fbcc3a2dabb0da5853024a3e5e596c4dfe52b3f5ff84305a6e141f6dc4d25ea5eb9ce1d0925a6cfa4a9be0d030c1d70602aff05c2a4eba7ab0
@@ -1,13 +1,18 @@
1
1
  # @author Mike Bland (michael.bland@gsa.gov)
2
2
 
3
+ require 'jekyll'
3
4
  require 'safe_yaml'
4
5
 
5
6
  module GuidesStyle18F
6
7
  module FrontMatter
7
8
  def self.load(basedir)
8
- Dir[File.join basedir, 'pages', '**', '*.md'].map do |f|
9
- [f[basedir.size + 1..-1], SafeYAML.load_file(f, safe: true)]
10
- end.to_h
9
+ # init_file_to_front_matter_map is initializing the map with a nil value
10
+ # for every file that _should_ contain front matter as far as the
11
+ # navigation menu is concerned. Any nil values that remain after merging
12
+ # with the site_file_to_front_matter map will result in a validation
13
+ # error.
14
+ init_file_to_front_matter_map(basedir).merge(
15
+ site_file_to_front_matter(init_site(basedir)))
11
16
  end
12
17
 
13
18
  def self.validate_with_message_upon_error(front_matter)
@@ -23,17 +28,76 @@ module GuidesStyle18F
23
28
 
24
29
  def self.validate(front_matter)
25
30
  front_matter.map do |file, data|
26
- next [file, ['no front matter defined']] unless data.instance_of? Hash
31
+ next [file, ['no front matter defined']] if data.nil?
27
32
  errors = missing_property_errors(data) + permalink_errors(data)
28
33
  [file, errors] unless errors.empty?
29
34
  end.compact.to_h
30
35
  end
31
36
 
37
+ private
38
+
39
+ def self.init_site(basedir)
40
+ Dir.chdir(basedir) do
41
+ config = SafeYAML.load_file('_config.yml', safe: true)
42
+ adjust_config_paths(basedir, config)
43
+ site = Jekyll::Site.new(Jekyll.configuration(config))
44
+ site.reset
45
+ site.read
46
+ site
47
+ end
48
+ end
49
+
50
+ def self.adjust_config_paths(basedir, config)
51
+ source = config['source']
52
+ config['source'] = source.nil? ? basedir : File.join(basedir, source)
53
+ destination = config['destination']
54
+ destination = '_site' if destination.nil?
55
+ config['destination'] = File.join(basedir, destination)
56
+ end
57
+
58
+ def self.site_file_to_front_matter(site)
59
+ site_pages(site).map do |page|
60
+ [page.relative_path, page.data]
61
+ end.to_h
62
+ end
63
+
64
+ # We're supporting two possible configurations:
65
+ #
66
+ # - a `pages/` directory in which documents appear as part of the regular
67
+ # site.pages collection; we have to filter by page.relative_path, and we
68
+ # do not assign a permalink so that validation (in a later step) will
69
+ # ensure that each page has a permalink assigned
70
+ #
71
+ # - an actual `pages` collection, stored in a `_pages` directory; no
72
+ # filtering is necessary, and we can reliably set the permalink to
73
+ # page.url as a default
74
+ def self.site_pages(site)
75
+ pages = site.collections['pages']
76
+ if pages.nil?
77
+ site.pages.select do |page|
78
+ page.relative_path.start_with?('/pages') || page.url == '/'
79
+ end
80
+ else
81
+ pages.docs.each { |page| page.data['permalink'] ||= page.url }
82
+ end
83
+ end
84
+
85
+ def self.init_file_to_front_matter_map(basedir)
86
+ file_to_front_matter = {}
87
+ Dir.chdir(basedir) do
88
+ pages_dir = Dir.exist?('_pages') ? '_pages' : 'pages'
89
+ Dir[File.join(pages_dir, '**', '*')].each do |file_name|
90
+ next unless File.file?(file_name)
91
+ file_to_front_matter[file_name] = nil
92
+ end
93
+ end
94
+ file_to_front_matter
95
+ end
96
+
32
97
  def self.missing_property_errors(data)
33
98
  properties = %w(title permalink)
34
99
  properties.map { |p| "no `#{p}:` property" unless data[p] }.compact
35
100
  end
36
- private_class_method :missing_property_errors
37
101
 
38
102
  def self.permalink_errors(data)
39
103
  pl = data['permalink']
@@ -43,7 +107,6 @@ module GuidesStyle18F
43
107
  errors << "`permalink:` does not end with '/'" unless pl.end_with? '/'
44
108
  errors
45
109
  end
46
- private_class_method :permalink_errors
47
110
  end
48
111
 
49
112
  # Automatically updates the `navigation:` field in _config.yml.
@@ -60,6 +123,8 @@ module GuidesStyle18F
60
123
  write_navigation_data_to_config_file config_path, nav_data
61
124
  end
62
125
 
126
+ private
127
+
63
128
  def self.update_navigation_data(nav_data, basedir)
64
129
  pages_data = pages_front_matter basedir
65
130
  children = pages_data['children'].map { |child| child['title'].downcase }
@@ -67,7 +132,6 @@ module GuidesStyle18F
67
132
  update_parent_nav_data nav_data, pages_data['parents']
68
133
  add_children_to_parents nav_data, pages_data['children']
69
134
  end
70
- private_class_method :update_navigation_data
71
135
 
72
136
  def self.pages_front_matter(basedir)
73
137
  front_matter = FrontMatter.load basedir
@@ -79,7 +143,6 @@ module GuidesStyle18F
79
143
  %w(parents children).each { |category| pages_data[category] ||= [] }
80
144
  pages_data
81
145
  end
82
- private_class_method :pages_front_matter
83
146
 
84
147
  def self.update_parent_nav_data(nav_data, parents)
85
148
  nav_by_title = nav_data_by_title nav_data
@@ -93,27 +156,29 @@ module GuidesStyle18F
93
156
  end
94
157
  end
95
158
  end
96
- private_class_method :update_parent_nav_data
97
159
 
98
160
  def self.nav_data_by_title(nav_data)
99
161
  nav_data.map { |nav| [nav['text'].downcase, nav] }.to_h
100
162
  end
101
- private_class_method :nav_data_by_title
102
163
 
103
164
  def self.page_nav(front_matter)
104
- { 'text' => front_matter['title'],
105
- 'url' => "#{front_matter['permalink'].split('/').last}/",
165
+ url_components = front_matter['permalink'].split('/')[1..-1]
166
+ result = {
167
+ 'text' => front_matter['title'],
168
+ 'url' => "#{url_components.nil? ? '' : url_components.last}/",
106
169
  'internal' => true,
107
170
  }
171
+ # Delete the root URL so we don't have an empty `url:` property laying
172
+ # around.
173
+ result.delete 'url' if result['url'] == '/'
174
+ result
108
175
  end
109
- private_class_method :page_nav
110
176
 
111
177
  def self.add_children_to_parents(nav_data, children)
112
178
  parents_by_title = nav_data_by_title nav_data
113
179
  children.each { |child| add_child_to_parent child, parents_by_title }
114
180
  nav_data
115
181
  end
116
- private_class_method :add_children_to_parents
117
182
 
118
183
  def self.add_child_to_parent(child, parents_by_title)
119
184
  child_nav_data = page_nav child
@@ -128,7 +193,6 @@ module GuidesStyle18F
128
193
  children << child_nav_data
129
194
  end
130
195
  end
131
- private_class_method :add_child_to_parent
132
196
 
133
197
  def self.parent(child, parents_by_title)
134
198
  parent = parents_by_title[child['parent'].downcase]
@@ -136,7 +200,6 @@ module GuidesStyle18F
136
200
  fail StandardError, 'Parent page not present in existing ' \
137
201
  "config: \"#{child['parent']}\" needed by: \"#{child['title']}\""
138
202
  end
139
- private_class_method :parent
140
203
 
141
204
  def self.write_navigation_data_to_config_file(config_path, nav_data)
142
205
  lines = []
@@ -146,7 +209,6 @@ module GuidesStyle18F
146
209
  end
147
210
  File.write config_path, lines.join
148
211
  end
149
- private_class_method :write_navigation_data_to_config_file
150
212
 
151
213
  def self.process_line(line, lines, nav_data, in_navigation = false)
152
214
  if !in_navigation && line.start_with?('navigation:')
@@ -160,5 +222,4 @@ module GuidesStyle18F
160
222
  end
161
223
  in_navigation
162
224
  end
163
- private_class_method :process_line
164
225
  end
@@ -5,13 +5,13 @@ require 'fileutils'
5
5
 
6
6
  module GuidesStyle18F
7
7
  TEMPLATE_FILES = %w(
8
- pages/baseurl.md
9
- pages/child-page.md
10
- pages/config.md
11
- pages/github.md
12
- pages/images.md
13
- pages/new-page.md
14
- pages/posting.md
8
+ _pages/add-a-new-page/make-a-child-page.md
9
+ _pages/add-a-new-page.md
10
+ _pages/add-images.md
11
+ _pages/github-setup.md
12
+ _pages/post-your-guide.md
13
+ _pages/update-the-config-file/understanding-baseurl.md
14
+ _pages/update-the-config-file.md
15
15
  images/18f-pages.png
16
16
  images/description.png
17
17
  images/gh-add-guide.png
@@ -1,5 +1,5 @@
1
1
  # @author Mike Bland (michael.bland@gsa.gov)
2
2
 
3
3
  module GuidesStyle18F
4
- VERSION = '0.1.10'
4
+ VERSION = '0.1.11'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: guides_style_18f
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.10
4
+ version: 0.1.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Bland
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-05 00:00:00.000000000 Z
11
+ date: 2016-01-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll