dss_tech_docs 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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>