tzispa_rig 0.5.0 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -0
- data/lib/tzispa/rig/binder.rb +57 -38
- data/lib/tzispa/rig/engine.rb +14 -20
- data/lib/tzispa/rig/parameters.rb +9 -11
- data/lib/tzispa/rig/parsernext.rb +54 -51
- data/lib/tzispa/rig/syntax.rb +7 -6
- data/lib/tzispa/rig/template.rb +48 -44
- data/lib/tzispa/rig/token.rb +8 -24
- data/lib/tzispa/rig/type_token/api_url.rb +28 -29
- data/lib/tzispa/rig/type_token/block.rb +46 -44
- data/lib/tzispa/rig/type_token/expression.rb +11 -15
- data/lib/tzispa/rig/type_token/statement.rb +35 -23
- data/lib/tzispa/rig/version.rb +1 -1
- data/test/parsernext_test.rb +4 -4
- data/test/res/apps/test_domain/view/_/layout/index.rig.txt +1 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b0ee09cd6bcb8f16477ec4472fe2442599db939d
|
4
|
+
data.tar.gz: a168edea1da7db3d372b37ca97bbbb58b6adb3ef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 272a50312a02d4455a1701d12a27270fc01523ee03cd61c85fbd7609875671bbf5885f9c942f96b5f825e131174886cefcec3813e82db66b5a13bdf7a5f3c0d6
|
7
|
+
data.tar.gz: d67f6a12863368644c24a2988e223972ffe5ce6c20cfe0d7632369096f6f1e5d1865e469c6afc57a6e10dc532d0561c8668d8e3c3e0f4342c2339dcd08bd616a
|
data/CHANGELOG.md
CHANGED
data/lib/tzispa/rig/binder.rb
CHANGED
@@ -5,25 +5,43 @@ require 'forwardable'
|
|
5
5
|
module Tzispa
|
6
6
|
module Rig
|
7
7
|
|
8
|
+
class UnknownTag < NameError
|
9
|
+
def initialize(name, tag)
|
10
|
+
super "#{name} there isn't any loop tagged '#{tag}'"
|
11
|
+
end
|
12
|
+
end
|
8
13
|
|
9
|
-
class
|
10
|
-
|
14
|
+
class DuplicatedLoop < StandardError
|
15
|
+
def initialize(name, loop_id)
|
16
|
+
super "#{name} there are many loops tagged '#{loop_id}' only 1 allowed at the same level"
|
17
|
+
end
|
18
|
+
end
|
11
19
|
|
20
|
+
class IsnotTemplateBinder < ArgumentError
|
21
|
+
def initialize(name)
|
22
|
+
super "Class #{name} isn't a TemplateBinder"
|
23
|
+
end
|
24
|
+
end
|
12
25
|
|
13
26
|
class Binder
|
14
27
|
extend Forwardable
|
15
28
|
|
16
29
|
attr_reader :context, :data_struct, :parser
|
17
30
|
def_delegators :@parser, :attribute_tags
|
18
|
-
def_delegators :@context, :app, :request, :response,
|
31
|
+
def_delegators :@context, :app, :request, :response,
|
32
|
+
:session, :router_params, :cache
|
19
33
|
def_delegators :app, :repository, :config, :logger
|
20
|
-
alias :tags :attribute_tags
|
21
34
|
|
35
|
+
alias tags attribute_tags
|
22
36
|
|
23
37
|
def initialize(parser, context)
|
24
38
|
@parser = parser
|
25
39
|
@context = context
|
26
|
-
@data_struct = attribute_tags.count
|
40
|
+
@data_struct = if attribute_tags.count.positive?
|
41
|
+
Struct.new(*attribute_tags)
|
42
|
+
else
|
43
|
+
Struct.new(nil)
|
44
|
+
end
|
27
45
|
end
|
28
46
|
|
29
47
|
# Gets a LoopBinder context for the given loop_id in a rig template
|
@@ -39,7 +57,7 @@ module Tzispa
|
|
39
57
|
# The LoopBinder returned by this funcion is independent of the
|
40
58
|
# parent binder where it is defined, so the template symbols of the parent
|
41
59
|
# binder are not accesible in the loop_binder context. In
|
42
|
-
# other words, in the top example the two 'myvar' symbols are different
|
60
|
+
# other words, in the top example the two 'myvar' symbols are different
|
43
61
|
# and you can not access the first myvar value inside the loop
|
44
62
|
#
|
45
63
|
# ==== Parameters
|
@@ -47,19 +65,25 @@ module Tzispa
|
|
47
65
|
#
|
48
66
|
def loop_binder(loop_id)
|
49
67
|
loop_parser = @parser.loop_parser loop_id
|
50
|
-
|
51
|
-
|
68
|
+
unknown? loop_parser
|
69
|
+
duplicated? loop_parser
|
52
70
|
LoopBinder.new loop_parser[0], @context
|
53
71
|
end
|
54
72
|
|
55
73
|
def attr_cache(*attrs)
|
56
|
-
attrs.each { |attrib|
|
57
|
-
cache[attrib] = send(attrib) if respond_to?(attrib)
|
58
|
-
}
|
74
|
+
attrs.each { |attrib| cache[attrib] = send(attrib) if respond_to?(attrib) }
|
59
75
|
end
|
60
76
|
|
61
|
-
|
77
|
+
private
|
78
|
+
|
79
|
+
def unknown?(loop_parser)
|
80
|
+
raise UnknownTag.new(self.class.name, loop_parser.id) unless loop_parser.count.positive?
|
81
|
+
end
|
62
82
|
|
83
|
+
def duplicated?(loop_parser)
|
84
|
+
raise DuplicatedLoop.new(self.class.name, loop_parser.id) unless loop_parser.count == 1
|
85
|
+
end
|
86
|
+
end
|
63
87
|
|
64
88
|
class TemplateBinder < Binder
|
65
89
|
extend Forwardable
|
@@ -67,7 +91,6 @@ module Tzispa
|
|
67
91
|
attr_reader :template
|
68
92
|
def_delegators :@template, :params
|
69
93
|
|
70
|
-
|
71
94
|
def initialize(template, context)
|
72
95
|
super(template.parser, context)
|
73
96
|
@template = template
|
@@ -78,65 +101,61 @@ module Tzispa
|
|
78
101
|
end
|
79
102
|
|
80
103
|
def attach(**params)
|
81
|
-
data.tap
|
82
|
-
params.each
|
83
|
-
raise UnknownTag.new
|
104
|
+
data.tap do |d|
|
105
|
+
params.each do |k, v|
|
106
|
+
raise UnknownTag.new(self.class.name, k) unless tags.include? k
|
84
107
|
d[k] = v
|
85
|
-
|
86
|
-
|
108
|
+
end
|
109
|
+
end
|
87
110
|
end
|
88
111
|
|
89
112
|
def self.for(template, context)
|
90
113
|
if template.bindable?
|
91
114
|
binder_class = template.binder_class
|
92
|
-
binder_class
|
93
|
-
raise
|
94
|
-
|
115
|
+
binder_class&.new(template, context)&.tap do |binder|
|
116
|
+
raise IsnotTemplateBinder(binder_class.name) unless binder.is_a? TemplateBinder
|
117
|
+
end
|
95
118
|
else
|
96
|
-
|
119
|
+
new(template, context)
|
97
120
|
end
|
98
121
|
end
|
99
|
-
|
100
122
|
end
|
101
123
|
|
102
|
-
|
103
124
|
class LoopBinder < Binder
|
104
|
-
|
105
125
|
attr_reader :data
|
106
126
|
|
107
127
|
def bind!(&generator)
|
108
|
-
@source_object = eval
|
128
|
+
@source_object = eval 'self', generator.binding
|
109
129
|
@data = instance_eval(&generator).to_enum(:each)
|
110
130
|
self
|
111
131
|
end
|
112
132
|
|
113
133
|
def method_missing(method, *args, &generator)
|
114
|
-
@source_object.send
|
134
|
+
@source_object.send(method, *args, &generator)
|
115
135
|
end
|
116
136
|
|
117
|
-
def
|
118
|
-
(
|
119
|
-
params.each{ |k,v|
|
120
|
-
raise UnknownTag.new "#{k} is not a tag in #{self.class.name}" unless tags.include? k
|
121
|
-
item.data[k] = v
|
122
|
-
} if params
|
123
|
-
}
|
137
|
+
def respond_to_missing?(method, *)
|
138
|
+
@source_object.respond_to?(method)
|
124
139
|
end
|
125
140
|
|
141
|
+
def loop_item(params = nil)
|
142
|
+
(LoopItem.new self).tap do |item|
|
143
|
+
params&.each do |k, v|
|
144
|
+
raise UnknownTag(self.class.name, k) unless tags.include? k
|
145
|
+
item.data[k] = v
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
126
149
|
end
|
127
150
|
|
128
|
-
|
129
151
|
class LoopItem
|
130
|
-
|
131
152
|
attr_reader :context, :data
|
132
153
|
|
133
154
|
def initialize(binder)
|
134
155
|
@context = binder.context
|
135
156
|
@data = binder.data_struct.new
|
136
157
|
end
|
137
|
-
|
138
158
|
end
|
139
159
|
|
140
|
-
|
141
160
|
end
|
142
161
|
end
|
data/lib/tzispa/rig/engine.rb
CHANGED
@@ -10,52 +10,44 @@ module Tzispa
|
|
10
10
|
class Engine
|
11
11
|
include Singleton
|
12
12
|
|
13
|
-
|
14
|
-
|
13
|
+
@cache_size = 512
|
14
|
+
@cache_ttl = 600
|
15
15
|
|
16
16
|
def initialize
|
17
|
-
@cache = LruRedux::TTL::ThreadSafeCache.new(
|
17
|
+
@cache = LruRedux::TTL::ThreadSafeCache.new(Engine.cache_size, Engine.cache_ttl)
|
18
18
|
end
|
19
19
|
|
20
20
|
class << self
|
21
|
+
attr_accessor :cache_size, :cache_ttl
|
21
22
|
|
22
23
|
def empty
|
23
24
|
TemplateBase.new
|
24
25
|
end
|
25
26
|
|
26
|
-
def layout(name:, domain:, content_type:, params:nil)
|
27
|
+
def layout(name:, domain:, content_type:, params: nil)
|
27
28
|
rig_template name, domain, :layout, content_type, params
|
28
29
|
end
|
29
30
|
|
30
|
-
def block(name:, domain:, content_type:, params:nil)
|
31
|
+
def block(name:, domain:, content_type:, params: nil)
|
31
32
|
rig_template name, domain, :block, content_type, params
|
32
33
|
end
|
33
34
|
|
34
|
-
def static(name:, domain:, content_type:, params:nil)
|
35
|
+
def static(name:, domain:, content_type:, params: nil)
|
35
36
|
rig_template name, domain, :static, content_type, params
|
36
37
|
end
|
37
38
|
|
38
39
|
def rig_template(name, domain, block_type, content_type, params)
|
39
40
|
instance.send(:cache_template, name, domain, block_type, content_type, params)
|
40
41
|
end
|
41
|
-
|
42
|
-
def cache_size=(sz)
|
43
|
-
@@cache_size = sz
|
44
|
-
end
|
45
|
-
|
46
|
-
def cache_ttl=(seconds)
|
47
|
-
@@cache_ttl = seconds
|
48
|
-
end
|
49
|
-
|
50
42
|
end
|
51
43
|
|
52
44
|
private
|
53
45
|
|
54
46
|
def cache_template(name, domain, block_type, content_type, params)
|
55
47
|
key = "#{domain}/#{block_type}/#{name}/#{content_type}".to_sym
|
56
|
-
get_template(key, name, domain, block_type, content_type).dup.tap
|
57
|
-
|
58
|
-
|
48
|
+
get_template(key, name, domain, block_type, content_type).dup.tap do |ctpl|
|
49
|
+
ctpl.params = params if params
|
50
|
+
end
|
59
51
|
end
|
60
52
|
|
61
53
|
def get_template(key, name, domain, block_type, content_type)
|
@@ -67,9 +59,11 @@ module Tzispa
|
|
67
59
|
end
|
68
60
|
|
69
61
|
def set_template(key, name, domain, block_type, content_type)
|
70
|
-
@cache[key] = Template.new(name: name,
|
62
|
+
@cache[key] = Template.new(name: name,
|
63
|
+
type: block_type,
|
64
|
+
domain: domain,
|
65
|
+
content_type: content_type).load!.parse!
|
71
66
|
end
|
72
|
-
|
73
67
|
end
|
74
68
|
|
75
69
|
end
|
@@ -4,14 +4,13 @@ module Tzispa
|
|
4
4
|
module Rig
|
5
5
|
|
6
6
|
class Parameters
|
7
|
-
|
8
7
|
attr_reader :inner, :outer
|
9
8
|
|
10
|
-
def initialize(params=nil, outer=',', inner='=')
|
11
|
-
@data =
|
9
|
+
def initialize(params = nil, outer = ',', inner = '=')
|
10
|
+
@data = {}
|
12
11
|
@outer = outer
|
13
12
|
@inner = inner
|
14
|
-
|
13
|
+
load(params) if params
|
15
14
|
end
|
16
15
|
|
17
16
|
def [](key)
|
@@ -27,29 +26,28 @@ module Tzispa
|
|
27
26
|
end
|
28
27
|
|
29
28
|
def to_s
|
30
|
-
@data.map { |k,v| "#{k}#{inner}#{v}" }.join(outer)
|
29
|
+
@data.map { |k, v| "#{k}#{inner}#{v}" }.join(outer)
|
31
30
|
end
|
32
31
|
|
33
32
|
def to_h
|
34
33
|
@data.dup
|
35
34
|
end
|
36
35
|
|
37
|
-
|
36
|
+
alias data to_h
|
38
37
|
|
39
38
|
def merge(params)
|
40
|
-
|
39
|
+
load(params)
|
41
40
|
end
|
42
41
|
|
43
42
|
private
|
44
43
|
|
45
|
-
def
|
44
|
+
def load(params)
|
46
45
|
params.split(outer).each do |param|
|
47
|
-
key,value = param.split(inner)
|
46
|
+
key, value = param.split(inner)
|
48
47
|
@data[key.to_sym] = value
|
49
48
|
end
|
50
49
|
end
|
51
|
-
|
52
|
-
|
53
50
|
end
|
51
|
+
|
54
52
|
end
|
55
53
|
end
|
@@ -6,35 +6,43 @@ module Tzispa
|
|
6
6
|
module Rig
|
7
7
|
|
8
8
|
class ParserNext
|
9
|
-
|
10
9
|
EMPTY_STRING = ''
|
11
10
|
|
12
11
|
include Tzispa::Rig::Syntax
|
13
12
|
|
14
|
-
attr_reader :flags, :template, :tokens, :domain, :format,
|
15
|
-
:
|
13
|
+
attr_reader :flags, :template, :tokens, :domain, :format,
|
14
|
+
:childrens, :content_type, :inner_text
|
16
15
|
|
17
|
-
def initialize(
|
16
|
+
def initialize(opts = {})
|
18
17
|
@parsed = false
|
19
|
-
@template = template
|
20
|
-
@inner_text = (text || template&.content)&.dup
|
21
|
-
|
22
|
-
@
|
23
|
-
@
|
24
|
-
@
|
18
|
+
@template = opts[:template] if opts.key?(:template)
|
19
|
+
@inner_text = (opts[:text] || template&.content)&.dup
|
20
|
+
parent = opts[:parent]
|
21
|
+
@domain = opts[:domain] || parent.domain
|
22
|
+
@bindable = opts.key?(:bindable) ? opts[:bindable] : parent.bindable?
|
23
|
+
@content_type = opts[:content_type] || parent.content_type
|
25
24
|
end
|
26
25
|
|
27
26
|
def empty?
|
28
27
|
@tokens.empty?
|
29
28
|
end
|
30
29
|
|
30
|
+
def bindable?
|
31
|
+
@bindable
|
32
|
+
end
|
33
|
+
|
34
|
+
def parsed?
|
35
|
+
@parsed
|
36
|
+
end
|
37
|
+
|
31
38
|
def parse!
|
32
39
|
unless parsed?
|
33
|
-
@attribute_tags
|
34
|
-
@childrens =
|
35
|
-
@tokens =
|
40
|
+
@attribute_tags = nil
|
41
|
+
@childrens = []
|
42
|
+
@tokens = []
|
43
|
+
@loop_parser = {}
|
36
44
|
parse_flags
|
37
|
-
if bindable
|
45
|
+
if bindable?
|
38
46
|
parse_statements
|
39
47
|
parse_expressions
|
40
48
|
parse_url_builder
|
@@ -45,86 +53,81 @@ module Tzispa
|
|
45
53
|
self
|
46
54
|
end
|
47
55
|
|
48
|
-
def
|
49
|
-
@
|
56
|
+
def content_escape_method
|
57
|
+
@content_escape_method ||= :"escape_#{content_type}"
|
50
58
|
end
|
51
59
|
|
52
60
|
def render(binder)
|
53
|
-
@inner_text.dup.tap
|
54
|
-
@tokens.each { |value|
|
55
|
-
|
56
|
-
}
|
57
|
-
}.freeze
|
61
|
+
@inner_text.dup.tap do |text|
|
62
|
+
@tokens.each { |value| text.gsub! value.anchor, value.render(binder) }
|
63
|
+
end.freeze
|
58
64
|
end
|
59
65
|
|
60
66
|
def attribute_tags
|
61
|
-
@
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
67
|
+
@at_tags ||= begin
|
68
|
+
att = tokens.select { |tk| tk.respond_to? :id }
|
69
|
+
att = att.map { |p| p.id.to_sym }
|
70
|
+
att.concat(
|
71
|
+
tokens.map { |p| p.attribute_tags if p.type == :ife }
|
72
|
+
).compact.flatten.uniq.freeze
|
73
|
+
end
|
68
74
|
end
|
69
75
|
|
70
76
|
def loop_parser(id)
|
71
|
-
tokens.select{ |p|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|p| p.loop_parser(id)
|
77
|
-
}.flatten.compact
|
77
|
+
lpp = tokens.select { |p| p.type == :loop && p.id == id }
|
78
|
+
lpp.concat(
|
79
|
+
tokens.select { |p| p.type == :ife }.map do |p|
|
80
|
+
p.loop_parser(id)
|
81
|
+
end.flatten.compact
|
78
82
|
)
|
79
83
|
end
|
80
84
|
|
81
85
|
private
|
82
86
|
|
83
87
|
def parse_flags
|
84
|
-
while match = @inner_text.match
|
88
|
+
while (match = @inner_text.match RIG_EMPTY[:flags])
|
85
89
|
@flags = Regexp.last_match(1)
|
86
90
|
@inner_text.gsub! match[0], ''
|
87
91
|
end
|
88
92
|
end
|
89
93
|
|
90
94
|
def parse_url_builder
|
91
|
-
RIG_URL_BUILDER.each_key
|
92
|
-
while match = @inner_text.match
|
93
|
-
tk = Token.instance(self, kre, match
|
95
|
+
RIG_URL_BUILDER.each_key do |kre|
|
96
|
+
while (match = @inner_text.match RIG_URL_BUILDER[kre])
|
97
|
+
tk = Token.instance(self, kre, match)
|
94
98
|
@tokens << tk
|
95
99
|
@inner_text.gsub! match[0], tk.anchor
|
96
100
|
end
|
97
|
-
|
101
|
+
end
|
98
102
|
end
|
99
103
|
|
100
104
|
def parse_expressions
|
101
|
-
RIG_EXPRESSIONS.each
|
102
|
-
while match = @inner_text.match
|
103
|
-
tk = Token.instance(self, kre, match
|
105
|
+
RIG_EXPRESSIONS.each do |kre, re|
|
106
|
+
while (match = @inner_text.match re)
|
107
|
+
tk = Token.instance(self, kre, match)
|
104
108
|
@tokens << tk
|
105
109
|
@inner_text.gsub! match[0], tk.anchor
|
106
110
|
end
|
107
|
-
|
111
|
+
end
|
108
112
|
end
|
109
113
|
|
110
114
|
def parse_statements
|
111
|
-
while match = @inner_text.match
|
112
|
-
type =
|
113
|
-
tk = Token.instance(self, type.to_sym, match
|
115
|
+
while (match = @inner_text.match RIG_STATEMENTS)
|
116
|
+
type = String.new << (match[2] || match[6])
|
117
|
+
tk = Token.instance(self, type.to_sym, match)
|
114
118
|
@tokens << tk.parse!
|
115
119
|
@inner_text.gsub! match[0], tk.anchor
|
116
120
|
end
|
117
121
|
end
|
118
122
|
|
119
123
|
def parse_templates
|
120
|
-
while match = @inner_text.match
|
121
|
-
type = (match[2] ||
|
122
|
-
tk = Token.instance(self, type.to_sym, match
|
124
|
+
while (match = @inner_text.match RIG_TEMPLATES)
|
125
|
+
type = String.new << (match[2] || match[6] || match[13])
|
126
|
+
tk = Token.instance(self, type.to_sym, match)
|
123
127
|
@tokens << tk.parse!
|
124
128
|
@inner_text.gsub! match[0], tk.anchor
|
125
129
|
end
|
126
130
|
end
|
127
|
-
|
128
131
|
end
|
129
132
|
|
130
133
|
end
|
data/lib/tzispa/rig/syntax.rb
CHANGED
@@ -1,26 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Tzispa
|
2
4
|
module Rig
|
3
5
|
module Syntax
|
4
6
|
|
5
7
|
RIG_EMPTY = {
|
6
|
-
:
|
8
|
+
flags: /<flags:(\[(\w+=[^,\]]+(,\w+=[^,\]]+)*?)\])\/>/
|
7
9
|
}.freeze
|
8
10
|
|
9
11
|
RIG_EXPRESSIONS = {
|
10
|
-
:
|
11
|
-
:
|
12
|
+
meta: /\{%([^%]+?)%\}/,
|
13
|
+
var: /<var(\[%[A-Z]?[0-9]*[a-z]\])?:(\w+)\/>/
|
12
14
|
}.freeze
|
13
15
|
|
14
16
|
RIG_URL_BUILDER = {
|
15
|
-
:
|
16
|
-
:
|
17
|
+
url: /<(url|purl)(#\w+)?:([^\[\@\/]+(?:\@[^\[\/]+)?)(\[(\w+=[^,\]]+(,\w+=[^,\]]+)*?)\])?\/>/,
|
18
|
+
api: /<(api|sapi)(#\w+)?:([^:\@]+(?:\@[^:]+)?):([^:\/]+)(?::([^:\/]+))?(?::([^\/]+))?\/>/
|
17
19
|
}.freeze
|
18
20
|
|
19
21
|
RIG_STATEMENTS = /(<(loop):(\w+)>(.*?)<\/loop:\3>)|(<(ife):(\w+)>(.*?)(<else:\7\/>(.*?))?<\/ife:\7>)/m
|
20
22
|
|
21
23
|
RIG_TEMPLATES = /(<(blk):(\w+(?:@\w+)?)(?:\[(\w+=[^,\]]+(?:,\w+=[^,\]]+)*)\])?\/>)|(<(iblk):(\w+):(\w+(?:@\w+)?)(?:\[(\w+=[^,\]]+(?:,\w+=[^,\]]+)*)\])?:(\w+(?:@\w+)?)(?:\[(\w+=[^,\]]+(?:,\w+=[^,\]]+)*)\])?\/>)|(<(static):(\w+(?:@\w+)?)(?:\[(\w+=[^,\]]+(?:,\w+=[^,\]]+)*)\])?\/>)/
|
22
24
|
|
23
|
-
|
24
25
|
end
|
25
26
|
end
|
26
27
|
end
|
data/lib/tzispa/rig/template.rb
CHANGED
@@ -4,16 +4,26 @@ require 'forwardable'
|
|
4
4
|
require 'fileutils'
|
5
5
|
require 'tzispa/utils/string'
|
6
6
|
require 'tzispa/utils/indenter'
|
7
|
+
require 'tzispa/rig/parameters'
|
8
|
+
require 'tzispa/rig/parsernext'
|
9
|
+
require 'tzispa/rig/binder'
|
7
10
|
|
8
11
|
module Tzispa
|
9
12
|
module Rig
|
10
13
|
|
11
|
-
class NotFound < NameError
|
14
|
+
class NotFound < NameError
|
15
|
+
def initialize(filename)
|
16
|
+
super "Template file '#{filename}' not found"
|
17
|
+
end
|
18
|
+
end
|
12
19
|
|
13
|
-
class ReadError < IOError
|
20
|
+
class ReadError < IOError
|
21
|
+
def initialize(file)
|
22
|
+
super "Template file '#{file}' could not be read"
|
23
|
+
end
|
24
|
+
end
|
14
25
|
|
15
26
|
class TemplateBase
|
16
|
-
|
17
27
|
attr_reader :content
|
18
28
|
|
19
29
|
def initialize
|
@@ -41,14 +51,12 @@ module Tzispa
|
|
41
51
|
self
|
42
52
|
end
|
43
53
|
|
44
|
-
def render(
|
45
|
-
|
54
|
+
def render(_context, _binder = nil)
|
55
|
+
''
|
46
56
|
end
|
47
|
-
|
48
57
|
end
|
49
58
|
|
50
59
|
class File < TemplateBase
|
51
|
-
|
52
60
|
attr_reader :filename, :encoding
|
53
61
|
|
54
62
|
def initialize(name, encoding: 'UTF-8')
|
@@ -67,33 +75,27 @@ module Tzispa
|
|
67
75
|
end
|
68
76
|
|
69
77
|
def load!
|
70
|
-
raise NotFound.new(
|
71
|
-
::File.open(filename, "r:#{encoding}")
|
78
|
+
raise Tzispa::Rig::NotFound.new(filename) unless exist?
|
79
|
+
::File.open(filename, "r:#{encoding}") do |f|
|
72
80
|
@content = String.new
|
73
81
|
@modified = f.mtime
|
74
|
-
f.each { |line|
|
75
|
-
@content << line
|
76
|
-
}
|
82
|
+
f.each { |line| @content << line }
|
77
83
|
@loaded = true
|
78
|
-
|
84
|
+
end
|
79
85
|
self
|
80
86
|
rescue Errno::ENOENT
|
81
|
-
raise ReadError.new
|
87
|
+
raise Tzispa::Rig::ReadError.new(@file)
|
82
88
|
end
|
83
89
|
|
84
|
-
def create(content=nil)
|
85
|
-
::File.open(filename, "w:#{encoding}") { |f|
|
86
|
-
f.puts content
|
87
|
-
}
|
90
|
+
def create(content = nil)
|
91
|
+
::File.open(filename, "w:#{encoding}") { |f| f.puts content }
|
88
92
|
end
|
89
|
-
|
90
93
|
end
|
91
94
|
|
92
|
-
|
93
95
|
class Template < File
|
94
96
|
extend Forwardable
|
95
97
|
|
96
|
-
using Tzispa::Utils
|
98
|
+
using Tzispa::Utils::TzString
|
97
99
|
|
98
100
|
BASIC_TYPES = [:layout, :block, :static].freeze
|
99
101
|
RIG_EXTENSION = 'rig'
|
@@ -103,10 +105,7 @@ module Tzispa
|
|
103
105
|
|
104
106
|
def initialize(name:, type:, domain:, content_type:, params: nil)
|
105
107
|
@id = name
|
106
|
-
name
|
107
|
-
@subdomain = sdn.length > 1 ? sdn.first : nil
|
108
|
-
@name = sdn.last
|
109
|
-
}
|
108
|
+
build_name name
|
110
109
|
@domain = domain
|
111
110
|
@content_type = content_type
|
112
111
|
@params = Parameters.new(params)
|
@@ -115,22 +114,23 @@ module Tzispa
|
|
115
114
|
end
|
116
115
|
|
117
116
|
def parse!
|
118
|
-
@parser = ParserNext.new
|
117
|
+
@parser = ParserNext.new template: self,
|
118
|
+
domain: domain,
|
119
|
+
content_type: content_type,
|
120
|
+
bindable: bindable?
|
119
121
|
parser.parse!
|
120
122
|
self
|
121
123
|
end
|
122
124
|
|
123
125
|
def modified?
|
124
|
-
super || (parser && parser.childrens.index
|
125
|
-
tpl.modified?
|
126
|
-
})
|
126
|
+
super || (parser && parser.childrens.index(&:modified?))
|
127
127
|
end
|
128
128
|
|
129
129
|
def valid?
|
130
130
|
!content.empty? && !parser.empty?
|
131
131
|
end
|
132
132
|
|
133
|
-
def render(context, binder=nil)
|
133
|
+
def render(context, binder = nil)
|
134
134
|
parse! unless parser
|
135
135
|
binder ||= TemplateBinder.for self, context
|
136
136
|
binder.bind! if binder&.respond_to?(:bind!)
|
@@ -141,7 +141,7 @@ module Tzispa
|
|
141
141
|
@path ||= "#{domain.path}/view/#{subdomain || '_'}/#{type.to_s.downcase}"
|
142
142
|
end
|
143
143
|
|
144
|
-
def create(content='')
|
144
|
+
def create(content = '')
|
145
145
|
FileUtils.mkdir_p(path) unless Dir.exist? path
|
146
146
|
super(content)
|
147
147
|
create_binder
|
@@ -192,38 +192,42 @@ module Tzispa
|
|
192
192
|
|
193
193
|
private
|
194
194
|
|
195
|
+
def build_name(name)
|
196
|
+
name.to_s.downcase.split('@').tap do |sdn|
|
197
|
+
@subdomain = sdn.first if sdn.length > 1
|
198
|
+
@name = sdn.last
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
195
202
|
def type=(value)
|
196
|
-
raise ArgumentError
|
203
|
+
raise ArgumentError("#{value} is not a Rig block") unless BASIC_TYPES.include?(value)
|
197
204
|
@type = value
|
198
205
|
end
|
199
206
|
|
200
207
|
def create_binder
|
201
|
-
|
208
|
+
return unless [:block, :layout].include?(type)
|
209
|
+
::File.open("#{domain.path}/#{binder_require}.rb", 'w') do |f|
|
202
210
|
f.puts write_binder_code
|
203
|
-
|
211
|
+
end
|
204
212
|
end
|
205
213
|
|
206
214
|
def write_binder_code
|
207
|
-
Tzispa::Utils::Indenter.new(2).tap
|
215
|
+
Tzispa::Utils::Indenter.new(2).tap do |binder_code|
|
208
216
|
binder_code << "require 'tzispa/rig/binder'\n\n"
|
209
217
|
level = 0
|
210
|
-
binder_namespace.split('::').each
|
211
|
-
binder_code.indent if level
|
218
|
+
binder_namespace.split('::').each do |ns|
|
219
|
+
binder_code.indent if level.positive?
|
212
220
|
binder_code << "module #{ns}\n"
|
213
221
|
level += 1
|
214
|
-
|
222
|
+
end
|
215
223
|
binder_code.indent << "\nclass #{binder_class_name} < Tzispa::Rig::TemplateBinder\n\n"
|
216
224
|
binder_code.indent << "def bind!\n"
|
217
225
|
binder_code << "end\n\n"
|
218
226
|
binder_code.unindent << "end\n"
|
219
|
-
binder_namespace.split('::').each {
|
220
|
-
|
221
|
-
}
|
222
|
-
}.to_s
|
227
|
+
binder_namespace.split('::').each { binder_code.unindent << "end\n" }
|
228
|
+
end.to_s
|
223
229
|
end
|
224
|
-
|
225
230
|
end
|
226
231
|
|
227
|
-
|
228
232
|
end
|
229
233
|
end
|
data/lib/tzispa/rig/token.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'forwardable'
|
4
|
+
require 'tzispa/utils/string'
|
4
5
|
|
5
6
|
module Tzispa
|
6
7
|
module Rig
|
@@ -8,6 +9,8 @@ module Tzispa
|
|
8
9
|
class Token
|
9
10
|
extend Forwardable
|
10
11
|
|
12
|
+
using Tzispa::Utils::TzString
|
13
|
+
|
11
14
|
RE_ANCHOR = /(\$\$\h+\$\$)/
|
12
15
|
|
13
16
|
attr_reader :type, :parser
|
@@ -18,33 +21,15 @@ module Tzispa
|
|
18
21
|
@type = type
|
19
22
|
end
|
20
23
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
TypeToken::Meta.new parser, type, match[1]
|
25
|
-
when :var
|
26
|
-
TypeToken::Var.new parser, type, match[1], match[2]
|
27
|
-
when :url
|
28
|
-
TypeToken::Url.new parser, match[1].to_sym, match[3], match[5], match[2]&.slice(1..-1)
|
29
|
-
when :api
|
30
|
-
TypeToken::Api.new parser, match[1].to_sym, match[3], match[4], match[5], match[6], match[2]&.slice(1..-1)
|
31
|
-
when :loop
|
32
|
-
TypeToken::Loop.new parser, type, match[3], match[4]
|
33
|
-
when :ife
|
34
|
-
TypeToken::Ife.new parser, type, match[7], match[8], match[10]
|
35
|
-
when :blk
|
36
|
-
TypeToken::Block.new parser, type, match[3], match[4]
|
37
|
-
when :iblk
|
38
|
-
TypeToken::IBlock.new parser, type, match[7], match[8], match[9], match[10], match[11]
|
39
|
-
when :static
|
40
|
-
TypeToken::Static.new parser, type, match[14], match[15]
|
24
|
+
class << self
|
25
|
+
def instance(parser, type, match)
|
26
|
+
"Tzispa::Rig::TypeToken::#{type.to_s.capitalize}".constantize.new parser, match
|
41
27
|
end
|
42
28
|
end
|
43
29
|
|
44
30
|
def anchor
|
45
|
-
@anchor ||= "$$#{
|
31
|
+
@anchor ||= "$$#{format '%x', object_id}$$"
|
46
32
|
end
|
47
|
-
|
48
33
|
end
|
49
34
|
|
50
35
|
require 'tzispa/rig/type_token/api_url'
|
@@ -52,6 +37,5 @@ module Tzispa
|
|
52
37
|
require 'tzispa/rig/type_token/statement'
|
53
38
|
require 'tzispa/rig/type_token/block'
|
54
39
|
|
55
|
-
|
56
40
|
end
|
57
|
-
end
|
41
|
+
end
|
@@ -5,14 +5,13 @@ module Tzispa
|
|
5
5
|
module TypeToken
|
6
6
|
|
7
7
|
class Url < Rig::Token
|
8
|
-
|
9
8
|
attr_reader :layout, :params, :app_name
|
10
9
|
|
11
|
-
def initialize(parser,
|
12
|
-
super(parser,
|
13
|
-
@layout =
|
14
|
-
@params =
|
15
|
-
@app_name =
|
10
|
+
def initialize(parser, match)
|
11
|
+
super(parser, match[1].to_sym)
|
12
|
+
@layout = match[3]
|
13
|
+
@params = match[5]
|
14
|
+
@app_name = match[2]&.slice(1..-1)&.to_sym
|
16
15
|
end
|
17
16
|
|
18
17
|
def render(binder)
|
@@ -27,55 +26,55 @@ module Tzispa
|
|
27
26
|
end
|
28
27
|
|
29
28
|
def render_purl(binder, app_name, b_layout, h_params)
|
30
|
-
app_name
|
31
|
-
binder.context.app_layout_path(app_name, b_layout, h_params)
|
29
|
+
if app_name
|
30
|
+
binder.context.app_layout_path(app_name, b_layout, h_params)
|
31
|
+
else
|
32
32
|
binder.context.layout_path(b_layout, h_params)
|
33
|
+
end
|
33
34
|
end
|
34
35
|
|
35
36
|
def render_url(binder, app_name, b_layout, h_params)
|
36
|
-
app_name
|
37
|
-
binder.context.app_layout_canonical_url(app_name, b_layout, h_params)
|
37
|
+
if app_name
|
38
|
+
binder.context.app_layout_canonical_url(app_name, b_layout, h_params)
|
39
|
+
else
|
38
40
|
binder.context.layout_canonical_url(b_layout, h_params)
|
41
|
+
end
|
39
42
|
end
|
40
43
|
|
41
44
|
def bind_value(value, binder)
|
42
|
-
value&.gsub(RE_ANCHOR)
|
43
|
-
parser.tokens.select { |p| p.anchor == match}.first.render(binder)
|
44
|
-
|
45
|
+
value&.gsub(RE_ANCHOR) do |match|
|
46
|
+
parser.tokens.select { |p| p.anchor == match }.first.render(binder)
|
47
|
+
end
|
45
48
|
end
|
46
|
-
|
47
49
|
end
|
48
50
|
|
49
|
-
|
50
51
|
class Api < Rig::Token
|
51
|
-
|
52
52
|
attr_reader :handler, :verb, :predicate, :app_name
|
53
53
|
|
54
|
-
def initialize(parser,
|
55
|
-
super(parser,
|
56
|
-
@handler =
|
57
|
-
@verb =
|
58
|
-
@predicate =
|
59
|
-
@sufix =
|
60
|
-
@app_name =
|
54
|
+
def initialize(parser, match)
|
55
|
+
super(parser, match[1].to_sym)
|
56
|
+
@handler = match[3]
|
57
|
+
@verb = match[4]
|
58
|
+
@predicate = match[5]
|
59
|
+
@sufix = match[6]
|
60
|
+
@app_name = match[2]&.slice(1..-1)&.to_sym
|
61
61
|
end
|
62
62
|
|
63
63
|
def render(binder)
|
64
64
|
b_handler = bind_value @handler.dup, binder
|
65
65
|
b_verb = bind_value @verb.dup, binder
|
66
|
-
b_predicate = bind_value(
|
67
|
-
b_sufix = bind_value(
|
66
|
+
b_predicate = bind_value(@predicate.dup, binder) if @predicate
|
67
|
+
b_sufix = bind_value(@sufix.dup, binder) if @sufix
|
68
68
|
binder.context.send(type.to_sym, b_handler, b_verb, b_predicate, b_sufix, app_name)
|
69
69
|
end
|
70
70
|
|
71
71
|
private
|
72
72
|
|
73
73
|
def bind_value(value, binder)
|
74
|
-
value.gsub(RE_ANCHOR)
|
75
|
-
parser.tokens.select { |p| p.anchor == match}.first.render(binder)
|
76
|
-
|
74
|
+
value.gsub(RE_ANCHOR) do |match|
|
75
|
+
parser.tokens.select { |p| p.anchor == match }.first.render(binder)
|
76
|
+
end
|
77
77
|
end
|
78
|
-
|
79
78
|
end
|
80
79
|
|
81
80
|
end
|
@@ -4,14 +4,13 @@ module Tzispa
|
|
4
4
|
module Rig
|
5
5
|
module TypeToken
|
6
6
|
|
7
|
-
class
|
8
|
-
|
7
|
+
class Blk < Rig::Token
|
9
8
|
attr_reader :id, :params
|
10
9
|
|
11
|
-
def initialize(parser,
|
12
|
-
super(parser,
|
13
|
-
@id =
|
14
|
-
@params =
|
10
|
+
def initialize(parser, match)
|
11
|
+
super(parser, :blk)
|
12
|
+
@id = match[3]
|
13
|
+
@params = match[4]
|
15
14
|
end
|
16
15
|
|
17
16
|
def parse!
|
@@ -30,9 +29,10 @@ module Tzispa
|
|
30
29
|
private
|
31
30
|
|
32
31
|
def bind_value(value, binder)
|
33
|
-
value.gsub(RE_ANCHOR)
|
34
|
-
parser.tokens.select { |p| p.anchor == match}
|
35
|
-
|
32
|
+
value.gsub(RE_ANCHOR) do |match|
|
33
|
+
anchor = parser.tokens.select { |p| p.anchor == match }
|
34
|
+
anchor.first.render(binder)
|
35
|
+
end
|
36
36
|
end
|
37
37
|
|
38
38
|
def obtain_block(id)
|
@@ -41,29 +41,27 @@ module Tzispa
|
|
41
41
|
Rig::Engine.empty
|
42
42
|
when template&.id
|
43
43
|
# to avoid infinite recursion
|
44
|
-
template&.type == :block
|
45
|
-
template
|
44
|
+
if template&.type == :block
|
45
|
+
template
|
46
|
+
else
|
46
47
|
Rig::Engine.block(name: id, domain: domain, content_type: content_type)
|
48
|
+
end
|
47
49
|
else
|
48
50
|
Rig::Engine.block(name: id, domain: domain, content_type: content_type)
|
49
51
|
end
|
50
52
|
end
|
51
|
-
|
52
|
-
|
53
53
|
end
|
54
54
|
|
55
|
-
|
56
|
-
class IBlock < Rig::Token
|
57
|
-
|
55
|
+
class Iblk < Rig::Token
|
58
56
|
attr_reader :id, :id_then, :params_then, :id_else, :params_else
|
59
57
|
|
60
|
-
def initialize(parser,
|
61
|
-
super(parser,
|
62
|
-
@id =
|
63
|
-
@id_then =
|
64
|
-
@params_then =
|
65
|
-
@id_else =
|
66
|
-
@params_else =
|
58
|
+
def initialize(parser, match)
|
59
|
+
super(parser, :iblk)
|
60
|
+
@id = match[7]
|
61
|
+
@id_then = match[8]
|
62
|
+
@params_then = match[9]
|
63
|
+
@id_else = match[10]
|
64
|
+
@params_else = match[11]
|
67
65
|
end
|
68
66
|
|
69
67
|
def parse!
|
@@ -92,53 +90,57 @@ module Tzispa
|
|
92
90
|
Rig::Engine.empty
|
93
91
|
when template&.id
|
94
92
|
# to avoid infinite recursion
|
95
|
-
template&.type == :block
|
96
|
-
template
|
93
|
+
if template&.type == :block
|
94
|
+
template
|
95
|
+
else
|
97
96
|
Rig::Engine.block(name: id, domain: domain, content_type: content_type)
|
97
|
+
end
|
98
98
|
else
|
99
99
|
Rig::Engine.block(name: id, domain: domain, content_type: content_type)
|
100
100
|
end
|
101
101
|
end
|
102
102
|
|
103
103
|
def bind_value(value, binder)
|
104
|
-
value.gsub(RE_ANCHOR)
|
105
|
-
parser.tokens.select { |p| p.anchor == match}
|
106
|
-
|
104
|
+
value.gsub(RE_ANCHOR) do |match|
|
105
|
+
anchor = parser.tokens.select { |p| p.anchor == match }
|
106
|
+
anchor.first.render(binder)
|
107
|
+
end
|
107
108
|
end
|
108
|
-
|
109
109
|
end
|
110
110
|
|
111
|
-
|
112
111
|
class Static < Rig::Token
|
113
|
-
|
114
112
|
attr_reader :id, :params
|
115
113
|
|
116
|
-
def initialize(parser,
|
117
|
-
super(parser,
|
118
|
-
@id =
|
119
|
-
@params =
|
114
|
+
def initialize(parser, match)
|
115
|
+
super(parser, :static)
|
116
|
+
@id = match[14]
|
117
|
+
@params = match[15]
|
120
118
|
end
|
121
119
|
|
122
120
|
def parse!
|
123
|
-
@parsed_static = Tzispa::Rig::Engine.static name: @id,
|
121
|
+
@parsed_static = Tzispa::Rig::Engine.static name: @id,
|
122
|
+
domain: domain,
|
123
|
+
content_type: content_type
|
124
124
|
parser.childrens << @parsed_static
|
125
125
|
self
|
126
126
|
end
|
127
127
|
|
128
128
|
def render(binder)
|
129
129
|
blk = @parsed_static.dup
|
130
|
-
if @params
|
131
|
-
b_params = @params.dup.gsub(RE_ANCHOR) { |match|
|
132
|
-
parser.tokens.select { |p| p.anchor == match}.first.render(binder)
|
133
|
-
}
|
134
|
-
blk.params = b_params
|
135
|
-
end
|
130
|
+
blk.params = bind_value(@params.dup, binder) if @params
|
136
131
|
blk.render binder.context
|
137
132
|
end
|
138
133
|
|
139
|
-
|
134
|
+
private
|
140
135
|
|
136
|
+
def bind_value(value, binder)
|
137
|
+
value.gsub(RE_ANCHOR) do |match|
|
138
|
+
anchor = parser.tokens.select { |p| p.anchor == match }
|
139
|
+
anchor.first.render(binder)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
141
143
|
|
142
144
|
end
|
143
145
|
end
|
144
|
-
end
|
146
|
+
end
|
@@ -7,12 +7,11 @@ module Tzispa
|
|
7
7
|
module TypeToken
|
8
8
|
|
9
9
|
class Meta < Rig::Token
|
10
|
-
|
11
10
|
attr_reader :id
|
12
11
|
|
13
|
-
def initialize(parser,
|
14
|
-
super(parser,
|
15
|
-
@id =
|
12
|
+
def initialize(parser, match)
|
13
|
+
super(parser, :meta)
|
14
|
+
@id = match[1].to_sym
|
16
15
|
end
|
17
16
|
|
18
17
|
def render(binder)
|
@@ -26,21 +25,19 @@ module Tzispa
|
|
26
25
|
private
|
27
26
|
|
28
27
|
def unknown
|
29
|
-
@unknown ||=
|
28
|
+
@unknown ||= id.to_s
|
30
29
|
end
|
31
|
-
|
32
30
|
end
|
33
31
|
|
34
|
-
|
35
32
|
class Var < Rig::Token
|
36
|
-
using Tzispa::Utils
|
33
|
+
using Tzispa::Utils::TzString
|
37
34
|
|
38
35
|
attr_reader :id
|
39
36
|
|
40
|
-
def initialize(parser,
|
41
|
-
super(parser,
|
42
|
-
@format =
|
43
|
-
@id =
|
37
|
+
def initialize(parser, match)
|
38
|
+
super(parser, :var)
|
39
|
+
@format = match[1]
|
40
|
+
@id = match[2].to_sym
|
44
41
|
end
|
45
42
|
|
46
43
|
def render(binder)
|
@@ -55,11 +52,10 @@ module Tzispa
|
|
55
52
|
private
|
56
53
|
|
57
54
|
def unknown
|
58
|
-
@unknown ||=
|
55
|
+
@unknown ||= @id.to_s
|
59
56
|
end
|
60
|
-
|
61
57
|
end
|
62
58
|
|
63
59
|
end
|
64
60
|
end
|
65
|
-
end
|
61
|
+
end
|
@@ -12,52 +12,65 @@ module Tzispa
|
|
12
12
|
attr_reader :id, :body_parser
|
13
13
|
def_delegators :@body_parser, :attribute_tags, :loop_parser
|
14
14
|
|
15
|
-
def initialize(parser,
|
16
|
-
super(parser,
|
17
|
-
@id =
|
18
|
-
@body =
|
15
|
+
def initialize(parser, match)
|
16
|
+
super(parser, :loop)
|
17
|
+
@id = match[3].to_sym
|
18
|
+
@body = match[4]
|
19
19
|
end
|
20
20
|
|
21
21
|
def parse!
|
22
|
-
@body_parser = Rig::ParserNext.new
|
22
|
+
@body_parser = Rig::ParserNext.new template: template,
|
23
|
+
text: @body,
|
24
|
+
parent: parser,
|
25
|
+
bindable: true
|
26
|
+
@body_parser.parse!
|
23
27
|
self
|
24
28
|
end
|
25
29
|
|
26
30
|
def render(binder)
|
27
|
-
String.new.tap
|
31
|
+
String.new.tap do |text|
|
28
32
|
looper = binder.data.send(@id) if binder.data.respond_to?(@id)
|
29
|
-
looper&.data&.each
|
33
|
+
looper&.data&.each do |loop_item|
|
30
34
|
text << body_parser.render(loop_item) if loop_item
|
31
|
-
|
32
|
-
|
35
|
+
end
|
36
|
+
end
|
33
37
|
end
|
34
|
-
|
35
38
|
end
|
36
39
|
|
37
|
-
|
38
40
|
class Ife < Rig::Token
|
39
|
-
|
40
41
|
attr_reader :test, :then_parser, :else_parser
|
41
42
|
|
42
|
-
def initialize(parser,
|
43
|
-
super(parser,
|
44
|
-
@test =
|
45
|
-
@then_body =
|
46
|
-
@else_body =
|
43
|
+
def initialize(parser, match)
|
44
|
+
super(parser, :ife)
|
45
|
+
@test = match[7].to_sym
|
46
|
+
@then_body = match[8]
|
47
|
+
@else_body = match[10]
|
47
48
|
end
|
48
49
|
|
49
50
|
def parse!
|
50
|
-
@then_parser = Rig::ParserNext.new(template
|
51
|
-
|
51
|
+
@then_parser = Rig::ParserNext.new(template: template,
|
52
|
+
text: @then_body,
|
53
|
+
parent: parser).parse!
|
54
|
+
@else_parser = if @else_body
|
55
|
+
Rig::ParserNext.new(template: template,
|
56
|
+
text: @else_body,
|
57
|
+
parent: parser).parse!
|
58
|
+
end
|
52
59
|
self
|
53
60
|
end
|
54
61
|
|
55
62
|
def attribute_tags
|
56
|
-
@attribute_tags ||=
|
63
|
+
@attribute_tags ||= begin
|
64
|
+
att = [test].concat(then_parser.attribute_tags)
|
65
|
+
att.concat(else_parser&.attribute_tags || [])
|
66
|
+
att.compact.uniq.freeze
|
67
|
+
end
|
57
68
|
end
|
58
69
|
|
59
70
|
def loop_parser(id)
|
60
|
-
|
71
|
+
lpp = then_parser.loop_parser(id)
|
72
|
+
lpp.concat(else_parser&.loop_parser(id) || [])
|
73
|
+
lpp.compact.freeze
|
61
74
|
end
|
62
75
|
|
63
76
|
def render(binder)
|
@@ -65,9 +78,8 @@ module Tzispa
|
|
65
78
|
ifeparser = test_eval ? then_parser : else_parser
|
66
79
|
ifeparser ? ifeparser.render(binder) : ''
|
67
80
|
end
|
68
|
-
|
69
81
|
end
|
70
82
|
|
71
83
|
end
|
72
84
|
end
|
73
|
-
end
|
85
|
+
end
|
data/lib/tzispa/rig/version.rb
CHANGED
data/test/parsernext_test.rb
CHANGED
@@ -212,10 +212,10 @@ class ParsernextTest < Minitest::Test
|
|
212
212
|
parser = Tzispa::Rig::ParserNext.new text: TPL_BLK, domain: domain, content_type: :htm, bindable: true
|
213
213
|
parser.parse!
|
214
214
|
assert_equal parser.tokens.count, 5
|
215
|
-
assert_instance_of Tzispa::Rig::TypeToken::
|
216
|
-
assert_instance_of Tzispa::Rig::TypeToken::
|
217
|
-
assert_instance_of Tzispa::Rig::TypeToken::
|
218
|
-
assert_instance_of Tzispa::Rig::TypeToken::
|
215
|
+
assert_instance_of Tzispa::Rig::TypeToken::Blk, parser.tokens[1]
|
216
|
+
assert_instance_of Tzispa::Rig::TypeToken::Blk, parser.tokens[2]
|
217
|
+
assert_instance_of Tzispa::Rig::TypeToken::Iblk, parser.tokens[3]
|
218
|
+
assert_instance_of Tzispa::Rig::TypeToken::Iblk, parser.tokens[4]
|
219
219
|
assert_equal parser.tokens[1].id, 'detail'
|
220
220
|
assert_equal parser.tokens[2].id, 'product@detail'
|
221
221
|
assert_equal parser.tokens[2].params, "tab=#{parser.tokens[0].anchor}"
|
@@ -0,0 +1 @@
|
|
1
|
+
This is a layout template file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tzispa_rig
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Juan Antonio Piñero
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-03-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: tzispa_utils
|
@@ -79,6 +79,7 @@ files:
|
|
79
79
|
- test/engine_test.rb
|
80
80
|
- test/parameters_test.rb
|
81
81
|
- test/parsernext_test.rb
|
82
|
+
- test/res/apps/test_domain/view/_/layout/index.rig.txt
|
82
83
|
- test/res/apps/test_domain/view/product/layout/list.rig.htm
|
83
84
|
- test/template_test.rb
|
84
85
|
- test/test_helper.rb
|