ejx 0.1 → 0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/condenser/transformers/ejx.rb +3 -1
- data/lib/ejx/assets/ejx.js +16 -3
- data/lib/ejx/template.rb +41 -9
- data/lib/ejx/template/html_tag.rb +4 -2
- data/lib/ejx/template/html_tag/attribute_value.rb +15 -0
- data/lib/ejx/template/js.rb +3 -1
- data/lib/ejx/template/parse_helpers.rb +2 -2
- data/lib/ejx/template/subtemplate.rb +11 -8
- data/lib/ejx/version.rb +1 -1
- metadata +8 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9f52677d4f3ebc419528b87b62deb8c54c4c87b65193a58efd675ebf4cdec670
|
4
|
+
data.tar.gz: 1d3529c96bb7756822e0b1f0708f5f39ab6fabccb20376196ee1729cddf75e8c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7ca36c97ddf80cef591f4f2c0c0787c6c8ea09f52484ca30932aae9c8a1c4195cbdab3a5a8f12579a671e47fa0fcbdaeeefd0ba849218cfbb1c698ad70ec34df
|
7
|
+
data.tar.gz: dd5c1d1c21812e910e24fd156d0dca8458aacf6f04958a073c172fe4bf7cf6f8e3e11d6c0b52904dae3597cb13996267228ba5896f703198646f3c41a53330f8
|
@@ -1,5 +1,7 @@
|
|
1
1
|
class Condenser::EjxTransformer < Condenser::NodeProcessor
|
2
2
|
|
3
|
+
attr_accessor :options
|
4
|
+
|
3
5
|
def initialize(options = {})
|
4
6
|
@options = options
|
5
7
|
end
|
@@ -20,4 +22,4 @@ class Condenser::EjxTransformer < Condenser::NodeProcessor
|
|
20
22
|
input[:source] = EJX::Template.new(input[:source], @options).to_module
|
21
23
|
end
|
22
24
|
|
23
|
-
end
|
25
|
+
end
|
data/lib/ejx/assets/ejx.js
CHANGED
@@ -14,18 +14,31 @@ function repalceejx(el, withItems) {
|
|
14
14
|
}
|
15
15
|
}
|
16
16
|
|
17
|
-
export function append(items, to, escape, promises,
|
17
|
+
export function append(items, to, escape, promises, promiseResults) {
|
18
18
|
if ( Array.isArray(items) ) {
|
19
19
|
items.forEach((i) => append(i, to, escape, promises));
|
20
20
|
} else {
|
21
21
|
let method = Array.isArray(to) ? 'push' : 'append';
|
22
|
-
|
23
22
|
if (items instanceof Promise) {
|
24
23
|
let holder = document.createElement( "div");
|
25
24
|
to[method](holder);
|
26
25
|
promises.push( items.then((resolvedItems) => {
|
27
|
-
|
26
|
+
if(holder.parentElement) {
|
27
|
+
repalceejx(holder, resolvedItems || promiseResults.flat())
|
28
|
+
} else if (Array.isArray(resolvedItems)) {
|
29
|
+
to.splice(to.indexOf(holder), 1, ...resolvedItems)
|
30
|
+
} else {
|
31
|
+
to.splice(to.indexOf(holder), 1, resolvedItems)
|
32
|
+
}
|
28
33
|
}));
|
34
|
+
} else if (typeof items === 'string') {
|
35
|
+
if (escape) {
|
36
|
+
to[method](items);
|
37
|
+
} else {
|
38
|
+
var container = document.createElement(Array.isArray(to) ? 'div' : to.tagName);
|
39
|
+
container.innerHTML = items;
|
40
|
+
to[method](...container.childNodes);
|
41
|
+
}
|
29
42
|
} else {
|
30
43
|
to[method](items);
|
31
44
|
}
|
data/lib/ejx/template.rb
CHANGED
@@ -51,6 +51,7 @@ class EJX::Template
|
|
51
51
|
end
|
52
52
|
end
|
53
53
|
when :js
|
54
|
+
pre_js = pre_match
|
54
55
|
scan_until(Regexp.new("(#{@js_close_tags.map{|s| Regexp.escape(s) }.join('|')})"))
|
55
56
|
pm = pre_match
|
56
57
|
open_modifier = @open_tag_modifiers.find { |k,v| pm.start_with?(v) }&.first
|
@@ -63,15 +64,18 @@ class EJX::Template
|
|
63
64
|
import += ';' if !import.end_with?(';')
|
64
65
|
@tree.first.imports << import
|
65
66
|
@stack.pop
|
66
|
-
elsif @tree.last.is_a?(EJX::Template::Subtemplate) && pm.match(/\A\s*\}
|
67
|
+
elsif @tree.last.is_a?(EJX::Template::Subtemplate) && pm.match(/\A\s*\}.*\)/m) && !pm.match(/\A\s*\}.*\{\s*\Z/m)
|
67
68
|
subtemplate = @tree.pop
|
68
69
|
subtemplate.children << pm.strip
|
69
70
|
@tree.last.children << subtemplate
|
70
71
|
@stack.pop
|
71
|
-
elsif pm.match(/function\s*\([^\)]*\)\s*\{\s*\Z/m)
|
72
|
+
elsif open_modifier && (pm.match(/function\s*\([^\)]*\)\s*\{\s*\Z/m) || pm.match(/=>\s*\{\s*\Z/m))
|
72
73
|
@tree << EJX::Template::Subtemplate.new(pm.strip, [open_modifier, close_modifier].compact)
|
73
74
|
@stack.pop
|
74
75
|
else
|
76
|
+
if open_modifier != :comment && !pre_js.empty? && @tree.last.children.last.is_a?(EJX::Template::JS)
|
77
|
+
@tree.last.children << EJX::Template::String.new(' ')
|
78
|
+
end
|
75
79
|
value = EJX::Template::JS.new(pm.strip, [open_modifier, close_modifier].compact)
|
76
80
|
|
77
81
|
@stack.pop
|
@@ -89,6 +93,10 @@ class EJX::Template
|
|
89
93
|
end
|
90
94
|
end
|
91
95
|
when :html_tag
|
96
|
+
if @tree.last.children.last.is_a?(EJX::Template::JS)
|
97
|
+
@tree.last.children << EJX::Template::String.new(' ')
|
98
|
+
end
|
99
|
+
|
92
100
|
scan_until(Regexp.new("(#{@js_start_tags.map{|s| Regexp.escape(s) }.join('|')}|\\/|[^\\s>]+)"))
|
93
101
|
if @js_start_tags.include?(matched)
|
94
102
|
@tree << EJX::Template::HTMLTag.new
|
@@ -182,18 +190,42 @@ class EJX::Template
|
|
182
190
|
@tree.last.attrs << { key => matched }
|
183
191
|
end
|
184
192
|
when :html_tag_attr_value_double_quoted
|
185
|
-
|
193
|
+
quoted_value = []
|
194
|
+
scan_until(/("|\[\[=)/)
|
195
|
+
while matched == '[[='
|
196
|
+
quoted_value << pre_match if !pre_match.strip.empty?
|
197
|
+
scan_until(/\]\]/)
|
198
|
+
quoted_value << EJX::Template::JS.new(pre_match.strip)
|
199
|
+
scan_until(/("|\[\[=)/)
|
200
|
+
end
|
201
|
+
quoted_value << pre_match if !pre_match.strip.empty?
|
202
|
+
rewind(1)
|
203
|
+
|
204
|
+
quoted_value = EJX::Template::HTMLTag::AttributeValue.new(quoted_value)
|
205
|
+
|
186
206
|
key = @tree.last.attrs.pop
|
187
|
-
@tree.last.namespace =
|
188
|
-
@tree.last.attrs << { key =>
|
207
|
+
@tree.last.namespace = quoted_value if key == 'xmlns'
|
208
|
+
@tree.last.attrs << { key => quoted_value }
|
189
209
|
scan_until(/\"/)
|
190
210
|
@stack.pop
|
191
211
|
when :html_tag_attr_value_single_quoted
|
192
|
-
|
212
|
+
quoted_value = []
|
213
|
+
scan_until(/('|\[\[=)/)
|
214
|
+
while matched == '[[='
|
215
|
+
quoted_value << pre_match if !pre_match.strip.empty?
|
216
|
+
scan_until(/\]\]/)
|
217
|
+
quoted_value << EJX::Template::JS.new(pre_match.strip)
|
218
|
+
scan_until(/('|\[\[=)/)
|
219
|
+
end
|
220
|
+
quoted_value << pre_match if !pre_match.strip.empty?
|
221
|
+
rewind(1)
|
222
|
+
|
223
|
+
quoted_value = EJX::Template::HTMLTag::AttributeValue.new(quoted_value)
|
224
|
+
|
193
225
|
key = @tree.last.attrs.pop
|
194
|
-
@tree.last.namespace =
|
195
|
-
@tree.last.attrs << { key =>
|
196
|
-
scan_until(
|
226
|
+
@tree.last.namespace = quoted_value if key == 'xmlns'
|
227
|
+
@tree.last.attrs << { key => quoted_value }
|
228
|
+
scan_until(/\'/)
|
197
229
|
@stack.pop
|
198
230
|
end
|
199
231
|
end
|
@@ -1,4 +1,6 @@
|
|
1
1
|
class EJX::Template::HTMLTag
|
2
|
+
|
3
|
+
autoload :AttributeValue, File.expand_path('../html_tag/attribute_value', __FILE__)
|
2
4
|
|
3
5
|
attr_accessor :tag_name, :attrs, :children, :namespace
|
4
6
|
|
@@ -21,7 +23,7 @@ class EJX::Template::HTMLTag
|
|
21
23
|
output_var = var_generator.next
|
22
24
|
js = "#{' '*indentation}var #{output_var} = document.createElement"
|
23
25
|
js << if namespace
|
24
|
-
"NS(#{
|
26
|
+
"NS(#{namespace.to_js}, #{JSON.generate(tag_name)});\n"
|
25
27
|
else
|
26
28
|
"(#{JSON.generate(tag_name)});\n"
|
27
29
|
end
|
@@ -29,7 +31,7 @@ class EJX::Template::HTMLTag
|
|
29
31
|
@attrs.each do |attr|
|
30
32
|
if attr.is_a?(Hash)
|
31
33
|
attr.each do |k, v|
|
32
|
-
js << "#{' '*indentation}#{output_var}.setAttribute(#{JSON.generate(k)}, #{
|
34
|
+
js << "#{' '*indentation}#{output_var}.setAttribute(#{JSON.generate(k)}, #{v.to_js});\n"
|
33
35
|
end
|
34
36
|
else
|
35
37
|
js << "#{' '*indentation}#{output_var}.setAttribute(#{JSON.generate(attr)}, \"\");\n"
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class EJX::Template::HTMLTag::AttributeValue
|
2
|
+
|
3
|
+
def initialize(values)
|
4
|
+
@values = values
|
5
|
+
end
|
6
|
+
|
7
|
+
def to_js
|
8
|
+
if @values.empty?
|
9
|
+
JSON.generate('')
|
10
|
+
else
|
11
|
+
@values.map{ |v| v.is_a?(::String) ? JSON.generate(v) : v.value }.join(' + ')
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
data/lib/ejx/template/js.rb
CHANGED
@@ -8,13 +8,14 @@ class EJX::Template::Subtemplate
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def to_js(indentation: 4, var_generator: nil, append: "__output")
|
11
|
+
global_output_var = var_generator.next
|
11
12
|
output_var = var_generator.next
|
12
|
-
|
13
|
+
|
14
|
+
output = "#{' '*indentation}var #{global_output_var} = [];\n"
|
13
15
|
output << "#{' '*indentation}__ejx_append("
|
14
|
-
output << @children.first
|
15
|
-
output << "
|
16
|
-
|
17
|
-
# var_generator ||= EJX::Template::VarGenerator.new
|
16
|
+
output << @children.first << "\n"
|
17
|
+
output << "#{' '*(indentation+4)}var #{output_var} = [];\n"
|
18
|
+
|
18
19
|
@children[1..-2].each do |child|
|
19
20
|
output << case child
|
20
21
|
when EJX::Template::String
|
@@ -23,9 +24,11 @@ class EJX::Template::Subtemplate
|
|
23
24
|
child.to_js(indentation: indentation + 4, var_generator: var_generator, append: output_var)
|
24
25
|
end
|
25
26
|
end
|
26
|
-
|
27
|
-
output <<
|
28
|
-
output <<
|
27
|
+
|
28
|
+
output << ' '*(indentation+4) << "#{global_output_var}.push(#{output_var});\n";
|
29
|
+
output << ' '*(indentation+4) << "return #{output_var};\n";
|
30
|
+
output << ' '*indentation << @children.last
|
31
|
+
output << ", #{append}, true, __promises, #{global_output_var});\n"
|
29
32
|
|
30
33
|
output
|
31
34
|
end
|
data/lib/ejx/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ejx
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.2'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Bracy
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-12-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -68,7 +68,7 @@ dependencies:
|
|
68
68
|
version: '0'
|
69
69
|
description: |
|
70
70
|
Compile EJX (Embedded JavaScript) templates to Javascript
|
71
|
-
|
71
|
+
with Ruby.
|
72
72
|
email:
|
73
73
|
- jonbracy@gmail.com
|
74
74
|
executables: []
|
@@ -83,6 +83,7 @@ files:
|
|
83
83
|
- lib/ejx/template.rb
|
84
84
|
- lib/ejx/template/base.rb
|
85
85
|
- lib/ejx/template/html_tag.rb
|
86
|
+
- lib/ejx/template/html_tag/attribute_value.rb
|
86
87
|
- lib/ejx/template/js.rb
|
87
88
|
- lib/ejx/template/parse_helpers.rb
|
88
89
|
- lib/ejx/template/string.rb
|
@@ -93,7 +94,7 @@ homepage: https://github.com/malomalo/ejx
|
|
93
94
|
licenses:
|
94
95
|
- MIT
|
95
96
|
metadata: {}
|
96
|
-
post_install_message:
|
97
|
+
post_install_message:
|
97
98
|
rdoc_options: []
|
98
99
|
require_paths:
|
99
100
|
- lib
|
@@ -108,8 +109,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
108
109
|
- !ruby/object:Gem::Version
|
109
110
|
version: '0'
|
110
111
|
requirements: []
|
111
|
-
rubygems_version: 3.1.
|
112
|
-
signing_key:
|
112
|
+
rubygems_version: 3.1.4
|
113
|
+
signing_key:
|
113
114
|
specification_version: 4
|
114
115
|
summary: EJX Template Compiler
|
115
116
|
test_files: []
|