bootstrap-email 0.0.0.alpha.1
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 +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: []
|