bootstrap-email 1.1.3 → 1.1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/bin/bootstrap-email +2 -0
- data/lib/bootstrap-email/bootstrap_email_cli.rb +7 -5
- data/lib/bootstrap-email/compiler.rb +3 -0
- data/lib/bootstrap-email/config.rb +7 -5
- data/lib/bootstrap-email/converters/add_missing_meta_tags.rb +13 -8
- data/lib/bootstrap-email/converters/alert.rb +2 -0
- data/lib/bootstrap-email/converters/align.rb +8 -6
- data/lib/bootstrap-email/converters/badge.rb +2 -0
- data/lib/bootstrap-email/converters/base.rb +3 -0
- data/lib/bootstrap-email/converters/beautify_html.rb +3 -1
- data/lib/bootstrap-email/converters/block.rb +2 -0
- data/lib/bootstrap-email/converters/body.rb +2 -0
- data/lib/bootstrap-email/converters/button.rb +2 -0
- data/lib/bootstrap-email/converters/card.rb +2 -0
- data/lib/bootstrap-email/converters/color.rb +2 -0
- data/lib/bootstrap-email/converters/container.rb +2 -0
- data/lib/bootstrap-email/converters/ensure_doctype.rb +16 -0
- data/lib/bootstrap-email/converters/force_encoding.rb +2 -0
- data/lib/bootstrap-email/converters/grid.rb +3 -3
- data/lib/bootstrap-email/converters/head_style.rb +4 -3
- data/lib/bootstrap-email/converters/hr.rb +2 -0
- data/lib/bootstrap-email/converters/margin.rb +4 -6
- data/lib/bootstrap-email/converters/padding.rb +3 -1
- data/lib/bootstrap-email/converters/paragraph.rb +2 -0
- data/lib/bootstrap-email/converters/preview_text.rb +2 -0
- data/lib/bootstrap-email/converters/spacer.rb +2 -0
- data/lib/bootstrap-email/converters/spacing.rb +2 -0
- data/lib/bootstrap-email/converters/stack.rb +2 -0
- data/lib/bootstrap-email/converters/support_url_tokens.rb +7 -5
- data/lib/bootstrap-email/converters/table.rb +2 -0
- data/lib/bootstrap-email/converters/version_comment.rb +2 -0
- data/lib/bootstrap-email/erb.rb +2 -0
- data/lib/bootstrap-email/rails/action_mailer.rb +5 -3
- data/lib/bootstrap-email/rails/engine.rb +2 -0
- data/lib/bootstrap-email/sass_cache.rb +9 -8
- data/lib/bootstrap-email/setup.rb +3 -1
- data/lib/bootstrap-email/version.rb +2 -0
- data/lib/bootstrap-email.rb +3 -3
- metadata +18 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8874cd9676dffa70b594e1d0b19f94439a5b5a1d56d4c4625f70af5dfcbaf627
|
4
|
+
data.tar.gz: 314113fdcd77f3d7bf7ad4936dd710c804a89644997f4478dc7deb02455fef19
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d09179eaa28c1091c59449c2a22368e9c877c23a11cc8682f949d72f0207c0f081e7d32955c070dbcdb69902cf54bc262c9fedcd907901b329f20d0354624e13
|
7
|
+
data.tar.gz: bf27de1b4a6d6965583f8f4112c25fccf12c07ca10473a5eed7595dd11bdff34741e81039d76c1b23874aff702b76f02d6ee52edd47de8254774db2240d21709
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.1.
|
1
|
+
1.1.6
|
data/bin/bootstrap-email
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative '../bootstrap-email'
|
2
4
|
require 'optparse'
|
3
5
|
|
@@ -57,9 +59,9 @@ if input
|
|
57
59
|
elsif ARGV.any?
|
58
60
|
# Executed via command line or shell script
|
59
61
|
input = ARGV.shift
|
60
|
-
elsif
|
62
|
+
elsif !$stdin.tty?
|
61
63
|
# Called in piped command
|
62
|
-
input =
|
64
|
+
input = $stdin.read
|
63
65
|
options[:type] = :string
|
64
66
|
else
|
65
67
|
# Running just the blank command to compile all files in directory containing .html
|
@@ -74,16 +76,16 @@ if input
|
|
74
76
|
next unless File.file?(path)
|
75
77
|
|
76
78
|
puts "Compiling file #{path}"
|
77
|
-
compiled = BootstrapEmail::Compiler.new(path, type: :file, options: {config_path: options[:config]}).perform_full_compile
|
79
|
+
compiled = BootstrapEmail::Compiler.new(path, type: :file, options: { config_path: options[:config] }).perform_full_compile
|
78
80
|
destination = options[:destination].chomp('/*')
|
79
81
|
FileUtils.mkdir_p("#{Dir.pwd}/#{destination}")
|
80
82
|
File.write(File.expand_path("#{destination}/#{path.split('/').last}", Dir.pwd), compiled)
|
81
83
|
end
|
82
84
|
when :file
|
83
85
|
path = File.expand_path(input, Dir.pwd)
|
84
|
-
puts BootstrapEmail::Compiler.new(path, type: :file, options: {config_path: options[:config], sass_log_enabled: false}).perform_full_compile
|
86
|
+
puts BootstrapEmail::Compiler.new(path, type: :file, options: { config_path: options[:config], sass_log_enabled: false }).perform_full_compile
|
85
87
|
when :string
|
86
|
-
puts BootstrapEmail::Compiler.new(input, options: {config_path: options[:config], sass_log_enabled: false}).perform_full_compile
|
88
|
+
puts BootstrapEmail::Compiler.new(input, options: { config_path: options[:config], sass_log_enabled: false }).perform_full_compile
|
87
89
|
end
|
88
90
|
else
|
89
91
|
puts opts
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module BootstrapEmail
|
2
4
|
class Compiler
|
3
5
|
attr_accessor :type, :doc, :premailer
|
@@ -92,6 +94,7 @@ module BootstrapEmail
|
|
92
94
|
def finalize_document!
|
93
95
|
html = doc.to_html(encoding: 'US-ASCII')
|
94
96
|
BootstrapEmail::Converter::SupportUrlTokens.replace(html)
|
97
|
+
BootstrapEmail::Converter::EnsureDoctype.replace(html)
|
95
98
|
BootstrapEmail::Converter::ForceEncoding.replace(html)
|
96
99
|
BootstrapEmail::Converter::BeautifyHTML.replace(html)
|
97
100
|
case type
|
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module BootstrapEmail
|
2
4
|
class Config
|
3
|
-
attr_writer :sass_email_location # path to main sass file
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
attr_writer :sass_email_location, # path to main sass file
|
6
|
+
:sass_head_location, # path to head sass file
|
7
|
+
:sass_load_paths, # array of directories for loading sass imports
|
8
|
+
:sass_cache_location, # path to tmp folder for sass cache
|
9
|
+
:sass_log_enabled # turn on or off sass log when caching new sass
|
8
10
|
|
9
11
|
def load_options(options)
|
10
12
|
file = File.expand_path('bootstrap-email.config.rb', Dir.pwd)
|
@@ -1,19 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module BootstrapEmail
|
2
4
|
module Converter
|
3
5
|
class AddMissingMetaTags < Base
|
4
6
|
META_TAGS = [
|
5
|
-
{query: 'meta[http-equiv="Content-Type"]'
|
6
|
-
|
7
|
-
{query: 'meta[
|
8
|
-
|
9
|
-
{query: 'meta[name="
|
7
|
+
{ query: 'meta[http-equiv="Content-Type"]',
|
8
|
+
code: '<meta http-equiv="Content-Type" content="text/html; charset=utf-8">' },
|
9
|
+
{ query: 'meta[http-equiv="x-ua-compatible"]',
|
10
|
+
code: '<meta http-equiv="x-ua-compatible" content="ie=edge">' },
|
11
|
+
{ query: 'meta[name="x-apple-disable-message-reformatting"]',
|
12
|
+
code: '<meta name="x-apple-disable-message-reformatting">' },
|
13
|
+
{ query: 'meta[name="viewport"]',
|
14
|
+
code: '<meta name="viewport" content="width=device-width, initial-scale=1">' },
|
15
|
+
{ query: 'meta[name="format-detection"]',
|
16
|
+
code: '<meta name="format-detection" content="telephone=no, date=no, address=no, email=no">' }
|
10
17
|
].reverse.freeze
|
11
18
|
|
12
19
|
def build
|
13
20
|
META_TAGS.each do |tag_hash|
|
14
|
-
unless doc.at_css(tag_hash[:query])
|
15
|
-
doc.at_css('head').prepend_child(tag_hash[:code])
|
16
|
-
end
|
21
|
+
doc.at_css('head').prepend_child(tag_hash[:code]) unless doc.at_css(tag_hash[:query])
|
17
22
|
end
|
18
23
|
end
|
19
24
|
end
|
@@ -1,13 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module BootstrapEmail
|
2
4
|
module Converter
|
3
5
|
class Align < Base
|
4
6
|
def build
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
%w[left center right].each do |type|
|
8
|
+
full_type = "ax-#{type}"
|
9
|
+
each_node(".#{full_type}") do |node|
|
10
|
+
align_helper(node, full_type, type)
|
11
|
+
end
|
12
|
+
end
|
11
13
|
end
|
12
14
|
|
13
15
|
def align_helper(node, full_type, type)
|
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module BootstrapEmail
|
2
4
|
module Converter
|
3
5
|
class BeautifyHTML < Base
|
4
6
|
def self.replace(html)
|
5
7
|
# Pretty print format the HTML string and add a trailing newline
|
6
|
-
html.replace(HtmlBeautifier.beautify(html)
|
8
|
+
html.replace("#{HtmlBeautifier.beautify(html)}\n")
|
7
9
|
end
|
8
10
|
end
|
9
11
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BootstrapEmail
|
4
|
+
module Converter
|
5
|
+
class EnsureDoctype < Base
|
6
|
+
def self.replace(html)
|
7
|
+
# ensure the proper XHTML doctype which ensures best compatibility in email clients
|
8
|
+
# https://github.com/bootstrap-email/bootstrap-email/discussions/168
|
9
|
+
html.gsub!(
|
10
|
+
/<!DOCTYPE.*(\[[\s\S]*?\])?>/,
|
11
|
+
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'
|
12
|
+
)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -1,11 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module BootstrapEmail
|
2
4
|
module Converter
|
3
5
|
class Grid < Base
|
4
6
|
def build
|
5
7
|
each_node('.row') do |node|
|
6
|
-
if node.at("./*[contains(@class, 'col-lg-')]")
|
7
|
-
add_class(node, 'row-responsive')
|
8
|
-
end
|
8
|
+
add_class(node, 'row-responsive') if node.at("./*[contains(@class, 'col-lg-')]")
|
9
9
|
node.replace(template('div', classes: node['class'], contents: template('table-to-tr', contents: node.inner_html)))
|
10
10
|
end
|
11
11
|
each_node('*[class*=col]') do |node|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module BootstrapEmail
|
2
4
|
module Converter
|
3
5
|
class HeadStyle < Base
|
@@ -8,12 +10,11 @@ module BootstrapEmail
|
|
8
10
|
private
|
9
11
|
|
10
12
|
def bootstrap_email_head
|
11
|
-
|
13
|
+
<<-HTML
|
12
14
|
<style type="text/css">
|
13
15
|
#{purged_css_from_head}
|
14
16
|
</style>
|
15
|
-
|
16
|
-
html_string
|
17
|
+
HTML
|
17
18
|
end
|
18
19
|
|
19
20
|
def purged_css_from_head
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module BootstrapEmail
|
2
4
|
module Converter
|
3
5
|
class Margin < Base
|
@@ -7,13 +9,9 @@ module BootstrapEmail
|
|
7
9
|
bottom_class = node['class'][/m[by]{1}-(lg-)?(\d+)/]
|
8
10
|
node['class'] = node['class'].gsub(/(m[tby]{1}-(lg-)?\d+)/, '').strip
|
9
11
|
html = ''
|
10
|
-
if top_class
|
11
|
-
html += template('div', classes: "s-#{top_class.gsub(/m[ty]{1}-/, '')}", contents: nil)
|
12
|
-
end
|
12
|
+
html += template('div', classes: "s-#{top_class.gsub(/m[ty]{1}-/, '')}", contents: nil) if top_class
|
13
13
|
html += node.to_html
|
14
|
-
if bottom_class
|
15
|
-
html += template('div', classes: "s-#{bottom_class.gsub(/m[by]{1}-/, '')}", contents: nil)
|
16
|
-
end
|
14
|
+
html += template('div', classes: "s-#{bottom_class.gsub(/m[by]{1}-/, '')}", contents: nil) if bottom_class
|
17
15
|
node.replace(html)
|
18
16
|
end
|
19
17
|
end
|
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module BootstrapEmail
|
2
4
|
module Converter
|
3
5
|
class Padding < Base
|
4
6
|
def build
|
5
7
|
each_node("*[class^=p-], *[class^=pt-], *[class^=pr-], *[class^=pb-], *[class^=pl-], *[class^=px-], *[class^=py-], *[class*=' p-'], *[class*=' pt-'], *[class*=' pr-'], *[class*=' pb-'], *[class*=' pl-'], *[class*=' px-'], *[class*=' py-']") do |node|
|
6
|
-
next if [
|
8
|
+
next if %w[table td a].include?(node.name)
|
7
9
|
|
8
10
|
padding_regex = /(p[trblxy]?-(lg-)?\d+)/
|
9
11
|
classes = node['class'].gsub(padding_regex).to_a.join(' ')
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module BootstrapEmail
|
2
4
|
module Converter
|
3
5
|
class SupportUrlTokens < Base
|
@@ -5,11 +7,11 @@ module BootstrapEmail
|
|
5
7
|
CLOSE_BRACKETS = CGI.escape('}}').freeze
|
6
8
|
|
7
9
|
def self.replace(html)
|
8
|
-
regex = /((href|src)=(
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
regex = /((href|src)=("|').*?)((#{Regexp.quote(OPEN_BRACKETS)}).*?(#{Regexp.quote(CLOSE_BRACKETS)}))(.*?("|'))/
|
11
|
+
return unless regex.match?(html)
|
12
|
+
|
13
|
+
html.gsub!(regex) do |_match|
|
14
|
+
"#{Regexp.last_match(1)}#{CGI.unescape(Regexp.last_match(4))}#{Regexp.last_match(7)}"
|
13
15
|
end
|
14
16
|
end
|
15
17
|
end
|
data/lib/bootstrap-email/erb.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
ActiveSupport.on_load(:action_mailer, { yield: true }) do |action_mailer|
|
2
4
|
action_mailer.class_eval do # To support Rails less than 6
|
3
5
|
# sit in the middle and compile the html
|
4
6
|
def bootstrap_mail(*args, &block)
|
@@ -10,7 +12,7 @@ ActiveSupport.on_load(:action_mailer, {yield: true}) do |action_mailer|
|
|
10
12
|
end
|
11
13
|
mail_message
|
12
14
|
end
|
13
|
-
|
14
|
-
|
15
|
+
alias_method :bootstrap_email, :bootstrap_mail
|
16
|
+
alias_method :make_bootstrap_mail, :bootstrap_mail
|
15
17
|
end
|
16
18
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module BootstrapEmail
|
2
4
|
class SassCache
|
3
5
|
SASS_DIR = File.expand_path('../../core', __dir__)
|
@@ -22,9 +24,7 @@ module BootstrapEmail
|
|
22
24
|
|
23
25
|
def compile
|
24
26
|
cache_path = "#{cache_dir}/#{checksum}/#{type}.css"
|
25
|
-
unless cached?(cache_path)
|
26
|
-
compile_and_cache_scss(cache_path)
|
27
|
-
end
|
27
|
+
compile_and_cache_scss(cache_path) unless cached?(cache_path)
|
28
28
|
File.read(cache_path)
|
29
29
|
end
|
30
30
|
|
@@ -41,9 +41,12 @@ module BootstrapEmail
|
|
41
41
|
|
42
42
|
def checksum_files
|
43
43
|
checksums = config_file.nil? ? [] : [Digest::SHA1.hexdigest(config_file)]
|
44
|
-
|
45
|
-
|
44
|
+
BootstrapEmail.config.sass_load_paths.each do |load_path|
|
45
|
+
Dir.glob(File.join(load_path, '**', '*.scss'), base: __dir__).each do |path|
|
46
|
+
checksums << Digest::SHA1.file(File.expand_path(path, __dir__)).hexdigest
|
47
|
+
end
|
46
48
|
end
|
49
|
+
|
47
50
|
Digest::SHA1.hexdigest(checksums.join)
|
48
51
|
end
|
49
52
|
|
@@ -56,9 +59,7 @@ module BootstrapEmail
|
|
56
59
|
css = SassC::Engine.new(file, style: style).render
|
57
60
|
FileUtils.mkdir_p("#{cache_dir}/#{checksum}") unless File.directory?("#{cache_dir}/#{checksum}")
|
58
61
|
File.write(cache_path, css)
|
59
|
-
if BootstrapEmail.config.sass_log_enabled?
|
60
|
-
puts "New css file cached for #{type}"
|
61
|
-
end
|
62
|
+
puts "New css file cached for #{type}" if BootstrapEmail.config.sass_log_enabled?
|
62
63
|
end
|
63
64
|
end
|
64
65
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module BootstrapEmail
|
2
4
|
class << self
|
3
5
|
def config
|
@@ -11,7 +13,7 @@ module BootstrapEmail
|
|
11
13
|
@config
|
12
14
|
end
|
13
15
|
|
14
|
-
def configure
|
16
|
+
def configure
|
15
17
|
@config ||= BootstrapEmail::Config.new
|
16
18
|
yield @config
|
17
19
|
end
|
data/lib/bootstrap-email.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'nokogiri'
|
2
4
|
require 'erb'
|
3
5
|
require 'ostruct'
|
@@ -12,9 +14,7 @@ begin
|
|
12
14
|
require 'rails'
|
13
15
|
rescue LoadError; end
|
14
16
|
|
15
|
-
if defined?(Rails)
|
16
|
-
require 'action_mailer'
|
17
|
-
end
|
17
|
+
require 'action_mailer' if defined?(Rails)
|
18
18
|
|
19
19
|
require_relative 'bootstrap-email/config'
|
20
20
|
require_relative 'bootstrap-email/setup'
|
metadata
CHANGED
@@ -1,71 +1,71 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bootstrap-email
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stuart Yamartino
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-05-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: htmlbeautifier
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1.
|
19
|
+
version: '1.3'
|
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.
|
26
|
+
version: '1.3'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: nokogiri
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '1.
|
33
|
+
version: '1.6'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '1.
|
40
|
+
version: '1.6'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: premailer
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '1.7'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '1.7'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: sassc
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '1
|
61
|
+
version: '2.1'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '1
|
68
|
+
version: '2.1'
|
69
69
|
description:
|
70
70
|
email: stu@stuyam.com
|
71
71
|
executables:
|
@@ -131,6 +131,7 @@ files:
|
|
131
131
|
- lib/bootstrap-email/converters/card.rb
|
132
132
|
- lib/bootstrap-email/converters/color.rb
|
133
133
|
- lib/bootstrap-email/converters/container.rb
|
134
|
+
- lib/bootstrap-email/converters/ensure_doctype.rb
|
134
135
|
- lib/bootstrap-email/converters/force_encoding.rb
|
135
136
|
- lib/bootstrap-email/converters/grid.rb
|
136
137
|
- lib/bootstrap-email/converters/head_style.rb
|
@@ -154,7 +155,8 @@ files:
|
|
154
155
|
homepage: https://bootstrapemail.com
|
155
156
|
licenses:
|
156
157
|
- MIT
|
157
|
-
metadata:
|
158
|
+
metadata:
|
159
|
+
rubygems_mfa_required: 'true'
|
158
160
|
post_install_message:
|
159
161
|
rdoc_options: []
|
160
162
|
require_paths:
|
@@ -170,7 +172,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
170
172
|
- !ruby/object:Gem::Version
|
171
173
|
version: '0'
|
172
174
|
requirements: []
|
173
|
-
rubygems_version: 3.0.3
|
175
|
+
rubygems_version: 3.0.3.1
|
174
176
|
signing_key:
|
175
177
|
specification_version: 4
|
176
178
|
summary: 'Bootstrap 5+ stylesheet, compiler, and inliner for responsive and consistent
|