bootstrap-email 0.0.0.alpha.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/bootstrap-email.rb +13 -0
- data/lib/bootstrap-email/action_mailer.rb +20 -0
- data/lib/bootstrap-email/bootstrap_email.rb +75 -0
- data/lib/bootstrap-email/engine.rb +6 -0
- data/lib/bootstrap-email/version.rb +5 -0
- metadata +90 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 79e15e6409d62b631a967453b3cc832fcbedf62a
|
4
|
+
data.tar.gz: 3b1777952a01a26d3eb37a131bff5952f5d61ed3
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: fba52120dc88c83ce84f8c91913c4e73d5d71bd12ad9d1f1479a9509352c5e8c7c48a714c2ae65317632fb36aa85a6250e5637f1d9cb555e02d916b2298fe10f
|
7
|
+
data.tar.gz: f2143b72a89bb7e08d957a61a87b09cb4b3d97a59bebe99bdad3da6dead48bb865da09e133d5df8ed9bdf3c88bf3c55ec9b78bfdc75a553546859006d3bc8d3f
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
require 'erb'
|
3
|
+
require 'ostruct'
|
4
|
+
require 'active-mailer'
|
5
|
+
require 'premailer'
|
6
|
+
|
7
|
+
Premailer::Rails.config.merge!(adapter: :nokogiri)
|
8
|
+
|
9
|
+
|
10
|
+
require 'bootstrap-email/bootstrap-email'
|
11
|
+
require 'bootstrap-email/active-mailer'
|
12
|
+
require 'bootstrap-email/engine'
|
13
|
+
require 'bootstrap-email/version'
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class ActionMailer::Base
|
2
|
+
helper BootstrapEmailHelper
|
3
|
+
|
4
|
+
def bootstrap_mail *args
|
5
|
+
mail = mail(*args)
|
6
|
+
bootstrap = BootstrapEmail.new(mail)
|
7
|
+
bootstrap.compiled_html!
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module BootstrapEmailHelper
|
12
|
+
|
13
|
+
def bootstrap_email_head
|
14
|
+
<<-HEREDOC
|
15
|
+
<style>
|
16
|
+
#{File.open('../../core/sass/head.scss').read}
|
17
|
+
</style>
|
18
|
+
HEREDOC
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
class BootstrapEmail
|
2
|
+
|
3
|
+
def constructor mail
|
4
|
+
@mail = mail
|
5
|
+
end
|
6
|
+
|
7
|
+
def compiled_html!
|
8
|
+
doc = Nokogiri::HTML(@mail.body.raw_source)
|
9
|
+
doc.css('.btn').each do |node| # move all classes up and remove all classes from the element
|
10
|
+
node.replace(build_from_template('table-left', {classes: node['class'], contents: node.delete('class') && node.to_html}))
|
11
|
+
end
|
12
|
+
doc.css('.badge').each do |node| # move all classes up and remove all classes from the element
|
13
|
+
node.replace(build_from_template('table-left', {classes: node['class'], contents: node.delete('class') && node.to_html}))
|
14
|
+
end
|
15
|
+
doc.css('.alert').each do |node| # move all classes up and remove all classes from the element
|
16
|
+
node.replace(build_from_template('table', {classes: node['class'], contents: node.delete('class') && node.to_html}))
|
17
|
+
end
|
18
|
+
doc.css('.align-left').each do |node| # align table and move contents
|
19
|
+
node.replace(build_from_template('align-left', {contents: node.to_html}))
|
20
|
+
end
|
21
|
+
doc.css('.align-center').each do |node| # align table and move contents
|
22
|
+
node.replace(build_from_template('align-center', {contents: node.to_html}))
|
23
|
+
end
|
24
|
+
doc.css('.align-right').each do |node| # align table and move contents
|
25
|
+
node.replace(build_from_template('align-right', {contents: node.to_html}))
|
26
|
+
end
|
27
|
+
doc.css('.card').each do |node| # move all classes up and remove all classes from element
|
28
|
+
node.replace(build_from_template('table', {classes: node['class'], contents: node.delete('class') && node.to_html}))
|
29
|
+
end
|
30
|
+
doc.css('.card-body').each do |node| # move all classes up and remove all classes from element
|
31
|
+
node.replace(build_from_template('table', {classes: node['class'], contents: node.delete('class') && node.to_html}))
|
32
|
+
end
|
33
|
+
doc.css('hr').each do |node| # drop hr in place of current
|
34
|
+
node.replace(build_from_template('hr'))
|
35
|
+
end
|
36
|
+
doc.css('.container').each do |node|
|
37
|
+
node.replace(build_from_template('container', {classes: node['class'], contents: node.inner_html}))
|
38
|
+
end
|
39
|
+
doc.css('.container-fluid').each do |node|
|
40
|
+
node.replace(build_from_template('table', {classes: node['class'], contents: node.inner_html}))
|
41
|
+
end
|
42
|
+
doc.css('.row').each do |node|
|
43
|
+
node.replace(build_from_template('row', {classes: node['class'], contents: node.inner_html}))
|
44
|
+
end
|
45
|
+
doc.css('*[class^=col]').each do |node|
|
46
|
+
node.replace(build_from_template('col', {classes: node['class'], contents: node.inner_html}))
|
47
|
+
end
|
48
|
+
padding = %w( p- pt- pr- pb- pl- px- py- ).map{ |padding| "contains(@class, '#{padding}')" }.join(' or ')
|
49
|
+
doc.xpath("//*[#{padding}]").each do |node|
|
50
|
+
if node.name != 'table' # if it is already on a table, set the padding on the table, else wrap the content in a table
|
51
|
+
node.replace(build_from_template('table', {classes: node['class'], contents: node.delete('class') && node.to_html}))
|
52
|
+
end
|
53
|
+
end
|
54
|
+
margin = %w( m- mt- mr- mb- ml- mx- my- ).map{ |margin| "contains(@class, '#{margin}')" }.join(' or ')
|
55
|
+
doc.xpath("//*[#{margin}]").each do |node|
|
56
|
+
if node.name != 'div' # if it is already on a div, set the margin on the div, else wrap the content in a div
|
57
|
+
node.replace(build_from_template('div', {classes: node['class'].scan(/(m[trblxy]?-\d)/).join(' '), contents: node.delete('class') && node.to_html}))
|
58
|
+
end
|
59
|
+
end
|
60
|
+
doc.css('table').each do |node|
|
61
|
+
#border="0" cellpadding="0" cellspacing="0"
|
62
|
+
node['border'] = 0
|
63
|
+
node['cellpadding'] = 0
|
64
|
+
node['cellspacing'] = 0
|
65
|
+
end
|
66
|
+
@mail.body = doc.to_html
|
67
|
+
@mail
|
68
|
+
end
|
69
|
+
|
70
|
+
def build_from_template template, locals_hash = {}
|
71
|
+
namespace = OpenStruct.new(locals_hash)
|
72
|
+
template = File.open("../../core/templates/#{template}.html.erb").read
|
73
|
+
Nokogiri::HTML::DocumentFragment.parse(ERB.new(template).result(namespace.instance_eval { binding }))
|
74
|
+
end
|
75
|
+
end
|
metadata
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bootstrap-email
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0.alpha.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Stuart Yamartino
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-10-28 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: premailer-rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '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.9'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: nokogiri
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: actionmailer
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: Bootstrap 4 style sheet and compiler for responsive and consistent emails.
|
56
|
+
email: stuartyamartino@gmail.com
|
57
|
+
executables: []
|
58
|
+
extensions: []
|
59
|
+
extra_rdoc_files: []
|
60
|
+
files:
|
61
|
+
- lib/bootstrap-email.rb
|
62
|
+
- lib/bootstrap-email/action_mailer.rb
|
63
|
+
- lib/bootstrap-email/bootstrap_email.rb
|
64
|
+
- lib/bootstrap-email/engine.rb
|
65
|
+
- lib/bootstrap-email/version.rb
|
66
|
+
homepage: http://rubygems.org/gems/bootstrap-email
|
67
|
+
licenses:
|
68
|
+
- MIT
|
69
|
+
metadata: {}
|
70
|
+
post_install_message:
|
71
|
+
rdoc_options: []
|
72
|
+
require_paths:
|
73
|
+
- lib
|
74
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
75
|
+
requirements:
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">"
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: 1.3.1
|
84
|
+
requirements: []
|
85
|
+
rubyforge_project:
|
86
|
+
rubygems_version: 2.6.8
|
87
|
+
signing_key:
|
88
|
+
specification_version: 4
|
89
|
+
summary: Bootstrap 4 style sheet and compiler for responsive and consistent emails.
|
90
|
+
test_files: []
|