premailer 1.7.3 → 1.7.8
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +5 -1
- data/.jrubyrc +1 -0
- data/.travis.yml +9 -0
- data/.yardopts +10 -0
- data/Gemfile +12 -1
- data/{LICENSE.rdoc → LICENSE.md} +2 -2
- data/README.md +100 -0
- data/lib/premailer/adapter.rb +14 -10
- data/lib/premailer/adapter/hpricot.rb +22 -16
- data/lib/premailer/adapter/nokogiri.rb +46 -18
- data/lib/premailer/executor.rb +4 -0
- data/lib/premailer/html_to_plain_text.rb +28 -12
- data/lib/premailer/premailer.rb +135 -63
- data/lib/premailer/version.rb +4 -0
- data/premailer.gemspec +14 -5
- data/rakefile.rb +20 -25
- data/test/files/html_with_uri.html +9 -0
- data/test/future_tests.rb +1 -1
- data/test/helper.rb +34 -1
- data/test/test_adapter.rb +1 -1
- data/test/test_html_to_plain_text.rb +25 -2
- data/test/test_links.rb +45 -1
- data/test/test_misc.rb +50 -5
- data/test/test_premailer.rb +60 -39
- data/test/test_warnings.rb +1 -3
- metadata +165 -131
- data/README.rdoc +0 -85
data/premailer.gemspec
CHANGED
@@ -1,6 +1,13 @@
|
|
1
|
+
GEM_ROOT = File.dirname(__FILE__).freeze unless defined?(GEM_ROOT)
|
2
|
+
|
3
|
+
lib_path = File.expand_path('lib', GEM_ROOT)
|
4
|
+
$LOAD_PATH.unshift(lib_path) unless $LOAD_PATH.include? lib_path
|
5
|
+
|
6
|
+
require 'premailer/version'
|
7
|
+
|
1
8
|
Gem::Specification.new do |s|
|
2
9
|
s.name = "premailer"
|
3
|
-
s.version =
|
10
|
+
s.version = Premailer::VERSION.dup
|
4
11
|
s.date = Time.now.strftime('%Y-%m-%d')
|
5
12
|
s.summary = "Preflight for HTML e-mail."
|
6
13
|
s.email = "code@dunae.ca"
|
@@ -8,15 +15,17 @@ Gem::Specification.new do |s|
|
|
8
15
|
s.description = "Improve the rendering of HTML emails by making CSS inline, converting links and warning about unsupported code."
|
9
16
|
s.has_rdoc = true
|
10
17
|
s.author = "Alex Dunae"
|
11
|
-
s.rdoc_options << '--all' << '--inline-source' << '--line-numbers' << '--charset' << 'utf-8'
|
12
|
-
s.extra_rdoc_files = ["README.rdoc"]
|
13
18
|
s.files = `git ls-files`.split("\n")
|
14
19
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
15
20
|
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
16
21
|
s.add_dependency('css_parser', '>= 1.1.9')
|
17
22
|
s.add_dependency('htmlentities', '>= 4.0.0')
|
23
|
+
s.add_development_dependency "bundler", "~> 1.3"
|
24
|
+
s.add_development_dependency('rake', ['~> 0.8', '!= 0.9.0'])
|
18
25
|
s.add_development_dependency('hpricot', '>= 0.8.3')
|
19
26
|
s.add_development_dependency('nokogiri', '>= 1.4.4')
|
20
|
-
s.add_development_dependency('
|
21
|
-
s.add_development_dependency('
|
27
|
+
s.add_development_dependency('yard', '~> 0.8.7')
|
28
|
+
s.add_development_dependency('redcarpet', '~> 3.0')
|
29
|
+
s.add_development_dependency "yard-redcarpet-ext", "~> 0.0.3"
|
22
30
|
end
|
31
|
+
|
data/rakefile.rb
CHANGED
@@ -2,27 +2,20 @@ $:.unshift File.expand_path('../lib', __FILE__)
|
|
2
2
|
|
3
3
|
require 'rake'
|
4
4
|
require 'rake/testtask'
|
5
|
-
require
|
6
|
-
require '
|
7
|
-
require 'fileutils'
|
8
|
-
require 'premailer'
|
5
|
+
require "bundler/gem_tasks"
|
6
|
+
require 'yard'
|
9
7
|
|
10
|
-
|
11
|
-
@gemspec ||= begin
|
12
|
-
file = File.expand_path('../premailer.gemspec', __FILE__)
|
13
|
-
eval(File.read(file), binding, file)
|
14
|
-
end
|
15
|
-
end
|
8
|
+
GEM_ROOT = File.dirname(__FILE__).freeze unless defined?(GEM_ROOT)
|
16
9
|
|
17
|
-
|
18
|
-
|
19
|
-
end
|
10
|
+
lib_path = File.expand_path('lib', GEM_ROOT)
|
11
|
+
$LOAD_PATH.unshift(lib_path) unless $LOAD_PATH.include? lib_path
|
20
12
|
|
21
|
-
|
22
|
-
task :default => [:inline]
|
13
|
+
require 'premailer/version'
|
23
14
|
|
24
15
|
desc 'Parse a URL and write out the output.'
|
25
16
|
task :inline do
|
17
|
+
require 'premailer'
|
18
|
+
|
26
19
|
url = ENV['url']
|
27
20
|
output = ENV['output']
|
28
21
|
|
@@ -32,15 +25,17 @@ task :inline do
|
|
32
25
|
end
|
33
26
|
|
34
27
|
premailer = Premailer.new(url, :warn_level => Premailer::Warnings::SAFE, :verbose => true, :adapter => :nokogiri)
|
35
|
-
|
36
|
-
|
37
|
-
|
28
|
+
File.open(output, "w") do |fout|
|
29
|
+
fout.puts premailer.to_inline_css
|
30
|
+
end
|
38
31
|
|
39
32
|
puts "Succesfully parsed '#{url}' into '#{output}'"
|
40
33
|
puts premailer.warnings.length.to_s + ' CSS warnings were found'
|
41
34
|
end
|
42
35
|
|
43
36
|
task :text do
|
37
|
+
require 'premailer'
|
38
|
+
|
44
39
|
url = ENV['url']
|
45
40
|
output = ENV['output']
|
46
41
|
|
@@ -50,9 +45,9 @@ task :text do
|
|
50
45
|
end
|
51
46
|
|
52
47
|
premailer = Premailer.new(url, :warn_level => Premailer::Warnings::SAFE)
|
53
|
-
|
54
|
-
|
55
|
-
|
48
|
+
File.open(output, "w") do |fout|
|
49
|
+
fout.puts premailer.to_plain_text
|
50
|
+
end
|
56
51
|
|
57
52
|
puts "Succesfully parsed '#{url}' into '#{output}'"
|
58
53
|
end
|
@@ -62,8 +57,8 @@ Rake::TestTask.new do |t|
|
|
62
57
|
t.verbose = false
|
63
58
|
end
|
64
59
|
|
65
|
-
|
66
|
-
|
67
|
-
rd.rdoc_files.include("README.rdoc", "LICENSE.rdoc", "lib/**/*.rb")
|
68
|
-
rd.title = 'Premailer Documentation'
|
60
|
+
YARD::Rake::YardocTask.new do |yard|
|
61
|
+
yard.options << "--title='Premailer #{Premailer::VERSION} Documentation'"
|
69
62
|
end
|
63
|
+
|
64
|
+
task :default => [:test]
|
data/test/future_tests.rb
CHANGED
data/test/helper.rb
CHANGED
@@ -3,5 +3,38 @@ $:.unshift(File.expand_path(File.dirname(__FILE__) + '/../lib'))
|
|
3
3
|
$:.unshift(File.expand_path(File.dirname(__FILE__) + '/../'))
|
4
4
|
require 'rubygems'
|
5
5
|
require 'test/unit'
|
6
|
-
require '
|
6
|
+
require 'webmock/test_unit'
|
7
7
|
require 'premailer'
|
8
|
+
|
9
|
+
class Premailer::TestCase < Test::Unit::TestCase
|
10
|
+
BASE_URI = 'http://premailer.dev/'
|
11
|
+
BASE_PATH = File.expand_path(File.dirname(__FILE__)) + '/files'
|
12
|
+
|
13
|
+
def setup
|
14
|
+
stub_request(:any, /premailer\.dev\/*/).to_return do |request|
|
15
|
+
file_path = BASE_PATH + URI.parse(request.uri).path
|
16
|
+
if File.exists?(file_path)
|
17
|
+
{ :status => 200, :body => File.open(file_path) }
|
18
|
+
else
|
19
|
+
{ :status => 404, :body => "#{file_path} not found" }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def default_test; end
|
25
|
+
|
26
|
+
protected
|
27
|
+
def local_setup(f = 'base.html', opts = {})
|
28
|
+
base_file = BASE_PATH + '/' + f
|
29
|
+
premailer = Premailer.new(base_file, opts)
|
30
|
+
premailer.to_inline_css
|
31
|
+
@doc = premailer.processed_doc
|
32
|
+
end
|
33
|
+
|
34
|
+
def remote_setup(f = 'base.html', opts = {})
|
35
|
+
@premailer = Premailer.new(BASE_URI + "#{f}", opts)
|
36
|
+
@premailer.to_inline_css
|
37
|
+
@doc = @premailer.processed_doc
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
data/test/test_adapter.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require File.expand_path(File.dirname(__FILE__)) + '/helper'
|
3
3
|
|
4
|
-
class TestHtmlToPlainText <
|
4
|
+
class TestHtmlToPlainText < Premailer::TestCase
|
5
5
|
include HtmlToPlainText
|
6
6
|
|
7
7
|
def test_to_plain_text_with_fragment
|
@@ -102,13 +102,33 @@ END_HTML
|
|
102
102
|
assert lens.max <= 20
|
103
103
|
end
|
104
104
|
|
105
|
+
def test_img_alt_tags
|
106
|
+
# ensure html imag tags that aren't self-closed are parsed,
|
107
|
+
# along with accepting both '' and "" as attribute quotes
|
108
|
+
|
109
|
+
# <img alt="" />
|
110
|
+
assert_plaintext 'Example ( http://example.com/ )', '<a href="http://example.com/"><img src="http://example.ru/hello.jpg" alt="Example"/></a>'
|
111
|
+
# <img alt="">
|
112
|
+
assert_plaintext 'Example ( http://example.com/ )', '<a href="http://example.com/"><img src="http://example.ru/hello.jpg" alt="Example"></a>'
|
113
|
+
# <img alt='' />
|
114
|
+
assert_plaintext 'Example ( http://example.com/ )', "<a href='http://example.com/'><img src='http://example.ru/hello.jpg' alt='Example'/></a>"
|
115
|
+
# <img alt=''>
|
116
|
+
assert_plaintext 'Example ( http://example.com/ )', "<a href='http://example.com/'><img src='http://example.ru/hello.jpg' alt='Example'></a>"
|
117
|
+
end
|
118
|
+
|
105
119
|
def test_links
|
106
120
|
# basic
|
107
121
|
assert_plaintext 'Link ( http://example.com/ )', '<a href="http://example.com/">Link</a>'
|
108
122
|
|
109
123
|
# nested html
|
110
124
|
assert_plaintext 'Link ( http://example.com/ )', '<a href="http://example.com/"><span class="a">Link</span></a>'
|
111
|
-
|
125
|
+
|
126
|
+
# nested html with new line
|
127
|
+
assert_plaintext 'Link ( http://example.com/ )', "<a href='http://example.com/'>\n\t<span class='a'>Link</span>\n\t</a>"
|
128
|
+
|
129
|
+
# mailto
|
130
|
+
assert_plaintext 'Contact Us ( contact@example.org )', "<a href='mailto:contact@example.org'>Contact Us</a>"
|
131
|
+
|
112
132
|
# complex link
|
113
133
|
assert_plaintext 'Link ( http://example.com:80/~user?aaa=bb&c=d,e,f#foo )', '<a href="http://example.com:80/~user?aaa=bb&c=d,e,f#foo">Link</a>'
|
114
134
|
|
@@ -128,6 +148,9 @@ END_HTML
|
|
128
148
|
|
129
149
|
# unsubscribe
|
130
150
|
assert_plaintext 'Link ( [[!unsubscribe]] )', '<a href="[[!unsubscribe]]">Link</a>'
|
151
|
+
|
152
|
+
# empty link gets dropped, and shouldn't run forever
|
153
|
+
assert_plaintext(("This is some more text\n\n" * 14 + "This is some more text"), "<a href=\"test\"></a>#{"\n<p>This is some more text</p>" * 15}")
|
131
154
|
end
|
132
155
|
|
133
156
|
# see https://github.com/alexdunae/premailer/issues/72
|
data/test/test_links.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
+
# encoding: UTF-8
|
1
2
|
require File.expand_path(File.dirname(__FILE__)) + '/helper'
|
2
3
|
|
3
|
-
class TestLinks <
|
4
|
+
class TestLinks < Premailer::TestCase
|
4
5
|
def test_empty_query_string
|
5
6
|
assert_nothing_raised do
|
6
7
|
premailer = Premailer.new('<p>Test</p>', :with_html_string => true, :link_query_string => ' ')
|
@@ -138,4 +139,47 @@ class TestLinks < Test::Unit::TestCase
|
|
138
139
|
assert_equal 'https://my.example.com:8080/', pdoc.at('#l01').attributes['href'].to_s
|
139
140
|
assert_equal 'https://my.example.com:8080/images/', pdoc.at('#l04').attributes['href'].to_s
|
140
141
|
end
|
142
|
+
|
143
|
+
def test_convertable_inline_links
|
144
|
+
convertable = [
|
145
|
+
'my/path/to',
|
146
|
+
'other/path',
|
147
|
+
'/'
|
148
|
+
]
|
149
|
+
|
150
|
+
html = convertable.collect {|url| "<a href='#{url}'>Link</a>" }
|
151
|
+
premailer = Premailer.new(html.to_s, :base_url => "http://example.com", :with_html_string => true)
|
152
|
+
|
153
|
+
premailer.processed_doc.search('a').each do |el|
|
154
|
+
href = el.attributes['href'].to_s
|
155
|
+
assert(href =~ /http:\/\/example.com/, "link #{href} is not absolute")
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
def test_non_convertable_inline_links
|
160
|
+
not_convertable = [
|
161
|
+
'%DONOTCONVERT%',
|
162
|
+
'{DONOTCONVERT}',
|
163
|
+
'[DONOTCONVERT]',
|
164
|
+
'<DONOTCONVERT>',
|
165
|
+
'{@msg-txturl}',
|
166
|
+
'[[!unsubscribe]]',
|
167
|
+
'#relative',
|
168
|
+
'tel:5555551212',
|
169
|
+
'mailto:premailer@example.com',
|
170
|
+
'ftp://example.com',
|
171
|
+
'gopher://gopher.floodgap.com/1/fun/twitpher',
|
172
|
+
'cid:13443452066.10392logo.jpeg@inline_attachment'
|
173
|
+
]
|
174
|
+
|
175
|
+
html = not_convertable.collect {|url| "<a href='#{url}'>Link</a>" }
|
176
|
+
|
177
|
+
premailer = Premailer.new(html.to_s, :base_url => "example.com", :with_html_string => true)
|
178
|
+
premailer.to_inline_css
|
179
|
+
|
180
|
+
premailer.processed_doc.search('a').each do |el|
|
181
|
+
href = el.attributes['href'].to_s
|
182
|
+
assert not_convertable.include?(href), "link #{href} should not be converted: see #{not_convertable.inspect}"
|
183
|
+
end
|
184
|
+
end
|
141
185
|
end
|
data/test/test_misc.rb
CHANGED
@@ -4,7 +4,7 @@ require File.expand_path(File.dirname(__FILE__)) + '/helper'
|
|
4
4
|
# Random tests for specific issues.
|
5
5
|
#
|
6
6
|
# The test suite will be cleaned up at some point soon.
|
7
|
-
class TestMisc <
|
7
|
+
class TestMisc < Premailer::TestCase
|
8
8
|
|
9
9
|
# in response to http://github.com/alexdunae/premailer/issues#issue/4
|
10
10
|
#
|
@@ -115,10 +115,10 @@ END_HTML
|
|
115
115
|
|
116
116
|
premailer = Premailer.new(html, :with_html_string => true, :preserve_styles => false, :adapter => adapter)
|
117
117
|
premailer.to_inline_css
|
118
|
-
assert_nil premailer.processed_doc.at('
|
118
|
+
assert_nil premailer.processed_doc.at('body link')
|
119
119
|
|
120
120
|
# should be preserved as unmergeable
|
121
|
-
assert_match /red !important/i, premailer.processed_doc.at('
|
121
|
+
assert_match /red !important/i, premailer.processed_doc.at('head style').inner_html
|
122
122
|
end
|
123
123
|
end
|
124
124
|
|
@@ -131,7 +131,7 @@ END_HTML
|
|
131
131
|
|
132
132
|
premailer = Premailer.new(html, :with_html_string => true, :verbose => true)
|
133
133
|
premailer.to_inline_css
|
134
|
-
assert_match /a\:hover[\s]*\{[\s]*color\:[\s]*red[\s]*!important;[\s]*\}/i, premailer.processed_doc.at('
|
134
|
+
assert_match /a\:hover[\s]*\{[\s]*color\:[\s]*red[\s]*!important;[\s]*\}/i, premailer.processed_doc.at('head style').inner_html
|
135
135
|
end
|
136
136
|
|
137
137
|
def test_unmergable_rules_with_no_body
|
@@ -168,6 +168,8 @@ END_HTML
|
|
168
168
|
end
|
169
169
|
|
170
170
|
# in response to https://github.com/alexdunae/premailer/issues#issue/7
|
171
|
+
#
|
172
|
+
# fails sometimes in JRuby, see https://github.com/alexdunae/premailer/issues/79
|
171
173
|
def test_parsing_bad_markup_around_tables
|
172
174
|
html = <<END_HTML
|
173
175
|
<html>
|
@@ -207,7 +209,7 @@ END_HTML
|
|
207
209
|
|
208
210
|
premailer = Premailer.new(html, :with_html_string => true, :adapter => :nokogiri)
|
209
211
|
premailer.to_inline_css
|
210
|
-
assert_equal 'color: green !important
|
212
|
+
assert_equal 'color: green !important', premailer.processed_doc.search('p').first.attributes['style'].to_s
|
211
213
|
end
|
212
214
|
|
213
215
|
# in response to https://github.com/alexdunae/premailer/issues/28
|
@@ -230,4 +232,47 @@ END_HTML
|
|
230
232
|
assert_match /margin: 0 auto;/, premailer.processed_doc.search('#page').first.attributes['style'].to_s
|
231
233
|
assert_match /border-style: solid none solid solid;/, premailer.processed_doc.search('p').first.attributes['style'].to_s
|
232
234
|
end
|
235
|
+
|
236
|
+
def test_sorting_style_attributes
|
237
|
+
html = <<END_HTML
|
238
|
+
<html>
|
239
|
+
<style type="text/css">
|
240
|
+
#page { right: 10px; left: 5px }
|
241
|
+
</style>
|
242
|
+
<body>
|
243
|
+
<div id='page'>test</div>
|
244
|
+
</body>
|
245
|
+
</html>
|
246
|
+
END_HTML
|
247
|
+
|
248
|
+
premailer = Premailer.new(html, :with_html_string => true)
|
249
|
+
premailer.to_inline_css
|
250
|
+
assert_equal "left: 5px; right: 10px", premailer.processed_doc.search('#page').first.attributes['style'].to_s
|
251
|
+
end
|
252
|
+
|
253
|
+
def test_removing_scripts
|
254
|
+
html = <<END_HTML
|
255
|
+
<html>
|
256
|
+
<head>
|
257
|
+
<script>script to be removed</script>
|
258
|
+
</head>
|
259
|
+
<body>
|
260
|
+
content
|
261
|
+
</body>
|
262
|
+
</html>
|
263
|
+
END_HTML
|
264
|
+
|
265
|
+
[:nokogiri, :hpricot].each do |adapter|
|
266
|
+
premailer = Premailer.new(html, :with_html_string => true, :remove_scripts => true, :adapter => adapter)
|
267
|
+
premailer.to_inline_css
|
268
|
+
assert_equal 0, premailer.processed_doc.search('script').length
|
269
|
+
end
|
270
|
+
|
271
|
+
[:nokogiri, :hpricot].each do |adapter|
|
272
|
+
premailer = Premailer.new(html, :with_html_string => true, :remove_scripts => false, :adapter => adapter)
|
273
|
+
premailer.to_inline_css
|
274
|
+
assert_equal 1, premailer.processed_doc.search('script').length
|
275
|
+
end
|
276
|
+
end
|
277
|
+
|
233
278
|
end
|
data/test/test_premailer.rb
CHANGED
@@ -1,25 +1,8 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
require File.expand_path(File.dirname(__FILE__)) + '/helper'
|
3
|
-
|
4
|
-
class TestPremailer < Test::Unit::TestCase
|
5
|
-
include WEBrick
|
6
|
-
|
7
|
-
def setup
|
8
|
-
# from http://nullref.se/blog/2006/5/17/testing-with-webrick
|
9
|
-
@uri_base = "http://localhost:12000"
|
10
|
-
www_root = File.expand_path(File.dirname(__FILE__)) + '/files/'
|
1
|
+
# -*- encoding: UTF-8 -*-
|
11
2
|
|
12
|
-
|
13
|
-
s = WEBrick::HTTPServer.new(:Port => 12000, :DocumentRoot => www_root, :Logger => Log.new(nil, BasicLog::ERROR), :AccessLog => [])
|
14
|
-
port = s.config[:Port]
|
15
|
-
begin
|
16
|
-
s.start
|
17
|
-
ensure
|
18
|
-
s.shutdown
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
3
|
+
require File.expand_path(File.dirname(__FILE__)) + '/helper'
|
22
4
|
|
5
|
+
class TestPremailer < Premailer::TestCase
|
23
6
|
def test_special_characters_nokogiri
|
24
7
|
html = '<p>cédille cé & garçon garçon à à & ©</p>'
|
25
8
|
premailer = Premailer.new(html, :with_html_string => true, :adapter => :nokogiri)
|
@@ -49,7 +32,6 @@ class TestPremailer < Test::Unit::TestCase
|
|
49
32
|
premailer.to_inline_css
|
50
33
|
assert_equal 'cédille cé & garçon garçon à à &', premailer.processed_doc.at('p').inner_html
|
51
34
|
end
|
52
|
-
|
53
35
|
|
54
36
|
def test_detecting_html
|
55
37
|
[:nokogiri, :hpricot].each do |adapter|
|
@@ -105,7 +87,8 @@ END_HTML
|
|
105
87
|
end
|
106
88
|
|
107
89
|
def test_importing_local_css
|
108
|
-
|
90
|
+
# , :hpricot
|
91
|
+
[:nokogiri].each do |adapter|
|
109
92
|
local_setup('base.html', :adapter => adapter)
|
110
93
|
|
111
94
|
# noimport.css (print stylesheet) sets body { background } to red
|
@@ -231,27 +214,65 @@ END_HTML
|
|
231
214
|
end
|
232
215
|
end
|
233
216
|
|
217
|
+
def test_include_link_tags_option
|
218
|
+
local_setup('base.html', :adapter => :nokogiri, :include_link_tags => true)
|
219
|
+
assert_match /1\.231/, @doc.at('body').attributes['style'].to_s
|
220
|
+
assert_match /display: none/, @doc.at('.hide').attributes['style'].to_s
|
234
221
|
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
premailer = Premailer.new(base_file, opts)
|
239
|
-
premailer.to_inline_css
|
240
|
-
@doc = premailer.processed_doc
|
222
|
+
local_setup('base.html', :adapter => :nokogiri, :include_link_tags => false)
|
223
|
+
assert_no_match /1\.231/, @doc.at('body').attributes['style'].to_s
|
224
|
+
assert_match /display: none/, @doc.at('.hide').attributes['style'].to_s
|
241
225
|
end
|
242
|
-
|
243
|
-
def
|
244
|
-
|
245
|
-
|
246
|
-
@
|
247
|
-
|
226
|
+
|
227
|
+
def test_include_style_tags_option
|
228
|
+
local_setup('base.html', :adapter => :nokogiri, :include_style_tags => true)
|
229
|
+
assert_match /1\.231/, @doc.at('body').attributes['style'].to_s
|
230
|
+
assert_match /display: block/, @doc.at('#iphone').attributes['style'].to_s
|
231
|
+
|
232
|
+
local_setup('base.html', :adapter => :nokogiri, :include_style_tags => false)
|
233
|
+
assert_match /1\.231/, @doc.at('body').attributes['style'].to_s
|
234
|
+
assert_no_match /display: block/, @doc.at('#iphone').attributes['style'].to_s
|
248
235
|
end
|
249
236
|
|
250
|
-
def
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
237
|
+
def test_input_encoding
|
238
|
+
html_special_characters = "Ää, Öö, Üü"
|
239
|
+
expected_html = "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body><p>" + html_special_characters + "</p></body></html>\n"
|
240
|
+
pm = Premailer.new(html_special_characters, :with_html_string => true, :adapter => :nokogiri, :input_encoding => "UTF-8")
|
241
|
+
assert_equal expected_html, pm.to_inline_css
|
242
|
+
end
|
243
|
+
|
244
|
+
def test_meta_encoding_downcase
|
245
|
+
meta_encoding = '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">'
|
246
|
+
expected_html = Regexp.new(Regexp.escape('<meta http-equiv="Content-Type" content="text/html; charset=utf-8">'), Regexp::IGNORECASE)
|
247
|
+
pm = Premailer.new(meta_encoding, :with_html_string => true, :adapter => :nokogiri, :input_encoding => "utf-8")
|
248
|
+
assert_match expected_html, pm.to_inline_css
|
249
|
+
end
|
250
|
+
|
251
|
+
def test_meta_encoding_upcase
|
252
|
+
meta_encoding = '<meta http-equiv="Content-Type" content="text/html; charset=utf-8">'
|
253
|
+
expected_html = Regexp.new(Regexp.escape('<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">'), Regexp::IGNORECASE)
|
254
|
+
pm = Premailer.new(meta_encoding, :with_html_string => true, :adapter => :nokogiri, :input_encoding => "UTF-8")
|
255
|
+
assert_match expected_html, pm.to_inline_css
|
256
|
+
end
|
257
|
+
|
258
|
+
def test_htmlentities
|
259
|
+
html_entities = "’"
|
260
|
+
expected_html = "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body><p>'</p></body></html>\n"
|
261
|
+
pm = Premailer.new(html_entities, :with_html_string => true, :adapter => :nokogiri, :replace_html_entities => true)
|
262
|
+
assert_equal expected_html, pm.to_inline_css
|
263
|
+
end
|
264
|
+
|
265
|
+
# If a line other than the first line in the html string begins with a URI
|
266
|
+
# Premailer should not identify the html string as a URI. Otherwise the following
|
267
|
+
# exception would be raised: ActionView::Template::Error: bad URI(is not URI?)
|
268
|
+
def test_line_starting_with_uri_in_html_with_linked_css
|
269
|
+
files_base = File.expand_path(File.dirname(__FILE__)) + '/files/'
|
270
|
+
html_string = IO.read(File.join(files_base, 'html_with_uri.html'))
|
271
|
+
|
272
|
+
assert_nothing_raised do
|
273
|
+
premailer = Premailer.new(html_string, :with_html_string => true)
|
274
|
+
premailer.to_inline_css
|
255
275
|
end
|
256
276
|
end
|
277
|
+
|
257
278
|
end
|