dss_tech_docs 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.editorconfig +29 -0
- data/.gitignore +37 -0
- data/.rspec +2 -0
- data/.rubocop.yml +11 -0
- data/.ruby-version +1 -0
- data/.travis.yml +9 -0
- data/CHANGELOG.md +274 -0
- data/CONTRIBUTING.md +9 -0
- data/Gemfile +4 -0
- data/LICENCE +21 -0
- data/README.md +89 -0
- data/Rakefile +13 -0
- data/docs/configuration.md +205 -0
- data/docs/core-layout-without-sidebar.png +0 -0
- data/docs/core-layout.png +0 -0
- data/docs/expired-page.png +0 -0
- data/docs/frontmatter.md +145 -0
- data/docs/last-reviewed-only.png +0 -0
- data/docs/last-reviewed-only.svg +1 -0
- data/docs/layout-layout.png +0 -0
- data/docs/not-expired-page.png +0 -0
- data/docs/page-expiry.md +85 -0
- data/dss_tech_docs.gemspec +46 -0
- data/example/.ruby-version +1 -0
- data/example/Gemfile +3 -0
- data/example/config.rb +9 -0
- data/example/config/hide-expiry.yml +51 -0
- data/example/config/tech-docs.yml +50 -0
- data/example/source/api-path.html.md +7 -0
- data/example/source/api-reference.html.md +5 -0
- data/example/source/child-of-expired-page.html.md +8 -0
- data/example/source/core-layout-without-sidebar.html.md.erb +7 -0
- 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 +19 -0
- data/example/source/javascripts/application.js +1 -0
- data/example/source/not-expired-page.html.md +9 -0
- data/example/source/pets.yml +109 -0
- data/example/source/stylesheets/print.css.scss +3 -0
- data/example/source/stylesheets/screen-old-ie.css.scss +4 -0
- data/example/source/stylesheets/screen.css.scss +1 -0
- data/example/source/templates/proxy_template.html.md +8 -0
- data/lib/assets/javascripts/_analytics.js +58 -0
- data/lib/assets/javascripts/_govuk/modules.js +57 -0
- data/lib/assets/javascripts/_modules/anchored-headings.js +18 -0
- data/lib/assets/javascripts/_modules/collapsible-navigation.js +95 -0
- data/lib/assets/javascripts/_modules/in-page-navigation.js +132 -0
- data/lib/assets/javascripts/_modules/navigation.js +34 -0
- data/lib/assets/javascripts/_modules/page-expiry.js +15 -0
- data/lib/assets/javascripts/_modules/search.js +367 -0
- data/lib/assets/javascripts/_modules/table-of-contents.js +111 -0
- data/lib/assets/javascripts/_start-modules.js +13 -0
- data/lib/assets/javascripts/_vendor/fixedsticky.js +194 -0
- data/lib/assets/javascripts/_vendor/jquery.js +5 -0
- data/lib/assets/javascripts/_vendor/jquery.mark.js +1081 -0
- data/lib/assets/javascripts/_vendor/lodash.js +613 -0
- data/lib/assets/javascripts/_vendor/modernizr.js +3 -0
- data/lib/assets/javascripts/govuk_tech_docs.js +10 -0
- data/lib/assets/stylesheets/_accessibility.scss +9 -0
- data/lib/assets/stylesheets/_core.scss +71 -0
- data/lib/assets/stylesheets/_fonts.scss +29 -0
- data/lib/assets/stylesheets/_govuk_tech_docs.scss +2 -0
- data/lib/assets/stylesheets/_syntax-highlighting.scss +196 -0
- data/lib/assets/stylesheets/_variables.scss +12 -0
- data/lib/assets/stylesheets/govuk_frontend_toolkit/_colours.scss +2 -0
- data/lib/assets/stylesheets/govuk_frontend_toolkit/_conditionals.scss +81 -0
- data/lib/assets/stylesheets/govuk_frontend_toolkit/_css3.scss +90 -0
- data/lib/assets/stylesheets/govuk_frontend_toolkit/_device-pixels.scss +10 -0
- data/lib/assets/stylesheets/govuk_frontend_toolkit/_font_stack.scss +19 -0
- data/lib/assets/stylesheets/govuk_frontend_toolkit/_grid_layout.scss +136 -0
- data/lib/assets/stylesheets/govuk_frontend_toolkit/_helpers.scss +16 -0
- data/lib/assets/stylesheets/govuk_frontend_toolkit/_measurements.scss +14 -0
- data/lib/assets/stylesheets/govuk_frontend_toolkit/_shims.scss +55 -0
- data/lib/assets/stylesheets/govuk_frontend_toolkit/_typography.scss +249 -0
- data/lib/assets/stylesheets/govuk_frontend_toolkit/_url-helpers.scss +16 -0
- data/lib/assets/stylesheets/govuk_frontend_toolkit/colours/_organisation.scss +103 -0
- data/lib/assets/stylesheets/govuk_frontend_toolkit/colours/_palette.scss +77 -0
- data/lib/assets/stylesheets/govuk_frontend_toolkit/design-patterns/_alpha-beta.scss +66 -0
- data/lib/assets/stylesheets/govuk_frontend_toolkit/design-patterns/_breadcrumbs.scss +53 -0
- data/lib/assets/stylesheets/govuk_frontend_toolkit/design-patterns/_buttons.scss +141 -0
- data/lib/assets/stylesheets/govuk_frontend_toolkit/design-patterns/_media-player.scss +242 -0
- data/lib/assets/stylesheets/modules/_anchored-heading.scss +54 -0
- data/lib/assets/stylesheets/modules/_app-pane.scss +64 -0
- data/lib/assets/stylesheets/modules/_collapsible.scss +52 -0
- data/lib/assets/stylesheets/modules/_contribution-banner.scss +22 -0
- data/lib/assets/stylesheets/modules/_footer.scss +130 -0
- data/lib/assets/stylesheets/modules/_govuk-logo.scss +47 -0
- data/lib/assets/stylesheets/modules/_header.scss +290 -0
- data/lib/assets/stylesheets/modules/_page-review.scss +35 -0
- data/lib/assets/stylesheets/modules/_phase-banner.scss +22 -0
- data/lib/assets/stylesheets/modules/_search.scss +137 -0
- data/lib/assets/stylesheets/modules/_skip-link.scss +31 -0
- data/lib/assets/stylesheets/modules/_technical-documentation.scss +241 -0
- data/lib/assets/stylesheets/modules/_toc.scss +216 -0
- data/lib/assets/stylesheets/modules/_warning-text.scss +73 -0
- data/lib/assets/stylesheets/palette/_syntax-highlighting.scss +23 -0
- data/lib/assets/stylesheets/utilities/_fonts.scss +29 -0
- data/lib/assets/stylesheets/utilities/_printable.scss +13 -0
- data/lib/assets/stylesheets/vendor/_fixedsticky.scss +22 -0
- data/lib/dss_tech_docs.rb +121 -0
- data/lib/govuk_tech_docs/api_reference/api_reference_extension.rb +101 -0
- data/lib/govuk_tech_docs/api_reference/api_reference_renderer.rb +279 -0
- data/lib/govuk_tech_docs/api_reference/templates/api_reference_full.html.erb +19 -0
- data/lib/govuk_tech_docs/api_reference/templates/operation.html.erb +11 -0
- data/lib/govuk_tech_docs/api_reference/templates/parameters.html.erb +28 -0
- data/lib/govuk_tech_docs/api_reference/templates/path.html.erb +4 -0
- data/lib/govuk_tech_docs/api_reference/templates/responses.html.erb +33 -0
- data/lib/govuk_tech_docs/api_reference/templates/schema.html.erb +29 -0
- data/lib/govuk_tech_docs/contribution_banner.rb +62 -0
- data/lib/govuk_tech_docs/meta_tags.rb +67 -0
- data/lib/govuk_tech_docs/page_review.rb +52 -0
- data/lib/govuk_tech_docs/pages.rb +32 -0
- data/lib/govuk_tech_docs/redirects.rb +39 -0
- data/lib/govuk_tech_docs/table_of_contents/heading.rb +30 -0
- data/lib/govuk_tech_docs/table_of_contents/heading_tree.rb +27 -0
- data/lib/govuk_tech_docs/table_of_contents/heading_tree_builder.rb +41 -0
- data/lib/govuk_tech_docs/table_of_contents/heading_tree_renderer.rb +46 -0
- data/lib/govuk_tech_docs/table_of_contents/headings_builder.rb +39 -0
- data/lib/govuk_tech_docs/table_of_contents/helpers.rb +79 -0
- data/lib/govuk_tech_docs/tech_docs_html_renderer.rb +34 -0
- data/lib/govuk_tech_docs/unique_identifier_extension.rb +13 -0
- data/lib/govuk_tech_docs/unique_identifier_generator.rb +72 -0
- data/lib/govuk_tech_docs/version.rb +3 -0
- data/lib/govuk_tech_docs/warning_text_extension.rb +23 -0
- data/lib/source/api/pages.json.erb +1 -0
- data/lib/source/favicon.ico +0 -0
- data/lib/source/images/anchored-heading-icon-2x.png +0 -0
- data/lib/source/images/anchored-heading-icon.png +0 -0
- data/lib/source/images/gov.uk_logotype_crown-2x.png +0 -0
- data/lib/source/images/gov.uk_logotype_crown.png +0 -0
- data/lib/source/images/gov.uk_logotype_crown_invert_trans.png +0 -0
- data/lib/source/images/govuk-crest-2x.png +0 -0
- data/lib/source/images/govuk-crest.png +0 -0
- data/lib/source/images/govuk-icn-close.png +0 -0
- data/lib/source/images/govuk-icn-close@2x.png +0 -0
- data/lib/source/images/govuk-icn-numbered-list.png +0 -0
- data/lib/source/images/govuk-icn-numbered-list@2x.png +0 -0
- data/lib/source/images/open-government-licence.png +0 -0
- data/lib/source/images/open-government-licence_2x.png +0 -0
- data/lib/source/images/search-result-caret.svg +13 -0
- data/lib/source/layouts/_analytics.erb +15 -0
- data/lib/source/layouts/_footer.erb +10 -0
- data/lib/source/layouts/_header.erb +44 -0
- data/lib/source/layouts/_page_review.erb +22 -0
- data/lib/source/layouts/_search.erb +16 -0
- data/lib/source/layouts/core.erb +82 -0
- data/lib/source/layouts/layout.erb +18 -0
- metadata +474 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
module GovukTechDocs
|
|
2
|
+
module TableOfContents
|
|
3
|
+
class HeadingTreeBuilder
|
|
4
|
+
def initialize(headings)
|
|
5
|
+
@headings = headings
|
|
6
|
+
@tree = HeadingTree.new
|
|
7
|
+
@pointer = @tree
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def tree
|
|
11
|
+
@headings.each do |heading|
|
|
12
|
+
move_to_depth(heading.size)
|
|
13
|
+
|
|
14
|
+
@pointer.children << HeadingTree.new(parent: @pointer, heading: heading)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
@tree
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
private
|
|
21
|
+
|
|
22
|
+
def move_to_depth(depth)
|
|
23
|
+
if depth > @pointer.depth
|
|
24
|
+
@pointer = @pointer.children.last
|
|
25
|
+
|
|
26
|
+
if depth > @pointer.depth
|
|
27
|
+
@pointer.children << HeadingTree.new(parent: @pointer)
|
|
28
|
+
|
|
29
|
+
move_to_depth(depth)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
if depth < @pointer.depth
|
|
34
|
+
@pointer = @pointer.parent
|
|
35
|
+
|
|
36
|
+
move_to_depth(depth)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
module GovukTechDocs
|
|
2
|
+
module TableOfContents
|
|
3
|
+
class HeadingTreeRenderer
|
|
4
|
+
DEFAULT_MAX_LEVEL = Float::INFINITY
|
|
5
|
+
DEFAULT_INDENTATION = ''.freeze
|
|
6
|
+
INDENTATION_INCREMENT = ' '.freeze
|
|
7
|
+
|
|
8
|
+
def initialize(heading_tree, max_level: nil)
|
|
9
|
+
@heading_tree = heading_tree
|
|
10
|
+
@max_level = max_level || DEFAULT_MAX_LEVEL
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def html
|
|
14
|
+
render_tree(@heading_tree, level: 0)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
private
|
|
18
|
+
|
|
19
|
+
def render_tree(tree, indentation: DEFAULT_INDENTATION, level: nil)
|
|
20
|
+
output = ''
|
|
21
|
+
|
|
22
|
+
if tree.heading
|
|
23
|
+
output += indentation + %{<a href="#{tree.heading.href}">#{tree.heading.title}</a>\n}
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
if tree.children.any? && level < @max_level
|
|
27
|
+
output += indentation + "<ul>\n"
|
|
28
|
+
|
|
29
|
+
tree.children.each do |child|
|
|
30
|
+
output += indentation + INDENTATION_INCREMENT + "<li>\n"
|
|
31
|
+
output += render_tree(
|
|
32
|
+
child,
|
|
33
|
+
indentation: indentation + INDENTATION_INCREMENT * 2,
|
|
34
|
+
level: level + 1
|
|
35
|
+
)
|
|
36
|
+
output += indentation + INDENTATION_INCREMENT + "</li>\n"
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
output += indentation + "</ul>\n"
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
output
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
module GovukTechDocs
|
|
2
|
+
module TableOfContents
|
|
3
|
+
class HeadingsBuilder
|
|
4
|
+
def initialize(html, url)
|
|
5
|
+
@html = html
|
|
6
|
+
@url = url
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def headings
|
|
10
|
+
heading_elements.map do |element|
|
|
11
|
+
Heading.new(
|
|
12
|
+
element_name: element.node_name,
|
|
13
|
+
text: element.content,
|
|
14
|
+
attributes: convert_nokogiri_attr_objects_to_hashes(element.attributes),
|
|
15
|
+
page_url: @url
|
|
16
|
+
)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
private
|
|
21
|
+
|
|
22
|
+
def page
|
|
23
|
+
@_page ||= Nokogiri::HTML(@html)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def heading_elements
|
|
27
|
+
page.search('h1, h2, h3, h4, h5, h6')
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def convert_nokogiri_attr_objects_to_hashes(attributes)
|
|
31
|
+
attributes.tap do |hash|
|
|
32
|
+
hash.each do |k, v|
|
|
33
|
+
hash[k] = v.value
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
require 'govuk_tech_docs/table_of_contents/heading_tree_builder'
|
|
2
|
+
require 'govuk_tech_docs/table_of_contents/heading_tree_renderer'
|
|
3
|
+
require 'govuk_tech_docs/table_of_contents/heading_tree'
|
|
4
|
+
require 'govuk_tech_docs/table_of_contents/heading'
|
|
5
|
+
require 'govuk_tech_docs/table_of_contents/headings_builder'
|
|
6
|
+
|
|
7
|
+
module GovukTechDocs
|
|
8
|
+
module TableOfContents
|
|
9
|
+
module Helpers
|
|
10
|
+
def single_page_table_of_contents(html, url: '', max_level: nil)
|
|
11
|
+
headings = HeadingsBuilder.new(html, url).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: " + url
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
tree = HeadingTreeBuilder.new(headings).tree
|
|
18
|
+
HeadingTreeRenderer.new(tree, max_level: max_level).html
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def multi_page_table_of_contents(resources, current_page, config, current_page_html = nil)
|
|
22
|
+
# Only parse top level html files
|
|
23
|
+
# Sorted by weight frontmatter
|
|
24
|
+
resources = resources
|
|
25
|
+
.select { |r| r.path.end_with?(".html") && (r.parent.nil? || r.parent.url == "/") }
|
|
26
|
+
.sort_by { |r| [r.data.weight ? 0 : 1, r.data.weight || 0] }
|
|
27
|
+
|
|
28
|
+
render_page_tree(resources, current_page, config, current_page_html)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def render_page_tree(resources, current_page, config, current_page_html)
|
|
32
|
+
# Sort by weight frontmatter
|
|
33
|
+
resources = resources
|
|
34
|
+
.sort_by { |r| [r.data.weight ? 0 : 1, r.data.weight || 0] }
|
|
35
|
+
output = '';
|
|
36
|
+
resources.each do |resource|
|
|
37
|
+
# Reuse the generated content for the active page
|
|
38
|
+
# If we generate it twice it increments the heading ids
|
|
39
|
+
content =
|
|
40
|
+
if current_page.url == resource.url && current_page_html
|
|
41
|
+
current_page_html
|
|
42
|
+
else
|
|
43
|
+
resource.render(layout: false)
|
|
44
|
+
end
|
|
45
|
+
# Avoid redirect pages
|
|
46
|
+
next if content.include? "http-equiv=refresh"
|
|
47
|
+
# If this page has children, just print the title and recursively
|
|
48
|
+
# render the children. If not, print the heading structure.
|
|
49
|
+
|
|
50
|
+
# We avoid printing the children of the root index.html as it is the
|
|
51
|
+
# parent of every other top level file. We need to take any custom
|
|
52
|
+
# prefix in to consideration when checking for the root index.html.
|
|
53
|
+
# The prefix may be set with or without a trailing slash: make sure
|
|
54
|
+
# it has one for this comparison check.
|
|
55
|
+
home_url =
|
|
56
|
+
if config[:http_prefix].end_with?("/")
|
|
57
|
+
config[:http_prefix]
|
|
58
|
+
else
|
|
59
|
+
config[:http_prefix] + "/"
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
if resource.children.any? && resource.url != home_url
|
|
63
|
+
output += %{<ul><li><a href="#{resource.url}">#{resource.data.title}</a>\n}
|
|
64
|
+
output += render_page_tree(resource.children, current_page, config, current_page_html)
|
|
65
|
+
output += '</li></ul>'
|
|
66
|
+
else
|
|
67
|
+
output +=
|
|
68
|
+
single_page_table_of_contents(
|
|
69
|
+
content,
|
|
70
|
+
url: resource.url,
|
|
71
|
+
max_level: config[:tech_docs][:max_toc_heading_level]
|
|
72
|
+
)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
output
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
require 'middleman-core/renderers/redcarpet'
|
|
2
|
+
|
|
3
|
+
module GovukTechDocs
|
|
4
|
+
class TechDocsHTMLRenderer < Middleman::Renderers::MiddlemanRedcarpetHTML
|
|
5
|
+
include Redcarpet::Render::SmartyPants
|
|
6
|
+
|
|
7
|
+
def initialize(options = {})
|
|
8
|
+
@local_options = options.dup
|
|
9
|
+
@app = @local_options[:context].app
|
|
10
|
+
super
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def paragraph(text)
|
|
14
|
+
@app.api("<p>#{text.strip}</p>\n")
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def header(text, level)
|
|
18
|
+
anchor = UniqueIdentifierGenerator.instance.create(text, level)
|
|
19
|
+
%(<h#{level} id="#{anchor}">#{text}</h#{level}>)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def image(link, *args)
|
|
23
|
+
%(<a href="#{link}" target="_blank" rel="noopener noreferrer">#{super}</a>)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def table(header, body)
|
|
27
|
+
%(<div class="table-container">
|
|
28
|
+
<table>
|
|
29
|
+
#{header}#{body}
|
|
30
|
+
</table>
|
|
31
|
+
</div>)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module GovukTechDocs
|
|
2
|
+
class UniqueIdentifierExtension < Middleman::Extension
|
|
3
|
+
def initialize(app, options_hash = {}, &block)
|
|
4
|
+
super
|
|
5
|
+
|
|
6
|
+
app.before do
|
|
7
|
+
UniqueIdentifierGenerator.instance.reset
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
::Middleman::Extensions.register(:unique_identifier, GovukTechDocs::UniqueIdentifierExtension)
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
require 'singleton'
|
|
2
|
+
|
|
3
|
+
module GovukTechDocs
|
|
4
|
+
class UniqueIdentifierGenerator
|
|
5
|
+
include Singleton
|
|
6
|
+
|
|
7
|
+
Anchor = Struct.new(:id, :level)
|
|
8
|
+
|
|
9
|
+
attr_reader :anchors
|
|
10
|
+
|
|
11
|
+
def initialize
|
|
12
|
+
reset
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def create(id, level)
|
|
16
|
+
anchor = heading_slug(id)
|
|
17
|
+
|
|
18
|
+
unless unique?(anchor)
|
|
19
|
+
anchor = prefixed_by_parent(anchor, level)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
unless unique?(anchor)
|
|
23
|
+
anchor = suffixed_with_number(anchor)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
@anchors << Anchor.new(anchor, level)
|
|
27
|
+
|
|
28
|
+
anchor
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def reset
|
|
32
|
+
@anchors = []
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
private
|
|
36
|
+
|
|
37
|
+
def prefixed_by_parent(anchor, level)
|
|
38
|
+
closest_parent = @anchors.reverse.find { |a| a.level < level }
|
|
39
|
+
if closest_parent.nil?
|
|
40
|
+
anchor
|
|
41
|
+
else
|
|
42
|
+
[closest_parent.id, anchor].join("-")
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def suffixed_with_number(text)
|
|
47
|
+
number = 2
|
|
48
|
+
anchor = "#{text}-#{number}"
|
|
49
|
+
|
|
50
|
+
until unique?(anchor)
|
|
51
|
+
anchor = "#{text}-#{number}"
|
|
52
|
+
number += 1
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
anchor
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def unique?(value)
|
|
59
|
+
@anchors.none? { |a| a.id == value }
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# https://github.com/vmg/redcarpet/blob/820dadb98b3720811cc20c5570a5d43c796c85fc/ext/redcarpet/html.c#L274-L305
|
|
63
|
+
def heading_slug(text)
|
|
64
|
+
text
|
|
65
|
+
.downcase
|
|
66
|
+
.strip
|
|
67
|
+
.gsub(%r{</?[^>]+?>}, '') # Remove HTML tags
|
|
68
|
+
.gsub(/[^0-9a-z]+/, '-') # Replace non-alphanumeric characters with dashes
|
|
69
|
+
.gsub(/\A-+|-+\z/, '') # Remove trailing dashes
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module GovukTechDocs
|
|
2
|
+
class WarningTextExtension < Middleman::Extension
|
|
3
|
+
def initialize(app, options_hash = {}, &block)
|
|
4
|
+
super
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
helpers do
|
|
8
|
+
def warning_text(text)
|
|
9
|
+
<<~EOS
|
|
10
|
+
<div class="govuk-warning-text">
|
|
11
|
+
<span class="govuk-warning-text__icon" aria-hidden="true">!</span>
|
|
12
|
+
<strong class="govuk-warning-text__text">
|
|
13
|
+
<span class="govuk-warning-text__assistive">Warning</span>
|
|
14
|
+
#{text}
|
|
15
|
+
</strong>
|
|
16
|
+
</div>
|
|
17
|
+
EOS
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
::Middleman::Extensions.register(:warning_text, GovukTechDocs::WarningTextExtension)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<%= GovukTechDocs::Pages.new(sitemap, config).to_json %>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg width="13px" height="23px" viewBox="0 0 13 23" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
3
|
+
<!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
|
|
4
|
+
<title>Page 1</title>
|
|
5
|
+
<desc>Created with Sketch.</desc>
|
|
6
|
+
<defs></defs>
|
|
7
|
+
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
|
8
|
+
<g fill="#FFFFFF">
|
|
9
|
+
<polygon id="Fill-1" points="11.6343 0.8004 0.7043 11.8004 11.6343 22.8004 13 22.8004 13 0.8004"></polygon>
|
|
10
|
+
<polyline id="Stroke-2" stroke="#B4B4B4" points="11.6346 22.8004 0.7046 11.8004 11.6346 0.8004 11.6346 0.8004"></polyline>
|
|
11
|
+
</g>
|
|
12
|
+
</g>
|
|
13
|
+
</svg>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<% if config[:tech_docs][:ga_tracking_id].is_a?(String) && !config[:tech_docs][:ga_tracking_id].empty? %>
|
|
2
|
+
<script>
|
|
3
|
+
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
|
4
|
+
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
|
5
|
+
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
|
6
|
+
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
|
|
7
|
+
|
|
8
|
+
ga('create', '<%= config[:tech_docs][:ga_tracking_id] %>', 'auto');
|
|
9
|
+
ga('set', 'anonymizeIp', true);
|
|
10
|
+
ga('set', 'displayFeaturesTask', null);
|
|
11
|
+
ga('set', 'transport', 'beacon');
|
|
12
|
+
ga('set', 'page', location.pathname+location.search+location.hash);
|
|
13
|
+
ga('send', 'pageview');
|
|
14
|
+
</script>
|
|
15
|
+
<% end %>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<footer class="footer">
|
|
2
|
+
<div class="footer__licence">
|
|
3
|
+
<a class="footer__licence-logo" href="https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/" rel="license">Open Government Licence</a>
|
|
4
|
+
<p class="footer__licence-description">All content is available under the <a href="https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/" rel="license">Open Government Licence v3.0</a>, except where otherwise stated</p>
|
|
5
|
+
</div>
|
|
6
|
+
|
|
7
|
+
<div class="footer__copyright">
|
|
8
|
+
<a class="footer__copyright-logo" href="http://www.nationalarchives.gov.uk/information-management/re-using-public-sector-information/copyright-and-re-use/crown-copyright/">© Crown copyright</a>
|
|
9
|
+
</div>
|
|
10
|
+
</footer>
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<header class="header header--full-width">
|
|
2
|
+
<div class="header__container">
|
|
3
|
+
<div class="header__brand">
|
|
4
|
+
<% if config[:tech_docs][:service_link] %>
|
|
5
|
+
<a href="<%= url_for config[:tech_docs][:service_link] %>">
|
|
6
|
+
<% else %>
|
|
7
|
+
<span>
|
|
8
|
+
<% end %>
|
|
9
|
+
<% if config[:tech_docs][:show_govuk_logo] %>
|
|
10
|
+
<span class="govuk-logo">
|
|
11
|
+
<img class="govuk-logo__printable-crown" src="/images/gov.uk_logotype_crown_invert_trans.png" height="32" width="36" alt="">
|
|
12
|
+
GOV.UK
|
|
13
|
+
</span>
|
|
14
|
+
<% end %>
|
|
15
|
+
<span class="header__title">
|
|
16
|
+
<%= config[:tech_docs][:service_name] %>
|
|
17
|
+
<% if config[:tech_docs][:phase] %>
|
|
18
|
+
<span class="phase-banner"><%= config[:tech_docs][:phase] %></span>
|
|
19
|
+
<% end %>
|
|
20
|
+
</span>
|
|
21
|
+
<% if config[:tech_docs][:service_link] %>
|
|
22
|
+
</a>
|
|
23
|
+
<% else %>
|
|
24
|
+
</span>
|
|
25
|
+
<% end %>
|
|
26
|
+
</div>
|
|
27
|
+
|
|
28
|
+
<% if config[:tech_docs][:header_links] %>
|
|
29
|
+
<div data-module="navigation">
|
|
30
|
+
<button type="button" class="header__navigation-toggle js-nav-toggle" aria-controls="navigation" aria-label="Show or hide top level navigation">Menu</button>
|
|
31
|
+
|
|
32
|
+
<nav id="navigation" class="header__navigation js-nav" aria-label="Top Level Navigation" aria-hidden="true">
|
|
33
|
+
<ul>
|
|
34
|
+
<% config[:tech_docs][:header_links].each do |title, path| %>
|
|
35
|
+
<li<% if active_page(path) %> class="active"<% end %>>
|
|
36
|
+
<a href="<%= url_for path %>"><%= title %></a>
|
|
37
|
+
</li>
|
|
38
|
+
<% end %>
|
|
39
|
+
</ul>
|
|
40
|
+
</nav>
|
|
41
|
+
</div>
|
|
42
|
+
<% end %>
|
|
43
|
+
</div>
|
|
44
|
+
</header>
|