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.
Files changed (151) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +29 -0
  3. data/.gitignore +37 -0
  4. data/.rspec +2 -0
  5. data/.rubocop.yml +11 -0
  6. data/.ruby-version +1 -0
  7. data/.travis.yml +9 -0
  8. data/CHANGELOG.md +274 -0
  9. data/CONTRIBUTING.md +9 -0
  10. data/Gemfile +4 -0
  11. data/LICENCE +21 -0
  12. data/README.md +89 -0
  13. data/Rakefile +13 -0
  14. data/docs/configuration.md +205 -0
  15. data/docs/core-layout-without-sidebar.png +0 -0
  16. data/docs/core-layout.png +0 -0
  17. data/docs/expired-page.png +0 -0
  18. data/docs/frontmatter.md +145 -0
  19. data/docs/last-reviewed-only.png +0 -0
  20. data/docs/last-reviewed-only.svg +1 -0
  21. data/docs/layout-layout.png +0 -0
  22. data/docs/not-expired-page.png +0 -0
  23. data/docs/page-expiry.md +85 -0
  24. data/dss_tech_docs.gemspec +46 -0
  25. data/example/.ruby-version +1 -0
  26. data/example/Gemfile +3 -0
  27. data/example/config.rb +9 -0
  28. data/example/config/hide-expiry.yml +51 -0
  29. data/example/config/tech-docs.yml +50 -0
  30. data/example/source/api-path.html.md +7 -0
  31. data/example/source/api-reference.html.md +5 -0
  32. data/example/source/child-of-expired-page.html.md +8 -0
  33. data/example/source/core-layout-without-sidebar.html.md.erb +7 -0
  34. data/example/source/core-layout.html.md.erb +12 -0
  35. data/example/source/expired-page-with-owner.html.md +10 -0
  36. data/example/source/expired-page.html.md +9 -0
  37. data/example/source/headings.html.md +11 -0
  38. data/example/source/index.html.md.erb +19 -0
  39. data/example/source/javascripts/application.js +1 -0
  40. data/example/source/not-expired-page.html.md +9 -0
  41. data/example/source/pets.yml +109 -0
  42. data/example/source/stylesheets/print.css.scss +3 -0
  43. data/example/source/stylesheets/screen-old-ie.css.scss +4 -0
  44. data/example/source/stylesheets/screen.css.scss +1 -0
  45. data/example/source/templates/proxy_template.html.md +8 -0
  46. data/lib/assets/javascripts/_analytics.js +58 -0
  47. data/lib/assets/javascripts/_govuk/modules.js +57 -0
  48. data/lib/assets/javascripts/_modules/anchored-headings.js +18 -0
  49. data/lib/assets/javascripts/_modules/collapsible-navigation.js +95 -0
  50. data/lib/assets/javascripts/_modules/in-page-navigation.js +132 -0
  51. data/lib/assets/javascripts/_modules/navigation.js +34 -0
  52. data/lib/assets/javascripts/_modules/page-expiry.js +15 -0
  53. data/lib/assets/javascripts/_modules/search.js +367 -0
  54. data/lib/assets/javascripts/_modules/table-of-contents.js +111 -0
  55. data/lib/assets/javascripts/_start-modules.js +13 -0
  56. data/lib/assets/javascripts/_vendor/fixedsticky.js +194 -0
  57. data/lib/assets/javascripts/_vendor/jquery.js +5 -0
  58. data/lib/assets/javascripts/_vendor/jquery.mark.js +1081 -0
  59. data/lib/assets/javascripts/_vendor/lodash.js +613 -0
  60. data/lib/assets/javascripts/_vendor/modernizr.js +3 -0
  61. data/lib/assets/javascripts/govuk_tech_docs.js +10 -0
  62. data/lib/assets/stylesheets/_accessibility.scss +9 -0
  63. data/lib/assets/stylesheets/_core.scss +71 -0
  64. data/lib/assets/stylesheets/_fonts.scss +29 -0
  65. data/lib/assets/stylesheets/_govuk_tech_docs.scss +2 -0
  66. data/lib/assets/stylesheets/_syntax-highlighting.scss +196 -0
  67. data/lib/assets/stylesheets/_variables.scss +12 -0
  68. data/lib/assets/stylesheets/govuk_frontend_toolkit/_colours.scss +2 -0
  69. data/lib/assets/stylesheets/govuk_frontend_toolkit/_conditionals.scss +81 -0
  70. data/lib/assets/stylesheets/govuk_frontend_toolkit/_css3.scss +90 -0
  71. data/lib/assets/stylesheets/govuk_frontend_toolkit/_device-pixels.scss +10 -0
  72. data/lib/assets/stylesheets/govuk_frontend_toolkit/_font_stack.scss +19 -0
  73. data/lib/assets/stylesheets/govuk_frontend_toolkit/_grid_layout.scss +136 -0
  74. data/lib/assets/stylesheets/govuk_frontend_toolkit/_helpers.scss +16 -0
  75. data/lib/assets/stylesheets/govuk_frontend_toolkit/_measurements.scss +14 -0
  76. data/lib/assets/stylesheets/govuk_frontend_toolkit/_shims.scss +55 -0
  77. data/lib/assets/stylesheets/govuk_frontend_toolkit/_typography.scss +249 -0
  78. data/lib/assets/stylesheets/govuk_frontend_toolkit/_url-helpers.scss +16 -0
  79. data/lib/assets/stylesheets/govuk_frontend_toolkit/colours/_organisation.scss +103 -0
  80. data/lib/assets/stylesheets/govuk_frontend_toolkit/colours/_palette.scss +77 -0
  81. data/lib/assets/stylesheets/govuk_frontend_toolkit/design-patterns/_alpha-beta.scss +66 -0
  82. data/lib/assets/stylesheets/govuk_frontend_toolkit/design-patterns/_breadcrumbs.scss +53 -0
  83. data/lib/assets/stylesheets/govuk_frontend_toolkit/design-patterns/_buttons.scss +141 -0
  84. data/lib/assets/stylesheets/govuk_frontend_toolkit/design-patterns/_media-player.scss +242 -0
  85. data/lib/assets/stylesheets/modules/_anchored-heading.scss +54 -0
  86. data/lib/assets/stylesheets/modules/_app-pane.scss +64 -0
  87. data/lib/assets/stylesheets/modules/_collapsible.scss +52 -0
  88. data/lib/assets/stylesheets/modules/_contribution-banner.scss +22 -0
  89. data/lib/assets/stylesheets/modules/_footer.scss +130 -0
  90. data/lib/assets/stylesheets/modules/_govuk-logo.scss +47 -0
  91. data/lib/assets/stylesheets/modules/_header.scss +290 -0
  92. data/lib/assets/stylesheets/modules/_page-review.scss +35 -0
  93. data/lib/assets/stylesheets/modules/_phase-banner.scss +22 -0
  94. data/lib/assets/stylesheets/modules/_search.scss +137 -0
  95. data/lib/assets/stylesheets/modules/_skip-link.scss +31 -0
  96. data/lib/assets/stylesheets/modules/_technical-documentation.scss +241 -0
  97. data/lib/assets/stylesheets/modules/_toc.scss +216 -0
  98. data/lib/assets/stylesheets/modules/_warning-text.scss +73 -0
  99. data/lib/assets/stylesheets/palette/_syntax-highlighting.scss +23 -0
  100. data/lib/assets/stylesheets/utilities/_fonts.scss +29 -0
  101. data/lib/assets/stylesheets/utilities/_printable.scss +13 -0
  102. data/lib/assets/stylesheets/vendor/_fixedsticky.scss +22 -0
  103. data/lib/dss_tech_docs.rb +121 -0
  104. data/lib/govuk_tech_docs/api_reference/api_reference_extension.rb +101 -0
  105. data/lib/govuk_tech_docs/api_reference/api_reference_renderer.rb +279 -0
  106. data/lib/govuk_tech_docs/api_reference/templates/api_reference_full.html.erb +19 -0
  107. data/lib/govuk_tech_docs/api_reference/templates/operation.html.erb +11 -0
  108. data/lib/govuk_tech_docs/api_reference/templates/parameters.html.erb +28 -0
  109. data/lib/govuk_tech_docs/api_reference/templates/path.html.erb +4 -0
  110. data/lib/govuk_tech_docs/api_reference/templates/responses.html.erb +33 -0
  111. data/lib/govuk_tech_docs/api_reference/templates/schema.html.erb +29 -0
  112. data/lib/govuk_tech_docs/contribution_banner.rb +62 -0
  113. data/lib/govuk_tech_docs/meta_tags.rb +67 -0
  114. data/lib/govuk_tech_docs/page_review.rb +52 -0
  115. data/lib/govuk_tech_docs/pages.rb +32 -0
  116. data/lib/govuk_tech_docs/redirects.rb +39 -0
  117. data/lib/govuk_tech_docs/table_of_contents/heading.rb +30 -0
  118. data/lib/govuk_tech_docs/table_of_contents/heading_tree.rb +27 -0
  119. data/lib/govuk_tech_docs/table_of_contents/heading_tree_builder.rb +41 -0
  120. data/lib/govuk_tech_docs/table_of_contents/heading_tree_renderer.rb +46 -0
  121. data/lib/govuk_tech_docs/table_of_contents/headings_builder.rb +39 -0
  122. data/lib/govuk_tech_docs/table_of_contents/helpers.rb +79 -0
  123. data/lib/govuk_tech_docs/tech_docs_html_renderer.rb +34 -0
  124. data/lib/govuk_tech_docs/unique_identifier_extension.rb +13 -0
  125. data/lib/govuk_tech_docs/unique_identifier_generator.rb +72 -0
  126. data/lib/govuk_tech_docs/version.rb +3 -0
  127. data/lib/govuk_tech_docs/warning_text_extension.rb +23 -0
  128. data/lib/source/api/pages.json.erb +1 -0
  129. data/lib/source/favicon.ico +0 -0
  130. data/lib/source/images/anchored-heading-icon-2x.png +0 -0
  131. data/lib/source/images/anchored-heading-icon.png +0 -0
  132. data/lib/source/images/gov.uk_logotype_crown-2x.png +0 -0
  133. data/lib/source/images/gov.uk_logotype_crown.png +0 -0
  134. data/lib/source/images/gov.uk_logotype_crown_invert_trans.png +0 -0
  135. data/lib/source/images/govuk-crest-2x.png +0 -0
  136. data/lib/source/images/govuk-crest.png +0 -0
  137. data/lib/source/images/govuk-icn-close.png +0 -0
  138. data/lib/source/images/govuk-icn-close@2x.png +0 -0
  139. data/lib/source/images/govuk-icn-numbered-list.png +0 -0
  140. data/lib/source/images/govuk-icn-numbered-list@2x.png +0 -0
  141. data/lib/source/images/open-government-licence.png +0 -0
  142. data/lib/source/images/open-government-licence_2x.png +0 -0
  143. data/lib/source/images/search-result-caret.svg +13 -0
  144. data/lib/source/layouts/_analytics.erb +15 -0
  145. data/lib/source/layouts/_footer.erb +10 -0
  146. data/lib/source/layouts/_header.erb +44 -0
  147. data/lib/source/layouts/_page_review.erb +22 -0
  148. data/lib/source/layouts/_search.erb +16 -0
  149. data/lib/source/layouts/core.erb +82 -0
  150. data/lib/source/layouts/layout.erb +18 -0
  151. 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,3 @@
1
+ module GovukTechDocs
2
+ VERSION = "0.1.0".freeze
3
+ 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
@@ -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>