govuk_tech_docs 2.0.13 → 2.2.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of govuk_tech_docs might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.github/pull_request_template.md +1 -0
- data/.ruby-version +1 -1
- data/.travis.yml +3 -0
- data/CHANGELOG.md +54 -1
- data/README.md +15 -22
- data/example/.ruby-version +1 -1
- data/example/source/index.html.md.erb +1 -0
- data/example/source/prevent-index-page.html.md +10 -0
- data/govuk_tech_docs.gemspec +1 -7
- data/lib/assets/javascripts/_modules/search.js +13 -2
- data/lib/assets/javascripts/_modules/table-of-contents.js +9 -14
- data/lib/assets/stylesheets/modules/_page-review.scss +3 -5
- data/lib/assets/stylesheets/modules/_search.scss +47 -9
- data/lib/assets/stylesheets/modules/_technical-documentation.scss +11 -2
- data/lib/assets/stylesheets/modules/_toc.scss +12 -2
- data/lib/govuk_tech_docs/api_reference/api_reference_extension.rb +0 -1
- data/lib/govuk_tech_docs/api_reference/api_reference_renderer.rb +70 -186
- data/lib/govuk_tech_docs/api_reference/templates/api_reference_full.html.erb +3 -2
- data/lib/govuk_tech_docs/api_reference/templates/operation.html.erb +1 -1
- data/lib/govuk_tech_docs/api_reference/templates/parameters.html.erb +1 -1
- data/lib/govuk_tech_docs/api_reference/templates/responses.html.erb +1 -1
- data/lib/govuk_tech_docs/api_reference/templates/schema.html.erb +12 -12
- data/lib/govuk_tech_docs/meta_tags.rb +27 -8
- data/lib/govuk_tech_docs/tech_docs_html_renderer.rb +75 -1
- data/lib/govuk_tech_docs/version.rb +1 -1
- data/lib/source/images/search-button.png +0 -0
- data/lib/source/layouts/_search.erb +10 -4
- data/lib/source/layouts/core.erb +7 -10
- data/package-lock.json +3 -3
- metadata +7 -74
@@ -9,7 +9,7 @@
|
|
9
9
|
<tr>
|
10
10
|
<td><%= key %></td>
|
11
11
|
<td>
|
12
|
-
<%=
|
12
|
+
<%= response.description_html %>
|
13
13
|
<% if response.content['application/json']
|
14
14
|
if response.content['application/json']["example"]
|
15
15
|
request_body = json_prettyprint(response.content['application/json']["example"])
|
@@ -1,26 +1,26 @@
|
|
1
1
|
<h3 id="<%= id = 'schema-' + title; id.parameterize %>"><%= title %></h3>
|
2
|
-
<%=
|
2
|
+
<%= schema.description_html %>
|
3
3
|
<% if properties.any? %>
|
4
|
-
<table>
|
4
|
+
<table class='<%= id.parameterize %>'>
|
5
5
|
<thead>
|
6
6
|
<tr><th>Name</th><th>Type</th><th>Required</th><th>Description</th><th>Schema</th></tr>
|
7
7
|
</thead>
|
8
8
|
<tbody>
|
9
|
-
<% properties.each do |
|
9
|
+
<% properties.each do |property_name, property_attributes| %>
|
10
10
|
<tr>
|
11
|
-
<td><%=
|
12
|
-
<td><%=
|
13
|
-
<td><%=
|
14
|
-
<td><%=
|
11
|
+
<td><%= property_name %></td>
|
12
|
+
<td><%= property_attributes.type %></td>
|
13
|
+
<td><%= schema.requires?(property_name) %></td>
|
14
|
+
<td><%= property_attributes.description_html %></td>
|
15
15
|
<td>
|
16
16
|
<%=
|
17
|
-
|
17
|
+
linked_schema = property_attributes
|
18
18
|
# If property is an array, check the items property for a reference.
|
19
|
-
if
|
20
|
-
|
19
|
+
if property_attributes.type == 'array'
|
20
|
+
linked_schema = property_attributes['items']
|
21
21
|
end
|
22
|
-
# Only print a link if it's a
|
23
|
-
get_schema_link(
|
22
|
+
# Only print a link if it's a named schema
|
23
|
+
get_schema_link(linked_schema) if linked_schema.name %>
|
24
24
|
</td>
|
25
25
|
</tr>
|
26
26
|
<% end %>
|
@@ -8,12 +8,8 @@ module GovukTechDocs
|
|
8
8
|
def tags
|
9
9
|
all_tags = {
|
10
10
|
"description" => page_description,
|
11
|
-
"
|
12
|
-
"
|
13
|
-
"og:site_name" => site_name,
|
14
|
-
"og:title" => page_title,
|
15
|
-
"og:type" => "object",
|
16
|
-
"og:url" => canonical_url,
|
11
|
+
"google-site-verification" => google_site_verification,
|
12
|
+
"robots" => robots,
|
17
13
|
"twitter:card" => "summary",
|
18
14
|
"twitter:domain" => URI.parse(host).host,
|
19
15
|
"twitter:image" => page_image,
|
@@ -24,6 +20,21 @@ module GovukTechDocs
|
|
24
20
|
Hash[all_tags.select { |_k, v| v }]
|
25
21
|
end
|
26
22
|
|
23
|
+
# OpenGraph uses the non-standard property attribute instead of name, so we
|
24
|
+
# return these separately so we can output them correctly.
|
25
|
+
def opengraph_tags
|
26
|
+
all_opengraph_tags = {
|
27
|
+
"og:description" => page_description,
|
28
|
+
"og:image" => page_image,
|
29
|
+
"og:site_name" => site_name,
|
30
|
+
"og:title" => page_title,
|
31
|
+
"og:type" => "object",
|
32
|
+
"og:url" => canonical_url,
|
33
|
+
}
|
34
|
+
|
35
|
+
Hash[all_opengraph_tags.select { |_k, v| v }]
|
36
|
+
end
|
37
|
+
|
27
38
|
def browser_title
|
28
39
|
[page_title, site_name].select(&:present?).uniq.join(" - ")
|
29
40
|
end
|
@@ -45,11 +56,19 @@ module GovukTechDocs
|
|
45
56
|
end
|
46
57
|
|
47
58
|
def page_description
|
48
|
-
locals[:description] || frontmatter
|
59
|
+
locals[:description] || frontmatter[:description]
|
49
60
|
end
|
50
61
|
|
51
62
|
def page_title
|
52
|
-
locals[:title] || frontmatter
|
63
|
+
locals[:title] || frontmatter[:title]
|
64
|
+
end
|
65
|
+
|
66
|
+
def robots
|
67
|
+
"noindex" if config[:tech_docs][:prevent_indexing] || frontmatter[:prevent_indexing]
|
68
|
+
end
|
69
|
+
|
70
|
+
def google_site_verification
|
71
|
+
config[:tech_docs][:google_site_verification]
|
53
72
|
end
|
54
73
|
|
55
74
|
def host
|
@@ -20,7 +20,7 @@ module GovukTechDocs
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def image(link, *args)
|
23
|
-
%(<a href="#{link}"
|
23
|
+
%(<a href="#{link}" rel="noopener noreferrer">#{super}</a>)
|
24
24
|
end
|
25
25
|
|
26
26
|
def table(header, body)
|
@@ -30,5 +30,79 @@ module GovukTechDocs
|
|
30
30
|
</table>
|
31
31
|
</div>)
|
32
32
|
end
|
33
|
+
|
34
|
+
def table_row(body)
|
35
|
+
# Post-processing the table_cell HTML to implement row headings.
|
36
|
+
#
|
37
|
+
# Doing this in table_row instead of table_cell is a hack.
|
38
|
+
#
|
39
|
+
# Ideally, we'd use the table_cell callback like:
|
40
|
+
#
|
41
|
+
# def table_cell(content, alignment, header)
|
42
|
+
# if header
|
43
|
+
# "<th>#{content}</th>"
|
44
|
+
# elsif content.start_with? "# "
|
45
|
+
# "<th scope="row">#{content.sub(/^# /, "")}</th>"
|
46
|
+
# else
|
47
|
+
# "<td>#{content}</td>"
|
48
|
+
# end
|
49
|
+
# end
|
50
|
+
#
|
51
|
+
# Sadly, Redcarpet's table_cell callback doesn't allow you to distinguish
|
52
|
+
# table cells and table headings until https://github.com/vmg/redcarpet/commit/27dfb2a738a23aadd286ac9e7ecd61c4545d29de
|
53
|
+
# (which is not yet released). This means we can't use the table_cell callback
|
54
|
+
# without breaking column headers, so we're having to hack it in table_row.
|
55
|
+
|
56
|
+
fragment = Nokogiri::HTML::DocumentFragment.parse(body)
|
57
|
+
fragment.children.each do |cell|
|
58
|
+
next unless cell.name == "td"
|
59
|
+
next if cell.children.empty?
|
60
|
+
|
61
|
+
first_child = cell.children.first
|
62
|
+
next unless first_child.text?
|
63
|
+
|
64
|
+
leading_text = first_child.content
|
65
|
+
next unless leading_text.start_with?("#")
|
66
|
+
|
67
|
+
cell.name = "th"
|
68
|
+
cell["scope"] = "row"
|
69
|
+
first_child.content = leading_text.sub(/# */, "")
|
70
|
+
end
|
71
|
+
|
72
|
+
tr = Nokogiri::XML::Node.new "tr", fragment
|
73
|
+
tr.children = fragment.children
|
74
|
+
|
75
|
+
tr.to_html
|
76
|
+
end
|
77
|
+
|
78
|
+
def block_code(text, lang)
|
79
|
+
if defined?(super)
|
80
|
+
# Post-processing the block_code HTML to implement tabbable code blocks.
|
81
|
+
#
|
82
|
+
# Middleman monkey patches the Middleman::Renderers::MiddlemanRedcarpetHTML
|
83
|
+
# to include Middleman::Syntax::RedcarpetCodeRenderer. This defines its own
|
84
|
+
# version of `block_code(text, lang)` which we can call with `super`.
|
85
|
+
|
86
|
+
fragment = Nokogiri::HTML::DocumentFragment.parse(super)
|
87
|
+
fragment.traverse do |element|
|
88
|
+
if element.name == "pre" && element["tabindex"].nil?
|
89
|
+
element["tabindex"] = "0"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
fragment.to_html
|
93
|
+
else
|
94
|
+
# If syntax highlighting with redcarpet isn't enabled, super will not
|
95
|
+
# be `defined?`, so we can jump straight to rendering HTML ourselves.
|
96
|
+
|
97
|
+
fragment = Nokogiri::HTML::DocumentFragment.parse("")
|
98
|
+
pre = Nokogiri::XML::Node.new "pre", fragment
|
99
|
+
pre["tabindex"] = "0"
|
100
|
+
code = Nokogiri::XML::Node.new "code", fragment
|
101
|
+
code["class"] = lang
|
102
|
+
code.content = text
|
103
|
+
pre.add_child code
|
104
|
+
pre.to_html
|
105
|
+
end
|
106
|
+
end
|
33
107
|
end
|
34
108
|
end
|
Binary file
|
@@ -1,16 +1,22 @@
|
|
1
1
|
<% if config[:tech_docs][:enable_search] %>
|
2
2
|
<div class="search" data-module="search">
|
3
|
-
<form action="https://www.google.co.uk/search" method="get" role="search">
|
3
|
+
<form action="https://www.google.co.uk/search" method="get" role="search" class="search__form govuk-!-margin-bottom-4">
|
4
4
|
<input type="hidden" name="as_sitesearch" value="<%= config[:tech_docs][:host] %>"/>
|
5
|
-
<label class="govuk-label search__label" for="search">
|
5
|
+
<label class="govuk-label search__label" for="search" aria-hidden="true">
|
6
6
|
Search (via Google)
|
7
7
|
</label>
|
8
|
-
<input
|
8
|
+
<input
|
9
|
+
type="text"
|
10
|
+
id="search" name="q"
|
11
|
+
class="govuk-input govuk-!-margin-bottom-0 search__input"
|
12
|
+
aria-controls="search-results"
|
13
|
+
placeholder="Search">
|
14
|
+
<button type="submit" class="search__button">Search</button>
|
9
15
|
</form>
|
10
16
|
<div id="search-results" class="search-results" aria-hidden="true" role="dialog" aria-labelledby="search-results-title">
|
11
17
|
<div class="search-results__inner">
|
12
18
|
<button class="search-results__close">Close<span class="search-results__close-label"> search results</span></button>
|
13
|
-
<h2 id="search-results-title" class="search-results__title" aria-live="
|
19
|
+
<h2 id="search-results-title" class="search-results__title" aria-live="assertive" role="alert">Results</h2>
|
14
20
|
<div class="search-results__content"></div>
|
15
21
|
</div>
|
16
22
|
</div>
|
data/lib/source/layouts/core.erb
CHANGED
@@ -4,9 +4,6 @@
|
|
4
4
|
<meta content="IE=edge" http-equiv="X-UA-Compatible">
|
5
5
|
<meta charset="utf-8">
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
|
7
|
-
<% if config[:tech_docs][:prevent_indexing] %>
|
8
|
-
<meta name="robots" content="noindex">
|
9
|
-
<% end %>
|
10
7
|
|
11
8
|
<title><%= meta_tags.browser_title %></title>
|
12
9
|
|
@@ -14,11 +11,11 @@
|
|
14
11
|
|
15
12
|
<link rel="canonical" href="<%= meta_tags.canonical_url %>">
|
16
13
|
|
17
|
-
<%
|
18
|
-
|
14
|
+
<% meta_tags.tags.each do |name, content| %>
|
15
|
+
<%= tag :meta, name: name, content: content %>
|
19
16
|
<% end %>
|
20
17
|
|
21
|
-
<% meta_tags.
|
18
|
+
<% meta_tags.opengraph_tags.each do |property, content| %>
|
22
19
|
<%= tag :meta, property: property, content: content %>
|
23
20
|
<% end %>
|
24
21
|
|
@@ -37,18 +34,18 @@
|
|
37
34
|
|
38
35
|
<% if content_for? :sidebar %>
|
39
36
|
<div id="toc-heading" class="toc-show fixedsticky">
|
40
|
-
<
|
37
|
+
<button type="button" class="toc-show__label js-toc-show" aria-controls="toc">
|
41
38
|
Table of contents <span class="toc-show__icon"></span>
|
42
|
-
</
|
39
|
+
</button>
|
43
40
|
</div>
|
44
41
|
<% end %>
|
45
42
|
|
46
43
|
<div class="app-pane__body"<%= " data-module=\"#{yield_content(:toc_module)}\"" if content_for? :toc_module %>>
|
47
44
|
<% if content_for? :sidebar %>
|
48
45
|
<div class="app-pane__toc">
|
49
|
-
<div class="toc" data-module="table-of-contents">
|
46
|
+
<div class="toc" data-module="table-of-contents" tabindex="-1" aria-label="Table of contents" role="dialog">
|
50
47
|
<%= partial "layouts/search" %>
|
51
|
-
<
|
48
|
+
<button type="button" class="toc__close js-toc-close" aria-controls="toc" aria-label="Hide table of contents"></button>
|
52
49
|
<nav id="toc" class="js-toc-list toc__list" aria-labelledby="toc-heading"<%= " data-module=\"collapsible-navigation\"" if config[:tech_docs][:collapsible_nav] %>>
|
53
50
|
<%= yield_content :sidebar %>
|
54
51
|
</nav>
|
data/package-lock.json
CHANGED
@@ -1108,9 +1108,9 @@
|
|
1108
1108
|
}
|
1109
1109
|
},
|
1110
1110
|
"lodash": {
|
1111
|
-
"version": "4.17.
|
1112
|
-
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.
|
1113
|
-
"integrity": "sha512-
|
1111
|
+
"version": "4.17.19",
|
1112
|
+
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
|
1113
|
+
"integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
|
1114
1114
|
"dev": true
|
1115
1115
|
},
|
1116
1116
|
"loose-envify": {
|
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: govuk_tech_docs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Government Digital Service
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-03-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: activesupport
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: chronic
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -156,28 +142,14 @@ dependencies:
|
|
156
142
|
requirements:
|
157
143
|
- - "~>"
|
158
144
|
- !ruby/object:Gem::Version
|
159
|
-
version: 0.
|
145
|
+
version: 0.9.0
|
160
146
|
type: :runtime
|
161
147
|
prerelease: false
|
162
148
|
version_requirements: !ruby/object:Gem::Requirement
|
163
149
|
requirements:
|
164
150
|
- - "~>"
|
165
151
|
- !ruby/object:Gem::Version
|
166
|
-
version: 0.
|
167
|
-
- !ruby/object:Gem::Dependency
|
168
|
-
name: pry
|
169
|
-
requirement: !ruby/object:Gem::Requirement
|
170
|
-
requirements:
|
171
|
-
- - ">="
|
172
|
-
- !ruby/object:Gem::Version
|
173
|
-
version: '0'
|
174
|
-
type: :runtime
|
175
|
-
prerelease: false
|
176
|
-
version_requirements: !ruby/object:Gem::Requirement
|
177
|
-
requirements:
|
178
|
-
- - ">="
|
179
|
-
- !ruby/object:Gem::Version
|
180
|
-
version: '0'
|
152
|
+
version: 0.9.0
|
181
153
|
- !ruby/object:Gem::Dependency
|
182
154
|
name: redcarpet
|
183
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -192,48 +164,6 @@ dependencies:
|
|
192
164
|
- - "~>"
|
193
165
|
- !ruby/object:Gem::Version
|
194
166
|
version: 3.5.0
|
195
|
-
- !ruby/object:Gem::Dependency
|
196
|
-
name: sass
|
197
|
-
requirement: !ruby/object:Gem::Requirement
|
198
|
-
requirements:
|
199
|
-
- - ">="
|
200
|
-
- !ruby/object:Gem::Version
|
201
|
-
version: '0'
|
202
|
-
type: :runtime
|
203
|
-
prerelease: false
|
204
|
-
version_requirements: !ruby/object:Gem::Requirement
|
205
|
-
requirements:
|
206
|
-
- - ">="
|
207
|
-
- !ruby/object:Gem::Version
|
208
|
-
version: '0'
|
209
|
-
- !ruby/object:Gem::Dependency
|
210
|
-
name: sprockets
|
211
|
-
requirement: !ruby/object:Gem::Requirement
|
212
|
-
requirements:
|
213
|
-
- - "~>"
|
214
|
-
- !ruby/object:Gem::Version
|
215
|
-
version: 4.0.0
|
216
|
-
type: :runtime
|
217
|
-
prerelease: false
|
218
|
-
version_requirements: !ruby/object:Gem::Requirement
|
219
|
-
requirements:
|
220
|
-
- - "~>"
|
221
|
-
- !ruby/object:Gem::Version
|
222
|
-
version: 4.0.0
|
223
|
-
- !ruby/object:Gem::Dependency
|
224
|
-
name: bundler
|
225
|
-
requirement: !ruby/object:Gem::Requirement
|
226
|
-
requirements:
|
227
|
-
- - "~>"
|
228
|
-
- !ruby/object:Gem::Version
|
229
|
-
version: 2.1.4
|
230
|
-
type: :development
|
231
|
-
prerelease: false
|
232
|
-
version_requirements: !ruby/object:Gem::Requirement
|
233
|
-
requirements:
|
234
|
-
- - "~>"
|
235
|
-
- !ruby/object:Gem::Version
|
236
|
-
version: 2.1.4
|
237
167
|
- !ruby/object:Gem::Dependency
|
238
168
|
name: byebug
|
239
169
|
requirement: !ruby/object:Gem::Requirement
|
@@ -327,6 +257,7 @@ extensions: []
|
|
327
257
|
extra_rdoc_files: []
|
328
258
|
files:
|
329
259
|
- ".editorconfig"
|
260
|
+
- ".github/pull_request_template.md"
|
330
261
|
- ".gitignore"
|
331
262
|
- ".nvmrc"
|
332
263
|
- ".rspec"
|
@@ -363,6 +294,7 @@ files:
|
|
363
294
|
- example/source/nested-page/index.html.md
|
364
295
|
- example/source/not-expired-page.html.md
|
365
296
|
- example/source/pets.yml
|
297
|
+
- example/source/prevent-index-page.html.md
|
366
298
|
- example/source/stylesheets/print.css.scss
|
367
299
|
- example/source/stylesheets/screen-old-ie.css.scss
|
368
300
|
- example/source/stylesheets/screen.css.scss
|
@@ -432,6 +364,7 @@ files:
|
|
432
364
|
- lib/source/images/govuk-icn-close@2x.png
|
433
365
|
- lib/source/images/govuk-icn-numbered-list.png
|
434
366
|
- lib/source/images/govuk-icn-numbered-list@2x.png
|
367
|
+
- lib/source/images/search-button.png
|
435
368
|
- lib/source/images/search-result-caret.svg
|
436
369
|
- lib/source/layouts/_analytics.erb
|
437
370
|
- lib/source/layouts/_footer.erb
|