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 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
@@ -0,0 +1,6 @@
1
+ module BootstrapEmail
2
+ module Rails
3
+ class Engine < ::Rails::Engine
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ module BootstrapEmail
2
+ module Rails
3
+ VERSION = '0.0.0.alpha.1'
4
+ end
5
+ 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: []