inky-rb 1.3.6.1 → 1.3.6.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.
- checksums.yaml +4 -4
- data/.rubocop.yml +150 -0
- data/Gemfile.lock +8 -2
- data/inky.gemspec +1 -1
- data/lib/component_factory.rb +55 -70
- data/lib/generators/inky/install_generator.rb +3 -3
- data/lib/inky.rb +16 -19
- data/lib/inky/rails/engine.rb +1 -1
- data/lib/inky/rails/template_handler.rb +8 -6
- data/lib/inky/rails/version.rb +1 -1
- data/spec/components_spec.rb +16 -16
- data/spec/grid_spec.rb +48 -3
- data/spec/spec_helper.rb +2 -3
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a70d84a75f2e9381d149d54dfb5fe9e965ad0dcb
|
4
|
+
data.tar.gz: dfb5d7fa5a16a9a332f6f0dcd31652b445a7df69
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 53b0a6662556687a5d52d498fe47963cf7e2f53cbdc3d60e54f48a4dfbff95c55eb615401827f21f5cfd37d5f8c8cad3a710d45d218ba05eb012d56394e1d70a
|
7
|
+
data.tar.gz: c2729bf8cddad5ed77eda40b3fd9d866b6bce67e6ef4480b0b5ddf9955758ebb58a9eb451242e9f87091b67b74ad834f805aa6145e1a3c1e5a7e0d82daf61491
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,150 @@
|
|
1
|
+
# Relaxed.Ruby.Style
|
2
|
+
|
3
|
+
Style/Alias:
|
4
|
+
Enabled: false
|
5
|
+
StyleGuide: http://relaxed.ruby.style/#stylealias
|
6
|
+
|
7
|
+
Style/BeginBlock:
|
8
|
+
Enabled: false
|
9
|
+
StyleGuide: http://relaxed.ruby.style/#stylebeginblock
|
10
|
+
|
11
|
+
Style/BlockDelimiters:
|
12
|
+
Enabled: false
|
13
|
+
StyleGuide: http://relaxed.ruby.style/#styleblockdelimiters
|
14
|
+
|
15
|
+
Style/Documentation:
|
16
|
+
Enabled: false
|
17
|
+
StyleGuide: http://relaxed.ruby.style/#styledocumentation
|
18
|
+
|
19
|
+
Style/DotPosition:
|
20
|
+
Enabled: false
|
21
|
+
StyleGuide: http://relaxed.ruby.style/#styledotposition
|
22
|
+
|
23
|
+
Style/DoubleNegation:
|
24
|
+
Enabled: false
|
25
|
+
StyleGuide: http://relaxed.ruby.style/#styledoublenegation
|
26
|
+
|
27
|
+
Style/EndBlock:
|
28
|
+
Enabled: false
|
29
|
+
StyleGuide: http://relaxed.ruby.style/#styleendblock
|
30
|
+
|
31
|
+
Style/FormatString:
|
32
|
+
Enabled: false
|
33
|
+
StyleGuide: http://relaxed.ruby.style/#styleformatstring
|
34
|
+
|
35
|
+
Style/IfUnlessModifier:
|
36
|
+
Enabled: false
|
37
|
+
StyleGuide: http://relaxed.ruby.style/#styleifunlessmodifier
|
38
|
+
|
39
|
+
Style/Lambda:
|
40
|
+
Enabled: false
|
41
|
+
StyleGuide: http://relaxed.ruby.style/#stylelambda
|
42
|
+
|
43
|
+
Style/ModuleFunction:
|
44
|
+
Enabled: false
|
45
|
+
StyleGuide: http://relaxed.ruby.style/#stylemodulefunction
|
46
|
+
|
47
|
+
Style/MultilineBlockChain:
|
48
|
+
Enabled: false
|
49
|
+
StyleGuide: http://relaxed.ruby.style/#stylemultilineblockchain
|
50
|
+
|
51
|
+
Style/NegatedIf:
|
52
|
+
Enabled: false
|
53
|
+
StyleGuide: http://relaxed.ruby.style/#stylenegatedif
|
54
|
+
|
55
|
+
Style/NegatedWhile:
|
56
|
+
Enabled: false
|
57
|
+
StyleGuide: http://relaxed.ruby.style/#stylenegatedwhile
|
58
|
+
|
59
|
+
Style/ParallelAssignment:
|
60
|
+
Enabled: false
|
61
|
+
StyleGuide: http://relaxed.ruby.style/#styleparallelassignment
|
62
|
+
|
63
|
+
Style/PercentLiteralDelimiters:
|
64
|
+
Enabled: false
|
65
|
+
StyleGuide: http://relaxed.ruby.style/#stylepercentliteraldelimiters
|
66
|
+
|
67
|
+
Style/PerlBackrefs:
|
68
|
+
Enabled: false
|
69
|
+
StyleGuide: http://relaxed.ruby.style/#styleperlbackrefs
|
70
|
+
|
71
|
+
Style/Semicolon:
|
72
|
+
Enabled: false
|
73
|
+
StyleGuide: http://relaxed.ruby.style/#stylesemicolon
|
74
|
+
|
75
|
+
Style/SignalException:
|
76
|
+
Enabled: false
|
77
|
+
StyleGuide: http://relaxed.ruby.style/#stylesignalexception
|
78
|
+
|
79
|
+
Style/SingleLineBlockParams:
|
80
|
+
Enabled: false
|
81
|
+
StyleGuide: http://relaxed.ruby.style/#stylesinglelineblockparams
|
82
|
+
|
83
|
+
Style/SingleLineMethods:
|
84
|
+
Enabled: false
|
85
|
+
StyleGuide: http://relaxed.ruby.style/#stylesinglelinemethods
|
86
|
+
|
87
|
+
Style/SpaceBeforeBlockBraces:
|
88
|
+
Enabled: false
|
89
|
+
StyleGuide: http://relaxed.ruby.style/#stylespacebeforeblockbraces
|
90
|
+
|
91
|
+
Style/SpaceInsideParens:
|
92
|
+
Enabled: false
|
93
|
+
StyleGuide: http://relaxed.ruby.style/#stylespaceinsideparens
|
94
|
+
|
95
|
+
Style/SpecialGlobalVars:
|
96
|
+
Enabled: false
|
97
|
+
StyleGuide: http://relaxed.ruby.style/#stylespecialglobalvars
|
98
|
+
|
99
|
+
Style/StringLiterals:
|
100
|
+
Enabled: false
|
101
|
+
StyleGuide: http://relaxed.ruby.style/#stylestringliterals
|
102
|
+
|
103
|
+
Style/TrailingCommaInLiteral:
|
104
|
+
Enabled: false
|
105
|
+
StyleGuide: http://relaxed.ruby.style/#styletrailingcommainliteral
|
106
|
+
|
107
|
+
Style/WhileUntilModifier:
|
108
|
+
Enabled: false
|
109
|
+
StyleGuide: http://relaxed.ruby.style/#stylewhileuntilmodifier
|
110
|
+
|
111
|
+
Lint/AmbiguousRegexpLiteral:
|
112
|
+
Enabled: false
|
113
|
+
StyleGuide: http://relaxed.ruby.style/#lintambiguousregexpliteral
|
114
|
+
|
115
|
+
Lint/AssignmentInCondition:
|
116
|
+
Enabled: false
|
117
|
+
StyleGuide: http://relaxed.ruby.style/#lintassignmentincondition
|
118
|
+
|
119
|
+
Metrics/AbcSize:
|
120
|
+
Enabled: false
|
121
|
+
|
122
|
+
Metrics/BlockNesting:
|
123
|
+
Enabled: false
|
124
|
+
|
125
|
+
Metrics/ClassLength:
|
126
|
+
Enabled: false
|
127
|
+
|
128
|
+
Metrics/ModuleLength:
|
129
|
+
Enabled: false
|
130
|
+
|
131
|
+
Metrics/CyclomaticComplexity:
|
132
|
+
Enabled: false
|
133
|
+
|
134
|
+
Metrics/LineLength:
|
135
|
+
Enabled: false
|
136
|
+
|
137
|
+
Metrics/MethodLength:
|
138
|
+
Enabled: false
|
139
|
+
|
140
|
+
Metrics/ParameterLists:
|
141
|
+
Enabled: false
|
142
|
+
|
143
|
+
Metrics/PerceivedComplexity:
|
144
|
+
Enabled: false
|
145
|
+
|
146
|
+
# inky-rb gem specifics
|
147
|
+
Lint/HandleExceptions:
|
148
|
+
Exclude:
|
149
|
+
- 'Rakefile'
|
150
|
+
- 'lib/inky.rb'
|
data/Gemfile.lock
CHANGED
@@ -1,14 +1,20 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
inky-rb (1.3.6.
|
4
|
+
inky-rb (1.3.6.2)
|
5
5
|
foundation_emails (~> 2)
|
6
|
+
nokogiri
|
6
7
|
|
7
8
|
GEM
|
8
9
|
remote: https://rubygems.org/
|
9
10
|
specs:
|
10
11
|
diff-lcs (1.2.5)
|
11
12
|
foundation_emails (2.2.0.0)
|
13
|
+
mini_portile2 (2.1.0)
|
14
|
+
nokogiri (1.6.8)
|
15
|
+
mini_portile2 (~> 2.1.0)
|
16
|
+
pkg-config (~> 1.1.7)
|
17
|
+
pkg-config (1.1.7)
|
12
18
|
rake (11.2.2)
|
13
19
|
rspec-core (3.5.0)
|
14
20
|
rspec-support (~> 3.5.0)
|
@@ -28,4 +34,4 @@ DEPENDENCIES
|
|
28
34
|
rspec-expectations
|
29
35
|
|
30
36
|
BUNDLED WITH
|
31
|
-
1.
|
37
|
+
1.12.5
|
data/inky.gemspec
CHANGED
@@ -5,7 +5,6 @@ require 'inky/rails/version'
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = 'inky-rb'
|
7
7
|
s.version = Inky::Rails::VERSION
|
8
|
-
s.date = '2016-02-12'
|
9
8
|
s.summary = 'Inky is an HTML-based templating language that converts simple HTML into complex, responsive email-ready HTML. Designed for Foundation for Emails, a responsive email framework from ZURB. '
|
10
9
|
s.description = 'Inky is an HTML-based templating language that converts simple HTML into complex, responsive email-ready HTML. Designed for Foundation for Emails, a responsive email framework from ZURB. '
|
11
10
|
s.authors = ["ZURB"]
|
@@ -16,6 +15,7 @@ Gem::Specification.new do |s|
|
|
16
15
|
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
17
16
|
|
18
17
|
s.add_dependency "foundation_emails", "~> 2"
|
18
|
+
s.add_dependency "nokogiri"
|
19
19
|
s.add_development_dependency "bundler", "~> 1.6"
|
20
20
|
s.add_development_dependency "rake"
|
21
21
|
end
|
data/lib/component_factory.rb
CHANGED
@@ -2,151 +2,136 @@ module ComponentFactory
|
|
2
2
|
def component_factory(elem)
|
3
3
|
inner = elem.children.map(&:to_s).join
|
4
4
|
# TODO: Handle changed names
|
5
|
-
transform_method = :"_transform_#{
|
6
|
-
|
7
|
-
|
8
|
-
else
|
9
|
-
nil
|
10
|
-
end
|
5
|
+
transform_method = :"_transform_#{component_lookup[elem.name]}"
|
6
|
+
return unless respond_to?(transform_method)
|
7
|
+
Nokogiri::XML(send(transform_method, elem, inner)).root
|
11
8
|
end
|
12
9
|
|
10
|
+
tags = %w[class id href size large no-expander small target]
|
11
|
+
tags = tags.to_set if tags.respond_to? :to_set
|
12
|
+
IGNORED_ON_PASSTHROUGH = tags.freeze
|
13
|
+
|
13
14
|
def _pass_through_attributes(elem)
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
''
|
18
|
-
else
|
19
|
-
"#{name}=\"#{value}\""
|
20
|
-
end
|
21
|
-
end.join(' ')
|
15
|
+
elem.attributes.reject { |e| IGNORED_ON_PASSTHROUGH.include?(e.downcase) }.map do |name, value|
|
16
|
+
%{#{name}="#{value}" }
|
17
|
+
end.join
|
22
18
|
end
|
23
19
|
|
24
20
|
def _has_class(elem, klass)
|
25
|
-
|
21
|
+
(elem.attr('class') || '').include?(klass)
|
26
22
|
end
|
27
23
|
|
28
24
|
def _class_array(elem, defaults = [])
|
29
|
-
|
25
|
+
classes = elem['class']
|
26
|
+
defaults.concat(classes.split(' ')) if classes
|
27
|
+
defaults
|
30
28
|
end
|
31
29
|
|
32
30
|
def _target_attribute(elem)
|
33
|
-
elem.attributes['target'] ?
|
31
|
+
elem.attributes['target'] ? %{ target="#{elem.attributes['target']}"} : ''
|
34
32
|
end
|
35
33
|
|
36
34
|
def _transform_button(component, inner)
|
37
35
|
expand = _has_class(component, 'expand')
|
38
|
-
if component.
|
36
|
+
if component.attr('href')
|
39
37
|
target = _target_attribute(component)
|
40
|
-
if expand
|
41
|
-
|
42
|
-
else
|
43
|
-
inner = "<a href=\"#{component.attributes['href']}\"#{target}>#{inner}</a>"
|
44
|
-
end
|
38
|
+
extra = ' align="center" class="float-center"' if expand
|
39
|
+
inner = %{<a href="#{component.attr('href')}"#{target}#{extra}>#{inner}</a>}
|
45
40
|
end
|
46
41
|
inner = "<center>#{inner}</center>" if expand
|
47
42
|
|
48
43
|
classes = _class_array(component, ['button'])
|
49
|
-
if expand
|
50
|
-
|
51
|
-
else
|
52
|
-
return "<table class=\"#{classes.join(' ')}\"><tr><td><table><tr><td>#{inner}</td></tr></table></td></tr></table>"
|
53
|
-
end
|
44
|
+
expander = '<td class="expander"></td>' if expand
|
45
|
+
%{<table class="#{classes.join(' ')}"><tr><td><table><tr><td>#{inner}</td></tr></table></td>#{expander}</tr></table>}
|
54
46
|
end
|
55
47
|
|
56
48
|
def _transform_menu(component, inner)
|
57
49
|
classes = _class_array(component, ['menu'])
|
58
|
-
|
50
|
+
%{<table class="#{classes.join(' ')}"><tr><td><table><tr>#{inner}</tr></table></td></tr></table>}
|
59
51
|
end
|
60
52
|
|
61
53
|
def _transform_menu_item(component, inner)
|
62
54
|
target = _target_attribute(component)
|
63
|
-
|
55
|
+
%{<th class="menu-item"><a href="#{component.attr('href')}"#{target}>#{inner}</a></th>}
|
64
56
|
end
|
65
57
|
|
66
58
|
def _transform_container(component, inner)
|
67
59
|
classes = _class_array(component, ['container'])
|
68
|
-
|
60
|
+
%{<table class="#{classes.join(' ')}"><tbody><tr><td>#{inner}</td></tr></tbody></table>}
|
69
61
|
end
|
70
62
|
|
71
63
|
def _transform_row(component, inner)
|
72
64
|
classes = _class_array(component, ['row'])
|
73
65
|
attrs = _pass_through_attributes(component)
|
74
|
-
|
66
|
+
%{<table #{attrs}class="#{classes.join(' ')}"><tbody><tr>#{inner}</tr></tbody></table>}
|
75
67
|
end
|
76
68
|
|
77
69
|
# in inky.js this is factored out into makeClumn. TBD if we need that here.
|
78
70
|
def _transform_columns(component, inner)
|
79
|
-
|
80
71
|
col_count = component.parent.elements.size
|
81
|
-
small_size = component.attributes['small'] || self.column_count
|
82
|
-
large_size = component.attributes['large'] || component.attributes['small'] || (self.column_count / col_count).to_i
|
83
72
|
|
84
|
-
|
73
|
+
small_val = component.attr('small')
|
74
|
+
large_val = component.attr('large')
|
75
|
+
|
76
|
+
small_size = small_val || column_count
|
77
|
+
large_size = large_val || small_val || (column_count / col_count).to_i
|
85
78
|
|
79
|
+
classes = _class_array(component, ["small-#{small_size}", "large-#{large_size}", "columns"])
|
86
80
|
|
87
81
|
classes.push('first') unless component.previous_element
|
88
82
|
classes.push('last') unless component.next_element
|
89
83
|
|
90
|
-
subrows = component.elements.
|
91
|
-
expander =
|
92
|
-
|
93
|
-
|
94
|
-
end
|
95
|
-
"<th class=\"#{classes.join(' ')}\"><table><tr><th>#{inner}</th>#{expander}</tr></table></th>"
|
84
|
+
subrows = component.elements.css(".row").to_a.concat(component.elements.css("row").to_a)
|
85
|
+
expander = %{<th class="expander"></th>} if large_size.to_i == column_count && subrows.empty?
|
86
|
+
|
87
|
+
%{<th class="#{classes.join(' ')}" #{_pass_through_attributes(component)}><table><tr><th>#{inner}</th>#{expander}</tr></table></th>}
|
96
88
|
end
|
97
89
|
|
98
90
|
def _transform_block_grid(component, inner)
|
99
|
-
classes = _class_array(component, ['block-grid', "up-#{component.
|
100
|
-
|
91
|
+
classes = _class_array(component, ['block-grid', "up-#{component.attr('up')}"])
|
92
|
+
%{<table class="#{classes.join(' ')}"><tr>#{inner}</tr></table>}
|
101
93
|
end
|
102
94
|
|
103
|
-
def _transform_center(component,
|
95
|
+
def _transform_center(component, _inner)
|
104
96
|
# NOTE: Using children instead of elements because elements.to_a
|
105
97
|
# sometimes appears to miss elements that show up in size
|
106
|
-
component.elements.
|
107
|
-
child
|
98
|
+
component.elements.each do |child|
|
99
|
+
child['align'] = 'center'
|
108
100
|
child_classes = _class_array(child, ['float-center'])
|
109
|
-
child
|
110
|
-
items = component.elements.
|
101
|
+
child['class'] = child_classes.join(' ')
|
102
|
+
items = component.elements.css(".menu-item").to_a.concat(component.elements.css("item").to_a)
|
111
103
|
items.each do |item|
|
112
104
|
item_classes = _class_array(item, ['float-center'])
|
113
|
-
item
|
105
|
+
item['class'] = item_classes.join(' ')
|
114
106
|
end
|
115
107
|
end
|
116
|
-
|
108
|
+
component.to_s
|
117
109
|
end
|
118
110
|
|
119
111
|
def _transform_callout(component, inner)
|
120
112
|
classes = _class_array(component, ['callout-inner'])
|
121
|
-
|
113
|
+
%{<table class="callout"><tr><th class="#{classes.join(' ')}">#{inner}</th><th class="expander"></th></tr></table>}
|
122
114
|
end
|
123
115
|
|
124
|
-
def _transform_spacer(component,
|
116
|
+
def _transform_spacer(component, _inner)
|
125
117
|
classes = _class_array(component, ['spacer'])
|
126
|
-
size =
|
127
|
-
|
128
|
-
|
118
|
+
build_table = ->(size, extra) { %{<table class="#{classes.join(' ')} #{extra}"><tbody><tr><td height="#{size}px" style="font-size:#{size}px;line-height:#{size}px;"> </td></tr></tbody></table>} }
|
119
|
+
size = component.attr('size')
|
120
|
+
size_sm = component.attr('size-sm')
|
121
|
+
size_lg = component.attr('size-lg')
|
129
122
|
if size_sm || size_lg
|
130
123
|
html = ''
|
131
|
-
if size_sm
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
html += "<table class=\"#{classes.join(' ')} show-for-large\"><tbody><tr><td height=\"#{size_lg}px\" style=\"font-size:#{size_lg}px;line-height:#{size_lg}px;\"> </td></tr></tbody></table>"
|
136
|
-
end
|
137
|
-
if size_sm && size_lg
|
138
|
-
# REXML doesn't like replacing a single element with a double
|
139
|
-
html = "<span>#{html}</span>"
|
140
|
-
end
|
141
|
-
return html
|
124
|
+
html << build_table[size_sm, 'hide-for-large'] if size_sm
|
125
|
+
html << build_table[size_lg, 'show-for-large'] if size_lg
|
126
|
+
html = "<span>#{html}</span>" if size_sm && size_lg
|
127
|
+
html
|
142
128
|
else
|
143
|
-
size
|
144
|
-
return "<table class=\"#{classes.join(' ')}\"><tbody><tr><td height=\"#{size}px\" style=\"font-size:#{size}px;line-height:#{size}px;\"> </td></tr></tbody></table>"
|
129
|
+
build_table[size || 16, nil]
|
145
130
|
end
|
146
131
|
end
|
147
132
|
|
148
133
|
def _transform_wrapper(component, inner)
|
149
134
|
classes = _class_array(component, ['wrapper'])
|
150
|
-
|
135
|
+
%{<table class="#{classes.join(' ')}" align="center"><tr><td class="wrapper-inner">#{inner}</td></tr></table>}
|
151
136
|
end
|
152
137
|
end
|
@@ -5,14 +5,14 @@ module Inky
|
|
5
5
|
class InstallGenerator < ::Rails::Generators::Base
|
6
6
|
desc 'Install Foundation for Emails'
|
7
7
|
source_root File.join(File.dirname(__FILE__), 'templates')
|
8
|
-
argument :layout_name, :
|
8
|
+
argument :layout_name, type: :string, default: 'mailer', banner: 'layout_name'
|
9
9
|
|
10
10
|
def preserve_original_mailer_layout
|
11
|
-
return
|
11
|
+
return unless layout_name == 'mailer'
|
12
12
|
|
13
13
|
original_mailer = File.join(layouts_base_dir, 'mailer.html.erb')
|
14
14
|
rename_filename = File.join(layouts_base_dir, "old_mailer_#{Time.now.to_i}.html.erb")
|
15
|
-
File.rename(original_mailer, rename_filename) if File.
|
15
|
+
File.rename(original_mailer, rename_filename) if File.exist? original_mailer
|
16
16
|
end
|
17
17
|
|
18
18
|
def create_mailer_stylesheet
|
data/lib/inky.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Inky
|
2
2
|
class Core
|
3
|
-
require '
|
3
|
+
require 'nokogiri'
|
4
4
|
require 'component_factory'
|
5
5
|
attr_accessor :components, :column_count, :component_lookup, :component_tags
|
6
6
|
|
@@ -21,27 +21,22 @@ module Inky
|
|
21
21
|
menu_item: 'item'
|
22
22
|
}.merge(options[:components] || {})
|
23
23
|
|
24
|
-
self.component_lookup =
|
24
|
+
self.component_lookup = components.invert
|
25
25
|
|
26
26
|
self.column_count = options[:column_count] || 12
|
27
27
|
|
28
|
-
self.component_tags =
|
28
|
+
self.component_tags = components.values
|
29
29
|
end
|
30
30
|
|
31
|
-
|
32
31
|
def release_the_kraken(xml_string)
|
33
32
|
xml_string = xml_string.gsub(/doctype/i, 'DOCTYPE')
|
34
33
|
raws, str = Inky::Core.extract_raws(xml_string)
|
35
|
-
xml_doc =
|
36
|
-
if
|
37
|
-
|
38
|
-
end
|
39
|
-
str = xml_doc.to_s
|
40
|
-
return Inky::Core.re_inject_raws(str, raws)
|
34
|
+
xml_doc = Nokogiri::XML(str)
|
35
|
+
transform_doc(xml_doc.root) if components_exist?(xml_doc)
|
36
|
+
Inky::Core.re_inject_raws(xml_doc.to_s, raws)
|
41
37
|
end
|
42
38
|
|
43
|
-
|
44
|
-
def components_exist?(xml_doc)
|
39
|
+
def components_exist?(_xml_doc)
|
45
40
|
true
|
46
41
|
end
|
47
42
|
|
@@ -50,8 +45,8 @@ module Inky
|
|
50
45
|
elem.children.each do |child|
|
51
46
|
transform_doc(child)
|
52
47
|
end
|
53
|
-
component =
|
54
|
-
elem.
|
48
|
+
component = component_factory(elem)
|
49
|
+
elem.replace(component) if component
|
55
50
|
end
|
56
51
|
elem
|
57
52
|
end
|
@@ -59,22 +54,24 @@ module Inky
|
|
59
54
|
def self.extract_raws(string)
|
60
55
|
raws = []
|
61
56
|
i = 0
|
62
|
-
regex =
|
57
|
+
regex = %r(< *raw *>(.*?)</ *raw *>)
|
63
58
|
str = string
|
64
59
|
while raw = str.match(regex)
|
65
60
|
raws[i] = raw[1]
|
66
61
|
str = str.sub(regex, "###RAW#{i}###")
|
67
|
-
i
|
62
|
+
i += 1
|
68
63
|
end
|
69
|
-
|
70
|
-
|
64
|
+
[raws, str]
|
65
|
+
end
|
71
66
|
|
72
67
|
def self.re_inject_raws(string, raws)
|
73
68
|
str = string
|
74
69
|
raws.each_with_index do |val, i|
|
75
70
|
str = str.sub("###RAW#{i}###", val)
|
76
71
|
end
|
77
|
-
|
72
|
+
# If we're in rails, these should be considered safe strings
|
73
|
+
str = str.html_safe if str.respond_to?(:html_safe)
|
74
|
+
str
|
78
75
|
end
|
79
76
|
end
|
80
77
|
end
|
data/lib/inky/rails/engine.rb
CHANGED
@@ -4,7 +4,7 @@ module Inky
|
|
4
4
|
module Rails
|
5
5
|
class Engine < ::Rails::Engine
|
6
6
|
if config.respond_to?(:annotations)
|
7
|
-
config.annotations.register_extensions("inky") { |annotation|
|
7
|
+
config.annotations.register_extensions("inky") { |annotation| %r(//\s*(#{annotation}):?\s*(.*)$) }
|
8
8
|
end
|
9
9
|
end
|
10
10
|
end
|
@@ -1,13 +1,15 @@
|
|
1
1
|
module Inky
|
2
2
|
module Rails
|
3
3
|
class TemplateHandler
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
class << self
|
5
|
+
def erb_handler
|
6
|
+
@erb_handler ||= ActionView::Template.registered_template_handler(:erb)
|
7
|
+
end
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
|
9
|
+
def call(template)
|
10
|
+
compiled_source = erb_handler.call(template)
|
11
|
+
"Inky::Core.new.release_the_kraken(begin; #{compiled_source};end)"
|
12
|
+
end
|
11
13
|
end
|
12
14
|
end
|
13
15
|
end
|
data/lib/inky/rails/version.rb
CHANGED
data/spec/components_spec.rb
CHANGED
@@ -2,14 +2,14 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
RSpec.describe "Center" do
|
4
4
|
it "applies a text-center class and center alignment attribute to the first child" do
|
5
|
-
input = '<center><div></div></center>'
|
5
|
+
input = '<center><div></div></center>'
|
6
6
|
expected = <<-HTML
|
7
7
|
<center>
|
8
8
|
<div align="center" class="float-center"></div>
|
9
9
|
</center>
|
10
10
|
HTML
|
11
11
|
|
12
|
-
compare(input, expected)
|
12
|
+
compare(input, expected)
|
13
13
|
end
|
14
14
|
|
15
15
|
it "doesn't choke if center tags are nested" do
|
@@ -23,7 +23,7 @@ RSpec.describe "Center" do
|
|
23
23
|
</center>
|
24
24
|
HTML
|
25
25
|
|
26
|
-
compare(input, expected)
|
26
|
+
compare(input, expected)
|
27
27
|
end
|
28
28
|
|
29
29
|
it "applies the class float-center to <item> elements" do
|
@@ -47,13 +47,13 @@ RSpec.describe "Center" do
|
|
47
47
|
</center>
|
48
48
|
HTML
|
49
49
|
|
50
|
-
compare(input, expected)
|
50
|
+
compare(input, expected)
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
54
54
|
RSpec.describe "Button" do
|
55
55
|
it "creates a simple button" do
|
56
|
-
input = '<button href="http://zurb.com">Button</button>'
|
56
|
+
input = '<button href="http://zurb.com">Button</button>'
|
57
57
|
expected = <<-HTML
|
58
58
|
<table class="button">
|
59
59
|
<tr>
|
@@ -67,7 +67,7 @@ RSpec.describe "Button" do
|
|
67
67
|
</tr>
|
68
68
|
</table>
|
69
69
|
HTML
|
70
|
-
compare(input, expected)
|
70
|
+
compare(input, expected)
|
71
71
|
end
|
72
72
|
|
73
73
|
it 'creates a button with target="_blank" attribute' do
|
@@ -224,7 +224,7 @@ end
|
|
224
224
|
|
225
225
|
RSpec.describe "Callout" do
|
226
226
|
it "creates a callout with correct syntax" do
|
227
|
-
input = '<callout>Callout</callout>'
|
227
|
+
input = '<callout>Callout</callout>'
|
228
228
|
expected = <<-HTML
|
229
229
|
<table class="callout">
|
230
230
|
<tr>
|
@@ -234,7 +234,7 @@ RSpec.describe "Callout" do
|
|
234
234
|
</table>
|
235
235
|
HTML
|
236
236
|
|
237
|
-
compare(input, expected)
|
237
|
+
compare(input, expected)
|
238
238
|
end
|
239
239
|
|
240
240
|
it "copies classes to the final HTML" do
|
@@ -248,13 +248,13 @@ RSpec.describe "Callout" do
|
|
248
248
|
</table>
|
249
249
|
HTML
|
250
250
|
|
251
|
-
compare(input, expected)
|
251
|
+
compare(input, expected)
|
252
252
|
end
|
253
253
|
end
|
254
|
-
|
254
|
+
|
255
255
|
RSpec.describe "Spacer" do
|
256
256
|
it 'creates a spacer element with correct size' do
|
257
|
-
input = '<spacer size="10"></spacer>'
|
257
|
+
input = '<spacer size="10"></spacer>'
|
258
258
|
expected = <<-HTML
|
259
259
|
<table class="spacer">
|
260
260
|
<tbody>
|
@@ -265,7 +265,7 @@ RSpec.describe "Spacer" do
|
|
265
265
|
</table>
|
266
266
|
HTML
|
267
267
|
|
268
|
-
compare(input, expected)
|
268
|
+
compare(input, expected)
|
269
269
|
end
|
270
270
|
|
271
271
|
it 'creates a spacer element for small screens with correct size' do
|
@@ -334,7 +334,7 @@ RSpec.describe "Spacer" do
|
|
334
334
|
</table>
|
335
335
|
HTML
|
336
336
|
|
337
|
-
compare(input, expected)
|
337
|
+
compare(input, expected)
|
338
338
|
end
|
339
339
|
end
|
340
340
|
|
@@ -349,14 +349,14 @@ RSpec.describe "Wrapper" do
|
|
349
349
|
</table>
|
350
350
|
HTML
|
351
351
|
|
352
|
-
compare(input, expected)
|
352
|
+
compare(input, expected)
|
353
353
|
end
|
354
354
|
end
|
355
355
|
|
356
356
|
RSpec.describe "raw" do
|
357
357
|
it 'creates a wrapper that ignores anything inside' do
|
358
|
-
input = "<raw><<LCG Program\TG LCG Coupon Code Default='246996'>></raw>"
|
359
|
-
expected = "
|
358
|
+
input = "<body><raw><<LCG Program\TG LCG Coupon Code Default='246996'>></raw></body>"
|
359
|
+
expected = "<?xml version=\"1.0\"?>\n<body><<LCG ProgramTG LCG Coupon Code Default='246996'>></body>\n"
|
360
360
|
|
361
361
|
# Can't do vanilla compare because the second will fail to parse
|
362
362
|
inky = Inky::Core.new
|
data/spec/grid_spec.rb
CHANGED
@@ -46,7 +46,7 @@ end
|
|
46
46
|
RSpec.describe 'Grid' do
|
47
47
|
it 'creates a row' do
|
48
48
|
input = '<row></row>'
|
49
|
-
expected =
|
49
|
+
expected = <<-HTML
|
50
50
|
<table class="row">
|
51
51
|
<tbody>
|
52
52
|
<tr></tr>
|
@@ -155,7 +155,7 @@ RSpec.describe 'Grid' do
|
|
155
155
|
compare(input, expected)
|
156
156
|
end
|
157
157
|
|
158
|
-
#if it just has small, borrow from small for large
|
158
|
+
# if it just has small, borrow from small for large
|
159
159
|
it 'automatically assigns large columns if no large attribute is assigned' do
|
160
160
|
input = <<-HTML
|
161
161
|
<body>
|
@@ -214,6 +214,35 @@ RSpec.describe 'Grid' do
|
|
214
214
|
compare(input, expected)
|
215
215
|
end
|
216
216
|
|
217
|
+
it 'assigns small as full width and large as half width if neither is defined and there are two columns' do
|
218
|
+
input = <<-INKY
|
219
|
+
<body>
|
220
|
+
<columns>One</columns>
|
221
|
+
<columns>Two</columns>
|
222
|
+
</body>
|
223
|
+
INKY
|
224
|
+
expected = <<-HTML
|
225
|
+
<body>
|
226
|
+
<th class="small-12 large-6 columns first">
|
227
|
+
<table>
|
228
|
+
<tr>
|
229
|
+
<th>One</th>
|
230
|
+
</tr>
|
231
|
+
</table>
|
232
|
+
</th>
|
233
|
+
<th class="small-12 large-6 columns last">
|
234
|
+
<table>
|
235
|
+
<tr>
|
236
|
+
<th>Two</th>
|
237
|
+
</tr>
|
238
|
+
</table>
|
239
|
+
</th>
|
240
|
+
</body>
|
241
|
+
HTML
|
242
|
+
|
243
|
+
compare(input, expected)
|
244
|
+
end
|
245
|
+
|
217
246
|
it 'supports nested grids' do
|
218
247
|
input = '<row><columns><row></row></columns></row>'
|
219
248
|
expected = <<-HTML
|
@@ -240,6 +269,23 @@ RSpec.describe 'Grid' do
|
|
240
269
|
|
241
270
|
compare(input, expected)
|
242
271
|
end
|
272
|
+
|
273
|
+
it 'transfers attributes like valign' do
|
274
|
+
input = '<columns small="6" valign="middle" foo="bar">x</columns>'
|
275
|
+
expected = <<-HTML
|
276
|
+
<th class="small-6 large-6 columns first last" valign="middle" foo="bar">
|
277
|
+
<table>
|
278
|
+
<tr>
|
279
|
+
<th>
|
280
|
+
x
|
281
|
+
</th>
|
282
|
+
</tr>
|
283
|
+
</table>
|
284
|
+
</th>
|
285
|
+
HTML
|
286
|
+
|
287
|
+
compare(input, expected)
|
288
|
+
end
|
243
289
|
end
|
244
290
|
|
245
291
|
RSpec.describe 'Block Grid' do
|
@@ -264,5 +310,4 @@ RSpec.describe 'Block Grid' do
|
|
264
310
|
|
265
311
|
compare(input, expected)
|
266
312
|
end
|
267
|
-
|
268
313
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'inky'
|
2
2
|
|
3
|
-
require 'rexml/document'
|
4
3
|
def compare(input, expected)
|
5
4
|
inky = Inky::Core.new
|
6
5
|
output = inky.release_the_kraken(input)
|
@@ -8,7 +7,7 @@ def compare(input, expected)
|
|
8
7
|
# TODO: Figure out a better way to do html compare in ruby..
|
9
8
|
# this is overly dependent on things like class ordering, making it
|
10
9
|
# fragile
|
11
|
-
output_str =
|
12
|
-
expected_str =
|
10
|
+
output_str = Nokogiri::XML(output).to_s.gsub(/\s/, '')
|
11
|
+
expected_str = Nokogiri::XML(expected).to_s.gsub(/\s/, '')
|
13
12
|
expect(output_str).to eql(expected_str)
|
14
13
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: inky-rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.6.
|
4
|
+
version: 1.3.6.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ZURB
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-10-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: foundation_emails
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '2'
|
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: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: bundler
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -62,6 +76,7 @@ extensions: []
|
|
62
76
|
extra_rdoc_files: []
|
63
77
|
files:
|
64
78
|
- ".gitignore"
|
79
|
+
- ".rubocop.yml"
|
65
80
|
- Gemfile
|
66
81
|
- Gemfile.lock
|
67
82
|
- README.md
|