govspeak 5.7.1 → 5.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d11428240a9a0cdbed2f63a5d278893bab54ccdee09814a1689fce6f47df9a75
4
- data.tar.gz: 18aaf4b2f5f72ff4ec22540badcac28db7b29df2867e9b5c59785472cee14cc0
3
+ metadata.gz: ac38fd3a1d6da3054f961380d76d362ad637aab0dd9593667a7657777ff10339
4
+ data.tar.gz: 6e8e0430a8a6ee72e67374b90e70a695ff8f1c710d10ce61849b5af10e9a4db9
5
5
  SHA512:
6
- metadata.gz: 06dade4f0571fc2bdef539d7e273b45afd3a7994d4b60d8686975e064aeb7c11912cd47e71d8dd2a7649296a6006ade569c772fba1f1ac06d8f3855b51512604
7
- data.tar.gz: 8953ea5d545b19510bc567de1851110c8f404b250e3c4a5d0a39e41485befd9e8afb034d0de19371789cd54b0778aa48ea6ca7fdf671742ec46e673d050964eb
6
+ metadata.gz: b3727ecd02a709c0db38b5881de8cb34846d627fbae0c0543da05462b250dfd1fb21bd3f5b07351be73dcc5bd8e447e7215e9a3693c59bce001559a978e7d6b5
7
+ data.tar.gz: 7a190b06732cb113838ddff93eec9c34e5c3785568f8025781b8d8da9d6100a9da6bef64a190669217867dc6a55ed143757316b7a9538434dca19abda4dfb55f
@@ -1,3 +1,7 @@
1
+ ## 5.8.0
2
+
3
+ * Add new `Image:image-id` extension and deprecate `embed:attachments:image:content-id`
4
+
1
5
  ## 5.7.1
2
6
 
3
7
  * Include locale, config and asset files in the gem distribution
data/README.md CHANGED
@@ -432,7 +432,7 @@ will output an attachment within a block of text
432
432
  <p>Details referenced in <span class="attachment-inline"><a href="http://example.com/my-thorough-study.pdf">My Thorough Study</a></span></p>
433
433
  ```
434
434
 
435
- ### Image Attachments
435
+ ### Image Attachments (DEPRECATED: use `Image:image-id` instead)
436
436
 
437
437
  Attachments can be used to embed an image within the document
438
438
 
@@ -460,6 +460,36 @@ will output a image section
460
460
  </figure>
461
461
  ```
462
462
 
463
+ ### Images
464
+
465
+ Images can be embedded as a figure with optional caption.
466
+
467
+ [Image:filename.png]
468
+
469
+ with options provided
470
+
471
+ {
472
+ images: [
473
+ {
474
+ alt_text: "Some alt text",
475
+ caption: "An optional caption",
476
+ url: "http://example.com/lovely-landscape.jpg",
477
+ id: "filename.png",
478
+ }
479
+ ]
480
+ }
481
+
482
+ will output a image section
483
+
484
+ ```html
485
+ <figure class="image embedded">
486
+ <div class="img">
487
+ <img src="http://example.com/lovely-landscape.jpg" alt="Some alt text">
488
+ <figcaption>An optional caption</figcaption>
489
+ </div>
490
+ </figure>
491
+ ```
492
+
463
493
  ### Link
464
494
 
465
495
  Links to different documents can be embedded so they change when the documents
@@ -16,6 +16,8 @@ require 'govspeak/link_extractor'
16
16
  require 'govspeak/presenters/attachment_presenter'
17
17
  require 'govspeak/presenters/contact_presenter'
18
18
  require 'govspeak/presenters/h_card_presenter'
19
+ require 'govspeak/presenters/image_presenter'
20
+ require 'govspeak/presenters/attachment_image_presenter'
19
21
 
20
22
 
21
23
  module Govspeak
@@ -217,12 +219,9 @@ module Govspeak
217
219
 
218
220
  extension('attached-image', /^!!([0-9]+)/) do |image_number|
219
221
  image = images[image_number.to_i - 1]
