govspeak 4.0.0 → 5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/README.md +12 -0
- data/bin/govspeak +8 -0
- data/lib/govspeak.rb +51 -23
- data/lib/govspeak/cli.rb +51 -0
- data/lib/govspeak/post_processor.rb +26 -0
- data/lib/govspeak/version.rb +1 -1
- data/lib/presenters/attachment_presenter.rb +102 -57
- data/lib/presenters/contact_presenter.rb +22 -0
- data/lib/{govspeak/extension → templates}/attachment.html.erb +7 -15
- data/lib/templates/contact.html.erb +2 -2
- data/lib/templates/inline_attachment.html.erb +6 -0
- data/test/govspeak_attachments_image_test.rb +108 -0
- data/test/govspeak_attachments_inline_test.rb +172 -0
- data/test/govspeak_attachments_test.rb +411 -0
- data/test/govspeak_contacts_test.rb +10 -6
- data/test/govspeak_link_test.rb +45 -0
- data/test/govspeak_test.rb +21 -90
- metadata +47 -7
- data/lib/govspeak/extension/inline_attachment.html.erb +0 -4
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'active_support/core_ext/array'
|
2
|
+
require 'ostruct'
|
3
|
+
|
4
|
+
class ContactPresenter
|
5
|
+
attr_reader :contact
|
6
|
+
delegate :id, :content_id, :title, :recipient, :street_address, :postal_code,
|
7
|
+
:locality, :region, :country_code, :country_name, :email, :contact_form_url,
|
8
|
+
:comments, :worldwide_organisation_path, to: :contact
|
9
|
+
|
10
|
+
def initialize(contact)
|
11
|
+
@contact = OpenStruct.new(contact)
|
12
|
+
end
|
13
|
+
|
14
|
+
def contact_numbers
|
15
|
+
Array.wrap(contact[:contact_numbers])
|
16
|
+
end
|
17
|
+
|
18
|
+
def has_postal_address?
|
19
|
+
recipient.present? || street_address.present? || locality.present? ||
|
20
|
+
region.present? || postal_code.present?
|
21
|
+
end
|
22
|
+
end
|
@@ -3,12 +3,10 @@
|
|
3
3
|
<%= attachment.thumbnail_link %>
|
4
4
|
</div>
|
5
5
|
<div class="attachment-details">
|
6
|
-
<h2 class="title"><%= attachment.
|
6
|
+
<h2 class="title"><%= attachment.attachment_details %></h2>
|
7
7
|
<p class="metadata">
|
8
8
|
<% if attachment.references? %>
|
9
|
-
<span class="references">
|
10
|
-
<%= t('attachment.headings.reference') %>: <%= attachment.references %>
|
11
|
-
</span>
|
9
|
+
<span class="references"><%= t('attachment.headings.reference') %>: <%= attachment.reference %></span>
|
12
10
|
<% end %>
|
13
11
|
<% if attachment.unnumbered_paper? %>
|
14
12
|
<span class="unnumbered-paper">
|
@@ -21,13 +19,9 @@
|
|
21
19
|
<% end %>
|
22
20
|
<% if attachment.previewable? %>
|
23
21
|
<span class="preview">
|
24
|
-
<strong>
|
25
|
-
<%= attachment.link("View online", attachment.preview_url) %>
|
26
|
-
</strong>
|
27
|
-
</span>
|
28
|
-
<span class="download">
|
29
|
-
attachment.download_link
|
22
|
+
<strong><%= attachment.link("View online", attachment.preview_url) %></strong>
|
30
23
|
</span>
|
24
|
+
<span class="download"><%= attachment.download_link %></span>
|
31
25
|
<% else %>
|
32
26
|
<%= attachment.attachment_attributes %>
|
33
27
|
<% end %>
|
@@ -35,10 +29,8 @@
|
|
35
29
|
<% if attachment.order_url.present? %>
|
36
30
|
<p>
|
37
31
|
<%= attachment.link t('attachment.headings.order_a_copy'), attachment.order_url,
|
38
|
-
|
39
|
-
|
40
|
-
(<span class="price"><%= attachment.price %></span>)
|
41
|
-
<% end %>
|
32
|
+
class: "order_url", title: t('attachment.headings.order_a_copy_full')
|
33
|
+
%><% if attachment.price %>(<span class="price"><%= attachment.price %></span>)<% end %>
|
42
34
|
</p>
|
43
35
|
<% end %>
|
44
36
|
|
@@ -57,7 +49,7 @@
|
|
57
49
|
<%= t('attachment.accessibility.full_help_html',
|
58
50
|
email: attachment.alternative_format_order_link,
|
59
51
|
title: attachment.title,
|
60
|
-
references: attachment.
|
52
|
+
references: attachment.references_for_title) %>
|
61
53
|
</p>
|
62
54
|
</div>
|
63
55
|
<% end %>
|
@@ -25,8 +25,8 @@
|
|
25
25
|
<% end %>
|
26
26
|
<% contact.contact_numbers.each do |number| %>
|
27
27
|
<p class="tel">
|
28
|
-
<span class="type"><%= number
|
29
|
-
<%= number
|
28
|
+
<span class="type"><%= number[:label] %></span>
|
29
|
+
<%= number[:number] %>
|
30
30
|
</p>
|
31
31
|
<% end %>
|
32
32
|
</div>
|
@@ -0,0 +1,6 @@
|
|
1
|
+
<span <% if attachment.id %>id="attachment_<%= attachment.id %>" <% end %>class="attachment-inline">
|
2
|
+
<%= attachment.link attachment.title, attachment.url %>
|
3
|
+
<% unless attachment.attachment_attributes.empty? %>
|
4
|
+
(<%= attachment.attachment_attributes %>)
|
5
|
+
<% end %>
|
6
|
+
</span>
|
@@ -0,0 +1,108 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class GovspeakAttachmentsImageTest < Minitest::Test
|
6
|
+
def build_attachment(args = {})
|
7
|
+
{
|
8
|
+
content_id: "2b4d92f3-f8cd-4284-aaaa-25b3a640d26c",
|
9
|
+
id: 456,
|
10
|
+
url: "http://example.com/attachment.jpg",
|
11
|
+
title: "Attachment Title",
|
12
|
+
}.merge(args)
|
13
|
+
end
|
14
|
+
|
15
|
+
def render_govspeak(govspeak, attachments = [])
|
16
|
+
Govspeak::Document.new(govspeak, attachments: attachments).to_html
|
17
|
+
end
|
18
|
+
|
19
|
+
def compress_html(html)
|
20
|
+
html.gsub(/[\n\r]+[\s]*/, '')
|
21
|
+
end
|
22
|
+
|
23
|
+
test "renders an empty string for an image attachment not found" do
|
24
|
+
assert_equal("\n", render_govspeak("[embed:attachments:image:1fe8]", [build_attachment]))
|
25
|
+
end
|
26
|
+
|
27
|
+
test "wraps an attachment in a figure with the id if the id is present" do
|
28
|
+
rendered = render_govspeak(
|
29
|
+
"[embed:attachments:image:1fe8]",
|
30
|
+
[build_attachment(id: 10, content_id: "1fe8")]
|
31
|
+
)
|
32
|
+
assert_match(/<figure id="attachment_10" class="image embedded">/, rendered)
|
33
|
+
end
|
34
|
+
|
35
|
+
test "wraps an attachment in a figure without the id if the id is not present" do
|
36
|
+
rendered = render_govspeak(
|
37
|
+
"[embed:attachments:image:1fe8]",
|
38
|
+
[build_attachment(id: nil, content_id: "1fe8")]
|
39
|
+
)
|
40
|
+
assert_match(/<figure class="image embedded">/, rendered)
|
41
|
+
end
|
42
|
+
|
43
|
+
test "renders an attachment if there are spaces around the content_id" do
|
44
|
+
rendered = render_govspeak(
|
45
|
+
"[embed:attachments:image: 1fe8 ]",
|
46
|
+
[build_attachment(id: 10, content_id: "1fe8")]
|
47
|
+
)
|
48
|
+
assert_match(/<figure id="attachment_10" class="image embedded">/, rendered)
|
49
|
+
end
|
50
|
+
|
51
|
+
test "has an image element to the file" do
|
52
|
+
rendered = render_govspeak(
|
53
|
+
"[embed:attachments:image:1fe8]",
|
54
|
+
[build_attachment(id: nil, url: "http://a.b/c.jpg", content_id: "1fe8")]
|
55
|
+
)
|
56
|
+
assert_match(%r{<img.*src="http://a.b/c.jpg"}, rendered)
|
57
|
+
end
|
58
|
+
|
59
|
+
test "renders the image title as an alt tag" do
|
60
|
+
rendered = render_govspeak(
|
61
|
+
"[embed:attachments:image:1fe8]",
|
62
|
+
[build_attachment(id: nil, title: "My Title", content_id: "1fe8")]
|
63
|
+
)
|
64
|
+
assert_match(%r{<img.*alt="My Title"}, rendered)
|
65
|
+
end
|
66
|
+
|
67
|
+
test "can render a nil image title" do
|
68
|
+
rendered = render_govspeak(
|
69
|
+
"[embed:attachments:image:1fe8]",
|
70
|
+
[build_attachment(id: nil, title: nil, content_id: "1fe8")]
|
71
|
+
)
|
72
|
+
assert_match(%r{<img.*alt=""}, rendered)
|
73
|
+
end
|
74
|
+
|
75
|
+
test "a full image attachment rendering looks correct" do
|
76
|
+
rendered = render_govspeak(
|
77
|
+
"[embed:attachments:image:1fe8]",
|
78
|
+
[build_attachment(id: 10, url: "http://a.b/c.jpg", title: "My Title", content_id: "1fe8")]
|
79
|
+
)
|
80
|
+
expected_html_output = %{
|
81
|
+
<figure id="attachment_10" class="image embedded">
|
82
|
+
<div class="img"><img src="http://a.b/c.jpg" alt="My Title"></div>
|
83
|
+
</figure>
|
84
|
+
}
|
85
|
+
assert_match(compress_html(expected_html_output), compress_html(rendered))
|
86
|
+
end
|
87
|
+
|
88
|
+
# test inserted because divs can be stripped inside a table
|
89
|
+
test "can be rendered inside a table" do
|
90
|
+
rendered = render_govspeak(
|
91
|
+
"| [embed:attachments:image:1fe8] |",
|
92
|
+
[build_attachment(content_id: "1fe8", id: nil)]
|
93
|
+
)
|
94
|
+
|
95
|
+
regex = %r{<td><figure class="image embedded"><div class="img">(.*?)</div></figure></td>}
|
96
|
+
assert_match(regex, rendered)
|
97
|
+
end
|
98
|
+
|
99
|
+
test "renders an empty string for no match" do
|
100
|
+
rendered = render_govspeak("[embed:attachments:image:1fe8]")
|
101
|
+
assert_equal("\n", rendered)
|
102
|
+
end
|
103
|
+
|
104
|
+
test "renders an empty string for a filename instead of a content id" do
|
105
|
+
rendered = render_govspeak("[embed:attachments:image: path/to/file.jpg ]")
|
106
|
+
assert_equal("\n", rendered)
|
107
|
+
end
|
108
|
+
end
|
@@ -0,0 +1,172 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class GovspeakAttachmentsInlineTest < Minitest::Test
|
6
|
+
def build_attachment(args = {})
|
7
|
+
{
|
8
|
+
content_id: "2b4d92f3-f8cd-4284-aaaa-25b3a640d26c",
|
9
|
+
id: 456,
|
10
|
+
url: "http://example.com/attachment.pdf",
|
11
|
+
title: "Attachment Title",
|
12
|
+
}.merge(args)
|
13
|
+
end
|
14
|
+
|
15
|
+
def render_govspeak(govspeak, attachments = [])
|
16
|
+
Govspeak::Document.new(govspeak, attachments: attachments).to_html
|
17
|
+
end
|
18
|
+
|
19
|
+
test "renders an empty string for an inline attachment not found" do
|
20
|
+
assert_equal("\n", render_govspeak("[embed:attachments:inline:1fe8]", [build_attachment]))
|
21
|
+
end
|
22
|
+
|
23
|
+
test "wraps an attachment in a span with the id if the id is present" do
|
24
|
+
rendered = render_govspeak(
|
25
|
+
"[embed:attachments:inline:1fe8]",
|
26
|
+
[build_attachment(id: 10, content_id: "1fe8")]
|
27
|
+
)
|
28
|
+
assert_match(/<span id="attachment_10" class="attachment-inline">/, rendered)
|
29
|
+
end
|
30
|
+
|
31
|
+
test "wraps an attachment in a span without the id if the id is not present" do
|
32
|
+
rendered = render_govspeak(
|
33
|
+
"[embed:attachments:inline:1fe8]",
|
34
|
+
[build_attachment(id: nil, content_id: "1fe8")]
|
35
|
+
)
|
36
|
+
assert_match(/<span class="attachment-inline">/, rendered)
|
37
|
+
end
|
38
|
+
|
39
|
+
test "renders an attachment where the content id has spaces" do
|
40
|
+
rendered = render_govspeak(
|
41
|
+
"[embed:attachments:inline: 1fe8 ]",
|
42
|
+
[build_attachment(id: nil, content_id: "1fe8")]
|
43
|
+
)
|
44
|
+
assert_match(/<span class="attachment-inline">/, rendered)
|
45
|
+
end
|
46
|
+
|
47
|
+
test "links to the attachment file" do
|
48
|
+
rendered = render_govspeak(
|
49
|
+
"[embed:attachments:inline:1fe8]",
|
50
|
+
[build_attachment(content_id: "1fe8", url: "http://a.b/f.pdf", title: "My Pdf")]
|
51
|
+
)
|
52
|
+
assert_match(%r{<a href="http://a.b/f.pdf">My Pdf</a>}, rendered)
|
53
|
+
end
|
54
|
+
|
55
|
+
test "renders with a nil title" do
|
56
|
+
rendered = render_govspeak(
|
57
|
+
"[embed:attachments:inline:1fe8]",
|
58
|
+
[build_attachment(content_id: "1fe8", url: "http://a.b/f.pdf", title: nil)]
|
59
|
+
)
|
60
|
+
assert_match(%r{<a href="http://a.b/f.pdf"></a>}, rendered)
|
61
|
+
end
|
62
|
+
|
63
|
+
test "renders on a single line" do
|
64
|
+
rendered = render_govspeak(
|
65
|
+
"[embed:attachments:inline:2bc1]",
|
66
|
+
[build_attachment(content_id: "2bc1", external?: true)]
|
67
|
+
)
|
68
|
+
assert_match(%r{<span id="attachment[^\n]*</span>}, rendered)
|
69
|
+
end
|
70
|
+
|
71
|
+
test "doesn't have spaces between the span and the link" do
|
72
|
+
rendered = render_govspeak(
|
73
|
+
"[embed:attachments:inline:2bc1]",
|
74
|
+
[build_attachment(content_id: "2bc1", id: nil)]
|
75
|
+
)
|
76
|
+
assert_match(%r{<span class="attachment-inline"><a href=".*">.*</a></span>}, rendered)
|
77
|
+
end
|
78
|
+
|
79
|
+
test "will show HTML type (in brackets) if file_extension is specified as html" do
|
80
|
+
rendered = render_govspeak(
|
81
|
+
"[embed:attachments:inline:1fe8]",
|
82
|
+
[build_attachment(content_id: "1fe8", file_extension: "html")]
|
83
|
+
)
|
84
|
+
assert_match(%r{(<span class="type">HTML</span>)}, rendered)
|
85
|
+
end
|
86
|
+
|
87
|
+
test "will show url (in brackets) if specified as external" do
|
88
|
+
rendered = render_govspeak(
|
89
|
+
"[embed:attachments:inline:1fe8]",
|
90
|
+
[build_attachment(content_id: "1fe8", url: "http://a.b/f.pdf", external?: true)]
|
91
|
+
)
|
92
|
+
assert_match(%r{(<span class="url">http://a.b/f.pdf</span>)}, rendered)
|
93
|
+
end
|
94
|
+
|
95
|
+
test "will not show url if file_extension is specified as html" do
|
96
|
+
rendered = render_govspeak(
|
97
|
+
"[embed:attachments:inline:1fe8]",
|
98
|
+
[build_attachment(content_id: "1fe8", url: "http://a.b/f.pdf", file_extension: "html", external?: true)]
|
99
|
+
)
|
100
|
+
refute_match(%r{(<span class="url">http://a.b/f.pdf</span>)}, rendered)
|
101
|
+
end
|
102
|
+
|
103
|
+
test "will show a file extension in a abbr element for non html" do
|
104
|
+
rendered = render_govspeak(
|
105
|
+
"[embed:attachments:inline:1fe8]",
|
106
|
+
[build_attachment(content_id: "1fe8", file_extension: "csv")]
|
107
|
+
)
|
108
|
+
refute_match(%r{<span class="type"><abbr title="Comma-separated values">CSV</abbr></span>}, rendered)
|
109
|
+
end
|
110
|
+
|
111
|
+
test "will show file size in a span" do
|
112
|
+
rendered = render_govspeak(
|
113
|
+
"[embed:attachments:inline:1fe8]",
|
114
|
+
[build_attachment(content_id: "1fe8", file_size: 1024)]
|
115
|
+
)
|
116
|
+
assert_match(%r{<span class="file-size">1 KB</span>}, rendered)
|
117
|
+
end
|
118
|
+
|
119
|
+
test "will show number of pages" do
|
120
|
+
rendered = render_govspeak(
|
121
|
+
"[embed:attachments:inline:1fe8]",
|
122
|
+
[build_attachment(content_id: "1fe8", number_of_pages: 1)]
|
123
|
+
)
|
124
|
+
assert_match(%r{<span class="page-length">1 page</span>}, rendered)
|
125
|
+
rendered = render_govspeak(
|
126
|
+
"[embed:attachments:inline:1fe8]",
|
127
|
+
[build_attachment(content_id: "1fe8", number_of_pages: 2)]
|
128
|
+
)
|
129
|
+
assert_match(%r{<span class="page-length">2 pages</span>}, rendered)
|
130
|
+
end
|
131
|
+
|
132
|
+
test "will show attributes after link" do
|
133
|
+
rendered = render_govspeak(
|
134
|
+
"[embed:attachments:inline:1fe8]",
|
135
|
+
[build_attachment(
|
136
|
+
content_id: "1fe8",
|
137
|
+
url: "http://a.b/test.txt",
|
138
|
+
title: "My Attached Text File",
|
139
|
+
file_extension: "txt",
|
140
|
+
file_size: 2048,
|
141
|
+
number_of_pages: 2,
|
142
|
+
)]
|
143
|
+
)
|
144
|
+
link = %{<a href="#{Regexp.quote('http://a.b/test.txt')}">My Attached Text File</a>}
|
145
|
+
type = %{<span class="type">Plain text</span>}
|
146
|
+
file_size = %{<span class="file-size">2 KB</span>}
|
147
|
+
pages = %{<span class="page-length">2 pages</span>}
|
148
|
+
assert_match(/#{link}\s+\(#{type}, #{file_size}, #{pages}\)/, rendered)
|
149
|
+
end
|
150
|
+
|
151
|
+
test "can render two inline attachments on the same line" do
|
152
|
+
rendered = render_govspeak(
|
153
|
+
"[embed:attachments:inline:1fe8] and [embed:attachments:inline:2abc]",
|
154
|
+
[
|
155
|
+
build_attachment(content_id: "1fe8", url: "http://a.b/test.txt", title: "Text File"),
|
156
|
+
build_attachment(content_id: "2abc", url: "http://a.b/test.pdf", title: "PDF File")
|
157
|
+
]
|
158
|
+
)
|
159
|
+
assert_match(%r{<a href="http://a.b/test.txt">Text File</a>}, rendered)
|
160
|
+
assert_match(%r{<a href="http://a.b/test.pdf">PDF File</a>}, rendered)
|
161
|
+
end
|
162
|
+
|
163
|
+
test "will render a not found attachment as an empty string" do
|
164
|
+
rendered = render_govspeak("[embed:attachments:inline:1fe8]")
|
165
|
+
assert_equal("\n", rendered)
|
166
|
+
end
|
167
|
+
|
168
|
+
test "will render a file name used as a content id as an empty string" do
|
169
|
+
rendered = render_govspeak("[embed:attachments:inline: path/to/file name.jpg ]")
|
170
|
+
assert_equal("\n", rendered)
|
171
|
+
end
|
172
|
+
end
|
@@ -0,0 +1,411 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class GovspeakAttachmentTest < Minitest::Test
|
6
|
+
def build_attachment(args = {})
|
7
|
+
{
|
8
|
+
content_id: "2b4d92f3-f8cd-4284-aaaa-25b3a640d26c",
|
9
|
+
id: 456,
|
10
|
+
url: "http://example.com/attachment.pdf",
|
11
|
+
title: "Attachment Title",
|
12
|
+
}.merge(args)
|
13
|
+
end
|
14
|
+
|
15
|
+
def compress_html(html)
|
16
|
+
html.gsub(/[\n\r]+[\s]*/, '')
|
17
|
+
end
|
18
|
+
|
19
|
+
def render_govspeak(govspeak, attachments = [], options = {})
|
20
|
+
options = options.merge(attachments: attachments)
|
21
|
+
Govspeak::Document.new(govspeak, options).to_html
|
22
|
+
end
|
23
|
+
|
24
|
+
test "wraps an attachment in a section.attachment.embedded" do
|
25
|
+
rendered = render_govspeak(
|
26
|
+
"[embed:attachments:3ed2]",
|
27
|
+
[build_attachment(content_id: "3ed2")]
|
28
|
+
)
|
29
|
+
assert_match(/<section class="attachment embedded">/, rendered)
|
30
|
+
end
|
31
|
+
|
32
|
+
test "can convert an attachment with spaces" do
|
33
|
+
rendered = render_govspeak(
|
34
|
+
"[embed:attachments: 3ed2 ]",
|
35
|
+
[build_attachment(content_id: "3ed2")]
|
36
|
+
)
|
37
|
+
assert_match(/<section class="attachment embedded">/, rendered)
|
38
|
+
end
|
39
|
+
|
40
|
+
test "wraps an external attachment in a section.attachment.hosted-externally" do
|
41
|
+
rendered = render_govspeak(
|
42
|
+
"[embed:attachments:3ed2]",
|
43
|
+
[build_attachment(content_id: "3ed2", external?: true)]
|
44
|
+
)
|
45
|
+
assert_match(/<section class="attachment hosted-externally">/, rendered)
|
46
|
+
end
|
47
|
+
|
48
|
+
test "outputs a pub-cover.png thumbnail by default" do
|
49
|
+
rendered = render_govspeak(
|
50
|
+
"[embed:attachments:3ed2]",
|
51
|
+
[build_attachment(content_id: "3ed2")]
|
52
|
+
)
|
53
|
+
assert_match(%r{<img src="/images/pub-cover.png"}, rendered)
|
54
|
+
end
|
55
|
+
|
56
|
+
test "outputs a specified thumbnail for a pdf with a thumbnail_url" do
|
57
|
+
rendered = render_govspeak(
|
58
|
+
"[embed:attachments:3ed2]",
|
59
|
+
[build_attachment(content_id: "3ed2", file_extension: "pdf", thumbnail_url: "http://a.b/custom.png")]
|
60
|
+
)
|
61
|
+
assert_match(%r{<img src="http://a.b/custom.png"}, rendered)
|
62
|
+
end
|
63
|
+
|
64
|
+
test "outputs pub-cover.png for a pdf without thumbnail_url" do
|
65
|
+
rendered = render_govspeak(
|
66
|
+
"[embed:attachments:3ed2]",
|
67
|
+
[build_attachment(content_id: "3ed2", file_extension: "pdf", thumbnail_url: nil)]
|
68
|
+
)
|
69
|
+
assert_match(%r{<img src="/images/pub-cover.png"}, rendered)
|
70
|
+
end
|
71
|
+
|
72
|
+
test "outputs pub-cover-html.png for a file with html file_extension" do
|
73
|
+
rendered = render_govspeak(
|
74
|
+
"[embed:attachments:3ed2]",
|
75
|
+
[build_attachment(content_id: "3ed2", file_extension: "html")]
|
76
|
+
)
|
77
|
+
assert_match(%r{<img src="/images/pub-cover-html.png"}, rendered)
|
78
|
+
end
|
79
|
+
|
80
|
+
test "outputs pub-cover-doc.png for a file with docx file_extension" do
|
81
|
+
rendered = render_govspeak(
|
82
|
+
"[embed:attachments:3ed2]",
|
83
|
+
[build_attachment(content_id: "3ed2", file_extension: "docx")]
|
84
|
+
)
|
85
|
+
assert_match(%r{<img src="/images/pub-cover-doc.png"}, rendered)
|
86
|
+
end
|
87
|
+
|
88
|
+
test "outputs pub-cover-spreadsheet.png for a file with xls file_extension" do
|
89
|
+
rendered = render_govspeak(
|
90
|
+
"[embed:attachments:3ed2]",
|
91
|
+
[build_attachment(content_id: "3ed2", file_extension: "xls")]
|
92
|
+
)
|
93
|
+
assert_match(%r{<img src="/images/pub-cover-spreadsheet.png"}, rendered)
|
94
|
+
end
|
95
|
+
|
96
|
+
test "outputs no thumbnail for a previewable file" do
|
97
|
+
rendered = render_govspeak(
|
98
|
+
"[embed:attachments:3ed2]",
|
99
|
+
[build_attachment(content_id: "3ed2", file_extension: "csv")]
|
100
|
+
)
|
101
|
+
assert_match(%r{<div class="attachment-thumb"></div>}, compress_html(rendered))
|
102
|
+
end
|
103
|
+
|
104
|
+
test "outputs a title link within a h2" do
|
105
|
+
rendered = render_govspeak(
|
106
|
+
"[embed:attachments:3ed2]",
|
107
|
+
[build_attachment(content_id: "3ed2", id: 1, url: "http://a.b/c.pdf", title: "Attachment Title")]
|
108
|
+
)
|
109
|
+
assert_match(%r{<h2 class="title">\s*<a href="http://a.b/c.pdf" aria-describedby="attachment-1-accessibility-help">Attachment Title</a></h2>}, compress_html(rendered))
|
110
|
+
end
|
111
|
+
|
112
|
+
test "title link has rel='external' for an external link" do
|
113
|
+
rendered = render_govspeak(
|
114
|
+
"[embed:attachments:3ed2]",
|
115
|
+
[build_attachment(content_id: "3ed2", id: 1, url: "http://a.b/c.pdf", external?: true)]
|
116
|
+
)
|
117
|
+
assert_match(%r{<a href="http://a.b/c.pdf" rel="external" aria-describedby="attachment-1-accessibility-help">}, rendered)
|
118
|
+
end
|
119
|
+
|
120
|
+
test "accessible attachment doesn't have the aria-describedby attribute" do
|
121
|
+
rendered = render_govspeak(
|
122
|
+
"[embed:attachments:3ed2]",
|
123
|
+
[build_attachment(content_id: "3ed2", url: "http://a.b/c.pdf", accessible?: true)]
|
124
|
+
)
|
125
|
+
assert_match(%r{<a href="http://a.b/c.pdf">}, rendered)
|
126
|
+
end
|
127
|
+
|
128
|
+
test "outputs reference if isbn is present" do
|
129
|
+
rendered = render_govspeak(
|
130
|
+
"[embed:attachments:3ed2]",
|
131
|
+
[build_attachment(content_id: "3ed2", isbn: "123")]
|
132
|
+
)
|
133
|
+
assert_match(%r{<span class="references">Ref: ISBN <span class="isbn">123</span></span>}, rendered)
|
134
|
+
end
|
135
|
+
|
136
|
+
test "outputs reference if uniuque_reference is present" do
|
137
|
+
rendered = render_govspeak(
|
138
|
+
"[embed:attachments:3ed2]",
|
139
|
+
[build_attachment(content_id: "3ed2", unique_reference: "123")]
|
140
|
+
)
|
141
|
+
assert_match(%r{<span class="references">Ref: <span class="unique_reference">123</span></span>}, rendered)
|
142
|
+
end
|
143
|
+
|
144
|
+
test "outputs reference if command_paper_number is present" do
|
145
|
+
rendered = render_govspeak(
|
146
|
+
"[embed:attachments:3ed2]",
|
147
|
+
[build_attachment(content_id: "3ed2", command_paper_number: "11")]
|
148
|
+
)
|
149
|
+
assert_match(%r{<span class="references">Ref: <span class="command_paper_number">11</span></span>}, rendered)
|
150
|
+
end
|
151
|
+
|
152
|
+
test "outputs reference if hoc_paper_number is present" do
|
153
|
+
rendered = render_govspeak(
|
154
|
+
"[embed:attachments:3ed2]",
|
155
|
+
[build_attachment(content_id: "3ed2", hoc_paper_number: "15", parliamentary_session: "1")]
|
156
|
+
)
|
157
|
+
assert_match(%r{<span class="references">Ref: <span class="house_of_commons_paper_number">HC 15</span> <span class="parliamentary_session">1</span></span>}, rendered)
|
158
|
+
end
|
159
|
+
|
160
|
+
test "can have multiple references" do
|
161
|
+
rendered = render_govspeak(
|
162
|
+
"[embed:attachments:3ed2]",
|
163
|
+
[build_attachment(content_id: "3ed2", isbn: "123", unique_reference: "55")]
|
164
|
+
)
|
165
|
+
assert_match(%r{<span class="references">Ref: ISBN <span class="isbn">123</span>, <span class="unique_reference">55</span></span>}, rendered)
|
166
|
+
end
|
167
|
+
|
168
|
+
test "can show an unnumbered command paper" do
|
169
|
+
rendered = render_govspeak(
|
170
|
+
"[embed:attachments:3ed2]",
|
171
|
+
[build_attachment(content_id: "3ed2", unnumbered_command_paper?: true)]
|
172
|
+
)
|
173
|
+
assert_match(%r{<span class="unnumbered-paper">\s*Unnumbered command paper\s*</span>}, compress_html(rendered))
|
174
|
+
end
|
175
|
+
|
176
|
+
test "can show an unnumbered act paper" do
|
177
|
+
rendered = render_govspeak(
|
178
|
+
"[embed:attachments:3ed2]",
|
179
|
+
[build_attachment(content_id: "3ed2", unnumbered_hoc_paper?: true)]
|
180
|
+
)
|
181
|
+
assert_match(%r{<span class="unnumbered-paper">\s*Unnumbered act paper\s*</span>}, compress_html(rendered))
|
182
|
+
end
|
183
|
+
|
184
|
+
test "unnumbered command paper takes precedence to unnumbered act paper" do
|
185
|
+
rendered = render_govspeak(
|
186
|
+
"[embed:attachments:3ed2]",
|
187
|
+
[build_attachment(content_id: "3ed2", unnumbered_command_paper?: true, unnumbered_hoc_paper?: true)]
|
188
|
+
)
|
189
|
+
assert_match(%r{<span class="unnumbered-paper">\s*Unnumbered command paper\s*</span>}, compress_html(rendered))
|
190
|
+
end
|
191
|
+
|
192
|
+
test "shows a preview link for a previewable format" do
|
193
|
+
rendered = render_govspeak(
|
194
|
+
"[embed:attachments:3ed2]",
|
195
|
+
[build_attachment(content_id: "3ed2", file_extension: "csv", url: "http://a.b/c.csv")]
|
196
|
+
)
|
197
|
+
assert_match(%r{<span class="preview"><strong>\s*<a href="http://a.b/c.csv/preview">View online</a>\s*</strong></span>}, compress_html(rendered))
|
198
|
+
end
|
199
|
+
|
200
|
+
test "Shows a download link for a previewable format" do
|
201
|
+
rendered = render_govspeak(
|
202
|
+
"[embed:attachments:3ed2]",
|
203
|
+
[build_attachment(content_id: "3ed2", file_extension: "csv", url: "http://a.b/c.csv")]
|
204
|
+
)
|
205
|
+
assert_match(%r{<span class="download">\s*<a href="http://a.b/c.csv"><strong>Download CSV</strong></a>s*</span>}, compress_html(rendered))
|
206
|
+
end
|
207
|
+
|
208
|
+
test "Can show filesize for a download link for a previewable format" do
|
209
|
+
rendered = render_govspeak(
|
210
|
+
"[embed:attachments:3ed2]",
|
211
|
+
[build_attachment(content_id: "3ed2", file_extension: "csv", url: "http://a.b/c.csv", file_size: 2048)]
|
212
|
+
)
|
213
|
+
assert_match(%r{<a href="http://a.b/c.csv" title="2 KB">}, rendered)
|
214
|
+
end
|
215
|
+
|
216
|
+
test "for a HTML format it outputs HTML" do
|
217
|
+
rendered = render_govspeak(
|
218
|
+
"[embed:attachments:3ed2]",
|
219
|
+
[build_attachment(content_id: "3ed2", file_extension: "html")]
|
220
|
+
)
|
221
|
+
assert_match(%r{<span class="type">HTML</span>}, rendered)
|
222
|
+
end
|
223
|
+
|
224
|
+
test "for an external type it outputs the url" do
|
225
|
+
rendered = render_govspeak(
|
226
|
+
"[embed:attachments:3ed2]",
|
227
|
+
[build_attachment(content_id: "3ed2", url: "http://a.b/c.pdf", external?: true)]
|
228
|
+
)
|
229
|
+
assert_match(%r{<span class="url">http://a.b/c.pdf</span>}, rendered)
|
230
|
+
end
|
231
|
+
|
232
|
+
test "will show a file extension in a abbr element for non html" do
|
233
|
+
rendered = render_govspeak(
|
234
|
+
"[embed:attachments:1fe8]",
|
235
|
+
[build_attachment(content_id: "1fe8", file_extension: "pdf")]
|
236
|
+
)
|
237
|
+
assert_match(%r{<span class="type"><abbr title="Portable Document Format">PDF</abbr></span>}, rendered)
|
238
|
+
end
|
239
|
+
|
240
|
+
test "will show file size in a span" do
|
241
|
+
rendered = render_govspeak(
|
242
|
+
"[embed:attachments:1fe8]",
|
243
|
+
[build_attachment(content_id: "1fe8", file_size: 1024)]
|
244
|
+
)
|
245
|
+
assert_match(%r{<span class="file-size">1 KB</span>}, rendered)
|
246
|
+
end
|
247
|
+
|
248
|
+
test "will show number of pages" do
|
249
|
+
rendered = render_govspeak(
|
250
|
+
"[embed:attachments:1fe8]",
|
251
|
+
[build_attachment(content_id: "1fe8", number_of_pages: 1)]
|
252
|
+
)
|
253
|
+
assert_match(%r{<span class="page-length">1 page</span>}, rendered)
|
254
|
+
rendered = render_govspeak(
|
255
|
+
"[embed:attachments:1fe8]",
|
256
|
+
[build_attachment(content_id: "1fe8", number_of_pages: 2)]
|
257
|
+
)
|
258
|
+
assert_match(%r{<span class="page-length">2 pages</span>}, rendered)
|
259
|
+
end
|
260
|
+
|
261
|
+
test "can show multiple attributes separated by a comma" do
|
262
|
+
rendered = render_govspeak(
|
263
|
+
"[embed:attachments:1fe8]",
|
264
|
+
[build_attachment(content_id: "1fe8", file_extension: "pdf", file_size: 1024)]
|
265
|
+
)
|
266
|
+
pdf = %{<span class="type"><abbr title="Portable Document Format">PDF</abbr></span>}
|
267
|
+
file_size = %{<span class="file-size">1 KB</span>}
|
268
|
+
assert_match(%r{#{pdf}, #{file_size}}, rendered)
|
269
|
+
end
|
270
|
+
|
271
|
+
test "can show a link to order a copy of the attachment" do
|
272
|
+
rendered = render_govspeak(
|
273
|
+
"[embed:attachments:1fe8]",
|
274
|
+
[build_attachment(content_id: "1fe8", order_url: "http://a.b/c")]
|
275
|
+
)
|
276
|
+
assert_match(%r{<a href="http://a.b/c" class="order_url" title="Order a copy of the publication">Order a copy</a>}, rendered)
|
277
|
+
end
|
278
|
+
|
279
|
+
test "can not show a link to order a copy of the attachment" do
|
280
|
+
rendered = render_govspeak(
|
281
|
+
"[embed:attachments:1fe8]",
|
282
|
+
[build_attachment(content_id: "1fe8", order_url: "nil")]
|
283
|
+
)
|
284
|
+
refute_match(%r{<a href="http://a.b/c" class="order_url" title="Order a copy of the publication">Order a copy</a>}, rendered)
|
285
|
+
end
|
286
|
+
|
287
|
+
test "can show a price for ordering a copy of the attachment" do
|
288
|
+
rendered = render_govspeak(
|
289
|
+
"[embed:attachments:1fe8]",
|
290
|
+
[build_attachment(content_id: "1fe8", order_url: "http://a.b/c", price: 10)]
|
291
|
+
)
|
292
|
+
assert_match(%r{(<span class="price">£10.00</span>)}, rendered)
|
293
|
+
end
|
294
|
+
|
295
|
+
test "can show opendocument help" do
|
296
|
+
rendered = render_govspeak(
|
297
|
+
"[embed:attachments:1fe8]",
|
298
|
+
[build_attachment(content_id: "1fe8", opendocument?: true)]
|
299
|
+
)
|
300
|
+
assert_match(%r{<p class="opendocument-help">}, rendered)
|
301
|
+
end
|
302
|
+
|
303
|
+
test "can not show opendocument help" do
|
304
|
+
rendered = render_govspeak(
|
305
|
+
"[embed:attachments:1fe8]",
|
306
|
+
[build_attachment(content_id: "1fe8", opendocument?: false)]
|
307
|
+
)
|
308
|
+
refute_match(%r{<p class="opendocument-help">}, rendered)
|
309
|
+
end
|
310
|
+
|
311
|
+
test "can show an accessibility warning" do
|
312
|
+
rendered = render_govspeak(
|
313
|
+
"[embed:attachments:1fe8]",
|
314
|
+
[build_attachment(content_id: "1fe8", id: 10, accessible?: false)]
|
315
|
+
)
|
316
|
+
assert_match(%r{<div data-module="toggle" class="accessibility-warning" id="attachment-10-accessibility-help">}, rendered)
|
317
|
+
end
|
318
|
+
|
319
|
+
test "can not show an accessibility warning" do
|
320
|
+
rendered = render_govspeak(
|
321
|
+
"[embed:attachments:1fe8]",
|
322
|
+
[build_attachment(content_id: "1fe8", id: 10, accessible?: true)]
|
323
|
+
)
|
324
|
+
refute_match(%r{<div data-module="toggle" class="accessibility-warning" id="attachment-10-accessibility-help">}, rendered)
|
325
|
+
end
|
326
|
+
|
327
|
+
test "shows accessibility mailto on a single line" do
|
328
|
+
rendered = render_govspeak(
|
329
|
+
"[embed:attachments:1fe8]",
|
330
|
+
[build_attachment(content_id: "1fe8", id: 10, accessible?: false)]
|
331
|
+
)
|
332
|
+
assert_match(%r{<a href="mailto:govuk-feedback@digital.cabinet-office.gov.uk\?subject=[^\n]*&body=[^\n]*">govuk-feedback@digital.cabinet-office.gov.uk</a>}, rendered)
|
333
|
+
end
|
334
|
+
|
335
|
+
Dir.glob("locales/*.yml") do |filename|
|
336
|
+
locale = File.basename(filename, ".yml")
|
337
|
+
test "can render in #{locale}" do
|
338
|
+
rendered = render_govspeak(
|
339
|
+
"[embed:attachments:3ed2]",
|
340
|
+
[build_attachment(content_id: "3ed2")],
|
341
|
+
locale: locale,
|
342
|
+
)
|
343
|
+
assert_match(/<section class="attachment embedded">/, rendered)
|
344
|
+
end
|
345
|
+
end
|
346
|
+
|
347
|
+
test "a full attachment rendering looks correct" do
|
348
|
+
attachment = {
|
349
|
+
id: 123,
|
350
|
+
content_id: "2b4d92f3-f8cd-4284-aaaa-25b3a640d26c",
|
351
|
+
title: "Attachment Title",
|
352
|
+
url: "http://example.com/test.pdf",
|
353
|
+
opendocument?: true,
|
354
|
+
order_url: "http://example.com/order",
|
355
|
+
price: 12.3,
|
356
|
+
isbn: "isbn-123",
|
357
|
+
unnumbered_command_paper?: true,
|
358
|
+
}
|
359
|
+
rendered = render_govspeak(
|
360
|
+
"[embed:attachments:2b4d92f3-f8cd-4284-aaaa-25b3a640d26c]",
|
361
|
+
[build_attachment(attachment)]
|
362
|
+
)
|
363
|
+
expected_html_output = %{
|
364
|
+
<section class="attachment embedded">
|
365
|
+
<div class="attachment-thumb">
|
366
|
+
<a href="http://example.com/test.pdf" aria-hidden="true" class="embedded"><img src="/images/pub-cover.png" alt="Pub cover"></a>
|
367
|
+
</div>
|
368
|
+
<div class="attachment-details">
|
369
|
+
<h2 class="title">
|
370
|
+
<a href="http://example.com/test.pdf" aria-describedby="attachment-123-accessibility-help">Attachment Title</a>
|
371
|
+
</h2>
|
372
|
+
<p class="metadata">
|
373
|
+
<span class="references">Ref: ISBN <span class="isbn">isbn-123</span></span>
|
374
|
+
<span class="unnumbered-paper">
|
375
|
+
Unnumbered command paper
|
376
|
+
</span>
|
377
|
+
</p>
|
378
|
+
<p>
|
379
|
+
<a href="http://example.com/order" class="order_url" title="Order a copy of the publication">Order a copy</a>(<span class="price">£12.30</span>)
|
380
|
+
</p>
|
381
|
+
<p class="opendocument-help">
|
382
|
+
This file is in an <a rel="external" href="https://en.wikipedia.org/wiki/OpenDocument_software">OpenDocument</a> format
|
383
|
+
</p>
|
384
|
+
<div data-module="toggle" class="accessibility-warning" id="attachment-123-accessibility-help">
|
385
|
+
<h2>This file may not be suitable for users of assistive technology.
|
386
|
+
<a class="toggler" href="#attachment-123-accessibility-request" data-controls="attachment-123-accessibility-request" data-expanded="false">Request an accessible format.</a>
|
387
|
+
</h2>
|
388
|
+
<p id="attachment-123-accessibility-request" class="js-hidden">
|
389
|
+
If you use assistive technology (eg a screen reader) and need a
|
390
|
+
version of this document in a more accessible format, please email <a href="mailto:govuk-feedback@digital.cabinet-office.gov.uk?subject=Request%20for%20%27Attachment%20Title%27%20in%20an%20alternative%20format&body=Details%20of%20document%20required%3A%0A%0A%20%20Title%3A%20Attachment%20Title%0A%20%20ISBN%3A%20isbn-123%0A%0APlease%20tell%20us%3A%0A%0A%20%201.%20What%20makes%20this%20format%20unsuitable%20for%20you%3F%0A%20%202.%20What%20format%20you%20would%20prefer%3F%0A">govuk-feedback@digital.cabinet-office.gov.uk</a>.
|
391
|
+
Please tell us what format you need. It will help us if you say what assistive technology you use.
|
392
|
+
</p>
|
393
|
+
</div>
|
394
|
+
</div>
|
395
|
+
</section>
|
396
|
+
}
|
397
|
+
assert_equal(compress_html(expected_html_output), compress_html(rendered))
|
398
|
+
end
|
399
|
+
|
400
|
+
test "attachment that isn't provided" do
|
401
|
+
govspeak = "[embed:attachments:906ac8b7-850d-45c6-98e0-9525c680f891]"
|
402
|
+
rendered = Govspeak::Document.new(govspeak).to_html
|
403
|
+
assert_equal("\n", rendered)
|
404
|
+
end
|
405
|
+
|
406
|
+
test "attachment where filename is provided, rather than a content_id" do
|
407
|
+
govspeak = "[embed:attachments:/path/to/file%20name.pdf]"
|
408
|
+
rendered = Govspeak::Document.new(govspeak).to_html
|
409
|
+
assert_equal("\n", rendered)
|
410
|
+
end
|
411
|
+
end
|