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.
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