premailer 1.9.1 → 1.9.2
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 +4 -4
- data/LICENSE.md +1 -1
- data/README.md +23 -13
- data/lib/premailer.rb +1 -0
- data/lib/premailer/adapter.rb +0 -2
- data/lib/premailer/adapter/hpricot.rb +9 -2
- data/lib/premailer/adapter/nokogiri.rb +8 -2
- data/lib/premailer/adapter/nokogiri_fast.rb +12 -6
- data/lib/premailer/adapter/nokogumbo.rb +8 -2
- data/lib/premailer/adapter/rgb_to_hex.rb +33 -0
- data/lib/premailer/premailer.rb +4 -0
- data/lib/premailer/version.rb +1 -1
- metadata +6 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 4df1d858e475536189c6e91cb30d72194cf8d88b
|
|
4
|
+
data.tar.gz: 39daad276db1125fc182e4da80ce8635debe9959
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 335cb3dc57599aba6fe75eba289a250abed56b9180ffc11feb129a0b90f49d9845f92d475329dfc2ba9ec9623e69f295bc844af35a66ca790914988e0f733620
|
|
7
|
+
data.tar.gz: d7401533fdfda12a308377cf6719e38461aafdf4c7f9b3c0eedef3998e8ef27c2126671e077d20e70aea82bb1dec3ee492b4b60545b5590e921bfb4a85628407
|
data/LICENSE.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Premailer License
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2007-
|
|
3
|
+
Copyright (c) 2007-2017, Alex Dunae. All rights reserved.
|
|
4
4
|
|
|
5
5
|
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
|
6
6
|
|
data/README.md
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
## What is this?
|
|
4
4
|
|
|
5
|
-
For the best HTML e-mail delivery results, CSS should be inline. This is a
|
|
6
|
-
huge pain and a simple newsletter becomes un-managable very quickly. This
|
|
5
|
+
For the best HTML e-mail delivery results, CSS should be inline. This is a
|
|
6
|
+
huge pain and a simple newsletter becomes un-managable very quickly. This
|
|
7
7
|
script is my solution.
|
|
8
8
|
|
|
9
9
|
* CSS styles are converted to inline style attributes
|
|
@@ -14,10 +14,6 @@ script is my solution.
|
|
|
14
14
|
- Based on the Email Standards Project's guides
|
|
15
15
|
* A plain text version is created (optional)
|
|
16
16
|
|
|
17
|
-
## Premailer 2.0 is coming
|
|
18
|
-
|
|
19
|
-
I'm looking for input on a version 2.0 update to Premailer. Please visit the [Premailer 2.0 Planning Page](https://github.com/premailer/premailer/wiki/New-Premailer-2.0-Planning) and give me your feedback.
|
|
20
|
-
|
|
21
17
|
## Installation
|
|
22
18
|
|
|
23
19
|
Install the Premailer gem from RubyGems.
|
|
@@ -31,7 +27,6 @@ or add it to your `Gemfile` and run `bundle`.
|
|
|
31
27
|
## Example
|
|
32
28
|
|
|
33
29
|
```ruby
|
|
34
|
-
require 'rubygems' # optional for Ruby 1.9 or above.
|
|
35
30
|
require 'premailer'
|
|
36
31
|
|
|
37
32
|
premailer = Premailer.new('http://example.com/myfile.html', :warn_level => Premailer::Warnings::SAFE)
|
|
@@ -53,9 +48,26 @@ premailer.warnings.each do |w|
|
|
|
53
48
|
end
|
|
54
49
|
```
|
|
55
50
|
|
|
51
|
+
## Adapters
|
|
52
|
+
|
|
53
|
+
Premailer's default adapter is nokogiri if both nokogiri and hpricot are included in the Gemfile list. However, if you want to use a different adapter, you can choose to.
|
|
54
|
+
|
|
55
|
+
There are four adapters in total (as of premailer 1.9.1)
|
|
56
|
+
|
|
57
|
+
1. nokogiri (default)
|
|
58
|
+
2. nokogiri_fast
|
|
59
|
+
3. nokogumbo
|
|
60
|
+
4. hpricot (deprecated and will be removed in future premailer releases)
|
|
61
|
+
|
|
62
|
+
`NokogiriFast` adapter improves the Algorithmic complexity of the running time by 20x with a slight compensation on memory. To switch to any of these adapters, add the following line. For example, if you want to include the `NokogiriFast` adapter,
|
|
63
|
+
|
|
64
|
+
```ruby
|
|
65
|
+
Premailer::Adapter.use = :nokogiri_fast
|
|
66
|
+
```
|
|
67
|
+
|
|
56
68
|
## Ruby Compatibility
|
|
57
69
|
|
|
58
|
-
Premailer is tested on Ruby
|
|
70
|
+
Premailer is tested on Ruby 2.x.0. JRuby support is close; contributors are welcome. Checkout the latest build status on the [Travis CI dashboard](https://travis-ci.org/#!/premailer/premailer).
|
|
59
71
|
|
|
60
72
|
## Premailer-specific CSS
|
|
61
73
|
|
|
@@ -77,7 +89,7 @@ For example
|
|
|
77
89
|
table { -premailer-cellspacing: 5; -premailer-width: 500; }
|
|
78
90
|
```
|
|
79
91
|
|
|
80
|
-
will result in
|
|
92
|
+
will result in
|
|
81
93
|
|
|
82
94
|
```html
|
|
83
95
|
<table cellspacing='5' width='500'>
|
|
@@ -99,9 +111,7 @@ Thanks to [all the wonderful contributors](https://github.com/premailer/premaile
|
|
|
99
111
|
Thanks to [Greenhood + Company](http://www.greenhood.com/) for sponsoring some of the 1.5.6 updates,
|
|
100
112
|
and to [Campaign Monitor](https://www.campaignmonitor.com/) for supporting the web interface.
|
|
101
113
|
|
|
102
|
-
The
|
|
103
|
-
|
|
104
|
-
The source code can be found on [GitHub](https://github.com/alexdunae/premailer).
|
|
114
|
+
The source code can be found on [GitHub](https://github.com/premailer/premailer).
|
|
105
115
|
|
|
106
|
-
Copyright by Alex Dunae (dunae.ca, e-mail 'code' at the same domain), 2007-
|
|
116
|
+
Copyright by Alex Dunae (dunae.ca, e-mail 'code' at the same domain), 2007-2017. See [LICENSE.md](https://github.com/alexdunae/premailer/blob/master/LICENSE.md) for license details.
|
|
107
117
|
|
data/lib/premailer.rb
CHANGED
data/lib/premailer/adapter.rb
CHANGED
|
@@ -4,6 +4,8 @@ class Premailer
|
|
|
4
4
|
module Adapter
|
|
5
5
|
# Hpricot adapter
|
|
6
6
|
module Hpricot
|
|
7
|
+
include AdapterHelper::RgbToHex
|
|
8
|
+
|
|
7
9
|
def self.included(base)
|
|
8
10
|
warn <<eos
|
|
9
11
|
[DEPRECATED] Premailer's Hpricot adapter will be removed with the next major \
|
|
@@ -87,9 +89,14 @@ eos
|
|
|
87
89
|
# Duplicate CSS attributes as HTML attributes
|
|
88
90
|
if Premailer::RELATED_ATTRIBUTES.has_key?(el.name) && @options[:css_to_attributes]
|
|
89
91
|
Premailer::RELATED_ATTRIBUTES[el.name].each do |css_att, html_att|
|
|
90
|
-
|
|
92
|
+
if el[html_att].nil? and not merged[css_att].empty?
|
|
93
|
+
new_html_att = merged[css_att].gsub(/url\(['|"](.*)['|"]\)/, '\1').gsub(/;$|\s*!important/, '').strip
|
|
94
|
+
el[html_att] = css_att.end_with?('color') && @options[:rgb_to_hex_attributes] ? ensure_hex(new_html_att) : new_html_att
|
|
95
|
+
end
|
|
91
96
|
merged.instance_variable_get("@declarations").tap do |declarations|
|
|
92
|
-
|
|
97
|
+
unless @options[:preserve_style_attribute]
|
|
98
|
+
declarations.delete(css_att)
|
|
99
|
+
end
|
|
93
100
|
end
|
|
94
101
|
end
|
|
95
102
|
end
|
|
@@ -5,6 +5,7 @@ class Premailer
|
|
|
5
5
|
# Nokogiri adapter
|
|
6
6
|
module Nokogiri
|
|
7
7
|
|
|
8
|
+
include AdapterHelper::RgbToHex
|
|
8
9
|
# Merge CSS into the HTML document.
|
|
9
10
|
#
|
|
10
11
|
# @return [String] an HTML.
|
|
@@ -75,9 +76,14 @@ class Premailer
|
|
|
75
76
|
# Duplicate CSS attributes as HTML attributes
|
|
76
77
|
if Premailer::RELATED_ATTRIBUTES.has_key?(el.name) && @options[:css_to_attributes]
|
|
77
78
|
Premailer::RELATED_ATTRIBUTES[el.name].each do |css_att, html_att|
|
|
78
|
-
|
|
79
|
+
if el[html_att].nil? and not merged[css_att].empty?
|
|
80
|
+
new_html_att = merged[css_att].gsub(/url\(['|"](.*)['|"]\)/, '\1').gsub(/;$|\s*!important/, '').strip
|
|
81
|
+
el[html_att] = css_att.end_with?('color') && @options[:rgb_to_hex_attributes] ? ensure_hex(new_html_att) : new_html_att
|
|
82
|
+
end
|
|
79
83
|
merged.instance_variable_get("@declarations").tap do |declarations|
|
|
80
|
-
|
|
84
|
+
unless @options[:preserve_style_attribute]
|
|
85
|
+
declarations.delete(css_att)
|
|
86
|
+
end
|
|
81
87
|
end
|
|
82
88
|
end
|
|
83
89
|
end
|
|
@@ -5,6 +5,7 @@ class Premailer
|
|
|
5
5
|
# NokogiriFast adapter
|
|
6
6
|
module NokogiriFast
|
|
7
7
|
|
|
8
|
+
include AdapterHelper::RgbToHex
|
|
8
9
|
# Merge CSS into the HTML document.
|
|
9
10
|
#
|
|
10
11
|
# @return [String] an HTML.
|
|
@@ -77,9 +78,14 @@ class Premailer
|
|
|
77
78
|
# Duplicate CSS attributes as HTML attributes
|
|
78
79
|
if Premailer::RELATED_ATTRIBUTES.has_key?(el.name) && @options[:css_to_attributes]
|
|
79
80
|
Premailer::RELATED_ATTRIBUTES[el.name].each do |css_att, html_att|
|
|
80
|
-
|
|
81
|
+
if el[html_att].nil? and not merged[css_att].empty?
|
|
82
|
+
new_html_att = merged[css_att].gsub(/url\(['|"](.*)['|"]\)/, '\1').gsub(/;$|\s*!important/, '').strip
|
|
83
|
+
el[html_att] = css_att.end_with?('color') && @options[:rgb_to_hex_attributes] ? ensure_hex(new_html_att) : new_html_att
|
|
84
|
+
end
|
|
81
85
|
merged.instance_variable_get("@declarations").tap do |declarations|
|
|
82
|
-
|
|
86
|
+
unless @options[:preserve_style_attribute]
|
|
87
|
+
declarations.delete(css_att)
|
|
88
|
+
end
|
|
83
89
|
end
|
|
84
90
|
end
|
|
85
91
|
end
|
|
@@ -241,12 +247,12 @@ class Premailer
|
|
|
241
247
|
doc
|
|
242
248
|
end
|
|
243
249
|
|
|
244
|
-
private
|
|
250
|
+
private
|
|
245
251
|
|
|
246
252
|
# For very large documents, it is useful to trade off some memory for performance.
|
|
247
253
|
# We can build an index of the nodes so we can quickly select by id/class/tagname
|
|
248
|
-
# instead of search the tree again and again.
|
|
249
|
-
#
|
|
254
|
+
# instead of search the tree again and again.
|
|
255
|
+
#
|
|
250
256
|
# @param page The Nokogiri HTML document to index.
|
|
251
257
|
# @return [index, set_of_all_nodes, descendants] The index is a hash from key to set of nodes.
|
|
252
258
|
# The "descendants" is a hash mapping a node to the set of its descendant nodes.
|
|
@@ -311,7 +317,7 @@ class Premailer
|
|
|
311
317
|
|
|
312
318
|
# @param index An index hash returned by make_index
|
|
313
319
|
# @param base The base set of nodes within which the given spec is to be matched.
|
|
314
|
-
# @param intersection_selector A CSS intersection selector string of the form
|
|
320
|
+
# @param intersection_selector A CSS intersection selector string of the form
|
|
315
321
|
# "hello.world" or "#blue.diamond". This should not contain spaces.
|
|
316
322
|
# @return Set of nodes matching the given spec that are present in the base set.
|
|
317
323
|
def narrow_down_nodes(index, base, intersection_selector)
|
|
@@ -5,6 +5,7 @@ class Premailer
|
|
|
5
5
|
# Nokogiri adapter
|
|
6
6
|
module Nokogumbo
|
|
7
7
|
|
|
8
|
+
include AdapterHelper::RgbToHex
|
|
8
9
|
# Merge CSS into the HTML document.
|
|
9
10
|
#
|
|
10
11
|
# @return [String] an HTML.
|
|
@@ -75,9 +76,14 @@ class Premailer
|
|
|
75
76
|
# Duplicate CSS attributes as HTML attributes
|
|
76
77
|
if Premailer::RELATED_ATTRIBUTES.has_key?(el.name) && @options[:css_to_attributes]
|
|
77
78
|
Premailer::RELATED_ATTRIBUTES[el.name].each do |css_att, html_att|
|
|
78
|
-
|
|
79
|
+
if el[html_att].nil? and not merged[css_att].empty?
|
|
80
|
+
new_html_att = merged[css_att].gsub(/url\(['|"](.*)['|"]\)/, '\1').gsub(/;$|\s*!important/, '').strip
|
|
81
|
+
el[html_att] = css_att.end_with?('color') && @options[:rgb_to_hex_attributes] ? ensure_hex(new_html_att) : new_html_att
|
|
82
|
+
end
|
|
79
83
|
merged.instance_variable_get("@declarations").tap do |declarations|
|
|
80
|
-
|
|
84
|
+
unless @options[:preserve_style_attribute]
|
|
85
|
+
declarations.delete(css_att)
|
|
86
|
+
end
|
|
81
87
|
end
|
|
82
88
|
end
|
|
83
89
|
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# RGB helper for adapters, currently only nokogiri supported
|
|
2
|
+
|
|
3
|
+
module AdapterHelper
|
|
4
|
+
module RgbToHex
|
|
5
|
+
def to_hex(str)
|
|
6
|
+
str.to_i.to_s(16).rjust(2, '0').upcase
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def is_rgb?(color)
|
|
10
|
+
pattern = %r{
|
|
11
|
+
rgb
|
|
12
|
+
\(\s* # literal open, with optional whitespace
|
|
13
|
+
(\d{1,3}) # capture 1-3 digits
|
|
14
|
+
\s*,\s* # comma, with optional whitespace
|
|
15
|
+
(\d{1,3}) # capture 1-3 digits
|
|
16
|
+
\s*,\s* # comma, with optional whitespace
|
|
17
|
+
(\d{1,3}) # capture 1-3 digits
|
|
18
|
+
\s*\) # literal close, with optional whitespace
|
|
19
|
+
}x
|
|
20
|
+
|
|
21
|
+
pattern.match(color)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def ensure_hex(color)
|
|
25
|
+
match_data = is_rgb?(color)
|
|
26
|
+
if match_data
|
|
27
|
+
"#{to_hex(match_data[1])}#{to_hex(match_data[2])}#{to_hex(match_data[3])}"
|
|
28
|
+
else
|
|
29
|
+
color
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
data/lib/premailer/premailer.rb
CHANGED
|
@@ -156,7 +156,9 @@ class Premailer
|
|
|
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
158
|
# @option options [Boolean] :css_to_attributes Copy related CSS attributes into HTML attributes (e.g. background-color to bgcolor)
|
|
159
|
+
# @option options [Boolean] :preserve_style_attribute Preserve original style attribute
|
|
159
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
|
|
160
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.
|
|
161
163
|
# @option options [Boolean] :remove_classes Remove class attributes. Default is false.
|
|
162
164
|
# @option options [Boolean] :remove_comments Remove html comments. Default is false.
|
|
@@ -180,6 +182,7 @@ class Premailer
|
|
|
180
182
|
:line_length => 65,
|
|
181
183
|
:link_query_string => nil,
|
|
182
184
|
:base_url => nil,
|
|
185
|
+
:rgb_to_hex_attributes => true,
|
|
183
186
|
:remove_classes => false,
|
|
184
187
|
:remove_ids => false,
|
|
185
188
|
:remove_comments => false,
|
|
@@ -187,6 +190,7 @@ class Premailer
|
|
|
187
190
|
:reset_contenteditable => true,
|
|
188
191
|
:css => [],
|
|
189
192
|
:css_to_attributes => true,
|
|
193
|
+
:preserve_style_attribute => false,
|
|
190
194
|
:with_html_string => false,
|
|
191
195
|
:css_string => nil,
|
|
192
196
|
:preserve_styles => false,
|
data/lib/premailer/version.rb
CHANGED
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.9.
|
|
4
|
+
version: 1.9.2
|
|
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-
|
|
11
|
+
date: 2017-02-03 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: css_parser
|
|
@@ -16,14 +16,14 @@ dependencies:
|
|
|
16
16
|
requirements:
|
|
17
17
|
- - ">="
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: 1.4.
|
|
19
|
+
version: 1.4.8
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
24
|
- - ">="
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: 1.4.
|
|
26
|
+
version: 1.4.8
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: htmlentities
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -207,6 +207,7 @@ files:
|
|
|
207
207
|
- lib/premailer/adapter/nokogiri.rb
|
|
208
208
|
- lib/premailer/adapter/nokogiri_fast.rb
|
|
209
209
|
- lib/premailer/adapter/nokogumbo.rb
|
|
210
|
+
- lib/premailer/adapter/rgb_to_hex.rb
|
|
210
211
|
- lib/premailer/executor.rb
|
|
211
212
|
- lib/premailer/html_to_plain_text.rb
|
|
212
213
|
- lib/premailer/premailer.rb
|
|
@@ -232,7 +233,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
232
233
|
version: '0'
|
|
233
234
|
requirements: []
|
|
234
235
|
rubyforge_project:
|
|
235
|
-
rubygems_version: 2.
|
|
236
|
+
rubygems_version: 2.6.8
|
|
236
237
|
signing_key:
|
|
237
238
|
specification_version: 4
|
|
238
239
|
summary: Preflight for HTML e-mail.
|