podkot-premailer 1.7.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.travis.yml +8 -0
  4. data/.yardopts +9 -0
  5. data/Gemfile +11 -0
  6. data/LICENSE.md +11 -0
  7. data/README.md +103 -0
  8. data/bin/premailer +7 -0
  9. data/init.rb +1 -0
  10. data/lib/premailer.rb +10 -0
  11. data/lib/premailer/adapter.rb +63 -0
  12. data/lib/premailer/adapter/hpricot.rb +199 -0
  13. data/lib/premailer/adapter/nokogiri.rb +223 -0
  14. data/lib/premailer/executor.rb +100 -0
  15. data/lib/premailer/html_to_plain_text.rb +102 -0
  16. data/lib/premailer/premailer.rb +550 -0
  17. data/lib/premailer/version.rb +4 -0
  18. data/local-premailer +9 -0
  19. data/misc/client_support.yaml +230 -0
  20. data/premailer.gemspec +26 -0
  21. data/rakefile.rb +71 -0
  22. data/test/files/base.html +142 -0
  23. data/test/files/chars.html +6 -0
  24. data/test/files/contact_bg.png +0 -0
  25. data/test/files/dialect.png +0 -0
  26. data/test/files/dots_end.png +0 -0
  27. data/test/files/dots_h.gif +0 -0
  28. data/test/files/html4.html +12 -0
  29. data/test/files/html_with_uri.html +9 -0
  30. data/test/files/import.css +13 -0
  31. data/test/files/inc/2009-placeholder.png +0 -0
  32. data/test/files/iso-8859-2.html +1 -0
  33. data/test/files/iso-8859-5.html +8 -0
  34. data/test/files/no_css.html +11 -0
  35. data/test/files/noimport.css +13 -0
  36. data/test/files/styles.css +106 -0
  37. data/test/files/xhtml.html +11 -0
  38. data/test/future_tests.rb +50 -0
  39. data/test/helper.rb +40 -0
  40. data/test/test_adapter.rb +29 -0
  41. data/test/test_html_to_plain_text.rb +155 -0
  42. data/test/test_links.rb +185 -0
  43. data/test/test_misc.rb +278 -0
  44. data/test/test_premailer.rb +277 -0
  45. data/test/test_warnings.rb +95 -0
  46. 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&eacute; & garçon gar&#231;on à &agrave; &nbsp; &amp; &copy;</p>'
7
+ premailer = Premailer.new(html, :with_html_string => true, :adapter => :nokogiri)
8
+ premailer.to_inline_css
9
+ assert_equal 'c&eacute;dille c&eacute; &amp; gar&ccedil;on gar&ccedil;on &agrave; &agrave; &nbsp; &amp; &copy;', 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&eacute;dille c&eacute; &amp; gar&ccedil;on gar&ccedil;on &agrave; &agrave; &nbsp; &amp; &copy;', @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&eacute; & garçon gar&#231;on à &agrave; &nbsp; &amp;</p>'
30
+ premailer = Premailer.new(html, :with_html_string => true, :adapter => :hpricot)
31
+ premailer.to_inline_css
32
+ assert_equal 'c&eacute;dille c&eacute; &amp; gar&ccedil;on gar&ccedil;on &agrave; &agrave; &nbsp; &amp;', 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&amp;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 = "&#8217;"
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