podkot-premailer 1.7.8
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.
- checksums.yaml +7 -0
- data/.gitignore +11 -0
- data/.travis.yml +8 -0
- data/.yardopts +9 -0
- data/Gemfile +11 -0
- data/LICENSE.md +11 -0
- data/README.md +103 -0
- data/bin/premailer +7 -0
- data/init.rb +1 -0
- data/lib/premailer.rb +10 -0
- data/lib/premailer/adapter.rb +63 -0
- data/lib/premailer/adapter/hpricot.rb +199 -0
- data/lib/premailer/adapter/nokogiri.rb +223 -0
- data/lib/premailer/executor.rb +100 -0
- data/lib/premailer/html_to_plain_text.rb +102 -0
- data/lib/premailer/premailer.rb +550 -0
- data/lib/premailer/version.rb +4 -0
- data/local-premailer +9 -0
- data/misc/client_support.yaml +230 -0
- data/premailer.gemspec +26 -0
- data/rakefile.rb +71 -0
- data/test/files/base.html +142 -0
- data/test/files/chars.html +6 -0
- data/test/files/contact_bg.png +0 -0
- data/test/files/dialect.png +0 -0
- data/test/files/dots_end.png +0 -0
- data/test/files/dots_h.gif +0 -0
- data/test/files/html4.html +12 -0
- data/test/files/html_with_uri.html +9 -0
- data/test/files/import.css +13 -0
- data/test/files/inc/2009-placeholder.png +0 -0
- data/test/files/iso-8859-2.html +1 -0
- data/test/files/iso-8859-5.html +8 -0
- data/test/files/no_css.html +11 -0
- data/test/files/noimport.css +13 -0
- data/test/files/styles.css +106 -0
- data/test/files/xhtml.html +11 -0
- data/test/future_tests.rb +50 -0
- data/test/helper.rb +40 -0
- data/test/test_adapter.rb +29 -0
- data/test/test_html_to_plain_text.rb +155 -0
- data/test/test_links.rb +185 -0
- data/test/test_misc.rb +278 -0
- data/test/test_premailer.rb +277 -0
- data/test/test_warnings.rb +95 -0
- metadata +216 -0
@@ -0,0 +1,277 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require File.expand_path(File.dirname(__FILE__)) + '/helper'
|
3
|
+
|
4
|
+
class TestPremailer < Premailer::TestCase
|
5
|
+
def test_special_characters_nokogiri
|
6
|
+
html = '<p>cédille cé & garçon garçon à à & ©</p>'
|
7
|
+
premailer = Premailer.new(html, :with_html_string => true, :adapter => :nokogiri)
|
8
|
+
premailer.to_inline_css
|
9
|
+
assert_equal 'cédille cé & garçon garçon à à & ©', premailer.processed_doc.at('p').inner_html
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_special_characters_nokogiri_remote
|
13
|
+
remote_setup('chars.html', :adapter => :nokogiri)
|
14
|
+
@premailer.to_inline_css
|
15
|
+
assert_equal 'cédille cé & garçon garçon à à & ©', @premailer.processed_doc.at('p').inner_html
|
16
|
+
end
|
17
|
+
|
18
|
+
#def test_cyrillic_nokogiri_remote
|
19
|
+
# if RUBY_VERSION =~ /1.9/
|
20
|
+
# remote_setup('iso-8859-5.html', :adapter => :nokogiri) #, :encoding => 'iso-8859-5')
|
21
|
+
# @premailer.to_inline_css
|
22
|
+
# assert_equal Encoding.find('ISO-8859-5'), @premailer.processed_doc.at('p').inner_html.encoding
|
23
|
+
# end
|
24
|
+
#end
|
25
|
+
|
26
|
+
# TODO: this passes when run from rake but not when run from:
|
27
|
+
# ruby -Itest test/test_premailer.rb -n test_special_characters_hpricot
|
28
|
+
def test_special_characters_hpricot
|
29
|
+
html = '<p>cédille cé & garçon garçon à à &</p>'
|
30
|
+
premailer = Premailer.new(html, :with_html_string => true, :adapter => :hpricot)
|
31
|
+
premailer.to_inline_css
|
32
|
+
assert_equal 'cédille cé & garçon garçon à à &', premailer.processed_doc.at('p').inner_html
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_detecting_html
|
36
|
+
[:nokogiri, :hpricot].each do |adapter|
|
37
|
+
remote_setup('base.html', :adapter => adapter)
|
38
|
+
assert !@premailer.is_xhtml?
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_detecting_xhtml
|
43
|
+
[:nokogiri, :hpricot].each do |adapter|
|
44
|
+
remote_setup('xhtml.html', :adapter => adapter)
|
45
|
+
assert @premailer.is_xhtml?
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_self_closing_xhtml_tags
|
50
|
+
[:nokogiri, :hpricot].each do |adapter|
|
51
|
+
remote_setup('xhtml.html', :adapter => adapter)
|
52
|
+
assert_match /<br[\s]*\/>/, @premailer.to_s
|
53
|
+
assert_match /<br[\s]*\/>/, @premailer.to_inline_css
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_non_self_closing_html_tags
|
58
|
+
[:nokogiri, :hpricot].each do |adapter|
|
59
|
+
remote_setup('html4.html', :adapter => adapter)
|
60
|
+
assert_match /<br>/, @premailer.to_s
|
61
|
+
assert_match /<br>/, @premailer.to_inline_css
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_mailtos_with_query_strings
|
66
|
+
html = <<END_HTML
|
67
|
+
<html>
|
68
|
+
<a href="mailto:info@example.com?subject=Programmübersicht&body=Lorem ipsum dolor sit amet.">Test</a>
|
69
|
+
</html>
|
70
|
+
END_HTML
|
71
|
+
|
72
|
+
qs = 'testing=123'
|
73
|
+
|
74
|
+
[:nokogiri, :hpricot].each do |adapter|
|
75
|
+
premailer = Premailer.new(html, :with_html_string => true, :link_query_string => qs, :adapter => adapter)
|
76
|
+
premailer.to_inline_css
|
77
|
+
assert_no_match /testing=123/, premailer.processed_doc.search('a').first.attributes['href'].to_s
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_escaping_strings
|
82
|
+
local_setup
|
83
|
+
|
84
|
+
str = %q{url("/images/test.png");}
|
85
|
+
assert_equal("url(\'/images/test.png\');", Premailer.escape_string(str))
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_importing_local_css
|
89
|
+
# , :hpricot
|
90
|
+
[:nokogiri].each do |adapter|
|
91
|
+
local_setup('base.html', :adapter => adapter)
|
92
|
+
|
93
|
+
# noimport.css (print stylesheet) sets body { background } to red
|
94
|
+
assert_no_match /red/, @doc.at('body').attributes['style'].to_s
|
95
|
+
|
96
|
+
# import.css sets .hide to { display: none }
|
97
|
+
assert_match /display: none/, @doc.at('#hide01').attributes['style'].to_s
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_importing_remote_css
|
102
|
+
[:nokogiri, :hpricot].each do |adapter|
|
103
|
+
remote_setup('base.html', :adapter => adapter)
|
104
|
+
|
105
|
+
# noimport.css (print stylesheet) sets body { background } to red
|
106
|
+
assert_no_match /red/, @doc.at('body')['style']
|
107
|
+
|
108
|
+
# import.css sets .hide to { display: none }
|
109
|
+
assert_match /display: none/, @doc.at('#hide01')['style']
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_importing_css_as_string
|
114
|
+
files_base = File.expand_path(File.dirname(__FILE__)) + '/files/'
|
115
|
+
|
116
|
+
css_string = IO.read(File.join(files_base, 'import.css'))
|
117
|
+
|
118
|
+
[:nokogiri, :hpricot].each do |adapter|
|
119
|
+
premailer = Premailer.new(File.join(files_base, 'no_css.html'), {:css_string => css_string, :adapter => adapter})
|
120
|
+
premailer.to_inline_css
|
121
|
+
@doc = premailer.processed_doc
|
122
|
+
|
123
|
+
# import.css sets .hide to { display: none }
|
124
|
+
assert_match /display: none/, @doc.at('#hide01')['style']
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_local_remote_check
|
129
|
+
assert Premailer.local_data?( StringIO.new('a') )
|
130
|
+
assert Premailer.local_data?( '/path/' )
|
131
|
+
assert !Premailer.local_data?( 'http://example.com/path/' )
|
132
|
+
|
133
|
+
# the old way is deprecated but should still work
|
134
|
+
premailer = Premailer.new( StringIO.new('a') )
|
135
|
+
assert premailer.local_uri?( '/path/' )
|
136
|
+
end
|
137
|
+
|
138
|
+
def test_initialize_can_accept_io_object
|
139
|
+
[:nokogiri, :hpricot].each do |adapter|
|
140
|
+
io = StringIO.new('hi mom')
|
141
|
+
premailer = Premailer.new(io, :adapter => adapter)
|
142
|
+
assert_match /hi mom/, premailer.to_inline_css
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_initialize_can_accept_html_string
|
147
|
+
[:nokogiri, :hpricot].each do |adapter|
|
148
|
+
premailer = Premailer.new('<p>test</p>', :with_html_string => true, :adapter => adapter)
|
149
|
+
assert_match /test/, premailer.to_inline_css
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
def test_remove_ids
|
154
|
+
html = <<END_HTML
|
155
|
+
<html> <head> <style type="text/css"> #remove { color:blue; } </style> </head>
|
156
|
+
<body>
|
157
|
+
<p id="remove"><a href="#keep">Test</a></p>
|
158
|
+
<p id="keep">Test</p>
|
159
|
+
</body> </html>
|
160
|
+
END_HTML
|
161
|
+
|
162
|
+
[:nokogiri, :hpricot].each do |adapter|
|
163
|
+
pm = Premailer.new(html, :with_html_string => true, :remove_ids => true, :adapter => adapter)
|
164
|
+
pm.to_inline_css
|
165
|
+
doc = pm.processed_doc
|
166
|
+
assert_nil doc.at('#remove')
|
167
|
+
assert_nil doc.at('#keep')
|
168
|
+
hashed_id = doc.at('a')['href'][1..-1]
|
169
|
+
assert_not_nil doc.at("\##{hashed_id}")
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
def test_carriage_returns_as_entities
|
174
|
+
html = <<-html
|
175
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
176
|
+
<html>
|
177
|
+
<body>\n\r<p>test</p>\n\r<p>test</p>
|
178
|
+
</body></html>
|
179
|
+
html
|
180
|
+
|
181
|
+
[:nokogiri, :hpricot].each do |adapter|
|
182
|
+
pm = Premailer.new(html, :with_html_string => true, :adapter => adapter)
|
183
|
+
assert_match /\r/, pm.to_inline_css
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
|
188
|
+
def test_advanced_selectors
|
189
|
+
remote_setup('base.html', :adapter => :nokogiri)
|
190
|
+
assert_match /italic/, @doc.at('h2 + h3')['style']
|
191
|
+
assert_match /italic/, @doc.at('p[attr~=quote]')['style']
|
192
|
+
assert_match /italic/, @doc.at('ul li:first-of-type')['style']
|
193
|
+
|
194
|
+
remote_setup('base.html', :adapter => :hpricot)
|
195
|
+
assert_match /italic/, @doc.at('p[@attr~="quote"]')['style']
|
196
|
+
assert_match /italic/, @doc.at('ul li:first-of-type')['style']
|
197
|
+
end
|
198
|
+
|
199
|
+
def test_premailer_related_attributes
|
200
|
+
html = <<END_HTML
|
201
|
+
<html> <head> <style>table { -premailer-width: 500; } td { -premailer-height: 20}; </style>
|
202
|
+
<body>
|
203
|
+
<table> <tr> <td> Test </td> </tr> </table>
|
204
|
+
</body> </html>
|
205
|
+
END_HTML
|
206
|
+
|
207
|
+
[:nokogiri, :hpricot].each do |adapter|
|
208
|
+
pm = Premailer.new(html, :with_html_string => true, :adapter => adapter)
|
209
|
+
pm.to_inline_css
|
210
|
+
doc = pm.processed_doc
|
211
|
+
assert_equal '500', doc.at('table')['width']
|
212
|
+
assert_equal '20', doc.at('td')['height']
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
def test_include_link_tags_option
|
217
|
+
local_setup('base.html', :adapter => :nokogiri, :include_link_tags => true)
|
218
|
+
assert_match /1\.231/, @doc.at('body').attributes['style'].to_s
|
219
|
+
assert_match /display: none/, @doc.at('.hide').attributes['style'].to_s
|
220
|
+
|
221
|
+
local_setup('base.html', :adapter => :nokogiri, :include_link_tags => false)
|
222
|
+
assert_no_match /1\.231/, @doc.at('body').attributes['style'].to_s
|
223
|
+
assert_match /display: none/, @doc.at('.hide').attributes['style'].to_s
|
224
|
+
end
|
225
|
+
|
226
|
+
def test_include_style_tags_option
|
227
|
+
local_setup('base.html', :adapter => :nokogiri, :include_style_tags => true)
|
228
|
+
assert_match /1\.231/, @doc.at('body').attributes['style'].to_s
|
229
|
+
assert_match /display: block/, @doc.at('#iphone').attributes['style'].to_s
|
230
|
+
|
231
|
+
local_setup('base.html', :adapter => :nokogiri, :include_style_tags => false)
|
232
|
+
assert_match /1\.231/, @doc.at('body').attributes['style'].to_s
|
233
|
+
assert_no_match /display: block/, @doc.at('#iphone').attributes['style'].to_s
|
234
|
+
end
|
235
|
+
|
236
|
+
def test_input_encoding
|
237
|
+
html_special_characters = "Ää, Öö, Üü".encode("UTF-8")
|
238
|
+
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"
|
239
|
+
pm = Premailer.new(html_special_characters, :with_html_string => true, :adapter => :nokogiri, :input_encoding => "UTF-8")
|
240
|
+
assert_equal expected_html, pm.to_inline_css
|
241
|
+
end
|
242
|
+
|
243
|
+
def test_meta_encoding_downcase
|
244
|
+
meta_encoding = '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">'
|
245
|
+
expected_html = '<meta http-equiv="Content-Type" content="text/html; charset=utf-8">'
|
246
|
+
pm = Premailer.new(meta_encoding, :with_html_string => true, :adapter => :nokogiri, :input_encoding => "utf-8")
|
247
|
+
assert_match expected_html, pm.to_inline_css
|
248
|
+
end
|
249
|
+
|
250
|
+
def test_meta_encoding_upcase
|
251
|
+
meta_encoding = '<meta http-equiv="Content-Type" content="text/html; charset=utf-8">'
|
252
|
+
expected_html = '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">'
|
253
|
+
pm = Premailer.new(meta_encoding, :with_html_string => true, :adapter => :nokogiri, :input_encoding => "UTF-8")
|
254
|
+
assert_match expected_html, pm.to_inline_css
|
255
|
+
end
|
256
|
+
|
257
|
+
def test_htmlentities
|
258
|
+
html_entities = "’"
|
259
|
+
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"
|
260
|
+
pm = Premailer.new(html_entities, :with_html_string => true, :adapter => :nokogiri, :replace_html_entities => true)
|
261
|
+
assert_equal expected_html, pm.to_inline_css
|
262
|
+
end
|
263
|
+
|
264
|
+
# If a line other than the first line in the html string begins with a URI
|
265
|
+
# Premailer should not identify the html string as a URI. Otherwise the following
|
266
|
+
# exception would be raised: ActionView::Template::Error: bad URI(is not URI?)
|
267
|
+
def test_line_starting_with_uri_in_html_with_linked_css
|
268
|
+
files_base = File.expand_path(File.dirname(__FILE__)) + '/files/'
|
269
|
+
html_string = IO.read(File.join(files_base, 'html_with_uri.html'))
|
270
|
+
|
271
|
+
assert_nothing_raised do
|
272
|
+
premailer = Premailer.new(html_string, :with_html_string => true)
|
273
|
+
premailer.to_inline_css
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require File.expand_path(File.dirname(__FILE__)) + '/helper'
|
3
|
+
|
4
|
+
class TestWarnings < Premailer::TestCase
|
5
|
+
def test_element_warnings
|
6
|
+
html = <<END_HTML
|
7
|
+
<!DOCTYPE html>
|
8
|
+
<html>
|
9
|
+
<head><link rel="alternate" href="http://example.com/"></head>
|
10
|
+
<body>
|
11
|
+
<form method="post"> Test </form>
|
12
|
+
</body>
|
13
|
+
</html>
|
14
|
+
END_HTML
|
15
|
+
|
16
|
+
[:nokogiri, :hpricot].each do |adapter|
|
17
|
+
warnings = get_warnings(html, adapter)
|
18
|
+
assert_equal 2, warnings.length
|
19
|
+
assert warnings.any? { |w| w[:message] == 'form HTML element'}
|
20
|
+
assert warnings.any? { |w| w[:message] == 'link HTML element'}
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_css_warnings
|
25
|
+
html = <<END_HTML
|
26
|
+
<!DOCTYPE html>
|
27
|
+
<html><body>
|
28
|
+
<div style="margin: 5px; height: 100px;">Test</div>
|
29
|
+
</body></html>
|
30
|
+
END_HTML
|
31
|
+
|
32
|
+
[:nokogiri, :hpricot].each do |adapter|
|
33
|
+
warnings = get_warnings(html, adapter)
|
34
|
+
assert_equal 2, warnings.length
|
35
|
+
assert warnings.any? { |w| w[:message] == 'height CSS property'}
|
36
|
+
assert warnings.any? { |w| w[:message] == 'margin CSS property'}
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_css_aliased_warnings
|
41
|
+
html = <<END_HTML
|
42
|
+
<!DOCTYPE html>
|
43
|
+
<html><body>
|
44
|
+
<div style="margin-top: 5px;">Test</div>
|
45
|
+
</body></html>
|
46
|
+
END_HTML
|
47
|
+
|
48
|
+
[:nokogiri, :hpricot].each do |adapter|
|
49
|
+
warnings = get_warnings(html, adapter)
|
50
|
+
assert_equal 1, warnings.length
|
51
|
+
assert warnings.any? { |w| w[:message] == 'margin-top CSS property'}
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_attribute_warnings
|
56
|
+
html = <<END_HTML
|
57
|
+
<!DOCTYPE html>
|
58
|
+
<html><body>
|
59
|
+
<img src="#" ismap>
|
60
|
+
</body></html>
|
61
|
+
END_HTML
|
62
|
+
|
63
|
+
[:nokogiri, :hpricot].each do |adapter|
|
64
|
+
warnings = get_warnings(html, adapter)
|
65
|
+
assert_equal 1, warnings.length
|
66
|
+
assert warnings.any? { |w| w[:message] == 'ismap HTML attribute'}
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_warn_level
|
71
|
+
html = <<END_HTML
|
72
|
+
<!DOCTYPE html>
|
73
|
+
<html><body>
|
74
|
+
<div style="color: red; font-family: sans-serif;">Test</div>
|
75
|
+
</body></html>
|
76
|
+
END_HTML
|
77
|
+
|
78
|
+
[:nokogiri, :hpricot].each do |adapter|
|
79
|
+
warnings = get_warnings(html, adapter, Premailer::Warnings::SAFE)
|
80
|
+
assert_equal 2, warnings.length
|
81
|
+
end
|
82
|
+
|
83
|
+
[:nokogiri, :hpricot].each do |adapter|
|
84
|
+
warnings = get_warnings(html, adapter, Premailer::Warnings::POOR)
|
85
|
+
assert_equal 1, warnings.length
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
protected
|
90
|
+
def get_warnings(html, adapter = :nokogiri, warn_level = Premailer::Warnings::SAFE)
|
91
|
+
pm = Premailer.new(html, {:adpater => adapter, :with_html_string => true, :warn_level => warn_level})
|
92
|
+
pm.to_inline_css
|
93
|
+
pm.check_client_support
|
94
|
+
end
|
95
|
+
end
|
metadata
ADDED
@@ -0,0 +1,216 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: podkot-premailer
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.7.8
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Alex Dunae
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-05-10 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: css_parser
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.1.9
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.1.9
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: htmlentities
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 4.0.0
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 4.0.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: hpricot
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.8.3
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.8.3
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: nokogiri
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.4.4
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 1.4.4
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ~>
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0.8'
|
76
|
+
- - '!='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: 0.9.0
|
79
|
+
type: :development
|
80
|
+
prerelease: false
|
81
|
+
version_requirements: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - ~>
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0.8'
|
86
|
+
- - '!='
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: 0.9.0
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: yard
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ~>
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: 0.7.3
|
96
|
+
type: :development
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ~>
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 0.7.3
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: redcarpet
|
105
|
+
requirement: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 1.17.2
|
110
|
+
type: :development
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - ~>
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: 1.17.2
|
117
|
+
description: Improve the rendering of HTML emails by making CSS inline, converting
|
118
|
+
links and warning about unsupported code.
|
119
|
+
email: code@dunae.ca
|
120
|
+
executables:
|
121
|
+
- premailer
|
122
|
+
extensions: []
|
123
|
+
extra_rdoc_files: []
|
124
|
+
files:
|
125
|
+
- .gitignore
|
126
|
+
- .travis.yml
|
127
|
+
- .yardopts
|
128
|
+
- Gemfile
|
129
|
+
- LICENSE.md
|
130
|
+
- README.md
|
131
|
+
- bin/premailer
|
132
|
+
- init.rb
|
133
|
+
- lib/premailer.rb
|
134
|
+
- lib/premailer/adapter.rb
|
135
|
+
- lib/premailer/adapter/hpricot.rb
|
136
|
+
- lib/premailer/adapter/nokogiri.rb
|
137
|
+
- lib/premailer/executor.rb
|
138
|
+
- lib/premailer/html_to_plain_text.rb
|
139
|
+
- lib/premailer/premailer.rb
|
140
|
+
- lib/premailer/version.rb
|
141
|
+
- local-premailer
|
142
|
+
- misc/client_support.yaml
|
143
|
+
- premailer.gemspec
|
144
|
+
- rakefile.rb
|
145
|
+
- test/files/base.html
|
146
|
+
- test/files/chars.html
|
147
|
+
- test/files/contact_bg.png
|
148
|
+
- test/files/dialect.png
|
149
|
+
- test/files/dots_end.png
|
150
|
+
- test/files/dots_h.gif
|
151
|
+
- test/files/html4.html
|
152
|
+
- test/files/html_with_uri.html
|
153
|
+
- test/files/import.css
|
154
|
+
- test/files/inc/2009-placeholder.png
|
155
|
+
- test/files/iso-8859-2.html
|
156
|
+
- test/files/iso-8859-5.html
|
157
|
+
- test/files/no_css.html
|
158
|
+
- test/files/noimport.css
|
159
|
+
- test/files/styles.css
|
160
|
+
- test/files/xhtml.html
|
161
|
+
- test/future_tests.rb
|
162
|
+
- test/helper.rb
|
163
|
+
- test/test_adapter.rb
|
164
|
+
- test/test_html_to_plain_text.rb
|
165
|
+
- test/test_links.rb
|
166
|
+
- test/test_misc.rb
|
167
|
+
- test/test_premailer.rb
|
168
|
+
- test/test_warnings.rb
|
169
|
+
homepage: http://premailer.dialect.ca/
|
170
|
+
licenses: []
|
171
|
+
metadata: {}
|
172
|
+
post_install_message:
|
173
|
+
rdoc_options: []
|
174
|
+
require_paths:
|
175
|
+
- lib
|
176
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - '>='
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
181
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
182
|
+
requirements:
|
183
|
+
- - '>='
|
184
|
+
- !ruby/object:Gem::Version
|
185
|
+
version: '0'
|
186
|
+
requirements: []
|
187
|
+
rubyforge_project:
|
188
|
+
rubygems_version: 2.0.3
|
189
|
+
signing_key:
|
190
|
+
specification_version: 4
|
191
|
+
summary: Preflight for HTML e-mail.
|
192
|
+
test_files:
|
193
|
+
- test/files/base.html
|
194
|
+
- test/files/chars.html
|
195
|
+
- test/files/contact_bg.png
|
196
|
+
- test/files/dialect.png
|
197
|
+
- test/files/dots_end.png
|
198
|
+
- test/files/dots_h.gif
|
199
|
+
- test/files/html4.html
|
200
|
+
- test/files/html_with_uri.html
|
201
|
+
- test/files/import.css
|
202
|
+
- test/files/inc/2009-placeholder.png
|
203
|
+
- test/files/iso-8859-2.html
|
204
|
+
- test/files/iso-8859-5.html
|
205
|
+
- test/files/no_css.html
|
206
|
+
- test/files/noimport.css
|
207
|
+
- test/files/styles.css
|
208
|
+
- test/files/xhtml.html
|
209
|
+
- test/future_tests.rb
|
210
|
+
- test/helper.rb
|
211
|
+
- test/test_adapter.rb
|
212
|
+
- test/test_html_to_plain_text.rb
|
213
|
+
- test/test_links.rb
|
214
|
+
- test/test_misc.rb
|
215
|
+
- test/test_premailer.rb
|
216
|
+
- test/test_warnings.rb
|