html2email 0.1.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.
- data/.gitignore +1 -0
- data/LICENSE +23 -0
- data/README.markdown +110 -0
- data/Rakefile +57 -0
- data/bin/html2email +5 -0
- data/html2email.gemspec +47 -0
- data/lib/html2email/context.rb +42 -0
- data/lib/html2email/html_email.rb +59 -0
- data/lib/html2email/html_mailer.rb +49 -0
- data/lib/html2email/vendor/premailer/.gitignore +1 -0
- data/lib/html2email/vendor/premailer/CHANGELOG.rdoc +62 -0
- data/lib/html2email/vendor/premailer/LICENSE.rdoc +42 -0
- data/lib/html2email/vendor/premailer/README.rdoc +66 -0
- data/lib/html2email/vendor/premailer/bin/premailer +72 -0
- data/lib/html2email/vendor/premailer/bin/trollop.rb +739 -0
- data/lib/html2email/vendor/premailer/init.rb +1 -0
- data/lib/html2email/vendor/premailer/lib/premailer/html_to_plain_text.rb +81 -0
- data/lib/html2email/vendor/premailer/lib/premailer/premailer.rb +464 -0
- data/lib/html2email/vendor/premailer/lib/premailer.rb +9 -0
- data/lib/html2email/vendor/premailer/misc/client_support.yaml +230 -0
- data/lib/html2email/vendor/premailer/premailer.gemspec +20 -0
- data/lib/html2email/vendor/premailer/rakefile.rb +42 -0
- data/lib/html2email/vendor/premailer/tests/files/base.html +145 -0
- data/lib/html2email/vendor/premailer/tests/files/contact_bg.png +0 -0
- data/lib/html2email/vendor/premailer/tests/files/dialect.png +0 -0
- data/lib/html2email/vendor/premailer/tests/files/dots_end.png +0 -0
- data/lib/html2email/vendor/premailer/tests/files/dots_h.gif +0 -0
- data/lib/html2email/vendor/premailer/tests/files/import.css +13 -0
- data/lib/html2email/vendor/premailer/tests/files/inc/2009-placeholder.png +0 -0
- data/lib/html2email/vendor/premailer/tests/files/noimport.css +13 -0
- data/lib/html2email/vendor/premailer/tests/files/styles.css +102 -0
- data/lib/html2email/vendor/premailer/tests/test_helper.rb +2 -0
- data/lib/html2email/vendor/premailer/tests/test_html_to_plain_text.rb +73 -0
- data/lib/html2email/vendor/premailer/tests/test_link_resolver.rb +49 -0
- data/lib/html2email/vendor/premailer/tests/test_premailer.rb +124 -0
- data/lib/html2email.rb +110 -0
- data/spec/html2email.spec.rb +9 -0
- metadata +176 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
|
2
|
+
|
|
3
|
+
class TestLinkResolver < Test::Unit::TestCase
|
|
4
|
+
def test_resolving_urls_from_string
|
|
5
|
+
['test.html', '/test.html', './test.html',
|
|
6
|
+
'test/../test.html', 'test/../test/../test.html'].each do |q|
|
|
7
|
+
assert_equal 'http://example.com/test.html', Premailer.resolve_link(q, 'http://example.com/'), q
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
assert_equal 'https://example.net:80/~basedir/test.html?var=1#anchor', Premailer.resolve_link('test/../test/../test.html?var=1#anchor', 'https://example.net:80/~basedir/')
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def test_resolving_urls_from_uri
|
|
14
|
+
base_uri = URI.parse('http://example.com/')
|
|
15
|
+
['test.html', '/test.html', './test.html',
|
|
16
|
+
'test/../test.html', 'test/../test/../test.html'].each do |q|
|
|
17
|
+
assert_equal 'http://example.com/test.html', Premailer.resolve_link(q, base_uri), q
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
base_uri = URI.parse('https://example.net:80/~basedir/')
|
|
21
|
+
assert_equal 'https://example.net:80/~basedir/test.html?var=1#anchor', Premailer.resolve_link('test/../test/../test.html?var=1#anchor', base_uri)
|
|
22
|
+
|
|
23
|
+
# base URI with a query string
|
|
24
|
+
base_uri = URI.parse('http://example.com/dir/index.cfm?newsletterID=16')
|
|
25
|
+
assert_equal 'http://example.com/dir/index.cfm?link=15', Premailer.resolve_link('?link=15', base_uri)
|
|
26
|
+
|
|
27
|
+
# URI preceded by a space
|
|
28
|
+
base_uri = URI.parse('http://example.com/')
|
|
29
|
+
assert_equal 'http://example.com/path', Premailer.resolve_link(' path', base_uri)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def test_resolving_urls_in_doc
|
|
33
|
+
base_file = File.dirname(__FILE__) + '/files/base.html'
|
|
34
|
+
base_url = 'https://my.example.com:8080/test-path.html'
|
|
35
|
+
premailer = Premailer.new(base_file, :base_url => base_url)
|
|
36
|
+
premailer.to_inline_css
|
|
37
|
+
pdoc = premailer.processed_doc
|
|
38
|
+
doc = premailer.doc
|
|
39
|
+
|
|
40
|
+
# unchanged links
|
|
41
|
+
['#l02', '#l03', '#l05', '#l06', '#l07', '#l08',
|
|
42
|
+
'#l09', '#l10', '#l11', '#l12', '#l13'].each do |link_id|
|
|
43
|
+
assert_equal doc.at(link_id).attributes['href'], pdoc.at(link_id).attributes['href'], link_id
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
assert_equal 'https://my.example.com:8080/', pdoc.at('#l01').attributes['href']
|
|
47
|
+
assert_equal 'https://my.example.com:8080/images/', pdoc.at('#l04').attributes['href']
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
|
2
|
+
require 'webrick'
|
|
3
|
+
|
|
4
|
+
class TestPremailer < Test::Unit::TestCase
|
|
5
|
+
include WEBrick
|
|
6
|
+
|
|
7
|
+
def test_accents
|
|
8
|
+
local_setup
|
|
9
|
+
|
|
10
|
+
assert_equal 'cédille cé garçon garçon à à', @doc.at('#accents').inner_html
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def test_escaping_strings
|
|
14
|
+
local_setup
|
|
15
|
+
|
|
16
|
+
str = %q{url("/images/test.png");}
|
|
17
|
+
assert_equal("url(\'/images/test.png\');", Premailer.escape_string(str))
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def test_importing_local_css
|
|
21
|
+
flunk
|
|
22
|
+
local_setup
|
|
23
|
+
|
|
24
|
+
# noimport.css (print stylesheet) sets body { background } to red
|
|
25
|
+
assert_no_match /red/, @doc.at('body').attributes['style']
|
|
26
|
+
|
|
27
|
+
# import.css sets .hide to { display: none }
|
|
28
|
+
assert_match /display: none/, @doc.at('#hide01').attributes['style']
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def test_importing_remote_css
|
|
32
|
+
flunk
|
|
33
|
+
remote_setup
|
|
34
|
+
|
|
35
|
+
# noimport.css (print stylesheet) sets body { background } to red
|
|
36
|
+
assert_no_match /red/, @doc.at('body').attributes['style']
|
|
37
|
+
|
|
38
|
+
# import.css sets .hide to { display: none }
|
|
39
|
+
assert_match /display: none/, @doc.at('#hide01').attributes['style']
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def test_related_attributes
|
|
44
|
+
local_setup
|
|
45
|
+
|
|
46
|
+
# h1 { text-align: center; }
|
|
47
|
+
assert_equal 'center', @doc.at('h1')['align']
|
|
48
|
+
|
|
49
|
+
# td { vertical-align: top; }
|
|
50
|
+
assert_equal 'top', @doc.at('td')['valign']
|
|
51
|
+
|
|
52
|
+
# p { vertical-align: top; } -- not allowed
|
|
53
|
+
assert_nil @doc.at('p')['valign']
|
|
54
|
+
|
|
55
|
+
# no align attr is specified for <p> elements, so it should not appear
|
|
56
|
+
assert_nil @doc.at('p.unaligned')['align']
|
|
57
|
+
|
|
58
|
+
# .contact { background: #9EC03B url("contact_bg.png") repeat 0 0; }
|
|
59
|
+
assert_equal '#9EC03B', @doc.at('td.contact')['bgcolor']
|
|
60
|
+
|
|
61
|
+
# body { background-color: #9EBF00; }
|
|
62
|
+
assert_equal '#9EBF00', @doc.at('body')['bgcolor']
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def test_merging_cellpadding
|
|
66
|
+
flunk
|
|
67
|
+
local_setup('cellpadding.html', {:prefer_cellpadding => true})
|
|
68
|
+
assert_equal '0', @doc.at('#t1')['cellpadding']
|
|
69
|
+
assert_match /padding\:/i, @doc.at('#t1 td')['style']
|
|
70
|
+
|
|
71
|
+
assert_equal '5', @doc.at('#t2')['cellpadding']
|
|
72
|
+
assert_no_match /padding\:/i, @doc.at('#t2 td')['style']
|
|
73
|
+
|
|
74
|
+
assert_nil @doc.at('#t3')['cellpadding']
|
|
75
|
+
assert_match /padding\:/i, @doc.at('#t3 td')['style']
|
|
76
|
+
|
|
77
|
+
assert_nil @doc.at('#t4')['cellpadding']
|
|
78
|
+
assert_match /padding\:/i, @doc.at('#t4a')['style']
|
|
79
|
+
assert_match /padding\:/i, @doc.at('#t4b')['style']
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def test_preserving_media_queries
|
|
83
|
+
local_setup
|
|
84
|
+
assert_match /display\: none/i, @doc.at('#iphone')['style']
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
protected
|
|
88
|
+
def local_setup(f = 'base.html', opts = {})
|
|
89
|
+
base_file = File.dirname(__FILE__) + '/files/' + f
|
|
90
|
+
premailer = Premailer.new(base_file, opts)
|
|
91
|
+
premailer.to_inline_css
|
|
92
|
+
@doc = premailer.processed_doc
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def remote_setup(opts = {})
|
|
96
|
+
# from http://nullref.se/blog/2006/5/17/testing-with-webrick
|
|
97
|
+
uri_base = 'http://localhost:12000'
|
|
98
|
+
www_root = File.dirname(__FILE__) + '/files/'
|
|
99
|
+
|
|
100
|
+
@server_thread = Thread.new do
|
|
101
|
+
s = WEBrick::HTTPServer.new(:Port => 12000, :DocumentRoot => www_root, :Logger => Log.new(nil, BasicLog::ERROR), :AccessLog => [])
|
|
102
|
+
port = s.config[:Port]
|
|
103
|
+
begin
|
|
104
|
+
s.start
|
|
105
|
+
ensure
|
|
106
|
+
s.shutdown
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
sleep 1 # ensure the server has time to load
|
|
111
|
+
|
|
112
|
+
premailer = Premailer.new(uri_base + '/base.html', opts)
|
|
113
|
+
premailer.to_inline_css
|
|
114
|
+
@doc = premailer.processed_doc
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def teardown
|
|
118
|
+
if @server_thread
|
|
119
|
+
@server_thread.kill
|
|
120
|
+
@server_thread.join(5)
|
|
121
|
+
@server_thread = nil
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
data/lib/html2email.rb
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
require 'optparse'
|
|
2
|
+
require 'fileutils'
|
|
3
|
+
require 'html2email/html_email'
|
|
4
|
+
require 'html2email/html_mailer'
|
|
5
|
+
|
|
6
|
+
#
|
|
7
|
+
# Command line wrapper for creating and writing HtmlEmail objects
|
|
8
|
+
#
|
|
9
|
+
class Html2Email
|
|
10
|
+
VERSION = '0.1.2'
|
|
11
|
+
|
|
12
|
+
def initialize(args = [])
|
|
13
|
+
@args, @options = args, { :default_type => 'str', :test_recipients => [] }
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def options
|
|
17
|
+
OptionParser.new do |opt|
|
|
18
|
+
opt.banner = %Q{\
|
|
19
|
+
Convert an html file to an email-compatible form.
|
|
20
|
+
|
|
21
|
+
Usage: #{File.basename $0} [options] [infile[:outfile], ...]
|
|
22
|
+
|
|
23
|
+
Options:
|
|
24
|
+
}.gsub(/^ +/,'')
|
|
25
|
+
|
|
26
|
+
opt.on('-l', '--layout FILE', 'Use FILE as a layout template') do |arg|
|
|
27
|
+
@options[:layout] = File.expand_path arg
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
types = Tilt.mappings.keys
|
|
31
|
+
opt.on('-t', '--default-type FORMAT',
|
|
32
|
+
'Fall back to FORMAT when template type cannot be inferred from',
|
|
33
|
+
"a file's extension, e.g. input from STDIN. " +
|
|
34
|
+
"Defaults to `#{@options[:default_type]}'") do |arg|
|
|
35
|
+
if types.include? arg
|
|
36
|
+
@options[:default_type] = arg
|
|
37
|
+
else
|
|
38
|
+
raise ArgumentError, "Default type must be one of: #{types.join ', '}"
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
opt.on('-e', '--email [ADDR,ADDR]', Array,
|
|
43
|
+
'Send rendered html to recipients; list can also be defined',
|
|
44
|
+
'within the template') do |arg|
|
|
45
|
+
@options[:email_test] = true
|
|
46
|
+
@options[:test_recipients] = arg || []
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
opt.on('--stdout',
|
|
50
|
+
'Write to STDOUT when an outfile is not explicitly specified') do
|
|
51
|
+
@options[:stdout] = true
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
opt.separator "\nSupported FORMATs:\n#{types.join ', '}"
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Command line interface
|
|
59
|
+
def run
|
|
60
|
+
options.parse! @args
|
|
61
|
+
messages = []
|
|
62
|
+
|
|
63
|
+
process(@args).each do |infile, outfile|
|
|
64
|
+
htmlemail = HtmlEmail.new infile, @options[:layout], @options
|
|
65
|
+
write (html = htmlemail.render), outfile
|
|
66
|
+
messages << html
|
|
67
|
+
@options[:test_recipients] += htmlemail.test_recipients
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
if @options[:email_test]
|
|
71
|
+
HtmlMailer.new(messages, @options[:test_recipients].uniq).html_send
|
|
72
|
+
end
|
|
73
|
+
ensure
|
|
74
|
+
FileUtils.rm_f(@tempfile) if @tempfile
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
private
|
|
78
|
+
|
|
79
|
+
def process(list)
|
|
80
|
+
# read from stdin if no file args
|
|
81
|
+
if list.empty?
|
|
82
|
+
# both Tilt and Premailer expect files as inputs; so we use a tempfile
|
|
83
|
+
@tempfile = Tempfile.new [self.class.to_s, '.' + @options[:default_type]]
|
|
84
|
+
@tempfile.write $stdin.read; @tempfile.rewind
|
|
85
|
+
[[@tempfile.path, $stdout]]
|
|
86
|
+
else
|
|
87
|
+
list.map { |a| a.split ':', 2 }.map do |i,o|
|
|
88
|
+
out = if o.nil? || o.empty?
|
|
89
|
+
if @options[:stdout]
|
|
90
|
+
$stdout
|
|
91
|
+
else
|
|
92
|
+
File.expand_path(i[/.html$/] ? i : i.chomp(File.extname i))
|
|
93
|
+
end
|
|
94
|
+
else
|
|
95
|
+
File.expand_path o
|
|
96
|
+
end
|
|
97
|
+
[File.expand_path(i), out]
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def write(string, dst)
|
|
103
|
+
if dst.kind_of? IO
|
|
104
|
+
dst.write string
|
|
105
|
+
else
|
|
106
|
+
warn "# Writing #{dst}"
|
|
107
|
+
File.open(dst, 'w') { |f| f.write string }
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: html2email
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
prerelease: false
|
|
5
|
+
segments:
|
|
6
|
+
- 0
|
|
7
|
+
- 1
|
|
8
|
+
- 2
|
|
9
|
+
version: 0.1.2
|
|
10
|
+
platform: ruby
|
|
11
|
+
authors:
|
|
12
|
+
- guns
|
|
13
|
+
autorequire:
|
|
14
|
+
bindir: bin
|
|
15
|
+
cert_chain: []
|
|
16
|
+
|
|
17
|
+
date: 2010-05-24 00:00:00 -05:00
|
|
18
|
+
default_executable:
|
|
19
|
+
dependencies:
|
|
20
|
+
- !ruby/object:Gem::Dependency
|
|
21
|
+
name: rack
|
|
22
|
+
prerelease: false
|
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
|
24
|
+
requirements:
|
|
25
|
+
- - ">="
|
|
26
|
+
- !ruby/object:Gem::Version
|
|
27
|
+
segments:
|
|
28
|
+
- 0
|
|
29
|
+
version: "0"
|
|
30
|
+
type: :runtime
|
|
31
|
+
version_requirements: *id001
|
|
32
|
+
- !ruby/object:Gem::Dependency
|
|
33
|
+
name: tilt
|
|
34
|
+
prerelease: false
|
|
35
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - ">="
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
segments:
|
|
40
|
+
- 0
|
|
41
|
+
version: "0"
|
|
42
|
+
type: :runtime
|
|
43
|
+
version_requirements: *id002
|
|
44
|
+
- !ruby/object:Gem::Dependency
|
|
45
|
+
name: hpricot
|
|
46
|
+
prerelease: false
|
|
47
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
|
48
|
+
requirements:
|
|
49
|
+
- - ">="
|
|
50
|
+
- !ruby/object:Gem::Version
|
|
51
|
+
segments:
|
|
52
|
+
- 0
|
|
53
|
+
- 6
|
|
54
|
+
version: "0.6"
|
|
55
|
+
type: :runtime
|
|
56
|
+
version_requirements: *id003
|
|
57
|
+
- !ruby/object:Gem::Dependency
|
|
58
|
+
name: css_parser
|
|
59
|
+
prerelease: false
|
|
60
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
|
61
|
+
requirements:
|
|
62
|
+
- - ">="
|
|
63
|
+
- !ruby/object:Gem::Version
|
|
64
|
+
segments:
|
|
65
|
+
- 0
|
|
66
|
+
- 9
|
|
67
|
+
- 1
|
|
68
|
+
version: 0.9.1
|
|
69
|
+
type: :runtime
|
|
70
|
+
version_requirements: *id004
|
|
71
|
+
- !ruby/object:Gem::Dependency
|
|
72
|
+
name: text-reform
|
|
73
|
+
prerelease: false
|
|
74
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
|
75
|
+
requirements:
|
|
76
|
+
- - ">="
|
|
77
|
+
- !ruby/object:Gem::Version
|
|
78
|
+
segments:
|
|
79
|
+
- 0
|
|
80
|
+
- 2
|
|
81
|
+
- 0
|
|
82
|
+
version: 0.2.0
|
|
83
|
+
type: :runtime
|
|
84
|
+
version_requirements: *id005
|
|
85
|
+
- !ruby/object:Gem::Dependency
|
|
86
|
+
name: htmlentities
|
|
87
|
+
prerelease: false
|
|
88
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
|
89
|
+
requirements:
|
|
90
|
+
- - ">="
|
|
91
|
+
- !ruby/object:Gem::Version
|
|
92
|
+
segments:
|
|
93
|
+
- 4
|
|
94
|
+
- 0
|
|
95
|
+
- 0
|
|
96
|
+
version: 4.0.0
|
|
97
|
+
type: :runtime
|
|
98
|
+
version_requirements: *id006
|
|
99
|
+
description: Convert ruby html templates to an email compatible form.
|
|
100
|
+
email: sung@metablu.com
|
|
101
|
+
executables:
|
|
102
|
+
- html2email
|
|
103
|
+
extensions: []
|
|
104
|
+
|
|
105
|
+
extra_rdoc_files: []
|
|
106
|
+
|
|
107
|
+
files:
|
|
108
|
+
- .gitignore
|
|
109
|
+
- LICENSE
|
|
110
|
+
- README.markdown
|
|
111
|
+
- Rakefile
|
|
112
|
+
- bin/html2email
|
|
113
|
+
- html2email.gemspec
|
|
114
|
+
- lib/html2email.rb
|
|
115
|
+
- lib/html2email/context.rb
|
|
116
|
+
- lib/html2email/html_email.rb
|
|
117
|
+
- lib/html2email/html_mailer.rb
|
|
118
|
+
- spec/html2email.spec.rb
|
|
119
|
+
- lib/html2email/vendor/premailer/.gitignore
|
|
120
|
+
- lib/html2email/vendor/premailer/CHANGELOG.rdoc
|
|
121
|
+
- lib/html2email/vendor/premailer/LICENSE.rdoc
|
|
122
|
+
- lib/html2email/vendor/premailer/README.rdoc
|
|
123
|
+
- lib/html2email/vendor/premailer/bin/premailer
|
|
124
|
+
- lib/html2email/vendor/premailer/bin/trollop.rb
|
|
125
|
+
- lib/html2email/vendor/premailer/init.rb
|
|
126
|
+
- lib/html2email/vendor/premailer/lib/premailer.rb
|
|
127
|
+
- lib/html2email/vendor/premailer/lib/premailer/html_to_plain_text.rb
|
|
128
|
+
- lib/html2email/vendor/premailer/lib/premailer/premailer.rb
|
|
129
|
+
- lib/html2email/vendor/premailer/misc/client_support.yaml
|
|
130
|
+
- lib/html2email/vendor/premailer/premailer.gemspec
|
|
131
|
+
- lib/html2email/vendor/premailer/rakefile.rb
|
|
132
|
+
- lib/html2email/vendor/premailer/tests/files/base.html
|
|
133
|
+
- lib/html2email/vendor/premailer/tests/files/contact_bg.png
|
|
134
|
+
- lib/html2email/vendor/premailer/tests/files/dialect.png
|
|
135
|
+
- lib/html2email/vendor/premailer/tests/files/dots_end.png
|
|
136
|
+
- lib/html2email/vendor/premailer/tests/files/dots_h.gif
|
|
137
|
+
- lib/html2email/vendor/premailer/tests/files/import.css
|
|
138
|
+
- lib/html2email/vendor/premailer/tests/files/inc/2009-placeholder.png
|
|
139
|
+
- lib/html2email/vendor/premailer/tests/files/noimport.css
|
|
140
|
+
- lib/html2email/vendor/premailer/tests/files/styles.css
|
|
141
|
+
- lib/html2email/vendor/premailer/tests/test_helper.rb
|
|
142
|
+
- lib/html2email/vendor/premailer/tests/test_html_to_plain_text.rb
|
|
143
|
+
- lib/html2email/vendor/premailer/tests/test_link_resolver.rb
|
|
144
|
+
- lib/html2email/vendor/premailer/tests/test_premailer.rb
|
|
145
|
+
has_rdoc: true
|
|
146
|
+
homepage: http://github.com/guns/html2email
|
|
147
|
+
licenses: []
|
|
148
|
+
|
|
149
|
+
post_install_message:
|
|
150
|
+
rdoc_options: []
|
|
151
|
+
|
|
152
|
+
require_paths:
|
|
153
|
+
- lib
|
|
154
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
155
|
+
requirements:
|
|
156
|
+
- - ">="
|
|
157
|
+
- !ruby/object:Gem::Version
|
|
158
|
+
segments:
|
|
159
|
+
- 0
|
|
160
|
+
version: "0"
|
|
161
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
162
|
+
requirements:
|
|
163
|
+
- - ">="
|
|
164
|
+
- !ruby/object:Gem::Version
|
|
165
|
+
segments:
|
|
166
|
+
- 0
|
|
167
|
+
version: "0"
|
|
168
|
+
requirements: []
|
|
169
|
+
|
|
170
|
+
rubyforge_project:
|
|
171
|
+
rubygems_version: 1.3.6
|
|
172
|
+
signing_key:
|
|
173
|
+
specification_version: 3
|
|
174
|
+
summary: "Html2Email: Tilt + Premailer + SMTP"
|
|
175
|
+
test_files: []
|
|
176
|
+
|