220
- if image
221
- caption = image.caption rescue nil
222
- render_image(image.url, image.alt_text, caption)
223
- else
224
- ""
225
- end
222
+ next "" unless image
223
+
224
+ render_image(ImagePresenter.new(image))
226
225
  end
227
226
 
228
227
  extension('attachment', /\[embed:attachments:(?!inline:|image:)\s*(.*?)\s*\]/) do |content_id, body|
@@ -247,13 +246,12 @@ module Govspeak
247
246
  %{<span#{span_id} class="attachment-inline">#{link}#{attributes}</span>}
248
247
  end
249
248
 
249
+ # DEPRECATED: use 'Image:image-id' instead
250
250
  extension('attachment image', /\[embed:attachments:image:\s*(.*?)\s*\]/) do |content_id|
251
251
  attachment = attachments.detect { |a| a[:content_id] == content_id }
252
252
  next "" unless attachment
253
253
 
254
- attachment = AttachmentPresenter.new(attachment)
255
- title = (attachment.title || "").tr("\n", " ")
256
- render_image(attachment.url, title, nil, attachment.id)
254
+ render_image(AttachmentImagePresenter.new(attachment))
257
255
  end
258
256
 
259
257
  # As of version 1.12.0 of Kramdown the block elements (div & figcaption)
@@ -266,12 +264,12 @@ module Govspeak
266
264
  # out div and figcaption
267
265
  #
268
266
  # This issue is not considered a bug by kramdown: https://github.com/gettalong/kramdown/issues/191
269
- def render_image(url, alt_text, caption = nil, id = nil)
270
- id_attr = id ? %{ id="attachment_#{id}"} : ""
267
+ def render_image(image)
268
+ id_attr = image.id ? %{ id="attachment_#{image.id}"} : ""
271
269
  lines = []
272
270
  lines << %{<figure#{id_attr} class="image embedded">}
273
- lines << %{<div class="img"><img src="#{encode(url)}" alt="#{encode(alt_text)}"></div>}
274
- lines << %{<figcaption>#{caption.strip}</figcaption>} if caption && !caption.strip.empty?
271
+ lines << %{<div class="img"><img src="#{encode(image.url)}" alt="#{encode(image.alt_text)}"></div>}
272
+ lines << %{<figcaption>#{encode(image.caption)}</figcaption>} if image.caption
275
273
  lines << '</figure>'
276
274
  lines.join
277
275
  end
@@ -359,6 +357,13 @@ module Govspeak
359
357
  @renderer.result(binding)
360
358
  end
361
359
 
360
+ extension('Image', /\[Image:\s*(.*?)\s*\]/) do |image_id|
361
+ image = images.detect { |c| c.is_a?(Hash) && c[:id] == image_id }
362
+ next "" unless image
363
+
364
+ render_image(ImagePresenter.new(image))
365
+ end
366
+
362
367
  private
363
368
 
364
369
  def kramdown_doc
@@ -0,0 +1,25 @@
1
+ module Govspeak
2
+ class AttachmentImagePresenter
3
+ attr_reader :attachment
4
+
5
+ def initialize(attachment)
6
+ @attachment = AttachmentPresenter.new(attachment)
7
+ end
8
+
9
+ def url
10
+ attachment.url
11
+ end
12
+
13
+ def alt_text
14
+ (attachment.title || "").tr("\n", " ")
15
+ end
16
+
17
+ def caption
18
+ nil
19
+ end
20
+
21
+ def id
22
+ attachment.id
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ module Govspeak
2
+ class ImagePresenter
3
+ attr_reader :image
4
+
5
+ def initialize(image)
6
+ @image = image
7
+ end
8
+
9
+ def url
10
+ image.respond_to?(:url) ? image.url : image[:url]
11
+ end
12
+
13
+ def alt_text
14
+ image.respond_to?(:alt_text) ? image.alt_text : image[:alt_text]
15
+ end
16
+
17
+ def caption
18
+ (image.respond_to?(:caption) ? image.caption : image[:caption]).to_s.strip.presence
19
+ end
20
+
21
+ def id
22
+ nil
23
+ end
24
+ end
25
+ end
@@ -1,3 +1,3 @@
1
1
  module Govspeak
2
- VERSION = "5.7.1".freeze
2
+ VERSION = "5.8.0".freeze
3
3
  end
@@ -0,0 +1,69 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'test_helper'
4
+ require 'govspeak_test_helper'
5
+
6
+ class GovspeakImagesBangTest < Minitest::Test
7
+ include GovspeakTestHelper
8
+
9
+ class Image
10
+ attr_reader :alt_text, :url, :caption
11
+
12
+ def initialize(attrs = {})
13
+ @alt_text = attrs[:alt_text] || "my alt"
14
+ @url = attrs[:url] || "http://example.com/image.jpg"
15
+ @caption = attrs[:caption]
16
+ end
17
+ end
18
+
19
+ test "!!n syntax renders an image in options[:images]" do
20
+ given_govspeak "!!1", images: [Image.new] do
21
+ assert_html_output(
22
+ %{<figure class="image embedded">} +
23
+ %{<div class="img"><img src="http://example.com/image.jpg" alt="my alt"></div>} +
24
+ %{</figure>}
25
+ )
26
+ end
27
+ end
28
+
29
+ test "!!n syntax escapes alt text" do
30
+ given_govspeak "!!1", images: [Image.new(alt_text: %{my alt '&"<>})] do
31
+ assert_html_output(
32
+ %{<figure class="image embedded">} +
33
+ %{<div class="img"><img src="http://example.com/image.jpg" alt="my alt '&amp;&quot;&lt;&gt;"></div>} +
34
+ %{</figure>}
35
+ )
36
+ end
37
+ end
38
+
39
+ test "!!n syntax renders nothing if not found" do
40
+ doc = Govspeak::Document.new("!!1")
41
+ assert_equal %{\n}, doc.to_html
42
+ end
43
+
44
+ test "Image:image-id syntax renders nothing" do
45
+ doc = Govspeak::Document.new("[Image:another-id]", images: [Image.new])
46
+ assert_equal %{\n}, doc.to_html
47
+ end
48
+
49
+ test "!!n syntax adds image caption if given" do
50
+ given_govspeak "!!1", images: [Image.new(caption: 'My Caption & so on')] do
51
+ assert_html_output(
52
+ %{<figure class="image embedded">} +
53
+ %{<div class="img"><img src="http://example.com/image.jpg" alt="my alt"></div>\n} +
54
+ %{<figcaption>My Caption &amp; so on</figcaption>} +
55
+ %{</figure>}
56
+ )
57
+ end
58
+ end
59
+
60
+ test "!!n syntax ignores a blank caption" do
61
+ given_govspeak "!!1", images: [Image.new(caption: ' ')] do
62
+ assert_html_output(
63
+ %{<figure class="image embedded">} +
64
+ %{<div class="img"><img src="http://example.com/image.jpg" alt="my alt"></div>} +
65
+ %{</figure>}
66
+ )
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,61 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'test_helper'
4
+ require 'govspeak_test_helper'
5
+
6
+ class GovspeakImagesTest < Minitest::Test
7
+ include GovspeakTestHelper
8
+
9
+ def build_image(attrs = {})
10
+ attrs[:alt_text] ||= "my alt"
11
+ attrs[:url] ||= "http://example.com/image.jpg"
12
+ attrs[:id] ||= "image-id"
13
+ attrs
14
+ end
15
+
16
+ test "Image:image-id syntax renders an image in options[:images]" do
17
+ given_govspeak "[Image:image-id]", images: [build_image] do
18
+ assert_html_output(
19
+ %{<figure class="image embedded">} +
20
+ %{<div class="img"><img src="http://example.com/image.jpg" alt="my alt"></div>} +
21
+ %{</figure>}
22
+ )
23
+ end
24
+ end
25
+
26
+ test "Image:image-id syntax escapes alt text" do
27
+ given_govspeak "[Image:image-id]", images: [build_image(alt_text: %{my alt '&"<>})] do
28
+ assert_html_output(
29
+ %{<figure class="image embedded">} +
30
+ %{<div class="img"><img src="http://example.com/image.jpg" alt="my alt '&amp;&quot;&lt;&gt;"></div>} +
31
+ %{</figure>}
32
+ )
33
+ end
34
+ end
35
+
36
+ test "Image:image-id syntax renders nothing if not found" do
37
+ doc = Govspeak::Document.new("[Image:another-id]")
38
+ assert_equal %{\n}, doc.to_html
39
+ end
40
+
41
+ test "Image:image-id syntax adds image caption if given" do
42
+ given_govspeak "[Image:image-id]", images: [build_image(caption: 'My Caption & so on')] do
43
+ assert_html_output(
44
+ %{<figure class="image embedded">} +
45
+ %{<div class="img"><img src="http://example.com/image.jpg" alt="my alt"></div>\n} +
46
+ %{<figcaption>My Caption &amp; so on</figcaption>} +
47
+ %{</figure>}
48
+ )
49
+ end
50
+ end
51
+
52
+ test "Image:image-id syntax ignores a blank caption" do
53
+ given_govspeak "[Image:image-id]", images: [build_image(caption: ' ')] do
54
+ assert_html_output(
55
+ %{<figure class="image embedded">} +
56
+ %{<div class="img"><img src="http://example.com/image.jpg" alt="my alt"></div>} +
57
+ %{</figure>}
58
+ )
59
+ end
60
+ end
61
+ end
@@ -440,7 +440,7 @@ Teston
440
440
 
441
441
  $CTA
442
442
  Click here to start the tool
443
- $CTA", [], document_domains: %w(www.not-external.com) do
443
+ $CTA", document_domains: %w(www.not-external.com) do
444
444
  assert_html_output %{
445
445
  <p><a href="http://www.not-external.com">internal link</a></p>
446
446
 
@@ -632,58 +632,6 @@ Teston
632
632
  }
633
633
  end
634
634
 
635
- test "can reference attached images using !!n" do
636
- images = [OpenStruct.new(alt_text: 'my alt', url: "http://example.com/image.jpg")]
637
- given_govspeak "!!1", images do
638
- assert_html_output(
639
- %{<figure class="image embedded">} +
640
- %{<div class="img"><img src="http://example.com/image.jpg" alt="my alt"></div>} +
641
- %{</figure>}
642
- )
643
- end
644
- end
645
-
646
- test "alt text of referenced images is escaped" do
647
- images = [OpenStruct.new(alt_text: %{my alt '&"<>}, url: "http://example.com/image.jpg")]
648
- given_govspeak "!!1", images do
649
- assert_html_output(
650
- %{<figure class="image embedded">} +
651
- %{<div class="img"><img src="http://example.com/image.jpg" alt="my alt '&amp;&quot;&lt;&gt;"></div>} +
652
- %{</figure>}
653
- )
654
- end
655
- end
656
-
657
- test "silently ignores an image attachment if the referenced image is missing" do
658
- doc = Govspeak::Document.new("!!1")
659
- doc.images = []
660
-
661
- assert_equal %{\n}, doc.to_html
662
- end
663
-
664
- test "adds image caption if given" do
665
- images = [OpenStruct.new(alt_text: "my alt", url: "http://example.com/image.jpg", caption: 'My Caption & so on')]
666
- given_govspeak "!!1", images do
667
- assert_html_output(
668
- %{<figure class="image embedded">} +
669
- %{<div class="img"><img src="http://example.com/image.jpg" alt="my alt"></div>\n} +
670
- %{<figcaption>My Caption &amp; so on</figcaption>} +
671
- %{</figure>}
672
- )
673
- end
674
- end
675
-
676
- test "ignores a blank caption" do
677
- images = [OpenStruct.new(alt_text: "my alt", url: "http://example.com/image.jpg", caption: ' ')]
678
- given_govspeak "!!1", images do
679
- assert_html_output(
680
- %{<figure class="image embedded">} +
681
- %{<div class="img"><img src="http://example.com/image.jpg" alt="my alt"></div>} +
682
- %{</figure>}
683
- )
684
- end
685
- end
686
-
687
635
  test "can sanitize a document" do
688
636
  document = Govspeak::Document.new("<script>doBadThings();</script>")
689
637
  assert_equal "doBadThings();", document.to_sanitized_html.strip
@@ -4,15 +4,14 @@ module GovspeakTestHelper
4
4
  end
5
5
 
6
6
  class GovspeakAsserter
7
- def initialize(testcase, govspeak, images = [], options = {})
7
+ def initialize(testcase, govspeak, options = {})
8
8
  @testcase = testcase
9
9
  @govspeak = remove_indentation(govspeak)
10
- @images = images
11
10
  @options = options
12
11
  end
13
12
 
14
13
  def document
15
- Govspeak::Document.new(@govspeak, @options.merge(images: @images))
14
+ Govspeak::Document.new(@govspeak, @options)
16
15
  end
17
16
 
18
17
  def assert_text_output(raw_expected)
@@ -55,8 +54,8 @@ module GovspeakTestHelper
55
54
  end
56
55
  end
57
56
 
58
- def given_govspeak(govspeak, images = [], options = {}, &block)
59
- asserter = GovspeakAsserter.new(self, govspeak, images, options)
57
+ def given_govspeak(govspeak, options = {}, &block)
58
+ asserter = GovspeakAsserter.new(self, govspeak, options)
60
59
  asserter.instance_eval(&block)
61
60
  end
62
61
 
@@ -69,9 +68,9 @@ module GovspeakTestHelper
69
68
  end
70
69
 
71
70
  module ClassMethods
72
- def test_given_govspeak(govspeak, images = [], options = {}, &block)
71
+ def test_given_govspeak(govspeak, options = {}, &block)
73
72
  test "Given #{govspeak}" do
74
- given_govspeak(govspeak, images, options, &block)
73
+ given_govspeak(govspeak, options, &block)
75
74
  end
76
75
  end
77
76
  end
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: 5.7.1
4
+ version: 5.8.0
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: 2018-11-09 00:00:00.000000000 Z
11
+ date: 2018-12-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionview
@@ -269,9 +269,11 @@ files:
269
269
  - lib/govspeak/kramdown_overrides.rb
270
270
  - lib/govspeak/link_extractor.rb
271
271
  - lib/govspeak/post_processor.rb
272
+ - lib/govspeak/presenters/attachment_image_presenter.rb
272
273
  - lib/govspeak/presenters/attachment_presenter.rb
273
274
  - lib/govspeak/presenters/contact_presenter.rb
274
275
  - lib/govspeak/presenters/h_card_presenter.rb
276
+ - lib/govspeak/presenters/image_presenter.rb
275
277
  - lib/govspeak/structured_header_extractor.rb
276
278
  - lib/govspeak/version.rb
277
279
  - lib/kramdown/parser/kramdown_with_automatic_external_links.rb
@@ -328,6 +330,8 @@ files:
328
330
  - test/govspeak_button_test.rb
329
331
  - test/govspeak_contacts_test.rb
330
332
  - test/govspeak_extract_contact_content_ids_test.rb
333
+ - test/govspeak_images_bang_test.rb
334
+ - test/govspeak_images_test.rb
331
335
  - test/govspeak_link_extractor_test.rb
332
336
  - test/govspeak_link_test.rb
333
337
  - test/govspeak_structured_headers_test.rb
@@ -373,7 +377,9 @@ test_files:
373
377
  - test/govspeak_link_test.rb
374
378
  - test/govspeak_extract_contact_content_ids_test.rb
375
379
  - test/govspeak_structured_headers_test.rb
380
+ - test/govspeak_images_test.rb
376
381
  - test/presenters/h_card_presenter_test.rb
382
+ - test/govspeak_images_bang_test.rb
377
383
  - test/govspeak_link_extractor_test.rb
378
384
  - test/govspeak_attachments_test.rb
379
385
  - test/govspeak_attachments_inline_test.rb