antlers 0.3.0 → 0.5.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 +8 -9
- data/lib/modules/props.rb +4 -7
- data/lib/modules/variables.rb +40 -11
- data/lib/nodes/for_node.rb +9 -4
- data/lib/nodes/prop_node.rb +4 -1
- data/lib/nodes/var_node.rb +2 -2
- data/lib/nodes/yield_node.rb +5 -1
- data/lib/{queries.rb → support/queries.rb} +1 -1
- data/lib/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 181c1f53191d4d32c458d74cc67b1d97082d0c023631b0af0fe726dc0db86d9e
|
|
4
|
+
data.tar.gz: 010ab20070af4634c783f2aa8573f8fa69be674bf96451df15e59f434cc8fa90
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d50a398b59defec9de55b59e45c3bd1b57d56f846221b6e00bbd080522909225f6a9e62cd6bc7326b30d60322faf30fbaecf41cada8ed04caa076bafc44be1d0
|
|
7
|
+
data.tar.gz: 4c8e9d78e0ee5ce5fbb6dcdb1c76e3ebd91f1c2600cd6accbb066cce81ccad9038aed99f65c6f3c28c99265dcfe7a95729bae02f07ca17283d81821153e7f9ae
|
|
@@ -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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative 'queries'
|
|
3
|
+
require_relative 'support/queries'
|
|
4
4
|
|
|
5
5
|
module Antlers
|
|
6
6
|
extend Queries
|
|
@@ -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:) || fallback(value)
|
|
34
31
|
end
|
|
35
32
|
|
|
36
33
|
evaluated_props
|
data/lib/modules/variables.rb
CHANGED
|
@@ -1,19 +1,48 @@
|
|
|
1
|
+
require_relative '../support/queries'
|
|
2
|
+
|
|
1
3
|
module Antlers
|
|
2
4
|
module Variables
|
|
3
|
-
|
|
5
|
+
extend Queries
|
|
6
|
+
|
|
7
|
+
# Evaluation limited to the following for security and to prevent a templating language becoming a programming language.
|
|
4
8
|
# 1. An instance variable
|
|
5
9
|
# 2. A method call/local variable
|
|
6
|
-
# 3. A
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
# 3. A method chain
|
|
11
|
+
# 4. A static string
|
|
12
|
+
def evaluate(name:, current_binding:)
|
|
13
|
+
return name.to_s unless current_binding
|
|
14
|
+
|
|
15
|
+
name, *chain = name.split('.')
|
|
16
|
+
|
|
17
|
+
result = method_var(name:, current_binding:)
|
|
18
|
+
return method_chain(result:, chain:, current_binding:) if chain.count > 0
|
|
19
|
+
return result if result
|
|
20
|
+
|
|
21
|
+
nil
|
|
22
|
+
rescue StandardError
|
|
23
|
+
nil
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def fallback(value)
|
|
27
|
+
return value[1..-2] if Queries.user_defined_string?(value)
|
|
13
28
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
29
|
+
value
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
private
|
|
33
|
+
|
|
34
|
+
def method_var(name:, current_binding:)
|
|
35
|
+
return current_binding.receiver.instance_variable_get(name) if name.start_with?('@')
|
|
36
|
+
return current_binding.local_variable_get(name) if current_binding.local_variable_defined?(name)
|
|
37
|
+
return current_binding.receiver.send(name.to_sym) if current_binding.receiver.respond_to?(name.to_sym)
|
|
38
|
+
|
|
39
|
+
nil
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def method_chain(result:, chain:, current_binding:)
|
|
43
|
+
chain.reduce(result) do |result, method_call|
|
|
44
|
+
result.send(method_call.to_sym)
|
|
45
|
+
end
|
|
17
46
|
end
|
|
18
47
|
end
|
|
19
48
|
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/prop_node.rb
CHANGED
|
@@ -12,7 +12,10 @@ module Antlers
|
|
|
12
12
|
event = create_render_event(props:)
|
|
13
13
|
|
|
14
14
|
renderable_klass = class_from_namespace(namespace: namespace&.split('::') || [], name: @name)
|
|
15
|
-
|
|
15
|
+
# TODO: There's currently 2 results for "Lowkey[renderable_klass.to_s]", this should not be.
|
|
16
|
+
# TODO: Only provide args that are defined, similar to how render_template does it.
|
|
17
|
+
initialize_method = Lowkey[renderable_klass.to_s].first[renderable_klass.to_s][:initialize]
|
|
18
|
+
renderable_instance = initialize_method ? renderable_klass.new(event:, **props) : renderable_klass.new(event:)
|
|
16
19
|
|
|
17
20
|
# Classes referenced via "<{ ChildNode }>" must implement class/instance render/render_template methods (See LowNode).
|
|
18
21
|
return renderable_instance.render_template(event:, parent_binding:, props:) if renderable_klass.template
|
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:) || fallback(@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/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.5.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
|
- - ">="
|
|
@@ -59,7 +59,7 @@ files:
|
|
|
59
59
|
- lib/nodes/var_node.rb
|
|
60
60
|
- lib/nodes/yield_node.rb
|
|
61
61
|
- lib/parser.rb
|
|
62
|
-
- lib/queries.rb
|
|
62
|
+
- lib/support/queries.rb
|
|
63
63
|
- lib/version.rb
|
|
64
64
|
homepage: https://codeberg.org/raindeer/antlers
|
|
65
65
|
licenses: []
|