premailer 1.11.0 → 1.13.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: c1f0cb88ede5d92fb777b596973cb59c69bd02e0
4
- data.tar.gz: cb84c900b1160ca8f8c91d3ad74bcd9023dc7c79
2
+ SHA256:
3
+ metadata.gz: c8c65984e17019ce303019a4c1798c6be9b265307739b9961615a0e5f80a456f
4
+ data.tar.gz: 209a139c10aa4f8c22783e6ec05019509fd59eddb72803f2e9ab5b484a640918
5
5
  SHA512:
6
- metadata.gz: f50e404b63d17ae55256615118585baf7eabf443dd56d634ad06ae4a83cc258c6a9b2dd647184f23d03b51decbc0770910f3e886aa558c4cd57fd0950102e1c1
7
- data.tar.gz: 0aab4b4d34f52a0e81a3176e3f9508d2637f1a0fb57b0a76efcfbf6f7a24cfbebb80037605cabb8fdea8de87e27f44f69b33c2ba298e816abf68c5220539947f
6
+ metadata.gz: 8dc2084696422cc0fb04b1aef915040bf91295662bbf25d12b0a0b0f1235d94ad0b2c6d8794f60a7d8a218dbec5335176504f7bc31f700fa836fa021e4c19ac0
7
+ data.tar.gz: dee28c3dfc8642e0a47446a1bf9790fbd0bce56c41069f585f1bb51b762e8f001597dd1a547efaaff95648093ea6ce36db5421d99ed947c1e9a5908fa123d688
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Premailer README [![Build Status](https://travis-ci.org/premailer/premailer.png?branch=master)](https://travis-ci.org/premailer/premailer) [![Gem Version](https://badge.fury.io/rb/premailer.svg)](https://badge.fury.io/rb/premailer)
1
+ # Premailer README [![Build Status](https://travis-ci.org/premailer/premailer.svg?branch=master)](https://travis-ci.org/premailer/premailer) [![Gem Version](https://badge.fury.io/rb/premailer.svg)](https://badge.fury.io/rb/premailer)
2
2
 
3
3
  ## What is this?
4
4
 
@@ -12,7 +12,7 @@ script is my solution.
12
12
  - Checks links in `href`, `src` and CSS `url('')`
13
13
  * CSS properties are checked against e-mail client capabilities
14
14
  - Based on the Email Standards Project's guides
15
- * A plain text version is created (optional)
15
+ * A [plain text version](https://premailer.github.io/premailer/HtmlToPlainText.html) is created (optional)
16
16
 
17
17
  ## Installation
18
18
 
@@ -80,6 +80,7 @@ Premailer looks for a few CSS attributes that make working with tables a bit eas
80
80
  | -premailer-height | Available on `table`, `tr`, `th` and `td` elements |
81
81
  | -premailer-cellpadding | Available on `table` elements |
82
82
  | -premailer-cellspacing | Available on `table` elements |
83
+ | -premailer-align | Available on `table` elements |
83
84
  | data-premailer="ignore" | Available on `link` and `style` elements. Premailer will ignore these elements entirely. |
84
85
 
85
86
  Each of these CSS declarations will be copied to appropriate element's attribute.
@@ -96,6 +97,19 @@ will result in
96
97
  <table cellspacing='5' width='500'>
97
98
  ```
98
99
 
100
+ ## Configuration options
101
+
102
+ The behavior of Premailer can be configured by passing options in the initializer.
103
+
104
+ For example, the following will accept HTML from a string and will exclude unmergeable css from being added to the `<head>` of the output document.
105
+
106
+ ```ruby
107
+ premailer = Premailer.new(html_string, with_html_string: true, drop_unmergeable_css_rules: true)
108
+ ```
109
+
110
+ [See here for a full list of the available options](https://premailer.github.io/premailer/Premailer.html#initialize-instance_method).
111
+
112
+
99
113
  ## Contributions
100
114
 
101
115
  Contributions are most welcome. Premailer was rotting away in a private SVN repository for too long and could use some TLC. Fork and patch to your heart's content. Please don't increment the version numbers, though.
@@ -94,7 +94,7 @@ class Premailer
94
94
  el['style'] = merged.declarations_to_s
95
95
  end
96
96
 
97
- doc = write_unmergable_css_rules(doc, @unmergable_rules)
97
+ doc = write_unmergable_css_rules(doc, @unmergable_rules) unless @options[:drop_unmergeable_css_rules]
98
98
 
99
99
  if @options[:remove_classes] or @options[:remove_comments]
100
100
  doc.traverse do |el|
@@ -204,7 +204,7 @@ class Premailer
204
204
  @base_dir = File.dirname(input)
205
205
  thing = File.open(input, 'r')
206
206
  else
207
- thing = open(input)
207
+ thing = URI.open(input)
208
208
  end
209
209
 
210
210
  if thing.respond_to?(:read)
@@ -226,7 +226,7 @@ class Premailer
226
226
  thing = thing.force_encoding(@options[:input_encoding]).encode!
227
227
  @options[:input_encoding]
228
228
  else
229
- @options[:input_encoding] || RUBY_PLATFORM == 'java' ? nil : 'BINARY'
229
+ @options[:input_encoding] || (RUBY_PLATFORM == 'java' ? nil : 'BINARY')
230
230
  end
231
231
  doc = if @options[:html_fragment]
232
232
  ::Nokogiri::HTML.fragment(thing, encoding)
@@ -96,7 +96,7 @@ class Premailer
96
96
  el['style'] = merged.declarations_to_s
97
97
  end
98
98
 
99
- doc = write_unmergable_css_rules(doc, @unmergable_rules)
99
+ doc = write_unmergable_css_rules(doc, @unmergable_rules) unless @options[:drop_unmergeable_css_rules]
100
100
 
101
101
  if @options[:remove_classes] or @options[:remove_comments]
102
102
  doc.traverse do |el|
@@ -206,7 +206,7 @@ class Premailer
206
206
  @base_dir = File.dirname(input)
207
207
  thing = File.open(input, 'r')
208
208
  else
209
- thing = open(input)
209
+ thing = URI.open(input)
210
210
  end
211
211
 
212
212
  if thing.respond_to?(:read)
@@ -228,7 +228,7 @@ class Premailer
228
228
  thing = thing.force_encoding(@options[:input_encoding]).encode!
229
229
  @options[:input_encoding]
230
230
  else
231
- @options[:input_encoding] || RUBY_PLATFORM == 'java' ? nil : 'BINARY'
231
+ @options[:input_encoding] || (RUBY_PLATFORM == 'java' ? nil : 'BINARY')
232
232
  end
233
233
  doc = if @options[:html_fragment]
234
234
  ::Nokogiri::HTML.fragment(thing, encoding)
@@ -94,7 +94,7 @@ class Premailer
94
94
  el['style'] = merged.declarations_to_s
95
95
  end
96
96
 
97
- doc = write_unmergable_css_rules(doc, @unmergable_rules)
97
+ doc = write_unmergable_css_rules(doc, @unmergable_rules) unless @options[:drop_unmergeable_css_rules]
98
98
 
99
99
  if @options[:remove_classes] or @options[:remove_comments]
100
100
  doc.traverse do |el|
@@ -204,7 +204,7 @@ class Premailer
204
204
  @base_dir = File.dirname(input)
205
205
  thing = File.open(input, 'r')
206
206
  else
207
- thing = open(input)
207
+ thing = URI.open(input)
208
208
  end
209
209
 
210
210
  if thing.respond_to?(:read)
@@ -226,9 +226,9 @@ class Premailer
226
226
  thing = thing.force_encoding(@options[:input_encoding]).encode!
227
227
  end
228
228
  doc = if @options[:html_fragment]
229
- ::Nokogiri::HTML5(thing)
230
- else
231
229
  ::Nokogiri::HTML5.fragment(thing)
230
+ else
231
+ ::Nokogiri::HTML5(thing)
232
232
  end
233
233
 
234
234
  # Fix for removing any CDATA tags from both style and script tags inserted per
@@ -6,7 +6,13 @@ module HtmlToPlainText
6
6
 
7
7
  # Returns the text in UTF-8 format with all HTML tags removed
8
8
  #
9
+ # HTML content can be omitted from the output by surrounding it in the following comments:
10
+ #
11
+ # <!-- start text/html -->
12
+ # <!-- end text/html -->
13
+ #
9
14
  # TODO: add support for DL, OL
15
+ # TODO: this is not safe and needs a real html parser to work
10
16
  def convert_to_text(html, line_length = 65, from_charset = 'UTF-8')
11
17
  txt = html
12
18
 
@@ -21,17 +27,31 @@ module HtmlToPlainText
21
27
  # eg. the following formats:
22
28
  # <img alt="" />
23
29
  # <img alt="">
24
- txt.gsub!(/<img.+?alt=\"([^\"]*)\"[^>]*\>/i, '\1')
30
+ txt.gsub!(/<img[^>]+?alt="([^"]*)"[^>]*>/i, '\1')
25
31
 
26
32
  # for img tags with '' for attribute quotes
27
33
  # with or without closing tag
28
34
  # eg. the following formats:
29
35
  # <img alt='' />
30
36
  # <img alt=''>
31
- txt.gsub!(/<img.+?alt=\'([^\']*)\'[^>]*\>/i, '\1')
37
+ txt.gsub!(/<img[^>]+?alt='([^']*)'[^>]*>/i, '\1')
38
+
39
+ # remove script tags and content
40
+ txt.gsub!(/<script.*?\/script>/m, '')
41
+
42
+ # links with double quotes
43
+ txt.gsub!(/<a\s[^\n]*?href=["'](mailto:)?([^"]*)["][^>]*>(.*?)<\/a>/im) do |s|
44
+ if $3.empty?
45
+ ''
46
+ elsif $3.strip.downcase == $2.strip.downcase
47
+ $3.strip
48
+ else
49
+ $3.strip + ' ( ' + $2.strip + ' )'
50
+ end
51
+ end
32
52
 
33
- # links
34
- txt.gsub!(/<a\s[^\n]*?href=["'](mailto:)?([^"']*)["'][^>]*>(.*?)<\/a>/im) do |s|
53
+ # links with single quotes
54
+ txt.gsub!(/<a\s[^\n]*?href=["'](mailto:)?([^']*)['][^>]*>(.*?)<\/a>/im) do |s|
35
55
  if $3.empty?
36
56
  ''
37
57
  elsif $3.strip.downcase == $2.strip.downcase
@@ -56,12 +76,12 @@ module HtmlToPlainText
56
76
  hlength = line_length if hlength > line_length
57
77
 
58
78
  case hlevel
59
- when 1 # H1, asterisks above and below
60
- htext = ('*' * hlength) + "\n" + htext + "\n" + ('*' * hlength)
61
- when 2 # H1, dashes above and below
62
- htext = ('-' * hlength) + "\n" + htext + "\n" + ('-' * hlength)
63
- else # H3-H6, dashes below
64
- htext = htext + "\n" + ('-' * hlength)
79
+ when 1 # H1, asterisks above and below
80
+ htext = ('*' * hlength) + "\n" + htext + "\n" + ('*' * hlength)
81
+ when 2 # H1, dashes above and below
82
+ htext = ('-' * hlength) + "\n" + htext + "\n" + ('-' * hlength)
83
+ else # H3-H6, dashes below
84
+ htext = htext + "\n" + ('-' * hlength)
65
85
  end
66
86
 
67
87
  "\n\n" + htext + "\n\n"
@@ -151,14 +151,14 @@ class Premailer
151
151
  #
152
152
  # @param [Hash] options the options to handle html with.
153
153
  # @option options [Fixnum] :line_length Line length used by to_plain_text. Default is 65.
154
- # @option options [Fixnum] :warn_level What level of CSS compatibility warnings to show (see {Premailer::Warnings}).
154
+ # @option options [Fixnum] :warn_level What level of CSS compatibility warnings to show (see {Premailer::Warnings}, default is Warnings::SAFE).
155
155
  # @option options [String] :link_query_string A string to append to every <tt>a href=""</tt> link. Do not include the initial <tt>?</tt>.
156
156
  # @option options [String] :base_url Used to calculate absolute URLs for local files.
157
157
  # @option options [Array(String)] :css Manually specify CSS stylesheets.
158
- # @option options [Boolean] :css_to_attributes Copy related CSS attributes into HTML attributes (e.g. background-color to bgcolor)
158
+ # @option options [Boolean] :css_to_attributes Copy related CSS attributes into HTML attributes (e.g. background-color to bgcolor). Default is true.
159
159
  # @option options [Boolean] :preserve_style_attribute Preserve original style attribute
160
160
  # @option options [String] :css_string Pass CSS as a string
161
- # @option options [Boolean] :rgb_to_hex_attributes Convert RBG to Hex colors, default false
161
+ # @option options [Boolean] :rgb_to_hex_attributes Convert RBG to Hex colors. Default is false.
162
162
  # @option options [Boolean] :remove_ids Remove ID attributes whenever possible and convert IDs used as anchors to hashed to avoid collisions in webmail programs. Default is false.
163
163
  # @option options [Boolean] :remove_classes Remove class attributes. Default is false.
164
164
  # @option options [Boolean] :remove_comments Remove html comments. Default is false.
@@ -178,6 +178,7 @@ class Premailer
178
178
  # @option options [String] :output_encoding Output encoding option for Nokogiri adapter. Should be set to "US-ASCII" to output HTML entities instead of Unicode characters.
179
179
  # @option options [Boolean] :create_shorthands Combine several properties into a shorthand one, e.g. font: style weight size. Default is true.
180
180
  # @option options [Boolean] :html_fragment Handle HTML fragment without any HTML content wrappers. Default is false.
181
+ # @option options [Boolean] :drop_unmergeable_css_rules Do not include unmergeable css rules in a <tt><style><tt> tag. Default is false.
181
182
  def initialize(html, options = {})
182
183
  @options = {:warn_level => Warnings::SAFE,
183
184
  :line_length => 65,
@@ -209,6 +210,7 @@ class Premailer
209
210
  :create_shorthands => true,
210
211
  :html_fragment => false,
211
212
  :adapter => Adapter.use,
213
+ :drop_unmergeable_css_rules => false
212
214
  }.merge(options)
213
215
 
214
216
  @html_file = html
@@ -236,7 +238,7 @@ class Premailer
236
238
 
237
239
  @adapter_class = Adapter.find @options[:adapter]
238
240
 
239
- self.class.send(:include, @adapter_class)
241
+ self.extend(@adapter_class)
240
242
 
241
243
  @doc = load_html(@html_file)
242
244
 
@@ -307,7 +309,7 @@ protected
307
309
  link_uri = File.join(File.dirname(@html_file), tag.attributes['href'].to_s.sub!(@base_url.to_s, ''))
308
310
  end
309
311
  # if the file does not exist locally, try to grab the remote reference
310
- unless File.exists?(link_uri)
312
+ unless File.exist?(link_uri)
311
313
  link_uri = Premailer.resolve_link(tag.attributes['href'].to_s, @html_file)
312
314
  end
313
315
  else
@@ -402,7 +404,7 @@ public
402
404
 
403
405
  # Check for an XHTML doctype
404
406
  def is_xhtml?
405
- intro = @doc.to_html.strip.split("\n")[0..2].join(' ')
407
+ intro = @doc.to_xhtml.strip.split("\n")[0..2].join(' ')
406
408
  is_xhtml = !!(intro =~ /w3c\/\/[\s]*dtd[\s]+xhtml/i)
407
409
  $stderr.puts "Is XHTML? #{is_xhtml.inspect}\nChecked:\n#{intro}" if @options[:debug]
408
410
  is_xhtml
@@ -1,4 +1,4 @@
1
1
  class Premailer
2
2
  # Premailer version.
3
- VERSION = '1.11.0'.freeze
3
+ VERSION = '1.13.1'.freeze
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: premailer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.11.0
4
+ version: 1.13.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Dunae
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-21 00:00:00.000000000 Z
11
+ date: 2020-08-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: css_parser
@@ -92,28 +92,14 @@ dependencies:
92
92
  requirements:
93
93
  - - "~>"
94
94
  - !ruby/object:Gem::Version
95
- version: '1.7'
95
+ version: 1.8.2
96
96
  type: :development
97
97
  prerelease: false
98
98
  version_requirements: !ruby/object:Gem::Requirement
99
99
  requirements:
100
100
  - - "~>"
101
101
  - !ruby/object:Gem::Version
102
- version: '1.7'
103
- - !ruby/object:Gem::Dependency
104
- name: yard
105
- requirement: !ruby/object:Gem::Requirement
106
- requirements:
107
- - - ">="
108
- - !ruby/object:Gem::Version
109
- version: '0'
110
- type: :development
111
- prerelease: false
112
- version_requirements: !ruby/object:Gem::Requirement
113
- requirements:
114
- - - ">="
115
- - !ruby/object:Gem::Version
116
- version: '0'
102
+ version: 1.8.2
117
103
  - !ruby/object:Gem::Dependency
118
104
  name: redcarpet
119
105
  requirement: !ruby/object:Gem::Requirement
@@ -184,6 +170,20 @@ dependencies:
184
170
  - - ">="
185
171
  - !ruby/object:Gem::Version
186
172
  version: '0'
173
+ - !ruby/object:Gem::Dependency
174
+ name: bump
175
+ requirement: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - ">="
178
+ - !ruby/object:Gem::Version
179
+ version: '0'
180
+ type: :development
181
+ prerelease: false
182
+ version_requirements: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - ">="
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
187
187
  description: Improve the rendering of HTML emails by making CSS inline, converting
188
188
  links and warning about unsupported code.
189
189
  email: akzhan.abdulin@gmail.com
@@ -218,15 +218,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
218
218
  requirements:
219
219
  - - ">="
220
220
  - !ruby/object:Gem::Version
221
- version: 2.1.0
221
+ version: 2.5.0
222
222
  required_rubygems_version: !ruby/object:Gem::Requirement
223
223
  requirements:
224
224
  - - ">="
225
225
  - !ruby/object:Gem::Version
226
226
  version: '0'
227
227
  requirements: []
228
- rubyforge_project:
229
- rubygems_version: 2.6.12
228
+ rubygems_version: 3.1.3
230
229
  signing_key:
231
230
  specification_version: 4
232
231
  summary: Preflight for HTML e-mail.