govspeak 0.8.15 → 0.8.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +1 -1
- data/lib/govspeak.rb +6 -1
- data/lib/govspeak/version.rb +1 -1
- data/lib/kramdown/parser/kramdown_with_automatic_external_links.rb +27 -0
- data/test/govspeak_test.rb +68 -4
- metadata +6 -5
data/README.md
CHANGED
data/lib/govspeak.rb
CHANGED
@@ -1,11 +1,15 @@
|
|
1
1
|
require 'kramdown'
|
2
2
|
require 'govspeak/header_extractor'
|
3
|
+
require 'kramdown/parser/kramdown_with_automatic_external_links'
|
3
4
|
require 'htmlentities'
|
4
5
|
|
5
6
|
module Govspeak
|
6
7
|
|
7
8
|
class Document
|
8
9
|
|
10
|
+
Parser = Kramdown::Parser::KramdownWithAutomaticExternalLinks
|
11
|
+
PARSER_CLASS_NAME = Parser.name.split("::").last
|
12
|
+
|
9
13
|
@@extensions = []
|
10
14
|
|
11
15
|
attr_accessor :images
|
@@ -16,7 +20,8 @@ module Govspeak
|
|
16
20
|
|
17
21
|
def initialize(source, options = {})
|
18
22
|
@source = source ? source.dup : ""
|
19
|
-
|
23
|
+
Parser.document_domains = options.delete(:document_domains)
|
24
|
+
@options = {input: PARSER_CLASS_NAME, entity_output: :symbolic}.merge(options)
|
20
25
|
@images = []
|
21
26
|
super()
|
22
27
|
end
|
data/lib/govspeak/version.rb
CHANGED
@@ -0,0 +1,27 @@
|
|
1
|
+
require "uri"
|
2
|
+
|
3
|
+
module Kramdown
|
4
|
+
module Parser
|
5
|
+
class KramdownWithAutomaticExternalLinks < Kramdown::Parser::Kramdown
|
6
|
+
class << self
|
7
|
+
attr_writer :document_domains
|
8
|
+
def document_domains
|
9
|
+
@document_domains || %w(www.gov.uk)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def add_link(el, href, title, alt_text = nil)
|
14
|
+
begin
|
15
|
+
host = URI.parse(href).host
|
16
|
+
unless host.nil? || (self.class.document_domains.compact.include?(host))
|
17
|
+
el.attr['rel'] = 'external'
|
18
|
+
end
|
19
|
+
rescue URI::InvalidURIError, URI::InvalidComponentError
|
20
|
+
# it's safe to ignore these very *specific* exceptions
|
21
|
+
end
|
22
|
+
super
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
data/test/govspeak_test.rb
CHANGED
@@ -9,6 +9,8 @@ SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter
|
|
9
9
|
require 'test_helper'
|
10
10
|
require 'govspeak_test_helper'
|
11
11
|
|
12
|
+
require 'ostruct'
|
13
|
+
|
12
14
|
class GovspeakTest < Test::Unit::TestCase
|
13
15
|
include GovspeakTestHelper
|
14
16
|
|
@@ -160,13 +162,13 @@ Teston
|
|
160
162
|
assert_text_output "I am very helpful"
|
161
163
|
end
|
162
164
|
|
163
|
-
test_given_govspeak "This is a [link](http://www.
|
164
|
-
assert_html_output '<p>This is a <a href="http://www.
|
165
|
+
test_given_govspeak "This is a [link](http://www.gov.uk) isn't it?" do
|
166
|
+
assert_html_output '<p>This is a <a href="http://www.gov.uk">link</a> isn’t it?</p>'
|
165
167
|
assert_text_output "This is a link isn’t it?"
|
166
168
|
end
|
167
169
|
|
168
|
-
test_given_govspeak "This is a [link with an at sign in it](http://www.
|
169
|
-
assert_html_output '<p>This is a <a href="http://www.
|
170
|
+
test_given_govspeak "This is a [link with an at sign in it](http://www.gov.uk/@dg/@this) isn't it?" do
|
171
|
+
assert_html_output '<p>This is a <a href="http://www.gov.uk/@dg/@this">link with an at sign in it</a> isn’t it?</p>'
|
170
172
|
assert_text_output "This is a link with an at sign in it isn’t it?"
|
171
173
|
end
|
172
174
|
|
@@ -187,6 +189,68 @@ Teston
|
|
187
189
|
assert_html_output '<p><a href="http://x.com" rel="external">an xx link</a></p>'
|
188
190
|
end
|
189
191
|
|
192
|
+
test_given_govspeak "[internal link](http://www.gov.uk)" do
|
193
|
+
assert_html_output '<p><a href="http://www.gov.uk">internal link</a></p>'
|
194
|
+
end
|
195
|
+
|
196
|
+
test_given_govspeak "[link with no host is assumed to be internal](/)" do
|
197
|
+
assert_html_output '<p><a href="/">link with no host is assumed to be internal</a></p>'
|
198
|
+
end
|
199
|
+
|
200
|
+
test_given_govspeak "[internal link with rel attribute keeps it](http://www.gov.uk){:rel='next'}" do
|
201
|
+
assert_html_output '<p><a href="http://www.gov.uk" rel="next">internal link with rel attribute keeps it</a></p>'
|
202
|
+
end
|
203
|
+
|
204
|
+
test_given_govspeak "[external link without x markers](http://www.google.com)" do
|
205
|
+
assert_html_output '<p><a rel="external" href="http://www.google.com">external link without x markers</a></p>'
|
206
|
+
end
|
207
|
+
|
208
|
+
test_given_govspeak "[external link with rel attribute](http://www.google.com){:rel='next'}" do
|
209
|
+
assert_html_output '<p><a rel="next" href="http://www.google.com">external link with rel attribute</a></p>'
|
210
|
+
end
|
211
|
+
|
212
|
+
test_given_govspeak "Text before [an external link](http://www.google.com)" do
|
213
|
+
assert_html_output '<p>Text before <a rel="external" href="http://www.google.com">an external link</a></p>'
|
214
|
+
end
|
215
|
+
|
216
|
+
test_given_govspeak "[An external link](http://www.google.com) with text afterwards" do
|
217
|
+
assert_html_output '<p><a rel="external" href="http://www.google.com">An external link</a> with text afterwards</p>'
|
218
|
+
end
|
219
|
+
|
220
|
+
test_given_govspeak "Text before [an external link](http://www.google.com) and text afterwards" do
|
221
|
+
assert_html_output '<p>Text before <a rel="external" href="http://www.google.com">an external link</a> and text afterwards</p>'
|
222
|
+
end
|
223
|
+
|
224
|
+
test "should be able to override default 'document_domains' option" do
|
225
|
+
html = Govspeak::Document.new("[internal link](http://www.not-external.com)", document_domains: %w(www.not-external.com)).to_html
|
226
|
+
refute html.include?('rel="external"'), "should not consider www.not-external.com as an external url"
|
227
|
+
end
|
228
|
+
|
229
|
+
test "should be able to supply multiple domains for 'document_domains' option" do
|
230
|
+
html = Govspeak::Document.new("[internal link](http://www.not-external-either.com)", document_domains: %w(www.not-external.com www.not-external-either.com)).to_html
|
231
|
+
refute html.include?('rel="external"'), "should not consider www.not-external-either.com as an external url"
|
232
|
+
end
|
233
|
+
|
234
|
+
test "should be able to override default 'input' option" do
|
235
|
+
html = Govspeak::Document.new("[external link](http://www.external.com)", input: "kramdown").to_html
|
236
|
+
refute html.include?('rel="external"'), "should not automatically add rel external attribute"
|
237
|
+
end
|
238
|
+
|
239
|
+
test "should be able to override default 'entity output' option" do
|
240
|
+
html = Govspeak::Document.new("&", entity_output: :numeric).to_html
|
241
|
+
assert html.include?("&")
|
242
|
+
end
|
243
|
+
|
244
|
+
test "should be assume link with invalid uri is internal" do
|
245
|
+
html = Govspeak::Document.new("[link](:invalid-uri)").to_html
|
246
|
+
refute html.include?('rel="external"')
|
247
|
+
end
|
248
|
+
|
249
|
+
test "should be assume link with invalid uri component is internal" do
|
250
|
+
html = Govspeak::Document.new("[link](mailto://www.example.com)").to_html
|
251
|
+
refute html.include?('rel="external"')
|
252
|
+
end
|
253
|
+
|
190
254
|
# Regression test - the surrounded_by helper doesn't require the closing x
|
191
255
|
# so 'xaa' was getting picked up by the external link helper above
|
192
256
|
# TODO: review whether we should require closing symbols for these extensions
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: govspeak
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.8.
|
5
|
+
version: 0.8.16
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Ben Griffiths
|
@@ -11,7 +11,7 @@ autorequire:
|
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
13
|
|
14
|
-
date: 2012-06
|
14
|
+
date: 2012-07-06 00:00:00 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: kramdown
|
@@ -71,6 +71,7 @@ extra_rdoc_files: []
|
|
71
71
|
|
72
72
|
files:
|
73
73
|
- lib/govspeak.rb
|
74
|
+
- lib/kramdown/parser/kramdown_with_automatic_external_links.rb
|
74
75
|
- lib/govspeak/header_extractor.rb
|
75
76
|
- lib/govspeak/version.rb
|
76
77
|
- README.md
|
@@ -92,7 +93,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
92
93
|
requirements:
|
93
94
|
- - ">="
|
94
95
|
- !ruby/object:Gem::Version
|
95
|
-
hash:
|
96
|
+
hash: -3802672710997913836
|
96
97
|
segments:
|
97
98
|
- 0
|
98
99
|
version: "0"
|
@@ -101,14 +102,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
101
102
|
requirements:
|
102
103
|
- - ">="
|
103
104
|
- !ruby/object:Gem::Version
|
104
|
-
hash:
|
105
|
+
hash: -3802672710997913836
|
105
106
|
segments:
|
106
107
|
- 0
|
107
108
|
version: "0"
|
108
109
|
requirements: []
|
109
110
|
|
110
111
|
rubyforge_project:
|
111
|
-
rubygems_version: 1.8.
|
112
|
+
rubygems_version: 1.8.24
|
112
113
|
signing_key:
|
113
114
|
specification_version: 3
|
114
115
|
summary: Markup language for single domain
|