inky-rb 1.3.6.3 → 1.3.7.0
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/.gitignore +1 -0
- data/Gemfile.lock +3 -5
- data/inky.gemspec +1 -0
- data/lib/component_factory.rb +34 -33
- data/lib/inky.rb +7 -9
- data/lib/inky/rails/version.rb +2 -1
- data/spec/cases/button/no_link.inky +1 -0
- data/spec/cases/button/with_expand_class.inky +3 -0
- data/spec/cases/button/with_image.inky +3 -0
- data/spec/cases/button/with_link.inky +3 -0
- data/spec/cases/button/with_tricky_class.inky +19 -0
- data/spec/cases/callout/basic.inky +1 -0
- data/spec/cases/callout/with_attributes.inky +3 -0
- data/spec/cases/general/multiple_root.inky +2 -0
- data/spec/cases/general/no_tag.inky +1 -0
- data/spec/cases/general/root_within_text.inky +3 -0
- data/spec/cases/general/void_html_elements.inky +6 -0
- data/spec/cases/grid/columns.inky +1 -0
- data/spec/cases/grid/container.inky +1 -0
- data/spec/cases/grid/container_with_align.inky +1 -0
- data/spec/cases/grid/row.inky +1 -0
- data/spec/cases/grid/row_with_columns.inky +5 -0
- data/spec/cases/menu/item.inky +1 -0
- data/spec/cases/menu/menu.inky +1 -0
- data/spec/cases/menu/menu_with_align.inky +1 -0
- data/spec/cases/menu/menu_with_items.inky +5 -0
- data/spec/cases/spacer/basic.inky +5 -0
- data/spec/cases/spacer/with_size.inky +5 -0
- data/spec/cases/spacer/with_size_lg.inky +4 -0
- data/spec/cases/spacer/with_size_sm.inky +5 -0
- data/spec/cases/spacer/with_size_sm_and_lg.inky +5 -0
- data/spec/cases/wrapper/basic.inky +1 -0
- data/spec/cases/wrapper/with_align.inky +1 -0
- data/spec/cases/wrapper/with_attributes.inky +1 -0
- data/spec/cases_spec.rb +55 -0
- data/spec/components_spec.rb +1 -3
- data/spec/grid_spec.rb +4 -4
- data/spec/spec_helper.rb +12 -5
- metadata +61 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 4a4008c29bb92a467214a676eb6dfa34286f7333
|
|
4
|
+
data.tar.gz: 2a5e4bf73fe574f8d952aed07ad6324c7aecfdad
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 0c67e33eb5035b4e02333642e3781eb70292bb7b1b2dcdf3fc3af6d54c8802f7085f232cbef1bb9198f3a0f048b2b926b510631aa72f8c841d95d594c14a5bef
|
|
7
|
+
data.tar.gz: 6f1d96ad26149214322c00e279f8ffbea12c531f9d30848c1d43af5b5beec3d08187580c82e9b90f34dcd8269c945d6090d7a47f66664aa9d01b311639def83b
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
inky-rb (1.3.
|
|
4
|
+
inky-rb (1.3.7.0)
|
|
5
5
|
foundation_emails (~> 2)
|
|
6
6
|
nokogiri
|
|
7
7
|
|
|
@@ -10,14 +10,12 @@ GEM
|
|
|
10
10
|
specs:
|
|
11
11
|
ast (2.3.0)
|
|
12
12
|
diff-lcs (1.2.5)
|
|
13
|
-
foundation_emails (2.2.
|
|
13
|
+
foundation_emails (2.2.1.0)
|
|
14
14
|
mini_portile2 (2.1.0)
|
|
15
|
-
nokogiri (1.6.8)
|
|
15
|
+
nokogiri (1.6.8.1)
|
|
16
16
|
mini_portile2 (~> 2.1.0)
|
|
17
|
-
pkg-config (~> 1.1.7)
|
|
18
17
|
parser (2.3.1.4)
|
|
19
18
|
ast (~> 2.2)
|
|
20
|
-
pkg-config (1.1.7)
|
|
21
19
|
powerpack (0.1.1)
|
|
22
20
|
rainbow (2.1.0)
|
|
23
21
|
rake (11.2.2)
|
data/inky.gemspec
CHANGED
|
@@ -9,6 +9,7 @@ Gem::Specification.new do |s|
|
|
|
9
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. '
|
|
10
10
|
s.authors = ["ZURB"]
|
|
11
11
|
s.email = ['foundation@zurb.com']
|
|
12
|
+
s.homepage = 'https://github.com/zurb/inky-rb'
|
|
12
13
|
|
|
13
14
|
s.files = `git ls-files -z`.split("\x0")
|
|
14
15
|
s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
data/lib/component_factory.rb
CHANGED
|
@@ -4,7 +4,7 @@ module ComponentFactory
|
|
|
4
4
|
# TODO: Handle changed names
|
|
5
5
|
transform_method = :"_transform_#{component_lookup[elem.name]}"
|
|
6
6
|
return unless respond_to?(transform_method)
|
|
7
|
-
|
|
7
|
+
send(transform_method, elem, inner)
|
|
8
8
|
end
|
|
9
9
|
|
|
10
10
|
tags = %w[class id href size large no-expander small target]
|
|
@@ -18,13 +18,16 @@ module ComponentFactory
|
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
def _has_class(elem, klass)
|
|
21
|
-
|
|
21
|
+
elem.attr('class') =~ /(^|\s)#{klass}($|\s)/
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
def
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
def _combine_classes(elem, extra_classes)
|
|
25
|
+
[elem['class'], extra_classes].join(' ')
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def _combine_attributes(elem, extra_classes = nil)
|
|
29
|
+
classes = _combine_classes(elem, extra_classes)
|
|
30
|
+
[_pass_through_attributes(elem), classes && %{class="#{classes}"}].join
|
|
28
31
|
end
|
|
29
32
|
|
|
30
33
|
def _target_attribute(elem)
|
|
@@ -40,30 +43,30 @@ module ComponentFactory
|
|
|
40
43
|
end
|
|
41
44
|
inner = "<center>#{inner}</center>" if expand
|
|
42
45
|
|
|
43
|
-
classes =
|
|
46
|
+
classes = _combine_classes(component, 'button')
|
|
44
47
|
expander = '<td class="expander"></td>' if expand
|
|
45
|
-
%{<table class="#{classes
|
|
48
|
+
%{<table class="#{classes}"><tr><td><table><tr><td>#{inner}</td></tr></table></td>#{expander}</tr></table>}
|
|
46
49
|
end
|
|
47
50
|
|
|
48
51
|
def _transform_menu(component, inner)
|
|
49
|
-
|
|
50
|
-
%{<table
|
|
52
|
+
attributes = _combine_attributes(component, 'menu')
|
|
53
|
+
%{<table #{attributes}><tr><td><table><tr>#{inner}</tr></table></td></tr></table>}
|
|
51
54
|
end
|
|
52
55
|
|
|
53
56
|
def _transform_menu_item(component, inner)
|
|
54
57
|
target = _target_attribute(component)
|
|
55
|
-
|
|
58
|
+
attributes = _combine_attributes(component, 'menu-item')
|
|
59
|
+
%{<th #{attributes}><a href="#{component.attr('href')}"#{target}>#{inner}</a></th>}
|
|
56
60
|
end
|
|
57
61
|
|
|
58
62
|
def _transform_container(component, inner)
|
|
59
|
-
|
|
60
|
-
%{<table
|
|
63
|
+
attributes = _combine_attributes(component, 'container')
|
|
64
|
+
%{<table #{attributes} align="center"><tbody><tr><td>#{inner}</td></tr></tbody></table>}
|
|
61
65
|
end
|
|
62
66
|
|
|
63
67
|
def _transform_row(component, inner)
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
%{<table #{attrs}class="#{classes.join(' ')}"><tbody><tr>#{inner}</tr></tbody></table>}
|
|
68
|
+
attributes = _combine_attributes(component, 'row')
|
|
69
|
+
%{<table #{attributes}><tbody><tr>#{inner}</tr></tbody></table>}
|
|
67
70
|
end
|
|
68
71
|
|
|
69
72
|
# in inky.js this is factored out into makeClumn. TBD if we need that here.
|
|
@@ -76,20 +79,20 @@ module ComponentFactory
|
|
|
76
79
|
small_size = small_val || column_count
|
|
77
80
|
large_size = large_val || small_val || (column_count / col_count).to_i
|
|
78
81
|
|
|
79
|
-
classes =
|
|
82
|
+
classes = _combine_classes(component, "small-#{small_size} large-#{large_size} columns")
|
|
80
83
|
|
|
81
|
-
classes
|
|
82
|
-
classes
|
|
84
|
+
classes << ' first' unless component.previous_element
|
|
85
|
+
classes << ' last' unless component.next_element
|
|
83
86
|
|
|
84
87
|
subrows = component.elements.css(".row").to_a.concat(component.elements.css("row").to_a)
|
|
85
88
|
expander = %{<th class="expander"></th>} if large_size.to_i == column_count && subrows.empty?
|
|
86
89
|
|
|
87
|
-
%{<th class="#{classes
|
|
90
|
+
%{<th class="#{classes}" #{_pass_through_attributes(component)}><table><tr><th>#{inner}</th>#{expander}</tr></table></th>}
|
|
88
91
|
end
|
|
89
92
|
|
|
90
93
|
def _transform_block_grid(component, inner)
|
|
91
|
-
classes =
|
|
92
|
-
%{<table class="#{classes
|
|
94
|
+
classes = _combine_classes(component, "block-grid up-#{component.attr('up')}")
|
|
95
|
+
%{<table class="#{classes}"><tr>#{inner}</tr></table>}
|
|
93
96
|
end
|
|
94
97
|
|
|
95
98
|
def _transform_center(component, _inner)
|
|
@@ -97,25 +100,24 @@ module ComponentFactory
|
|
|
97
100
|
# sometimes appears to miss elements that show up in size
|
|
98
101
|
component.elements.each do |child|
|
|
99
102
|
child['align'] = 'center'
|
|
100
|
-
|
|
101
|
-
child['class'] = child_classes.join(' ')
|
|
103
|
+
child['class'] = _combine_classes(child, 'float-center')
|
|
102
104
|
items = component.elements.css(".menu-item").to_a.concat(component.elements.css("item").to_a)
|
|
103
105
|
items.each do |item|
|
|
104
|
-
|
|
105
|
-
item['class'] = item_classes.join(' ')
|
|
106
|
+
item['class'] = _combine_classes(item, 'float-center')
|
|
106
107
|
end
|
|
107
108
|
end
|
|
108
109
|
component.to_s
|
|
109
110
|
end
|
|
110
111
|
|
|
111
112
|
def _transform_callout(component, inner)
|
|
112
|
-
classes =
|
|
113
|
-
|
|
113
|
+
classes = _combine_classes(component, 'callout-inner')
|
|
114
|
+
attributes = _pass_through_attributes(component)
|
|
115
|
+
%{<table #{attributes}class="callout"><tr><th class="#{classes}">#{inner}</th><th class="expander"></th></tr></table>}
|
|
114
116
|
end
|
|
115
117
|
|
|
116
118
|
def _transform_spacer(component, _inner)
|
|
117
|
-
classes =
|
|
118
|
-
build_table = ->(size, extra) { %{<table class="#{classes
|
|
119
|
+
classes = _combine_classes(component, 'spacer')
|
|
120
|
+
build_table = ->(size, extra) { %{<table class="#{classes} #{extra}"><tbody><tr><td height="#{size}px" style="font-size:#{size}px;line-height:#{size}px;"> </td></tr></tbody></table>} }
|
|
119
121
|
size = component.attr('size')
|
|
120
122
|
size_sm = component.attr('size-sm')
|
|
121
123
|
size_lg = component.attr('size-lg')
|
|
@@ -123,7 +125,6 @@ module ComponentFactory
|
|
|
123
125
|
html = ''
|
|
124
126
|
html << build_table[size_sm, 'hide-for-large'] if size_sm
|
|
125
127
|
html << build_table[size_lg, 'show-for-large'] if size_lg
|
|
126
|
-
html = "<span>#{html}</span>" if size_sm && size_lg
|
|
127
128
|
html
|
|
128
129
|
else
|
|
129
130
|
build_table[size || 16, nil]
|
|
@@ -131,7 +132,7 @@ module ComponentFactory
|
|
|
131
132
|
end
|
|
132
133
|
|
|
133
134
|
def _transform_wrapper(component, inner)
|
|
134
|
-
|
|
135
|
-
%{<table
|
|
135
|
+
attributes = _combine_attributes(component, 'wrapper')
|
|
136
|
+
%{<table #{attributes} align="center"><tr><td class="wrapper-inner">#{inner}</td></tr></table>}
|
|
136
137
|
end
|
|
137
138
|
end
|
data/lib/inky.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
module Inky
|
|
2
2
|
class Core
|
|
3
3
|
require 'nokogiri'
|
|
4
|
-
|
|
4
|
+
require_relative 'component_factory'
|
|
5
5
|
attr_accessor :components, :column_count, :component_lookup, :component_tags
|
|
6
6
|
|
|
7
7
|
include ComponentFactory
|
|
@@ -31,17 +31,15 @@ module Inky
|
|
|
31
31
|
def release_the_kraken(xml_string)
|
|
32
32
|
xml_string = xml_string.gsub(/doctype/i, 'DOCTYPE')
|
|
33
33
|
raws, str = Inky::Core.extract_raws(xml_string)
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
parse_cmd = str =~ /<html/i ? :parse : :fragment
|
|
35
|
+
html = Nokogiri::HTML.public_send(parse_cmd, str)
|
|
36
|
+
html.elements.each do |elem|
|
|
37
|
+
transform_doc(elem)
|
|
38
|
+
end
|
|
39
|
+
string = html.to_html(encoding: 'US-ASCII')
|
|
38
40
|
Inky::Core.re_inject_raws(string, raws)
|
|
39
41
|
end
|
|
40
42
|
|
|
41
|
-
def components_exist?(_xml_doc)
|
|
42
|
-
true
|
|
43
|
-
end
|
|
44
|
-
|
|
45
43
|
def transform_doc(elem)
|
|
46
44
|
if elem.respond_to?(:children)
|
|
47
45
|
elem.children.each do |child|
|
data/lib/inky/rails/version.rb
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<button>I'm missing an href</button>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<button href="http://example.com" class="noexpand">
|
|
2
|
+
A label
|
|
3
|
+
</button>
|
|
4
|
+
|
|
5
|
+
<button href="http://example.com" class="expand-niet">
|
|
6
|
+
A label
|
|
7
|
+
</button>
|
|
8
|
+
|
|
9
|
+
<button href="http://example.com" class="expand foo">
|
|
10
|
+
A label
|
|
11
|
+
</button>
|
|
12
|
+
|
|
13
|
+
<button href="http://example.com" class="foo expand">
|
|
14
|
+
A label
|
|
15
|
+
</button>
|
|
16
|
+
|
|
17
|
+
<button href="http://example.com" class="foo expand bar">
|
|
18
|
+
A label
|
|
19
|
+
</button>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<callout>Simple callout</callout>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Very simple test...
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<columns class="some classes" foo="bar">First column</columns>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<container class="klass" foo="bar">some content</container>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<container align="left">some content</container>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<row class="some klasses" foo="bar">columns here</row>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<item class="some classes" foo="bar" href="http://example.com">An item</item>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<menu class="some classes" foo="bar"/>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<menu align="left"/>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<wrapper>In the wrap</wrapper>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<wrapper align="left">In the wrap</wrapper>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<wrapper class="some classes" foo="bar">In the wrap</wrapper>
|
data/spec/cases_spec.rb
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'json'
|
|
3
|
+
|
|
4
|
+
INKY_VERSION_REQUIRED = Inky::NODE_VERSION
|
|
5
|
+
|
|
6
|
+
def npm_packages
|
|
7
|
+
JSON.parse(`npm list -g --depth=1 --json=true`)
|
|
8
|
+
rescue
|
|
9
|
+
puts <<-Err
|
|
10
|
+
npm not detected, skipping comparison tests.
|
|
11
|
+
Err
|
|
12
|
+
nil
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def inky_cli_ok?
|
|
16
|
+
return unless packages = npm_packages
|
|
17
|
+
version = packages['dependencies']['inky-cli']['dependencies']['inky']['version']
|
|
18
|
+
return true if version >= INKY_VERSION_REQUIRED
|
|
19
|
+
puts "Requires inky version #{INKY_VERSION_REQUIRED}+, currently installed #{version}"
|
|
20
|
+
false
|
|
21
|
+
rescue
|
|
22
|
+
puts <<-Err
|
|
23
|
+
inky-cli not globally installed, skipping comparison tests.
|
|
24
|
+
Install with:
|
|
25
|
+
npm install inky-cli -g
|
|
26
|
+
Err
|
|
27
|
+
false
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
RSpec.describe "Inky-rb" do
|
|
31
|
+
context "compared to inky-cli" do
|
|
32
|
+
Dir['./spec/cases/*'].each do |path|
|
|
33
|
+
folder = File.basename(path)
|
|
34
|
+
output_path = "./spec/_cases_output/#{File.basename(folder)}"
|
|
35
|
+
sources = "#{path}/*.inky"
|
|
36
|
+
source_paths = Dir[sources]
|
|
37
|
+
|
|
38
|
+
context "for #{folder} components" do
|
|
39
|
+
before(:all) do
|
|
40
|
+
shell = source_paths.map { |p| "inky #{p} #{output_path}" }
|
|
41
|
+
`#{shell.join(' && ')}`
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
source_paths.each do |filepath|
|
|
45
|
+
file = File.basename(filepath, '.inky')
|
|
46
|
+
content = File.read(filepath)
|
|
47
|
+
exec = content =~ /^<!--\s*(pending|skip)/ ? $1 : :it
|
|
48
|
+
send exec, "provides the same results for #{file}" do
|
|
49
|
+
compare(content, File.read("#{output_path}/#{file}.inky"))
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end if inky_cli_ok?
|
|
55
|
+
end
|
data/spec/components_spec.rb
CHANGED
|
@@ -301,7 +301,6 @@ RSpec.describe "Spacer" do
|
|
|
301
301
|
it 'creates a spacer element for small and large screens with correct sizes' do
|
|
302
302
|
input = '<spacer size-sm="10" size-lg="20"></spacer>'
|
|
303
303
|
expected = <<-HTML
|
|
304
|
-
<span>
|
|
305
304
|
<table class="spacer hide-for-large">
|
|
306
305
|
<tbody>
|
|
307
306
|
<tr>
|
|
@@ -316,7 +315,6 @@ RSpec.describe "Spacer" do
|
|
|
316
315
|
</tr>
|
|
317
316
|
</tbody>
|
|
318
317
|
</table>
|
|
319
|
-
</span>
|
|
320
318
|
HTML
|
|
321
319
|
|
|
322
320
|
compare(input, expected)
|
|
@@ -356,7 +354,7 @@ end
|
|
|
356
354
|
RSpec.describe "raw" do
|
|
357
355
|
it 'creates a wrapper that ignores anything inside' do
|
|
358
356
|
input = "<body><raw><<LCG ProgramTG LCG Coupon Code Default='246996'>></raw></body>"
|
|
359
|
-
expected = "<body><<LCG ProgramTG LCG Coupon Code Default='246996'>></body
|
|
357
|
+
expected = "<body><<LCG ProgramTG LCG Coupon Code Default='246996'>></body>"
|
|
360
358
|
|
|
361
359
|
# Can't do vanilla compare because the second will fail to parse
|
|
362
360
|
inky = Inky::Core.new
|
data/spec/grid_spec.rb
CHANGED
|
@@ -4,7 +4,7 @@ RSpec.describe "Container" do
|
|
|
4
4
|
it "creates a container table" do
|
|
5
5
|
input = '<container></container>'
|
|
6
6
|
expected = <<-HTML
|
|
7
|
-
<table class="container">
|
|
7
|
+
<table class="container" align="center">
|
|
8
8
|
<tbody>
|
|
9
9
|
<tr>
|
|
10
10
|
<td></td>
|
|
@@ -18,7 +18,7 @@ RSpec.describe "Container" do
|
|
|
18
18
|
it 'works when parsing a full HTML document' do
|
|
19
19
|
input = <<-INKY
|
|
20
20
|
<!doctype html> <html>
|
|
21
|
-
<head></head>
|
|
21
|
+
<head><meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"></head>
|
|
22
22
|
<body>
|
|
23
23
|
<container></container>
|
|
24
24
|
</body>
|
|
@@ -27,9 +27,9 @@ RSpec.describe "Container" do
|
|
|
27
27
|
expected = <<-HTML
|
|
28
28
|
<!DOCTYPE html>
|
|
29
29
|
<html>
|
|
30
|
-
<head></head>
|
|
30
|
+
<head><meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"></head>
|
|
31
31
|
<body>
|
|
32
|
-
<table class="container">
|
|
32
|
+
<table class="container" align="center">
|
|
33
33
|
<tbody>
|
|
34
34
|
<tr>
|
|
35
35
|
<td></td>
|
data/spec/spec_helper.rb
CHANGED
|
@@ -2,11 +2,18 @@ require 'inky'
|
|
|
2
2
|
|
|
3
3
|
def reformat_html(html)
|
|
4
4
|
html
|
|
5
|
-
.gsub(/\s+/, ' ')
|
|
6
|
-
.gsub(/> *</, ">\n<")
|
|
7
|
-
.gsub(%r{<(\w+)([^>]*)>\n</\1>}, '<\1\2/>')
|
|
8
|
-
.gsub(/ "/, '"').gsub(/\=" /, '="')
|
|
9
|
-
.gsub(/ </, '<').gsub(/> /, '>')
|
|
5
|
+
.gsub(/\s+/, ' ') # Compact all whitespace to a single space
|
|
6
|
+
.gsub(/> *</, ">\n<") # Use returns between tags
|
|
7
|
+
.gsub(%r{<(\w+)([^>]*)>\n</\1>}, '<\1\2/>') # Auto close empty tags, e.g. <hr>\n</hr> => <hr/>
|
|
8
|
+
.gsub(/ "/, '"').gsub(/\=" /, '="') # Remove leading/trailing spaces inside attributes
|
|
9
|
+
.gsub(/ </, '<').gsub(/> /, '>') # Remove leading/trailing spaces inside tags
|
|
10
|
+
.gsub(' data-parsed=""', '') # Don't consider this known inky-node artefact
|
|
11
|
+
.gsub(' ', ' ') # These are the same entity...
|
|
12
|
+
.gsub(/(align="[^"]+") (class="[^"]+")/, '\2 \1') # Tweak order to match inky-node on container
|
|
13
|
+
.gsub(/class\="([^"]+)"/) do # Sort class names
|
|
14
|
+
classes = $1.split(' ').sort.join(' ')
|
|
15
|
+
%{class="#{classes}"}
|
|
16
|
+
end
|
|
10
17
|
end
|
|
11
18
|
|
|
12
19
|
def compare(input, expected)
|
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.
|
|
4
|
+
version: 1.3.7.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- ZURB
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2016-10-
|
|
11
|
+
date: 2016-10-11 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: foundation_emails
|
|
@@ -122,10 +122,39 @@ files:
|
|
|
122
122
|
- lib/inky/rails/engine.rb
|
|
123
123
|
- lib/inky/rails/template_handler.rb
|
|
124
124
|
- lib/inky/rails/version.rb
|
|
125
|
+
- spec/cases/button/no_link.inky
|
|
126
|
+
- spec/cases/button/with_expand_class.inky
|
|
127
|
+
- spec/cases/button/with_image.inky
|
|
128
|
+
- spec/cases/button/with_link.inky
|
|
129
|
+
- spec/cases/button/with_tricky_class.inky
|
|
130
|
+
- spec/cases/callout/basic.inky
|
|
131
|
+
- spec/cases/callout/with_attributes.inky
|
|
132
|
+
- spec/cases/general/multiple_root.inky
|
|
133
|
+
- spec/cases/general/no_tag.inky
|
|
134
|
+
- spec/cases/general/root_within_text.inky
|
|
135
|
+
- spec/cases/general/void_html_elements.inky
|
|
136
|
+
- spec/cases/grid/columns.inky
|
|
137
|
+
- spec/cases/grid/container.inky
|
|
138
|
+
- spec/cases/grid/container_with_align.inky
|
|
139
|
+
- spec/cases/grid/row.inky
|
|
140
|
+
- spec/cases/grid/row_with_columns.inky
|
|
141
|
+
- spec/cases/menu/item.inky
|
|
142
|
+
- spec/cases/menu/menu.inky
|
|
143
|
+
- spec/cases/menu/menu_with_align.inky
|
|
144
|
+
- spec/cases/menu/menu_with_items.inky
|
|
145
|
+
- spec/cases/spacer/basic.inky
|
|
146
|
+
- spec/cases/spacer/with_size.inky
|
|
147
|
+
- spec/cases/spacer/with_size_lg.inky
|
|
148
|
+
- spec/cases/spacer/with_size_sm.inky
|
|
149
|
+
- spec/cases/spacer/with_size_sm_and_lg.inky
|
|
150
|
+
- spec/cases/wrapper/basic.inky
|
|
151
|
+
- spec/cases/wrapper/with_align.inky
|
|
152
|
+
- spec/cases/wrapper/with_attributes.inky
|
|
153
|
+
- spec/cases_spec.rb
|
|
125
154
|
- spec/components_spec.rb
|
|
126
155
|
- spec/grid_spec.rb
|
|
127
156
|
- spec/spec_helper.rb
|
|
128
|
-
homepage:
|
|
157
|
+
homepage: https://github.com/zurb/inky-rb
|
|
129
158
|
licenses: []
|
|
130
159
|
metadata: {}
|
|
131
160
|
post_install_message:
|
|
@@ -151,6 +180,35 @@ summary: Inky is an HTML-based templating language that converts simple HTML int
|
|
|
151
180
|
complex, responsive email-ready HTML. Designed for Foundation for Emails, a responsive
|
|
152
181
|
email framework from ZURB.
|
|
153
182
|
test_files:
|
|
183
|
+
- spec/cases/button/no_link.inky
|
|
184
|
+
- spec/cases/button/with_expand_class.inky
|
|
185
|
+
- spec/cases/button/with_image.inky
|
|
186
|
+
- spec/cases/button/with_link.inky
|
|
187
|
+
- spec/cases/button/with_tricky_class.inky
|
|
188
|
+
- spec/cases/callout/basic.inky
|
|
189
|
+
- spec/cases/callout/with_attributes.inky
|
|
190
|
+
- spec/cases/general/multiple_root.inky
|
|
191
|
+
- spec/cases/general/no_tag.inky
|
|
192
|
+
- spec/cases/general/root_within_text.inky
|
|
193
|
+
- spec/cases/general/void_html_elements.inky
|
|
194
|
+
- spec/cases/grid/columns.inky
|
|
195
|
+
- spec/cases/grid/container.inky
|
|
196
|
+
- spec/cases/grid/container_with_align.inky
|
|
197
|
+
- spec/cases/grid/row.inky
|
|
198
|
+
- spec/cases/grid/row_with_columns.inky
|
|
199
|
+
- spec/cases/menu/item.inky
|
|
200
|
+
- spec/cases/menu/menu.inky
|
|
201
|
+
- spec/cases/menu/menu_with_align.inky
|
|
202
|
+
- spec/cases/menu/menu_with_items.inky
|
|
203
|
+
- spec/cases/spacer/basic.inky
|
|
204
|
+
- spec/cases/spacer/with_size.inky
|
|
205
|
+
- spec/cases/spacer/with_size_lg.inky
|
|
206
|
+
- spec/cases/spacer/with_size_sm.inky
|
|
207
|
+
- spec/cases/spacer/with_size_sm_and_lg.inky
|
|
208
|
+
- spec/cases/wrapper/basic.inky
|
|
209
|
+
- spec/cases/wrapper/with_align.inky
|
|
210
|
+
- spec/cases/wrapper/with_attributes.inky
|
|
211
|
+
- spec/cases_spec.rb
|
|
154
212
|
- spec/components_spec.rb
|
|
155
213
|
- spec/grid_spec.rb
|
|
156
214
|
- spec/spec_helper.rb
|