antlers 0.3.0 → 0.4.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/lib/factories/node_factory.rb +2 -1
- data/lib/lexer.rb +7 -8
- data/lib/modules/props.rb +4 -7
- data/lib/modules/variables.rb +27 -8
- data/lib/nodes/for_node.rb +9 -4
- data/lib/nodes/var_node.rb +2 -2
- data/lib/nodes/yield_node.rb +5 -1
- data/lib/queries.rb +1 -1
- data/lib/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 581b3e4990e2c5279c26989e05e545f61a80a3fb8590c8a4bfd058878f2684f8
|
|
4
|
+
data.tar.gz: 5135d9c10a19fa9bb80c79694f998287c1dad614514a6d22c915cfc371d54b71
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4e85dd8fc504c21fe4c71f692203dc695fd60834e2f2f33185c1daf6edbf3e64c4c8eccf29710d899f5beab1c348cac1c9fe6a8350778b7563cd4d879cef78e2
|
|
7
|
+
data.tar.gz: 5b4853ba5e0d0749d4305c57923d6488ddcd5b05892aa2e274dd3683519ae85fcbd9a84b117e9c453a9b1ab256c814cd6f6d35b71db76935e30f0c86d17852ba
|
|
@@ -10,7 +10,8 @@ module Antlers
|
|
|
10
10
|
class NodeFactory
|
|
11
11
|
class << self
|
|
12
12
|
def for_node(segment:)
|
|
13
|
-
|
|
13
|
+
value, key, items = segment.values_at(:for_def, :key, :in)
|
|
14
|
+
ForNode.new(name: value, key:, value:, items:)
|
|
14
15
|
end
|
|
15
16
|
|
|
16
17
|
def prop_node(segment:)
|
data/lib/lexer.rb
CHANGED
|
@@ -67,12 +67,12 @@ module Antlers
|
|
|
67
67
|
end
|
|
68
68
|
|
|
69
69
|
def var?(segments:)
|
|
70
|
-
first,
|
|
70
|
+
first, _, last = segments[@cursor..@cursor + 3].map(&:strip)
|
|
71
71
|
first == '{' && last == '}'
|
|
72
72
|
end
|
|
73
73
|
|
|
74
74
|
def for_loop?(keywords:)
|
|
75
|
-
|
|
75
|
+
['for:', ':for'].include?(keywords.first)
|
|
76
76
|
end
|
|
77
77
|
|
|
78
78
|
def slot?(name)
|
|
@@ -89,19 +89,18 @@ module Antlers
|
|
|
89
89
|
|
|
90
90
|
def var(antlers_segment:)
|
|
91
91
|
# String is already interpolated or not depending on user input on the template layer, now we store it without those template quotes.
|
|
92
|
-
if Queries.user_defined_string?(antlers_segment)
|
|
93
|
-
antlers_segment = antlers_segment[1..-2]
|
|
94
|
-
end
|
|
92
|
+
antlers_segment = antlers_segment[1..-2] if Queries.user_defined_string?(antlers_segment)
|
|
95
93
|
|
|
96
94
|
{ var: antlers_segment }
|
|
97
95
|
end
|
|
98
96
|
|
|
99
97
|
def for_loop(keywords:)
|
|
100
|
-
key_values = keywords.count
|
|
98
|
+
key_values = keywords.count.even? ? keywords.each_slice(2).to_h : {}
|
|
101
99
|
|
|
102
100
|
if key_values['for:']
|
|
103
|
-
|
|
104
|
-
for_def
|
|
101
|
+
*key, value = key_values['for:'].split(',').map(&:strip)
|
|
102
|
+
for_def = { for_def: value, in: key_values['in:'] }
|
|
103
|
+
for_def[:key] = key.first unless key.empty?
|
|
105
104
|
return for_def
|
|
106
105
|
end
|
|
107
106
|
|
data/lib/modules/props.rb
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require 'low_event'
|
|
4
|
+
require_relative 'variables'
|
|
4
5
|
|
|
5
6
|
module Antlers
|
|
6
7
|
module Props
|
|
8
|
+
include Variables
|
|
9
|
+
|
|
7
10
|
attr_accessor :props
|
|
8
11
|
|
|
9
12
|
def initialize(name:, props: {}, **)
|
|
@@ -24,13 +27,7 @@ module Antlers
|
|
|
24
27
|
evaluated_props = {}
|
|
25
28
|
|
|
26
29
|
props.each do |name, value|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
if receiver.respond_to?(value.to_sym)
|
|
30
|
-
evaluated_props[name] = receiver.send(value.to_sym)
|
|
31
|
-
elsif value.start_with?('@')
|
|
32
|
-
evaluated_props[name] = receiver.instance_variable_get(value)
|
|
33
|
-
end
|
|
30
|
+
evaluated_props[name] = evaluate(name: value, current_binding:)
|
|
34
31
|
end
|
|
35
32
|
|
|
36
33
|
evaluated_props
|
data/lib/modules/variables.rb
CHANGED
|
@@ -1,19 +1,38 @@
|
|
|
1
1
|
module Antlers
|
|
2
2
|
module Variables
|
|
3
|
-
#
|
|
3
|
+
# Evaluation limited to the following for security and to prevent a templating language becoming a programming language.
|
|
4
4
|
# 1. An instance variable
|
|
5
5
|
# 2. A method call/local variable
|
|
6
|
-
# 3. A
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
6
|
+
# 3. A method chain
|
|
7
|
+
# 4. A static string
|
|
8
|
+
def evaluate(name:, current_binding:)
|
|
9
|
+
return @value.to_s unless current_binding
|
|
10
|
+
|
|
11
|
+
name, *chain = name.split('.')
|
|
12
|
+
|
|
13
|
+
result = method_var(name:, current_binding:)
|
|
14
|
+
return method_chain(result:, chain:, current_binding:) if chain.count > 0
|
|
15
|
+
return result if result
|
|
13
16
|
|
|
14
17
|
@value.to_s
|
|
15
18
|
rescue NameError
|
|
16
19
|
@value.to_s
|
|
17
20
|
end
|
|
21
|
+
|
|
22
|
+
private
|
|
23
|
+
|
|
24
|
+
def method_var(name:, current_binding:)
|
|
25
|
+
return current_binding.receiver.instance_variable_get(name) if name.start_with?('@')
|
|
26
|
+
return current_binding.local_variable_get(name) if current_binding.local_variable_defined?(name)
|
|
27
|
+
return current_binding.receiver.send(name.to_sym) if current_binding.receiver.respond_to?(name.to_sym)
|
|
28
|
+
|
|
29
|
+
nil
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def method_chain(result:, chain:, current_binding:)
|
|
33
|
+
chain.reduce(result) do |result, method_call|
|
|
34
|
+
result.send(method_call.to_sym)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
18
37
|
end
|
|
19
38
|
end
|
data/lib/nodes/for_node.rb
CHANGED
|
@@ -11,18 +11,23 @@ module Antlers
|
|
|
11
11
|
|
|
12
12
|
attr_accessor :children
|
|
13
13
|
|
|
14
|
-
def initialize(name:,
|
|
14
|
+
def initialize(name:, items:, value:, key: nil, props: [], children: [])
|
|
15
15
|
super(name:, props:, children:)
|
|
16
16
|
|
|
17
|
-
@item = item
|
|
18
17
|
@items = items
|
|
18
|
+
@value = value
|
|
19
|
+
@key = key
|
|
19
20
|
end
|
|
20
21
|
|
|
21
22
|
def render(current_binding: nil, parent_binding: nil, slot_node: nil, namespace: nil)
|
|
22
23
|
output = ''
|
|
23
24
|
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
evaluate(name: @items, current_binding:).each do |value|
|
|
26
|
+
key, value = value if @key
|
|
27
|
+
|
|
28
|
+
# TODO: Parallelize by creating new bindings and ensuring children have any args they need via RenderEvent.
|
|
29
|
+
current_binding.local_variable_set(@value, value)
|
|
30
|
+
current_binding.local_variable_set(@key, key) if @key
|
|
26
31
|
|
|
27
32
|
@children.each do |child|
|
|
28
33
|
# Antlers nodes respond to "render", whereas HTML is stored as a string and output as is.
|
data/lib/nodes/var_node.rb
CHANGED
|
@@ -11,14 +11,14 @@ module Antlers
|
|
|
11
11
|
|
|
12
12
|
attr_reader :value
|
|
13
13
|
|
|
14
|
-
def initialize(name: :var
|
|
14
|
+
def initialize(value:, name: :var)
|
|
15
15
|
super(name:)
|
|
16
16
|
|
|
17
17
|
@value = value
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
def render(current_binding: nil, parent_binding: nil, slot_node: nil, namespace: nil)
|
|
21
|
-
ERB::Util.html_escape(
|
|
21
|
+
ERB::Util.html_escape(evaluate(name: @value, current_binding:) || @value)
|
|
22
22
|
end
|
|
23
23
|
end
|
|
24
24
|
end
|
data/lib/nodes/yield_node.rb
CHANGED
|
@@ -14,7 +14,11 @@ module Antlers
|
|
|
14
14
|
|
|
15
15
|
slot_node.children.each do |child|
|
|
16
16
|
# Antlers nodes respond to "render", whereas HTML is stored as a string and output as is.
|
|
17
|
-
|
|
17
|
+
if child.respond_to?(:render) # rubocop:disable Style/ConditionalAssignment
|
|
18
|
+
output += child.render(current_binding: parent_binding, parent_binding: nil, slot_node: nil, namespace:)
|
|
19
|
+
else
|
|
20
|
+
output += child || ''
|
|
21
|
+
end
|
|
18
22
|
end
|
|
19
23
|
|
|
20
24
|
output
|
data/lib/queries.rb
CHANGED
data/lib/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: antlers
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.4.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- maedi
|
|
@@ -10,7 +10,7 @@ cert_chain: []
|
|
|
10
10
|
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
11
|
dependencies:
|
|
12
12
|
- !ruby/object:Gem::Dependency
|
|
13
|
-
name:
|
|
13
|
+
name: erb
|
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
|
15
15
|
requirements:
|
|
16
16
|
- - ">="
|
|
@@ -24,7 +24,7 @@ dependencies:
|
|
|
24
24
|
- !ruby/object:Gem::Version
|
|
25
25
|
version: '0'
|
|
26
26
|
- !ruby/object:Gem::Dependency
|
|
27
|
-
name:
|
|
27
|
+
name: low_event
|
|
28
28
|
requirement: !ruby/object:Gem::Requirement
|
|
29
29
|
requirements:
|
|
30
30
|
- - ">="
|