govspeak 6.0.0 → 6.1.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 +1 -45
- data/lib/govspeak.rb +18 -8
- data/lib/govspeak/blockquote_extra_quote_remover.rb +4 -3
- data/lib/govspeak/html_sanitizer.rb +1 -1
- data/lib/govspeak/post_processor.rb +25 -3
- data/lib/govspeak/presenters/attachment_presenter.rb +7 -194
- data/lib/govspeak/version.rb +1 -1
- data/locales/ar.yml +0 -17
- data/locales/be.yml +0 -17
- data/locales/bg.yml +0 -19
- data/locales/cs.yml +0 -19
- data/locales/cy.yml +0 -18
- data/locales/de.yml +0 -18
- data/locales/el.yml +0 -19
- data/locales/en.yml +0 -20
- data/locales/es-419.yml +0 -18
- data/locales/es.yml +0 -18
- data/locales/et.yml +0 -19
- data/locales/fa.yml +0 -17
- data/locales/fr.yml +0 -18
- data/locales/he.yml +0 -18
- data/locales/hi.yml +0 -18
- data/locales/hu.yml +0 -18
- data/locales/hy.yml +0 -18
- data/locales/id.yml +0 -17
- data/locales/it.yml +0 -18
- data/locales/ja.yml +0 -16
- data/locales/ko.yml +0 -16
- data/locales/lt.yml +0 -17
- data/locales/lv.yml +0 -17
- data/locales/pl.yml +0 -19
- data/locales/ps.yml +0 -17
- data/locales/pt.yml +0 -17
- data/locales/ro.yml +0 -19
- data/locales/ru.yml +0 -16
- data/locales/si.yml +0 -17
- data/locales/sr.yml +0 -18
- data/locales/ta.yml +0 -19
- data/locales/th.yml +0 -16
- data/locales/tr.yml +0 -17
- data/locales/uk.yml +0 -17
- data/locales/ur.yml +0 -18
- data/locales/uz.yml +0 -17
- data/locales/vi.yml +0 -17
- data/locales/zh-hk.yml +0 -15
- data/locales/zh-tw.yml +0 -15
- data/locales/zh.yml +0 -15
- data/test/blockquote_extra_quote_remover_test.rb +7 -0
- data/test/govspeak_attachment_link_test.rb +25 -0
- data/test/govspeak_attachment_test.rb +40 -0
- metadata +33 -35
- data/lib/templates/attachment.html.erb +0 -57
- data/locales/dr.yml +0 -20
- data/locales/so.yml +0 -22
- data/locales/sq.yml +0 -21
- data/test/govspeak_attachments_test.rb +0 -358
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ec0c2e0694235f631985feeea77f20f07f8ce6ccaf55a8317a83b42583a6bcd2
|
4
|
+
data.tar.gz: f98e90a503d00b4dd7c92c9b4dd9e1ff4e3a14494787a344f3722cd788515294
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b45e92bd8d25ef8a0674de0aba0ac4785589a3af588bf07893b567e09792b13deb15101ba85aef05c45b4429982add8ff52669abfa8b273a9ce29d51591c908b
|
7
|
+
data.tar.gz: b193767c7dd265bf61ac851cdc2b0caafd249f63057f5b2008e9dea991ae8d79166fa86169305cf099d3a3ddf1fbe0f1c256f02216d27ae95d2ad2f7a2f17d1e
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
## 6.1.0
|
2
|
+
|
3
|
+
* Remove `[embed:attachments:content-id]` this isn't used by any apps and has never worked
|
4
|
+
* Add dependency on govuk_publishing_components
|
5
|
+
* Add new `AttachementLink:attachment-id` extension and mark as experimental
|
6
|
+
* Add new `Attachement:attachment-id` extension and mark as experimental
|
7
|
+
* Blockquote quote remover is now more forgiving to spaces before or after quote characters
|
8
|
+
|
1
9
|
## 6.0.0
|
2
10
|
|
3
11
|
* BREAKING CHANGE: Input is sanitized by default, to use unsafe HTML initialize with a sanitize option of false
|
data/README.md
CHANGED
@@ -352,53 +352,9 @@ Embedded content allows authors to reference a supporting item of a document by
|
|
352
352
|
referencing an id. The details of this content is passed to the publishing
|
353
353
|
application to govspeak at the time of rendering.
|
354
354
|
|
355
|
-
### Attachments
|
356
|
-
|
357
|
-
To create an attachment callout
|
358
|
-
|
359
|
-
[embed:attachment:2b4d92f3-f8cd-4284-aaaa-25b3a640d26c]
|
360
|
-
|
361
|
-
with options provided
|
362
|
-
|
363
|
-
{
|
364
|
-
attachments: [
|
365
|
-
{
|
366
|
-
id: 123,
|
367
|
-
content_id: "2b4d92f3-f8cd-4284-aaaa-25b3a640d26c",
|
368
|
-
title: "Attachment Title",
|
369
|
-
url: "http://example.com/test.pdf",
|
370
|
-
order_url: "http://example.com/order",
|
371
|
-
price: 12.3,
|
372
|
-
isbn: "isbn-123",
|
373
|
-
attachment?: true,
|
374
|
-
}
|
375
|
-
]
|
376
|
-
}
|
377
|
-
|
378
|
-
will output an attachment box
|
379
|
-
|
380
|
-
```html
|
381
|
-
<section class="attachment embedded">
|
382
|
-
<div class="attachment-thumb">
|
383
|
-
<a href="http://example.com/test.pdf" aria-hidden="true" class="embedded"><img src="/images/pub-cover.png" alt="Pub cover"></a>
|
384
|
-
</div>
|
385
|
-
<div class="attachment-details">
|
386
|
-
<h2 class="title">
|
387
|
-
<a href="http://example.com/test.pdf" aria-describedby="attachment-123-accessibility-help">Attachment Title</a>
|
388
|
-
</h2>
|
389
|
-
<p class="metadata">
|
390
|
-
<span class="references">Ref: ISBN <span class="isbn">isbn-123</span></span>
|
391
|
-
</p>
|
392
|
-
<p>
|
393
|
-
<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>)
|
394
|
-
</p>
|
395
|
-
</div>
|
396
|
-
</section>
|
397
|
-
```
|
398
|
-
|
399
355
|
### Inline Attachment
|
400
356
|
|
401
|
-
Attachments can be linked to inline
|
357
|
+
Attachments can be linked to inline
|
402
358
|
|
403
359
|
Details referenced in [embed:attachments:inline:34f6dda0-21b1-4e78-8120-3ff4dcea522d]
|
404
360
|
|
data/lib/govspeak.rb
CHANGED
@@ -5,6 +5,7 @@ require 'htmlentities'
|
|
5
5
|
require 'kramdown'
|
6
6
|
require 'kramdown/parser/kramdown_with_automatic_external_links'
|
7
7
|
require 'rinku'
|
8
|
+
require 'govuk_publishing_components'
|
8
9
|
require 'govspeak/header_extractor'
|
9
10
|
require 'govspeak/structured_header_extractor'
|
10
11
|
require 'govspeak/html_validator'
|
@@ -217,18 +218,12 @@ module Govspeak
|
|
217
218
|
render_image(ImagePresenter.new(image))
|
218
219
|
end
|
219
220
|
|
220
|
-
extension('attachment', /\[embed:attachments:
|
221
|
-
# not treating this as a self closing tag seems to avoid some oddities
|
222
|
-
# such as an extra new line being inserted when explicitly closed or
|
223
|
-
# swallowing subsequent elements when not closed
|
224
|
-
%{<govspeak-embed-attachment content-id="#{content_id}"></govspeak-embed-attachment>}
|
225
|
-
end
|
226
|
-
|
227
|
-
extension('attachment inline', /\[embed:attachments:inline:\s*(.*?)\s*\]/) do |content_id|
|
221
|
+
extension('embed attachment inline', /\[embed:attachments:inline:\s*(.*?)\s*\]/) do |content_id|
|
228
222
|
attachment = attachments.detect { |a| a[:content_id] == content_id }
|
229
223
|
next "" unless attachment
|
230
224
|
|
231
225
|
attachment = AttachmentPresenter.new(attachment)
|
226
|
+
|
232
227
|
span_id = attachment.id ? %{ id="attachment_#{attachment.id}"} : ""
|
233
228
|
# new lines inside our title cause problems with govspeak rendering as this is expected to be on one line.
|
234
229
|
title = (attachment.title || "").tr("\n", " ")
|
@@ -354,6 +349,21 @@ module Govspeak
|
|
354
349
|
render_image(ImagePresenter.new(image))
|
355
350
|
end
|
356
351
|
|
352
|
+
# This is an alternative syntax for embedding attachments using a readable id (expected
|
353
|
+
# to be a unique variation of a filename). This syntax is being used by
|
354
|
+
# Content Publisher and should be considered experimental as it is likely
|
355
|
+
# to be iterated in the short term.
|
356
|
+
extension('Attachment', /#{NEW_PARAGRAPH_LOOKBEHIND}\[Attachment:\s*(.*?)\s*\]/) do |attachment_id|
|
357
|
+
%{<govspeak-embed-attachment id="#{attachment_id}"></govspeak-embed-attachment>}
|
358
|
+
end
|
359
|
+
|
360
|
+
# This is an alternative syntax for embedding attachments as links. This
|
361
|
+
# syntax is being used by Content Publisher and should be considered
|
362
|
+
# experimental
|
363
|
+
extension('AttachmentLink', /\[AttachmentLink:\s*(.*?)\s*\]/) do |attachment_id|
|
364
|
+
%{<govspeak-embed-attachment-link id="#{attachment_id}"></govspeak-embed-attachment-link>}
|
365
|
+
end
|
366
|
+
|
357
367
|
private
|
358
368
|
|
359
369
|
def kramdown_doc
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Govspeak
|
2
2
|
module BlockquoteExtraQuoteRemover
|
3
|
-
|
4
|
-
|
3
|
+
QUOTES = '["\u201C\u201D\u201E\u201F\u2033\u2036]+'.freeze
|
4
|
+
WHITESPACE = '[^\S\r\n]*'.freeze
|
5
5
|
|
6
6
|
# used to remove quotes from a markdown blockquote, as these will be inserted
|
7
7
|
# as part of the rendering
|
@@ -14,7 +14,8 @@ module Govspeak
|
|
14
14
|
def self.remove(source)
|
15
15
|
return if source.nil?
|
16
16
|
|
17
|
-
source.gsub(
|
17
|
+
source.gsub(/^>#{WHITESPACE}#{QUOTES}#{WHITESPACE}(.+?)$/, '> \1') # prefixed with a quote
|
18
|
+
.gsub(/^>(.+?)#{WHITESPACE}#{QUOTES}#{WHITESPACE}(\r?)$/, '>\1\2') # suffixed with a quote
|
18
19
|
end
|
19
20
|
end
|
20
21
|
end
|
@@ -60,7 +60,7 @@ class Govspeak::HtmlSanitizer
|
|
60
60
|
def sanitize_config
|
61
61
|
Sanitize::Config.merge(
|
62
62
|
Sanitize::Config::RELAXED,
|
63
|
-
elements: Sanitize::Config::RELAXED[:elements] + %w[govspeak-embed-attachment],
|
63
|
+
elements: Sanitize::Config::RELAXED[:elements] + %w[govspeak-embed-attachment govspeak-embed-attachment-link],
|
64
64
|
attributes: {
|
65
65
|
:all => Sanitize::Config::RELAXED[:attributes][:all] + ["role", "aria-label"],
|
66
66
|
"a" => Sanitize::Config::RELAXED[:attributes]["a"] + button_sanitize_config,
|
@@ -51,14 +51,36 @@ module Govspeak
|
|
51
51
|
|
52
52
|
extension("embed attachment HTML") do |document|
|
53
53
|
document.css("govspeak-embed-attachment").map do |el|
|
54
|
-
attachment = govspeak_document.attachments.detect { |a| a[:
|
54
|
+
attachment = govspeak_document.attachments.detect { |a| a[:id] == el["id"] }
|
55
|
+
|
56
|
+
unless attachment
|
57
|
+
el.remove
|
58
|
+
next
|
59
|
+
end
|
60
|
+
|
61
|
+
attachment_html = GovukPublishingComponents.render(
|
62
|
+
"govuk_publishing_components/components/attachment",
|
63
|
+
attachment: attachment,
|
64
|
+
locale: govspeak_document.locale
|
65
|
+
)
|
66
|
+
el.swap(attachment_html)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
extension("embed attachment link HTML") do |document|
|
71
|
+
document.css("govspeak-embed-attachment-link").map do |el|
|
72
|
+
attachment = govspeak_document.attachments.detect { |a| a[:id] == el["id"] }
|
73
|
+
|
55
74
|
unless attachment
|
56
75
|
el.remove
|
57
76
|
next
|
58
77
|
end
|
59
78
|
|
60
|
-
|
61
|
-
|
79
|
+
attachment_html = GovukPublishingComponents.render(
|
80
|
+
"govuk_publishing_components/components/attachment_link",
|
81
|
+
attachment: attachment,
|
82
|
+
locale: govspeak_document.locale
|
83
|
+
)
|
62
84
|
el.swap(attachment_html)
|
63
85
|
end
|
64
86
|
end
|
@@ -1,15 +1,11 @@
|
|
1
1
|
require "action_view"
|
2
|
-
require "money"
|
3
2
|
require "htmlentities"
|
4
3
|
|
5
|
-
Money.locale_backend = :currency
|
6
|
-
|
7
4
|
module Govspeak
|
8
5
|
class AttachmentPresenter
|
9
6
|
attr_reader :attachment
|
10
7
|
include ActionView::Helpers::TagHelper
|
11
8
|
include ActionView::Helpers::NumberHelper
|
12
|
-
include ActionView::Helpers::AssetTagHelper
|
13
9
|
include ActionView::Helpers::TextHelper
|
14
10
|
|
15
11
|
def initialize(attachment)
|
@@ -20,158 +16,19 @@ module Govspeak
|
|
20
16
|
attachment[:id]
|
21
17
|
end
|
22
18
|
|
23
|
-
def order_url
|
24
|
-
attachment[:order_url]
|
25
|
-
end
|
26
|
-
|
27
|
-
def opendocument?
|
28
|
-
attachment[:opendocument?]
|
29
|
-
end
|
30
|
-
|
31
19
|
def url
|
32
20
|
attachment[:url]
|
33
21
|
end
|
34
22
|
|
35
|
-
def
|
36
|
-
attachment[:
|
37
|
-
end
|
38
|
-
|
39
|
-
def price
|
40
|
-
return unless attachment[:price]
|
41
|
-
|
42
|
-
Money.from_amount(attachment[:price], 'GBP').format
|
43
|
-
end
|
44
|
-
|
45
|
-
def accessible?
|
46
|
-
attachment[:accessible?]
|
47
|
-
end
|
48
|
-
|
49
|
-
def thumbnail_link
|
50
|
-
return if hide_thumbnail?
|
51
|
-
return if previewable?
|
52
|
-
|
53
|
-
link(attachment_thumbnail, url, "aria-hidden" => "true", "class" => attachment_class)
|
54
|
-
end
|
55
|
-
|
56
|
-
def help_block_toggle_id
|
57
|
-
"attachment-#{id}-accessibility-request"
|
58
|
-
end
|
59
|
-
|
60
|
-
def section_class
|
61
|
-
attachment[:external?] ? "hosted-externally" : "embedded"
|
62
|
-
end
|
63
|
-
|
64
|
-
def mail_to(email_address, name, options = {})
|
65
|
-
query_string = options.slice(:subject, :body).map { |k, v| "#{urlencode(k)}=#{urlencode(v)}" }.join("&")
|
66
|
-
"<a href='mailto:#{encode(email_address)}?#{encode(query_string)}'>#{name}</a>"
|
67
|
-
end
|
68
|
-
|
69
|
-
def alternative_format_order_link
|
70
|
-
attachment_info = []
|
71
|
-
attachment_info << " Title: #{title}"
|
72
|
-
attachment_info << " Original format: #{file_extension}" if file_extension.present?
|
73
|
-
attachment_info << " ISBN: #{attachment[:isbn]}" if attachment[:isbn].present?
|
74
|
-
attachment_info << " Unique reference: #{attachment[:unique_reference]}" if attachment[:unique_reference].present?
|
75
|
-
attachment_info << " Command paper number: #{attachment[:command_paper_number]}" if attachment[:command_paper_number].present?
|
76
|
-
if attachment[:hoc_paper_number].present?
|
77
|
-
attachment_info << " House of Commons paper number: #{attachment[:hoc_paper_number]}"
|
78
|
-
attachment_info << " Parliamentary session: #{attachment[:parliamentary_session]}"
|
79
|
-
end
|
80
|
-
|
81
|
-
options = {
|
82
|
-
subject: "Request for '#{title}' in an alternative format",
|
83
|
-
body: body_for_mail(attachment_info)
|
84
|
-
}
|
85
|
-
|
86
|
-
mail_to(alternative_format_contact_email, alternative_format_contact_email, options)
|
87
|
-
end
|
88
|
-
|
89
|
-
def body_for_mail(attachment_info)
|
90
|
-
<<~TEXT
|
91
|
-
Details of document required:
|
92
|
-
|
93
|
-
#{attachment_info.join("\n")}
|
94
|
-
|
95
|
-
Please tell us:
|
96
|
-
|
97
|
-
1. What makes this format unsuitable for you?
|
98
|
-
2. What format you would prefer?
|
99
|
-
TEXT
|
100
|
-
end
|
101
|
-
|
102
|
-
def alternative_format_contact_email
|
103
|
-
"govuk-feedback@digital.cabinet-office.gov.uk"
|
104
|
-
end
|
105
|
-
|
106
|
-
# FIXME: usage of image_tag will cause these to render at /images/ which seems
|
107
|
-
# very host dependent. I assume this will need links to static urls.
|
108
|
-
def attachment_thumbnail
|
109
|
-
if file_extension == "pdf" && attachment[:thumbnail_url]
|
110
|
-
image_tag(attachment[:thumbnail_url])
|
111
|
-
elsif file_extension == "html"
|
112
|
-
image_tag('pub-cover-html.png')
|
113
|
-
elsif %w{doc docx odt}.include?(file_extension)
|
114
|
-
image_tag('pub-cover-doc.png')
|
115
|
-
elsif %w{xls xlsx ods csv}.include?(file_extension)
|
116
|
-
image_tag('pub-cover-spreadsheet.png')
|
117
|
-
else
|
118
|
-
image_tag('pub-cover.png')
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
def reference
|
123
|
-
ref = []
|
124
|
-
if attachment[:isbn].present?
|
125
|
-
ref << "ISBN " + content_tag(:span, attachment[:isbn], class: "isbn")
|
126
|
-
end
|
127
|
-
|
128
|
-
if attachment[:unique_reference].present?
|
129
|
-
ref << content_tag(:span, attachment[:unique_reference], class: "unique_reference")
|
130
|
-
end
|
131
|
-
|
132
|
-
if attachment[:command_paper_number].present?
|
133
|
-
ref << content_tag(:span, attachment[:command_paper_number], class: "command_paper_number")
|
134
|
-
end
|
135
|
-
|
136
|
-
if attachment[:hoc_paper_number].present?
|
137
|
-
ref << content_tag(:span, "HC #{attachment[:hoc_paper_number]}", class: 'house_of_commons_paper_number') + ' ' +
|
138
|
-
content_tag(:span, attachment[:parliamentary_session], class: 'parliamentary_session')
|
139
|
-
end
|
140
|
-
|
141
|
-
ref.join(', ').html_safe
|
142
|
-
end
|
143
|
-
|
144
|
-
# FIXME this has english in it so will cause problems if the locale is not en
|
145
|
-
def references_for_title
|
146
|
-
references = []
|
147
|
-
references << "ISBN: #{attachment[:isbn]}" if attachment[:isbn].present?
|
148
|
-
references << "Unique reference: #{attachment[:unique_reference]}" if attachment[:unique_reference].present?
|
149
|
-
references << "Command paper number: #{attachment[:command_paper_number]}" if attachment[:command_paper_number].present?
|
150
|
-
references << "HC: #{attachment[:hoc_paper_number]} #{attachment[:parliamentary_session]}" if attachment[:hoc_paper_number].present?
|
151
|
-
prefix = references.size == 1 ? "and its reference" : "and its references"
|
152
|
-
references.any? ? ", #{prefix} (" + references.join(", ") + ")" : ""
|
153
|
-
end
|
154
|
-
|
155
|
-
def references?
|
156
|
-
!attachment[:isbn].to_s.empty? || !attachment[:unique_reference].to_s.empty? || !attachment[:command_paper_number].to_s.empty? || !attachment[:hoc_paper_number].to_s.empty?
|
157
|
-
end
|
158
|
-
|
159
|
-
def attachment_class
|
160
|
-
attachment[:external?] ? "hosted-externally" : "embedded"
|
161
|
-
end
|
162
|
-
|
163
|
-
def unnumbered_paper?
|
164
|
-
attachment[:unnumbered_command_paper?] || attachment[:unnumbered_hoc_paper?]
|
165
|
-
end
|
166
|
-
|
167
|
-
def unnumbered_command_paper?
|
168
|
-
attachment[:unnumbered_command_paper?]
|
23
|
+
def title
|
24
|
+
attachment[:title]
|
169
25
|
end
|
170
26
|
|
171
|
-
def
|
172
|
-
|
173
|
-
|
174
|
-
|
27
|
+
def file_extension
|
28
|
+
# Note: this is a separate parameter rather than being calculated from the
|
29
|
+
# filename because at the time of writing not all apps were using the effects
|
30
|
+
# of this field.
|
31
|
+
attachment[:file_extension]
|
175
32
|
end
|
176
33
|
|
177
34
|
def attachment_attributes
|
@@ -188,10 +45,6 @@ module Govspeak
|
|
188
45
|
attributes.join(', ').html_safe
|
189
46
|
end
|
190
47
|
|
191
|
-
def preview_url
|
192
|
-
url + '/preview'
|
193
|
-
end
|
194
|
-
|
195
48
|
MS_WORD_DOCUMENT_HUMANIZED_CONTENT_TYPE = "MS Word Document".freeze
|
196
49
|
MS_EXCEL_SPREADSHEET_HUMANIZED_CONTENT_TYPE = "MS Excel Spreadsheet".freeze
|
197
50
|
MS_POWERPOINT_PRESENTATION_HUMANIZED_CONTENT_TYPE = "MS Powerpoint Presentation".freeze
|
@@ -239,42 +92,6 @@ module Govspeak
|
|
239
92
|
file_extension_vs_humanized_content_type.fetch(file_extension.to_s.downcase, '')
|
240
93
|
end
|
241
94
|
|
242
|
-
def previewable?
|
243
|
-
file_extension == "csv"
|
244
|
-
end
|
245
|
-
|
246
|
-
def title
|
247
|
-
attachment[:title]
|
248
|
-
end
|
249
|
-
|
250
|
-
def file_extension
|
251
|
-
# Note: this is a separate parameter rather than being calculated from the
|
252
|
-
# filename because at the time of writing not all apps were using the effects
|
253
|
-
# of this field.
|
254
|
-
attachment[:file_extension]
|
255
|
-
end
|
256
|
-
|
257
|
-
def hide_thumbnail?
|
258
|
-
defined?(hide_thumbnail) && hide_thumbnail
|
259
|
-
end
|
260
|
-
|
261
|
-
def attachment_details
|
262
|
-
return if previewable?
|
263
|
-
|
264
|
-
link(title, url, title_link_options)
|
265
|
-
end
|
266
|
-
|
267
|
-
def title_link_options
|
268
|
-
title_link_options = {}
|
269
|
-
title_link_options["rel"] = "external" if attachment[:external?]
|
270
|
-
title_link_options["aria-describedby"] = help_block_id unless attachment[:accessible?]
|
271
|
-
title_link_options
|
272
|
-
end
|
273
|
-
|
274
|
-
def help_block_id
|
275
|
-
"attachment-#{id}-accessibility-help"
|
276
|
-
end
|
277
|
-
|
278
95
|
def link(body, url, options = {})
|
279
96
|
options_str = options.map { |k, v| %{#{encode(k)}="#{encode(v)}"} }.join(" ")
|
280
97
|
%{<a href="#{encode(url)}" #{options_str}>#{body}</a>}
|
@@ -285,9 +102,5 @@ module Govspeak
|
|
285
102
|
def encode(text)
|
286
103
|
HTMLEntities.new.encode(text)
|
287
104
|
end
|
288
|
-
|
289
|
-
def urlencode(text)
|
290
|
-
ERB::Util.url_encode(text)
|
291
|
-
end
|
292
105
|
end
|
293
106
|
end
|
data/lib/govspeak/version.rb
CHANGED