govuk_tech_docs 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +8 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +35 -1
- data/README.md +1 -1
- data/Rakefile +5 -1
- data/docs/configuration.md +65 -33
- data/docs/core-layout.png +0 -0
- data/docs/expired-page.png +0 -0
- data/docs/frontmatter.md +113 -0
- data/docs/layout-layout.png +0 -0
- data/docs/not-expired-page.png +0 -0
- data/example/config.rb +6 -0
- data/example/config/tech-docs.yml +11 -1
- data/example/source/core-layout.html.md.erb +12 -0
- data/example/source/expired-page-with-owner.html.md +10 -0
- data/example/source/expired-page.html.md +9 -0
- data/example/source/headings.html.md +11 -0
- data/example/source/index.html.md.erb +2 -0
- data/example/source/not-expired-page.html.md +9 -0
- data/example/source/templates/proxy_template.html.md +8 -0
- data/govuk_tech_docs.gemspec +3 -0
- data/lib/assets/javascripts/_modules/page-expiry.js +15 -0
- data/lib/assets/javascripts/_start-modules.js +1 -0
- data/lib/assets/stylesheets/_core.scss +2 -0
- data/lib/assets/stylesheets/modules/_contribution-banner.scss +22 -0
- data/lib/assets/stylesheets/modules/_page-review.scss +34 -0
- data/lib/govuk_tech_docs.rb +28 -0
- data/lib/govuk_tech_docs/contribution_banner.rb +52 -0
- data/lib/govuk_tech_docs/meta_tags.rb +67 -0
- data/lib/govuk_tech_docs/page_review.rb +36 -0
- data/lib/govuk_tech_docs/pages.rb +31 -0
- data/lib/govuk_tech_docs/redirects.rb +39 -0
- data/lib/govuk_tech_docs/table_of_contents/helpers.rb +8 -6
- data/lib/govuk_tech_docs/version.rb +1 -1
- data/lib/source/api/pages.json.erb +1 -0
- data/lib/source/layouts/_page_review.erb +18 -0
- data/lib/source/layouts/core.erb +15 -3
- metadata +68 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f5e6745794ab18eb8c628384b868c10edaecfe5a
|
4
|
+
data.tar.gz: 6d93cae1fd2a09c0addc299fa7b43bceecd6208f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c9a3f2c71458829e25e27d0cf79cea3d19e125bafb8e3c2c28827312e2a6d6a4d28cd9b0e01aa999f051f3b0881a081d1b14dbe250e47d6d055ba48765ec1e02
|
7
|
+
data.tar.gz: b77c6acc475897e7423b3067abcc41f339539bd6cd5b4eb85c219fafc6a0cf8de60eec81ce55df3e7469c6a2fecedd0088261edf0c003c860f3935cd03905233
|
data/.rubocop.yml
ADDED
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.4.2
|
data/CHANGELOG.md
CHANGED
@@ -1,11 +1,45 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 1.2.0
|
4
|
+
|
5
|
+
### New feature: redirects
|
6
|
+
|
7
|
+
You can now specify redirects in the frontmatter and `config/tech-docs.yml`.
|
8
|
+
|
9
|
+
You can use this when you change a page URL.
|
10
|
+
|
11
|
+
More info:
|
12
|
+
|
13
|
+
- https://github.com/alphagov/tech-docs-gem/blob/master/docs/configuration.md#redirects
|
14
|
+
- https://github.com/alphagov/tech-docs-gem/blob/master/docs/frontmatter.md#old_paths
|
15
|
+
|
16
|
+
### New feature: contribution banner
|
17
|
+
|
18
|
+
You can now show a block at the bottom of the page that links to
|
19
|
+
the page source on GitHub, so readers can easily contribute back to the documentation.
|
20
|
+
|
21
|
+
https://github.com/alphagov/tech-docs-gem/blob/master/docs/configuration.md#show_contribution_banner
|
22
|
+
|
23
|
+
### New feature: page review system
|
24
|
+
|
25
|
+
An optional page review system to make sure documentation stays up to date.
|
26
|
+
|
27
|
+
More info:
|
28
|
+
|
29
|
+
- https://github.com/alphagov/tech-docs-gem/blob/master/docs/frontmatter.md#last_reviewed_on
|
30
|
+
- https://github.com/alphagov/tech-docs-gem/blob/master/docs/frontmatter.md#owner_slack
|
31
|
+
|
32
|
+
|
33
|
+
### Better meta tags
|
34
|
+
|
35
|
+
Pages now include better meta tags for search engines, Twitter, Facebook and Slack to pick up.
|
36
|
+
|
3
37
|
## 1.1.0
|
4
38
|
|
5
39
|
You can now specify `google_site_verification` in tech-docs.yml. You can use
|
6
40
|
this to verify your site in Google Webmaster tools.
|
7
41
|
|
8
|
-
https://github.com/alphagov/tech-docs-gem/blob/master/docs/configuration.md#google_site_verification
|
42
|
+
https://github.com/alphagov/tech-docs-gem/blob/master/docs/configuration.md#google_site_verification
|
9
43
|
|
10
44
|
## 1.0.0
|
11
45
|
|
data/README.md
CHANGED
@@ -42,6 +42,6 @@ Or, on the command line, run `bundle exec rake jasmine:ci`.
|
|
42
42
|
|
43
43
|
## License
|
44
44
|
|
45
|
-
The gem is available as open source under the terms of the [MIT License](LICENSE
|
45
|
+
The gem is available as open source under the terms of the [MIT License](LICENSE).
|
46
46
|
|
47
47
|
[jas]: https://jasmine.github.io/
|
data/Rakefile
CHANGED
data/docs/configuration.md
CHANGED
@@ -4,44 +4,57 @@ You can configure the site using `config/tech-docs.yml`. [See the PaaS tech docs
|
|
4
4
|
|
5
5
|
These are all the available options:
|
6
6
|
|
7
|
-
## `
|
8
|
-
|
9
|
-
Host to use for canonical URL generation (without trailing slash).
|
7
|
+
## `ga_tracking_id`
|
10
8
|
|
11
|
-
|
9
|
+
Tracking ID from Google Analytics
|
12
10
|
|
13
11
|
```yaml
|
14
|
-
|
12
|
+
ga_tracking_id: UA-XXXX-Y
|
15
13
|
```
|
16
14
|
|
17
|
-
## `
|
15
|
+
## `github_repo`
|
18
16
|
|
19
|
-
|
17
|
+
Your repository. Required if [show_contribution_banner](#show-contribution-banner) is true.
|
20
18
|
|
21
|
-
|
19
|
+
```yaml
|
20
|
+
github_repo: alphagov/example-repo
|
21
|
+
```
|
22
|
+
|
23
|
+
## `google_site_verification`
|
24
|
+
|
25
|
+
Adds a [Google Site Verification code](https://support.google.com/webmasters/answer/35179?hl=en) to the meta tags.
|
22
26
|
|
23
27
|
```yaml
|
24
|
-
|
28
|
+
google_site_verification: TvDTuyvdstyusadrCSDrctyd
|
25
29
|
```
|
26
30
|
|
27
|
-
## `
|
31
|
+
## `header_links`
|
28
32
|
|
29
|
-
|
33
|
+
Right hand side navigation.
|
30
34
|
|
31
35
|
Example:
|
32
36
|
|
33
37
|
```yaml
|
34
|
-
|
38
|
+
header_links:
|
39
|
+
Documentation: /
|
35
40
|
```
|
36
41
|
|
37
|
-
## `
|
42
|
+
## `host`
|
38
43
|
|
39
|
-
|
44
|
+
Host to use for canonical URL generation (without trailing slash).
|
40
45
|
|
41
|
-
|
46
|
+
Example:
|
42
47
|
|
43
48
|
```yaml
|
44
|
-
|
49
|
+
host: https://docs.cloud.service.gov.uk
|
50
|
+
```
|
51
|
+
|
52
|
+
## `max_toc_heading_level`
|
53
|
+
|
54
|
+
Table of contents depth – how many levels to include in the table of contents. If your ToC is too long, reduce this number and we'll only show higher-level headings.
|
55
|
+
|
56
|
+
```yaml
|
57
|
+
max_toc_heading_level: 6
|
45
58
|
```
|
46
59
|
|
47
60
|
## `phase`
|
@@ -50,45 +63,64 @@ service_link: "/"
|
|
50
63
|
phase: "Beta"
|
51
64
|
```
|
52
65
|
|
53
|
-
## `
|
66
|
+
## `prevent_indexing`
|
54
67
|
|
55
|
-
|
68
|
+
Prevent robots from indexing (e.g. whilst in development)
|
56
69
|
|
57
|
-
|
70
|
+
```yaml
|
71
|
+
prevent_indexing: false
|
72
|
+
```
|
73
|
+
|
74
|
+
## `redirects`
|
75
|
+
|
76
|
+
A list of redirects, from old to new location. Use this to set up external
|
77
|
+
redirects or if [setting `old_paths` in the frontmatter](docs/frontmatter.md#old_paths) doesn't work.
|
58
78
|
|
59
79
|
```yaml
|
60
|
-
|
61
|
-
|
80
|
+
redirects:
|
81
|
+
/old-page.html: https://example.org/something-else.html
|
82
|
+
/another/old-page.html: /another/new-page.html
|
62
83
|
```
|
63
84
|
|
64
|
-
## `
|
85
|
+
## `service_name`
|
65
86
|
|
66
|
-
|
87
|
+
The service name in the header.
|
88
|
+
|
89
|
+
Example:
|
67
90
|
|
68
91
|
```yaml
|
69
|
-
|
92
|
+
service_name: "Platform as a Service"
|
70
93
|
```
|
71
94
|
|
72
|
-
## `
|
95
|
+
## `service_link`
|
73
96
|
|
74
|
-
|
97
|
+
What the service name in the header links to.
|
98
|
+
|
99
|
+
default: '/'
|
75
100
|
|
76
101
|
```yaml
|
77
|
-
|
102
|
+
service_link: "/"
|
78
103
|
```
|
79
104
|
|
80
|
-
## `
|
105
|
+
## `show_contribution_banner`
|
81
106
|
|
82
|
-
|
107
|
+
Show a block at the bottom of the page that links to the page source, so readers
|
108
|
+
can easily contribute back to the documentation. If turned on [github_repo](#github-repo) is
|
109
|
+
required.
|
110
|
+
|
111
|
+
Off by default.
|
83
112
|
|
84
113
|
```yaml
|
85
|
-
|
114
|
+
show_contribution_banner: true
|
115
|
+
github_repo: alphagov/example-repo
|
86
116
|
```
|
87
117
|
|
88
|
-
## `
|
118
|
+
## `show_govuk_logo`
|
89
119
|
|
90
|
-
|
120
|
+
Whether to show the GOV.UK crown logo.
|
121
|
+
|
122
|
+
default: `true`
|
91
123
|
|
92
124
|
```yaml
|
93
|
-
|
125
|
+
show_govuk_logo: true
|
94
126
|
```
|
Binary file
|
Binary file
|
data/docs/frontmatter.md
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
# Available frontmatter
|
2
|
+
|
3
|
+
"Frontmatter" allows page-specific variables to be included at the top of a template using YAML. For a general introduction on frontmatter, see the [Middleman frontmatter docs][mm].
|
4
|
+
|
5
|
+
## `last_reviewed_on` and `review_in`
|
6
|
+
|
7
|
+
These attributes determine the date when the page needs to be reviewed next.
|
8
|
+
|
9
|
+
If the page doesn't need to be reviewed, we show a blue box with the last-reviewed date, when it needs review again, and the owner.
|
10
|
+
|
11
|
+
![](not-expired-page.png)
|
12
|
+
|
13
|
+
If the page needs to be reviewed, we show a red box saying the page might not be accurate.
|
14
|
+
|
15
|
+
![](expired-page.png)
|
16
|
+
|
17
|
+
Example:
|
18
|
+
|
19
|
+
```yaml
|
20
|
+
---
|
21
|
+
last_reviewed_on: 2018-01-18
|
22
|
+
review_in: 6 weeks
|
23
|
+
---
|
24
|
+
```
|
25
|
+
|
26
|
+
You can use this in combination with [owner_slack](#owner-slack) to set an owner for the page.
|
27
|
+
|
28
|
+
## `layout`
|
29
|
+
|
30
|
+
The layout of the page.
|
31
|
+
|
32
|
+
```yaml
|
33
|
+
---
|
34
|
+
layout: core
|
35
|
+
---
|
36
|
+
```
|
37
|
+
|
38
|
+
There are 2 available page layouts.
|
39
|
+
|
40
|
+
### The `layout` layout (default)
|
41
|
+
|
42
|
+
By default, pages will use the `layout` layout. This layout will parse the page and generate a sidebar with a table of contents consisting of each `h2`, `h3`, `h4` heading.
|
43
|
+
|
44
|
+
```md
|
45
|
+
---
|
46
|
+
layout: layout
|
47
|
+
---
|
48
|
+
|
49
|
+
# The title
|
50
|
+
|
51
|
+
## A subheader
|
52
|
+
|
53
|
+
### A h3 subheader
|
54
|
+
|
55
|
+
## Another subheader
|
56
|
+
```
|
57
|
+
|
58
|
+
Will generate a page with the headings from the content in the sidebar.
|
59
|
+
|
60
|
+
![](layout-layout.png)
|
61
|
+
|
62
|
+
### `core` layout
|
63
|
+
|
64
|
+
If you want more control about the layout, use `core` layout. This allows you to specify the sidebar manually with a `content_for` block.
|
65
|
+
|
66
|
+
```rb
|
67
|
+
---
|
68
|
+
layout: core
|
69
|
+
---
|
70
|
+
|
71
|
+
<% content_for :sidebar do %>
|
72
|
+
You can put anything in the sidebar.
|
73
|
+
<% end %>
|
74
|
+
|
75
|
+
This page has a configurable sidebar that is independent of the content.
|
76
|
+
```
|
77
|
+
|
78
|
+
![](core-layout.png)
|
79
|
+
|
80
|
+
## `old_paths`
|
81
|
+
|
82
|
+
Any paths of pages that should redirect to this page.
|
83
|
+
|
84
|
+
Example:
|
85
|
+
|
86
|
+
```yaml
|
87
|
+
---
|
88
|
+
old_paths:
|
89
|
+
- /some-old-page.html
|
90
|
+
---
|
91
|
+
```
|
92
|
+
|
93
|
+
## `owner_slack`
|
94
|
+
|
95
|
+
The Slack username or channel of the page owner. This can be used to appoint an individual or team as responsible for keeping the page up to date.
|
96
|
+
|
97
|
+
```yaml
|
98
|
+
---
|
99
|
+
owner_slack: "#operations-teams"
|
100
|
+
---
|
101
|
+
```
|
102
|
+
|
103
|
+
## `title`
|
104
|
+
|
105
|
+
The browser title of the page.
|
106
|
+
|
107
|
+
```yaml
|
108
|
+
---
|
109
|
+
title: My beautiful page
|
110
|
+
---
|
111
|
+
```
|
112
|
+
|
113
|
+
[mm]: https://middlemanapp.com/basics/frontmatter
|
Binary file
|
Binary file
|
data/example/config.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# Host to use for canonical URL generation (without trailing slash)
|
2
|
-
host:
|
2
|
+
host: https://docs.example.com
|
3
3
|
|
4
4
|
# Header-related options
|
5
5
|
show_govuk_logo: true
|
@@ -10,6 +10,9 @@ phase: Beta
|
|
10
10
|
# Links to show on right-hand-side of header
|
11
11
|
header_links:
|
12
12
|
Documentation: /
|
13
|
+
Expired page: /expired-page.html
|
14
|
+
Expired with owner: /expired-page-with-owner.html
|
15
|
+
Not expired page: /not-expired-page.html
|
13
16
|
|
14
17
|
# Tracking ID from Google Analytics (e.g. UA-XXXX-Y)
|
15
18
|
ga_tracking_id:
|
@@ -23,3 +26,10 @@ max_toc_heading_level: 6
|
|
23
26
|
prevent_indexing: false
|
24
27
|
|
25
28
|
google_site_verification: dstbao8TVS^DRVDS&rv76
|
29
|
+
|
30
|
+
show_contribution_banner: true
|
31
|
+
|
32
|
+
github_repo: alphagov/example-repo
|
33
|
+
|
34
|
+
redirects:
|
35
|
+
/something/old.html: /index.html
|
data/govuk_tech_docs.gemspec
CHANGED
@@ -21,6 +21,8 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
22
|
spec.require_paths = ["lib"]
|
23
23
|
|
24
|
+
spec.add_dependency "activesupport"
|
25
|
+
spec.add_dependency "chronic", "~> 0.10.2"
|
24
26
|
spec.add_dependency "middleman", "~> 4.0"
|
25
27
|
spec.add_dependency "middleman-autoprefixer", "~> 2.7.0"
|
26
28
|
spec.add_dependency "middleman-compass", ">= 4.0.0"
|
@@ -33,6 +35,7 @@ Gem::Specification.new do |spec|
|
|
33
35
|
spec.add_development_dependency "bundler", "~> 1.15"
|
34
36
|
spec.add_development_dependency "rake", "~> 10.0"
|
35
37
|
spec.add_development_dependency "capybara", "~> 2.18.0"
|
38
|
+
spec.add_development_dependency "govuk-lint", "~> 3.7.0"
|
36
39
|
spec.add_development_dependency "jasmine", "~> 3.1.0"
|
37
40
|
spec.add_development_dependency "rspec", "~> 3.7.0"
|
38
41
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
(function($, Modules) {
|
2
|
+
'use strict';
|
3
|
+
|
4
|
+
Modules.PageExpiry = function PageExpiry() {
|
5
|
+
this.start = function start($element) {
|
6
|
+
var rawDate = $element.data('last-reviewed-on');
|
7
|
+
var isExpired = Date.parse(rawDate) < new Date();
|
8
|
+
|
9
|
+
if (isExpired) {
|
10
|
+
$element.find('.page-expiry--not-expired').hide(0);
|
11
|
+
$element.find('.page-expiry--expired').show(0);
|
12
|
+
}
|
13
|
+
};
|
14
|
+
};
|
15
|
+
})(jQuery, window.GOVUK.Modules);
|
@@ -24,8 +24,10 @@ $desktop-breakpoint: 992px !default;
|
|
24
24
|
@import "modules/footer";
|
25
25
|
@import "modules/govuk-logo";
|
26
26
|
@import "modules/header";
|
27
|
+
@import "modules/page-review";
|
27
28
|
@import "modules/phase-banner";
|
28
29
|
@import "modules/skip-link";
|
30
|
+
@import "modules/contribution-banner";
|
29
31
|
@import "modules/technical-documentation";
|
30
32
|
@import "modules/toc";
|
31
33
|
|
@@ -0,0 +1,22 @@
|
|
1
|
+
.contribution-banner {
|
2
|
+
padding: 0;
|
3
|
+
max-width: 40em;
|
4
|
+
margin-top: $gutter * 2;
|
5
|
+
margin-left: $gutter-half;
|
6
|
+
margin-right: $gutter-half;
|
7
|
+
|
8
|
+
@include media(tablet) {
|
9
|
+
margin-left: $gutter + 2px;
|
10
|
+
margin-right: $gutter + 2px;
|
11
|
+
}
|
12
|
+
|
13
|
+
a {
|
14
|
+
margin-right: $gutter-half;
|
15
|
+
}
|
16
|
+
|
17
|
+
li {
|
18
|
+
display: inline-block;
|
19
|
+
list-style: none;
|
20
|
+
margin: 2px 0;
|
21
|
+
}
|
22
|
+
}
|
@@ -0,0 +1,34 @@
|
|
1
|
+
.page-expiry--not-expired {
|
2
|
+
padding: $gutter-half;
|
3
|
+
margin-top: $gutter;
|
4
|
+
margin-bottom: $gutter;
|
5
|
+
background-color: $govuk-blue;
|
6
|
+
color: $page-colour;
|
7
|
+
|
8
|
+
@include media(tablet) {
|
9
|
+
padding: $gutter;
|
10
|
+
}
|
11
|
+
|
12
|
+
a:link,
|
13
|
+
a:visited {
|
14
|
+
color: inherit;
|
15
|
+
}
|
16
|
+
|
17
|
+
a:hover {
|
18
|
+
color: $link-hover-colour;
|
19
|
+
}
|
20
|
+
|
21
|
+
a:active {
|
22
|
+
color: $link-active-colour;
|
23
|
+
}
|
24
|
+
}
|
25
|
+
|
26
|
+
.page-expiry--expired {
|
27
|
+
display: none;
|
28
|
+
|
29
|
+
padding: $gutter-half;
|
30
|
+
margin-top: $gutter * 2;
|
31
|
+
background-color: $error-background;
|
32
|
+
border: 1px solid $error-colour;
|
33
|
+
color: $error-colour;
|
34
|
+
}
|
data/lib/govuk_tech_docs.rb
CHANGED
@@ -7,8 +7,15 @@ require 'middleman-livereload'
|
|
7
7
|
require 'middleman-syntax'
|
8
8
|
|
9
9
|
require 'nokogiri'
|
10
|
+
require 'chronic'
|
11
|
+
require 'active_support/all'
|
10
12
|
|
13
|
+
require 'govuk_tech_docs/redirects'
|
11
14
|
require 'govuk_tech_docs/table_of_contents/helpers'
|
15
|
+
require 'govuk_tech_docs/contribution_banner'
|
16
|
+
require 'govuk_tech_docs/meta_tags'
|
17
|
+
require 'govuk_tech_docs/page_review'
|
18
|
+
require 'govuk_tech_docs/pages'
|
12
19
|
require 'govuk_tech_docs/tech_docs_html_renderer'
|
13
20
|
require 'govuk_tech_docs/unique_identifier_extension'
|
14
21
|
require 'govuk_tech_docs/unique_identifier_generator'
|
@@ -45,10 +52,31 @@ module GovukTechDocs
|
|
45
52
|
|
46
53
|
context.helpers do
|
47
54
|
include GovukTechDocs::TableOfContents::Helpers
|
55
|
+
include GovukTechDocs::ContributionBanner
|
56
|
+
|
57
|
+
def meta_tags
|
58
|
+
@meta_tags ||= GovukTechDocs::MetaTags.new(config, current_page)
|
59
|
+
end
|
60
|
+
|
61
|
+
def current_page_review
|
62
|
+
@current_page_review ||= GovukTechDocs::PageReview.new(current_page)
|
63
|
+
end
|
64
|
+
|
65
|
+
def format_date(date)
|
66
|
+
date.strftime('%-e %B %Y')
|
67
|
+
end
|
48
68
|
end
|
49
69
|
|
50
70
|
context.page '/*.xml', layout: false
|
51
71
|
context.page '/*.json', layout: false
|
52
72
|
context.page '/*.txt', layout: false
|
73
|
+
|
74
|
+
context.ready do
|
75
|
+
redirects = GovukTechDocs::Redirects.new(context).redirects
|
76
|
+
|
77
|
+
redirects.each do |from, to|
|
78
|
+
context.redirect from, to
|
79
|
+
end
|
80
|
+
end
|
53
81
|
end
|
54
82
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module GovukTechDocs
|
2
|
+
# Helper included
|
3
|
+
module ContributionBanner
|
4
|
+
def source_urls
|
5
|
+
SourceUrls.new(current_page, config)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class SourceUrls
|
10
|
+
attr_reader :current_page, :config
|
11
|
+
|
12
|
+
def initialize(current_page, config)
|
13
|
+
@current_page = current_page
|
14
|
+
@config = config
|
15
|
+
end
|
16
|
+
|
17
|
+
def view_source_url
|
18
|
+
override_from_page || source_from_yaml_file || source_from_file
|
19
|
+
end
|
20
|
+
|
21
|
+
def report_issue_url
|
22
|
+
"#{repo_url}/issues/new?labels=bug&title=Re: '#{current_page.data.title}'&body=Problem with '#{current_page.data.title}' (#{config[:tech_docs][:host]}#{current_page.url})"
|
23
|
+
end
|
24
|
+
|
25
|
+
def repo_url
|
26
|
+
"https://github.com/#{config[:tech_docs][:github_repo]}"
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
# If a `page` local exists, see if it has a `source_url`. This is used by the
|
32
|
+
# pages that are created by the proxy system because they can't use frontmatter
|
33
|
+
def override_from_page
|
34
|
+
locals.key?(:page) ? locals[:page].try(:source_url) : false
|
35
|
+
end
|
36
|
+
|
37
|
+
# In the frontmatter we can specify a `source_url`. Use this if the actual
|
38
|
+
# source of the page is in another GitHub repo.
|
39
|
+
def source_from_yaml_file
|
40
|
+
current_page.data.source_url
|
41
|
+
end
|
42
|
+
|
43
|
+
# As the last fallback link to the source file in this repository.
|
44
|
+
def source_from_file
|
45
|
+
"#{repo_url}/blob/master/source/#{current_page.file_descriptor[:relative_path]}"
|
46
|
+
end
|
47
|
+
|
48
|
+
def locals
|
49
|
+
current_page.metadata[:locals]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module GovukTechDocs
|
2
|
+
class MetaTags
|
3
|
+
def initialize(config, current_page)
|
4
|
+
@config = config
|
5
|
+
@current_page = current_page
|
6
|
+
end
|
7
|
+
|
8
|
+
def tags
|
9
|
+
all_tags = {
|
10
|
+
'description' => page_description,
|
11
|
+
'og:description' => page_description,
|
12
|
+
'og:image' => page_image,
|
13
|
+
'og:site_name' => site_name,
|
14
|
+
'og:title' => page_title,
|
15
|
+
'og:type' => 'object',
|
16
|
+
'og:url' => canonical_url,
|
17
|
+
'twitter:card' => 'summary',
|
18
|
+
'twitter:domain' => URI.parse(host).host,
|
19
|
+
'twitter:image' => page_image,
|
20
|
+
'twitter:title' => browser_title,
|
21
|
+
'twitter:url' => canonical_url,
|
22
|
+
}
|
23
|
+
|
24
|
+
Hash[all_tags.select { |_k, v| v }]
|
25
|
+
end
|
26
|
+
|
27
|
+
def browser_title
|
28
|
+
[page_title, site_name].select(&:present?).uniq.join(' | ')
|
29
|
+
end
|
30
|
+
|
31
|
+
def canonical_url
|
32
|
+
"#{host}#{current_page.url}"
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
attr_reader :config, :current_page
|
38
|
+
|
39
|
+
def page_image
|
40
|
+
"#{host}/images/govuk-large.png"
|
41
|
+
end
|
42
|
+
|
43
|
+
def site_name
|
44
|
+
config[:tech_docs][:service_name]
|
45
|
+
end
|
46
|
+
|
47
|
+
def page_description
|
48
|
+
locals[:description] || frontmatter.description
|
49
|
+
end
|
50
|
+
|
51
|
+
def page_title
|
52
|
+
locals[:title] || frontmatter.title
|
53
|
+
end
|
54
|
+
|
55
|
+
def host
|
56
|
+
config[:tech_docs][:host]
|
57
|
+
end
|
58
|
+
|
59
|
+
def locals
|
60
|
+
current_page.metadata[:locals]
|
61
|
+
end
|
62
|
+
|
63
|
+
def frontmatter
|
64
|
+
current_page.data
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module GovukTechDocs
|
2
|
+
class PageReview
|
3
|
+
attr_reader :page
|
4
|
+
|
5
|
+
def initialize(page)
|
6
|
+
@page = page
|
7
|
+
end
|
8
|
+
|
9
|
+
def review_by
|
10
|
+
return unless last_reviewed_on
|
11
|
+
|
12
|
+
@review_by ||= Chronic.parse(
|
13
|
+
"in #{page.data.review_in}",
|
14
|
+
now: last_reviewed_on.to_time
|
15
|
+
).to_date
|
16
|
+
end
|
17
|
+
|
18
|
+
def under_review?
|
19
|
+
page.data.review_in.present?
|
20
|
+
end
|
21
|
+
|
22
|
+
def last_reviewed_on
|
23
|
+
page.data.last_reviewed_on
|
24
|
+
end
|
25
|
+
|
26
|
+
def owner_slack
|
27
|
+
page.data.owner_slack
|
28
|
+
end
|
29
|
+
|
30
|
+
def owner_slack_url
|
31
|
+
# Slack URLs don't have the # (channels) or @ (usernames)
|
32
|
+
slack_identifier = owner_slack.to_s.delete('#').delete('@')
|
33
|
+
"https://govuk.slack.com/messages/#{slack_identifier}"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module GovukTechDocs
|
2
|
+
class Pages
|
3
|
+
attr_reader :sitemap
|
4
|
+
|
5
|
+
def initialize(sitemap, config)
|
6
|
+
@sitemap = sitemap
|
7
|
+
@config = config
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_json
|
11
|
+
as_json.to_json
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def as_json
|
17
|
+
pages.map do |page|
|
18
|
+
{
|
19
|
+
title: page.data.title,
|
20
|
+
url: "#{@config[:tech_docs][:host]}#{page.url}",
|
21
|
+
review_by: PageReview.new(page).review_by,
|
22
|
+
owner_slack: page.data.owner_slack,
|
23
|
+
}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def pages
|
28
|
+
sitemap.resources.select { |page| page.url.end_with?('.html') && page.data.title }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module GovukTechDocs
|
2
|
+
class Redirects
|
3
|
+
LEADING_SLASH = %r[\A\/]
|
4
|
+
|
5
|
+
def initialize(context)
|
6
|
+
@context = context
|
7
|
+
end
|
8
|
+
|
9
|
+
def redirects
|
10
|
+
all_redirects = redirects_from_config + redirects_from_frontmatter
|
11
|
+
|
12
|
+
all_redirects.map do |from, to|
|
13
|
+
# Middleman needs paths without leading slashes
|
14
|
+
[from.sub(LEADING_SLASH, ''), to: to.sub(LEADING_SLASH, '')]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
attr_reader :context
|
21
|
+
|
22
|
+
def redirects_from_config
|
23
|
+
context.config[:tech_docs][:redirects].to_a
|
24
|
+
end
|
25
|
+
|
26
|
+
def redirects_from_frontmatter
|
27
|
+
reds = []
|
28
|
+
context.sitemap.resources.each do |page|
|
29
|
+
next unless page.data.old_paths
|
30
|
+
|
31
|
+
page.data.old_paths.each do |old_path|
|
32
|
+
reds << [old_path, page.path]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
reds
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -8,12 +8,14 @@ module GovukTechDocs
|
|
8
8
|
module TableOfContents
|
9
9
|
module Helpers
|
10
10
|
def table_of_contents(html, max_level: nil)
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
11
|
+
headings = HeadingsBuilder.new(html).headings
|
12
|
+
|
13
|
+
if headings.none? { |heading| heading.size == 1 }
|
14
|
+
raise "No H1 tag found. You have to at least add one H1 heading to the page."
|
15
|
+
end
|
16
|
+
|
17
|
+
tree = HeadingTreeBuilder.new(headings).tree
|
18
|
+
HeadingTreeRenderer.new(tree, max_level: max_level).html
|
17
19
|
end
|
18
20
|
end
|
19
21
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= GovukTechDocs::Pages.new(sitemap, config).to_json %>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<% if current_page_review.under_review? %>
|
2
|
+
<div data-module='page-expiry' data-last-reviewed-on="<%= current_page_review.review_by %>">
|
3
|
+
<div class='page-expiry--not-expired'>
|
4
|
+
This page was last reviewed on <%= format_date current_page_review.last_reviewed_on %>.
|
5
|
+
|
6
|
+
It needs to be reviewed again on <%= format_date current_page_review.review_by %>
|
7
|
+
<% if current_page_review.owner_slack %>
|
8
|
+
by the page owner <%= link_to current_page_review.owner_slack, current_page_review.owner_slack_url %>
|
9
|
+
<% end %>.
|
10
|
+
</div>
|
11
|
+
|
12
|
+
<div class='page-expiry--expired'>
|
13
|
+
This page was set to be reviewed before <%= format_date current_page_review.review_by %><% if current_page_review.owner_slack %>
|
14
|
+
by the page owner <%= link_to current_page_review.owner_slack, current_page_review.owner_slack_url %><% end %>.
|
15
|
+
This might mean the content is out of date.
|
16
|
+
</div>
|
17
|
+
</div>
|
18
|
+
<% end %>
|
data/lib/source/layouts/core.erb
CHANGED
@@ -8,13 +8,12 @@
|
|
8
8
|
<meta name="robots" content="noindex">
|
9
9
|
<% end %>
|
10
10
|
|
11
|
-
|
12
|
-
<title><%= current_page.data.title || "GOV.UK Documentation" %></title>
|
11
|
+
<title><%= meta_tags.browser_title %></title>
|
13
12
|
|
14
13
|
<!--[if gt IE 8]><!--><%= stylesheet_link_tag :screen, media: 'screen' %><!--<![endif]-->
|
15
14
|
<!--[if lte IE 8]><%= stylesheet_link_tag 'screen-old-ie', media: 'screen' %><![endif]-->
|
16
15
|
|
17
|
-
<link rel="canonical" href="<%=
|
16
|
+
<link rel="canonical" href="<%= meta_tags.canonical_url %>">
|
18
17
|
|
19
18
|
<% if config[:tech_docs][:google_site_verification] %>
|
20
19
|
<meta name="google-site-verification" content="<%= config[:tech_docs][:google_site_verification] %>" />
|
@@ -22,6 +21,10 @@
|
|
22
21
|
|
23
22
|
<%= stylesheet_link_tag :print, media: 'print' %>
|
24
23
|
<%= javascript_include_tag :application %>
|
24
|
+
|
25
|
+
<% meta_tags.tags.each do |property, content| %>
|
26
|
+
<%= tag :meta, property: property, content: content %>
|
27
|
+
<% end %>
|
25
28
|
</head>
|
26
29
|
|
27
30
|
<body>
|
@@ -51,8 +54,17 @@
|
|
51
54
|
<div class="app-pane__content toc-open-disabled">
|
52
55
|
<main id="content" class="technical-documentation" data-module="anchored-headings">
|
53
56
|
<%= yield %>
|
57
|
+
<%= partial "layouts/page_review" %>
|
54
58
|
</main>
|
55
59
|
|
60
|
+
<% if config[:tech_docs][:show_contribution_banner] %>
|
61
|
+
<ul class="contribution-banner">
|
62
|
+
<li><%= link_to "View source", source_urls.view_source_url %></li>
|
63
|
+
<li><%= link_to "Report problem", source_urls.report_issue_url %></li>
|
64
|
+
<li><%= link_to "GitHub Repo", source_urls.repo_url %></li>
|
65
|
+
</ul>
|
66
|
+
<% end %>
|
67
|
+
|
56
68
|
<%= partial "layouts/footer" %>
|
57
69
|
</div>
|
58
70
|
</div>
|
metadata
CHANGED
@@ -1,15 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: govuk_tech_docs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
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: 2018-
|
11
|
+
date: 2018-04-06 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
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: chronic
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.10.2
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.10.2
|
13
41
|
- !ruby/object:Gem::Dependency
|
14
42
|
name: middleman
|
15
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -164,6 +192,20 @@ dependencies:
|
|
164
192
|
- - "~>"
|
165
193
|
- !ruby/object:Gem::Version
|
166
194
|
version: 2.18.0
|
195
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: govuk-lint
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - "~>"
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: 3.7.0
|
202
|
+
type: :development
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - "~>"
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: 3.7.0
|
167
209
|
- !ruby/object:Gem::Dependency
|
168
210
|
name: jasmine
|
169
211
|
requirement: !ruby/object:Gem::Requirement
|
@@ -203,6 +245,8 @@ files:
|
|
203
245
|
- ".editorconfig"
|
204
246
|
- ".gitignore"
|
205
247
|
- ".rspec"
|
248
|
+
- ".rubocop.yml"
|
249
|
+
- ".ruby-version"
|
206
250
|
- ".travis.yml"
|
207
251
|
- CHANGELOG.md
|
208
252
|
- Gemfile
|
@@ -210,21 +254,33 @@ files:
|
|
210
254
|
- README.md
|
211
255
|
- Rakefile
|
212
256
|
- docs/configuration.md
|
257
|
+
- docs/core-layout.png
|
258
|
+
- docs/expired-page.png
|
259
|
+
- docs/frontmatter.md
|
260
|
+
- docs/layout-layout.png
|
261
|
+
- docs/not-expired-page.png
|
213
262
|
- example/.ruby-version
|
214
263
|
- example/Gemfile
|
215
264
|
- example/config.rb
|
216
265
|
- example/config/tech-docs.yml
|
266
|
+
- example/source/core-layout.html.md.erb
|
267
|
+
- example/source/expired-page-with-owner.html.md
|
268
|
+
- example/source/expired-page.html.md
|
269
|
+
- example/source/headings.html.md
|
217
270
|
- example/source/index.html.md.erb
|
218
271
|
- example/source/javascripts/application.js
|
272
|
+
- example/source/not-expired-page.html.md
|
219
273
|
- example/source/stylesheets/print.css.scss
|
220
274
|
- example/source/stylesheets/screen-old-ie.css.scss
|
221
275
|
- example/source/stylesheets/screen.css.scss
|
276
|
+
- example/source/templates/proxy_template.html.md
|
222
277
|
- govuk_tech_docs.gemspec
|
223
278
|
- lib/assets/javascripts/_analytics.js
|
224
279
|
- lib/assets/javascripts/_govuk/modules.js
|
225
280
|
- lib/assets/javascripts/_modules/anchored-headings.js
|
226
281
|
- lib/assets/javascripts/_modules/in-page-navigation.js
|
227
282
|
- lib/assets/javascripts/_modules/navigation.js
|
283
|
+
- lib/assets/javascripts/_modules/page-expiry.js
|
228
284
|
- lib/assets/javascripts/_modules/table-of-contents.js
|
229
285
|
- lib/assets/javascripts/_start-modules.js
|
230
286
|
- lib/assets/javascripts/_vendor/fixedsticky.js
|
@@ -256,9 +312,11 @@ files:
|
|
256
312
|
- lib/assets/stylesheets/govuk_frontend_toolkit/design-patterns/_media-player.scss
|
257
313
|
- lib/assets/stylesheets/modules/_anchored-heading.scss
|
258
314
|
- lib/assets/stylesheets/modules/_app-pane.scss
|
315
|
+
- lib/assets/stylesheets/modules/_contribution-banner.scss
|
259
316
|
- lib/assets/stylesheets/modules/_footer.scss
|
260
317
|
- lib/assets/stylesheets/modules/_govuk-logo.scss
|
261
318
|
- lib/assets/stylesheets/modules/_header.scss
|
319
|
+
- lib/assets/stylesheets/modules/_page-review.scss
|
262
320
|
- lib/assets/stylesheets/modules/_phase-banner.scss
|
263
321
|
- lib/assets/stylesheets/modules/_skip-link.scss
|
264
322
|
- lib/assets/stylesheets/modules/_technical-documentation.scss
|
@@ -268,6 +326,11 @@ files:
|
|
268
326
|
- lib/assets/stylesheets/utilities/_printable.scss
|
269
327
|
- lib/assets/stylesheets/vendor/_fixedsticky.scss
|
270
328
|
- lib/govuk_tech_docs.rb
|
329
|
+
- lib/govuk_tech_docs/contribution_banner.rb
|
330
|
+
- lib/govuk_tech_docs/meta_tags.rb
|
331
|
+
- lib/govuk_tech_docs/page_review.rb
|
332
|
+
- lib/govuk_tech_docs/pages.rb
|
333
|
+
- lib/govuk_tech_docs/redirects.rb
|
271
334
|
- lib/govuk_tech_docs/table_of_contents/heading.rb
|
272
335
|
- lib/govuk_tech_docs/table_of_contents/heading_tree.rb
|
273
336
|
- lib/govuk_tech_docs/table_of_contents/heading_tree_builder.rb
|
@@ -278,6 +341,7 @@ files:
|
|
278
341
|
- lib/govuk_tech_docs/unique_identifier_extension.rb
|
279
342
|
- lib/govuk_tech_docs/unique_identifier_generator.rb
|
280
343
|
- lib/govuk_tech_docs/version.rb
|
344
|
+
- lib/source/api/pages.json.erb
|
281
345
|
- lib/source/favicon.ico
|
282
346
|
- lib/source/images/anchored-heading-icon-2x.png
|
283
347
|
- lib/source/images/anchored-heading-icon.png
|
@@ -295,6 +359,7 @@ files:
|
|
295
359
|
- lib/source/layouts/_analytics.erb
|
296
360
|
- lib/source/layouts/_footer.erb
|
297
361
|
- lib/source/layouts/_header.erb
|
362
|
+
- lib/source/layouts/_page_review.erb
|
298
363
|
- lib/source/layouts/core.erb
|
299
364
|
- lib/source/layouts/layout.erb
|
300
365
|
homepage: https://github.com/alphagov/tech-docs-gem
|
@@ -317,7 +382,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
317
382
|
version: '0'
|
318
383
|
requirements: []
|
319
384
|
rubyforge_project:
|
320
|
-
rubygems_version: 2.
|
385
|
+
rubygems_version: 2.6.13
|
321
386
|
signing_key:
|
322
387
|
specification_version: 4
|
323
388
|
summary: Gem to distribute the GOV.UK Tech Docs Template
|