govspeak 6.7.8 → 6.8.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -0
- data/lib/govspeak/html_sanitizer.rb +11 -1
- data/lib/govspeak/html_validator.rb +12 -6
- data/lib/govspeak/template_renderer.rb +1 -1
- data/lib/govspeak/version.rb +1 -1
- data/lib/govspeak.rb +5 -2
- data/test/govspeak_test.rb +42 -0
- data/test/test_helper.rb +0 -2
- metadata +23 -43
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a8509b4c394ef305fd80454c6c6bdb13561332bcdedc5d0292c271387a34043c
|
4
|
+
data.tar.gz: a73d8175cbea307d6b8028931bd15e9b99b97f7ae7708247cc833873622a8574
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ae280e29132e39a4d85f6f095bfd45cfc0da7505b7148e0b48756c4c9fccd29af2a550257a6f972837b8f1c1495f817ee61653ee069db868e66fc5a149386553
|
7
|
+
data.tar.gz: d3e0c5858ebe636a50d44bb360c68bc2bee4cad547529872c51be3f42a5630d5444ccc29e4ef5437d096ecdc43386f18c27363f9bcfbeff801a86fb3f6bbc486
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
## 6.8.2
|
2
|
+
|
3
|
+
* Fix footnote numbering [#239](https://github.com/alphagov/govspeak/pull/239)
|
4
|
+
|
5
|
+
## 6.8.1
|
6
|
+
|
7
|
+
* Fix a bug which resulted in validation errors on 'Start Button' elements [#237](https://github.com/alphagov/govspeak/pull/237)
|
8
|
+
|
9
|
+
## 6.8.0
|
10
|
+
|
11
|
+
* Drop support for Ruby 2.6 which reaches End of Life (EOL) on 31/03/2022
|
12
|
+
* Add support for Rails 7 by loosening the version constraint on `activeview` gem
|
13
|
+
* Fix deprecation notices caused by the bump in Ruby version
|
14
|
+
|
1
15
|
## 6.7.8
|
2
16
|
|
3
17
|
* Fixes bug which reverts acronyms from being converted into abbr tags [#229](https://github.com/alphagov/govspeak/pull/229)
|
@@ -46,7 +46,17 @@ class Govspeak::HtmlSanitizer
|
|
46
46
|
transformers << ImageSourceWhitelister.new(@allowed_image_hosts)
|
47
47
|
end
|
48
48
|
|
49
|
-
|
49
|
+
# It would be cleaner to move this `transformers` key into the `sanitize_config` method rather
|
50
|
+
# than having to use Sanitize::Config.merge() twice in succession. However, `sanitize_config`
|
51
|
+
# is a public method and it looks like other projects depend on it behaving the way it
|
52
|
+
# currently does – i.e. to return Sanitize config without any transformers.
|
53
|
+
# e.g. https://github.com/alphagov/hmrc-manuals-api/blob/4a83f78d0bb839520155623fd9b63b3b12a3b13a/app/validators/no_dangerous_html_in_text_fields_validator.rb#L44
|
54
|
+
config_with_transformers = Sanitize::Config.merge(
|
55
|
+
sanitize_config(allowed_elements: allowed_elements),
|
56
|
+
transformers: transformers,
|
57
|
+
)
|
58
|
+
|
59
|
+
Sanitize.clean(@dirty_html, config_with_transformers)
|
50
60
|
end
|
51
61
|
|
52
62
|
def sanitize_config(allowed_elements: [])
|
@@ -1,9 +1,9 @@
|
|
1
1
|
class Govspeak::HtmlValidator
|
2
2
|
attr_reader :govspeak_string
|
3
3
|
|
4
|
-
def initialize(govspeak_string,
|
4
|
+
def initialize(govspeak_string, options = {})
|
5
5
|
@govspeak_string = govspeak_string.dup.force_encoding(Encoding::UTF_8)
|
6
|
-
@
|
6
|
+
@allowed_image_hosts = options[:allowed_image_hosts]
|
7
7
|
end
|
8
8
|
|
9
9
|
def invalid?
|
@@ -11,17 +11,23 @@ class Govspeak::HtmlValidator
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def valid?
|
14
|
-
dirty_html = govspeak_to_html
|
15
|
-
clean_html =
|
14
|
+
dirty_html = govspeak_to_html(sanitize: false)
|
15
|
+
clean_html = govspeak_to_html(sanitize: true)
|
16
16
|
normalise_html(dirty_html) == normalise_html(clean_html)
|
17
17
|
end
|
18
18
|
|
19
|
+
private
|
20
|
+
|
19
21
|
# Make whitespace in html tags consistent
|
20
22
|
def normalise_html(html)
|
21
23
|
Nokogiri::HTML5.fragment(html).to_s
|
22
24
|
end
|
23
25
|
|
24
|
-
def govspeak_to_html
|
25
|
-
Govspeak::Document.new(
|
26
|
+
def govspeak_to_html(sanitize:)
|
27
|
+
Govspeak::Document.new(
|
28
|
+
govspeak_string,
|
29
|
+
sanitize: sanitize,
|
30
|
+
allowed_image_hosts: @allowed_image_hosts,
|
31
|
+
).to_html
|
26
32
|
end
|
27
33
|
end
|
data/lib/govspeak/version.rb
CHANGED
data/lib/govspeak.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require "active_support"
|
1
2
|
require "active_support/core_ext/hash"
|
2
3
|
require "active_support/core_ext/array"
|
3
4
|
require "erb"
|
@@ -53,6 +54,7 @@ module Govspeak
|
|
53
54
|
|
54
55
|
@images = options.delete(:images) || []
|
55
56
|
@allowed_elements = options.delete(:allowed_elements) || []
|
57
|
+
@allowed_image_hosts = options.delete(:allowed_image_hosts) || []
|
56
58
|
@attachments = Array.wrap(options.delete(:attachments))
|
57
59
|
@links = Array.wrap(options.delete(:links))
|
58
60
|
@contacts = Array.wrap(options.delete(:contacts))
|
@@ -68,7 +70,8 @@ module Govspeak
|
|
68
70
|
def to_html
|
69
71
|
@to_html ||= begin
|
70
72
|
html = if @options[:sanitize]
|
71
|
-
HtmlSanitizer.new(kramdown_doc.to_html
|
73
|
+
HtmlSanitizer.new(kramdown_doc.to_html, allowed_image_hosts: @allowed_image_hosts)
|
74
|
+
.sanitize(allowed_elements: @allowed_elements)
|
72
75
|
else
|
73
76
|
kramdown_doc.to_html
|
74
77
|
end
|
@@ -135,7 +138,7 @@ module Govspeak
|
|
135
138
|
def footnote_definitions(source)
|
136
139
|
is_legislative_list = source.scan(/\$LegislativeList.*?\[\^\d\]*.*?\$EndLegislativeList/m).size.positive?
|
137
140
|
is_cta = source.scan(/\$CTA.*?\[\^\d\]*.*?\$CTA/m).size.positive?
|
138
|
-
footnotes = source.scan(
|
141
|
+
footnotes = source.scan(/^\s*\[\^(\d+)\]:(.*)/)
|
139
142
|
@acronyms = source.scan(/(?<=\*)\[(.*)\]:(.*)/)
|
140
143
|
if (is_legislative_list || is_cta) && footnotes.size.positive?
|
141
144
|
list_items = footnotes.map do |footnote|
|
data/test/govspeak_test.rb
CHANGED
@@ -1048,6 +1048,48 @@ Teston
|
|
1048
1048
|
)
|
1049
1049
|
end
|
1050
1050
|
|
1051
|
+
test_given_govspeak "
|
1052
|
+
$LegislativeList
|
1053
|
+
1. some text[^1]:
|
1054
|
+
$EndLegislativeList
|
1055
|
+
[^1]: footnote text
|
1056
|
+
" do
|
1057
|
+
assert_html_output %(
|
1058
|
+
<p>1. some text<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">[footnote 1]</a></sup>:</p>
|
1059
|
+
|
1060
|
+
<div class="footnotes" role="doc-endnotes">
|
1061
|
+
<ol>
|
1062
|
+
<li id="fn:1" role="doc-endnote">
|
1063
|
+
<p>
|
1064
|
+
footnote text<a href="#fnref:1" class="reversefootnote" role="doc-backlink" aria-label="go to where this is referenced">↩</a>
|
1065
|
+
</p>
|
1066
|
+
</li>
|
1067
|
+
</ol>
|
1068
|
+
</div>
|
1069
|
+
)
|
1070
|
+
end
|
1071
|
+
|
1072
|
+
test_given_govspeak "
|
1073
|
+
$LegislativeList
|
1074
|
+
1. some text[^1]: extra
|
1075
|
+
$EndLegislativeList
|
1076
|
+
[^1]: footnote text
|
1077
|
+
" do
|
1078
|
+
assert_html_output %(
|
1079
|
+
<p>1. some text<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">[footnote 1]</a></sup>: extra</p>
|
1080
|
+
|
1081
|
+
<div class="footnotes" role="doc-endnotes">
|
1082
|
+
<ol>
|
1083
|
+
<li id="fn:1" role="doc-endnote">
|
1084
|
+
<p>
|
1085
|
+
footnote text<a href="#fnref:1" class="reversefootnote" role="doc-backlink" aria-label="go to where this is referenced">↩</a>
|
1086
|
+
</p>
|
1087
|
+
</li>
|
1088
|
+
</ol>
|
1089
|
+
</div>
|
1090
|
+
)
|
1091
|
+
end
|
1092
|
+
|
1051
1093
|
# FIXME: this code is buggy and replaces abbreviations in HTML tags - removing the functionality for now
|
1052
1094
|
# test_given_govspeak "
|
1053
1095
|
# $LegislativeList
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: govspeak
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.
|
4
|
+
version: 6.8.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- GOV.UK Dev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-03-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: actionview
|
@@ -16,20 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
20
|
-
- - "<"
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version: '7'
|
19
|
+
version: '6'
|
23
20
|
type: :runtime
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
24
|
- - ">="
|
28
25
|
- !ruby/object:Gem::Version
|
29
|
-
version: '
|
30
|
-
- - "<"
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
version: '7'
|
26
|
+
version: '6'
|
33
27
|
- !ruby/object:Gem::Dependency
|
34
28
|
name: addressable
|
35
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -194,16 +188,16 @@ dependencies:
|
|
194
188
|
name: rubocop-govuk
|
195
189
|
requirement: !ruby/object:Gem::Requirement
|
196
190
|
requirements:
|
197
|
-
- -
|
191
|
+
- - '='
|
198
192
|
- !ruby/object:Gem::Version
|
199
|
-
version: 4.
|
193
|
+
version: 4.3.0
|
200
194
|
type: :development
|
201
195
|
prerelease: false
|
202
196
|
version_requirements: !ruby/object:Gem::Requirement
|
203
197
|
requirements:
|
204
|
-
- -
|
198
|
+
- - '='
|
205
199
|
- !ruby/object:Gem::Version
|
206
|
-
version: 4.
|
200
|
+
version: 4.3.0
|
207
201
|
- !ruby/object:Gem::Dependency
|
208
202
|
name: simplecov
|
209
203
|
requirement: !ruby/object:Gem::Requirement
|
@@ -218,20 +212,6 @@ dependencies:
|
|
218
212
|
- - ">="
|
219
213
|
- !ruby/object:Gem::Version
|
220
214
|
version: '0'
|
221
|
-
- !ruby/object:Gem::Dependency
|
222
|
-
name: simplecov-rcov
|
223
|
-
requirement: !ruby/object:Gem::Requirement
|
224
|
-
requirements:
|
225
|
-
- - ">="
|
226
|
-
- !ruby/object:Gem::Version
|
227
|
-
version: '0'
|
228
|
-
type: :development
|
229
|
-
prerelease: false
|
230
|
-
version_requirements: !ruby/object:Gem::Requirement
|
231
|
-
requirements:
|
232
|
-
- - ">="
|
233
|
-
- !ruby/object:Gem::Version
|
234
|
-
version: '0'
|
235
215
|
description: |-
|
236
216
|
A set of extensions to markdown layered on top of the kramdown
|
237
217
|
library for use in the UK Government Single Domain project
|
@@ -340,36 +320,36 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
340
320
|
requirements:
|
341
321
|
- - ">="
|
342
322
|
- !ruby/object:Gem::Version
|
343
|
-
version: '2.
|
323
|
+
version: '2.7'
|
344
324
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
345
325
|
requirements:
|
346
326
|
- - ">="
|
347
327
|
- !ruby/object:Gem::Version
|
348
328
|
version: '0'
|
349
329
|
requirements: []
|
350
|
-
rubygems_version: 3.
|
330
|
+
rubygems_version: 3.3.10
|
351
331
|
signing_key:
|
352
332
|
specification_version: 4
|
353
333
|
summary: Markup language for single domain
|
354
334
|
test_files:
|
355
|
-
- test/
|
335
|
+
- test/govspeak_test_helper.rb
|
356
336
|
- test/blockquote_extra_quote_remover_test.rb
|
357
|
-
- test/govspeak_images_bang_test.rb
|
358
|
-
- test/govspeak_contacts_test.rb
|
359
|
-
- test/govspeak_table_with_headers_test.rb
|
360
337
|
- test/govspeak_link_extractor_test.rb
|
361
|
-
- test/
|
362
|
-
- test/
|
363
|
-
- test/govspeak_button_test.rb
|
338
|
+
- test/govspeak_images_test.rb
|
339
|
+
- test/govspeak_link_test.rb
|
364
340
|
- test/govspeak_extract_contact_content_ids_test.rb
|
365
|
-
- test/govspeak_test_helper.rb
|
366
341
|
- test/govspeak_footnote_test.rb
|
367
|
-
- test/
|
342
|
+
- test/presenters/h_card_presenter_test.rb
|
343
|
+
- test/govspeak_attachments_inline_test.rb
|
368
344
|
- test/govspeak_structured_headers_test.rb
|
345
|
+
- test/test_helper.rb
|
346
|
+
- test/govspeak_button_test.rb
|
347
|
+
- test/govspeak_attachment_test.rb
|
369
348
|
- test/html_sanitizer_test.rb
|
370
|
-
- test/
|
349
|
+
- test/govspeak_contacts_test.rb
|
350
|
+
- test/govspeak_attachments_image_test.rb
|
351
|
+
- test/govspeak_images_bang_test.rb
|
371
352
|
- test/govspeak_test.rb
|
353
|
+
- test/govspeak_table_with_headers_test.rb
|
354
|
+
- test/html_validator_test.rb
|
372
355
|
- test/govspeak_attachment_link_test.rb
|
373
|
-
- test/govspeak_attachment_test.rb
|
374
|
-
- test/presenters/h_card_presenter_test.rb
|
375
|
-
- test/govspeak_attachments_inline_test.rb
|