tzispa_rig 0.4.5 → 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/CHANGELOG.md +10 -0
- data/README.md +10 -6
- data/Rakefile +7 -0
- data/lib/tzispa/rig/binder.rb +15 -7
- data/lib/tzispa/rig/engine.rb +43 -31
- data/lib/tzispa/rig/parameters.rb +4 -8
- data/lib/tzispa/rig/parsernext.rb +68 -378
- data/lib/tzispa/rig/syntax.rb +4 -7
- data/lib/tzispa/rig/template.rb +78 -54
- data/lib/tzispa/rig/token.rb +57 -0
- data/lib/tzispa/rig/type_token/api_url.rb +83 -0
- data/lib/tzispa/rig/type_token/block.rb +144 -0
- data/lib/tzispa/rig/type_token/expression.rb +65 -0
- data/lib/tzispa/rig/type_token/statement.rb +73 -0
- data/lib/tzispa/rig/version.rb +1 -1
- data/lib/tzispa/rig.rb +3 -2
- data/test/engine_test.rb +41 -0
- data/test/parameters_test.rb +35 -0
- data/test/parsernext_test.rb +256 -0
- data/test/res/apps/test_domain/view/product/layout/list.rig.htm +1 -0
- data/test/template_test.rb +78 -0
- data/test/test_helper.rb +174 -0
- metadata +31 -5
data/lib/tzispa/rig/template.rb
CHANGED
@@ -4,7 +4,6 @@ require 'forwardable'
|
|
4
4
|
require 'fileutils'
|
5
5
|
require 'tzispa/utils/string'
|
6
6
|
require 'tzispa/utils/indenter'
|
7
|
-
require 'tzispa/rig'
|
8
7
|
|
9
8
|
module Tzispa
|
10
9
|
module Rig
|
@@ -13,13 +12,13 @@ module Tzispa
|
|
13
12
|
|
14
13
|
class ReadError < IOError; end
|
15
14
|
|
16
|
-
class
|
15
|
+
class TemplateBase
|
17
16
|
|
18
|
-
attr_reader :
|
17
|
+
attr_reader :content
|
19
18
|
|
20
|
-
def initialize
|
21
|
-
@
|
22
|
-
@loaded =
|
19
|
+
def initialize
|
20
|
+
@content = nil
|
21
|
+
@loaded = true
|
23
22
|
end
|
24
23
|
|
25
24
|
def loaded?
|
@@ -27,33 +26,63 @@ module Tzispa
|
|
27
26
|
end
|
28
27
|
|
29
28
|
def modified?
|
30
|
-
|
29
|
+
false
|
31
30
|
end
|
32
31
|
|
33
32
|
def exist?
|
34
|
-
|
33
|
+
true
|
35
34
|
end
|
36
35
|
|
37
36
|
def load!
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
37
|
+
self
|
38
|
+
end
|
39
|
+
|
40
|
+
def parse!
|
41
|
+
self
|
42
|
+
end
|
43
|
+
|
44
|
+
def render(context, binder=nil)
|
45
|
+
""
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
class File < TemplateBase
|
51
|
+
|
52
|
+
attr_reader :filename, :encoding
|
53
|
+
|
54
|
+
def initialize(name, encoding: 'UTF-8')
|
55
|
+
super()
|
56
|
+
@filename = name
|
57
|
+
@loaded = false
|
58
|
+
@encoding = encoding
|
59
|
+
end
|
60
|
+
|
61
|
+
def modified?
|
62
|
+
@modified && (@modified != ::File.mtime(filename))
|
63
|
+
end
|
64
|
+
|
65
|
+
def exist?
|
66
|
+
::File.exist?(filename)
|
67
|
+
end
|
68
|
+
|
69
|
+
def load!
|
70
|
+
raise NotFound.new("Template file '#{filename}' not found") unless exist?
|
71
|
+
::File.open(filename, "r:#{encoding}") { |f|
|
72
|
+
@content = String.new
|
73
|
+
@modified = f.mtime
|
74
|
+
f.each { |line|
|
75
|
+
@content << line
|
47
76
|
}
|
48
77
|
@loaded = true
|
49
|
-
|
50
|
-
raise ReadError.new "Template file '#{@file}' could not be read"
|
51
|
-
end
|
78
|
+
}
|
52
79
|
self
|
80
|
+
rescue Errno::ENOENT
|
81
|
+
raise ReadError.new "Template file '#{@file}' could not be read"
|
53
82
|
end
|
54
83
|
|
55
84
|
def create(content=nil)
|
56
|
-
::File.open(
|
85
|
+
::File.open(filename, "w:#{encoding}") { |f|
|
57
86
|
f.puts content
|
58
87
|
}
|
59
88
|
end
|
@@ -67,39 +96,32 @@ module Tzispa
|
|
67
96
|
using Tzispa::Utils
|
68
97
|
|
69
98
|
BASIC_TYPES = [:layout, :block, :static].freeze
|
70
|
-
|
71
|
-
RIG_EXTENSION = 'rig'.freeze
|
99
|
+
RIG_EXTENSION = 'rig'
|
72
100
|
|
73
|
-
attr_reader :name, :type, :domain, :
|
101
|
+
attr_reader :id, :name, :type, :domain, :parser, :subdomain, :childrens, :content_type
|
74
102
|
def_delegators :@parser, :attribute_tags
|
75
103
|
|
76
|
-
def initialize(name:, type:, domain
|
77
|
-
|
78
|
-
@
|
79
|
-
|
104
|
+
def initialize(name:, type:, domain:, content_type:, params: nil)
|
105
|
+
@id = name
|
106
|
+
name.downcase.split('@').tap { |sdn|
|
107
|
+
@subdomain = sdn.length > 1 ? sdn.first : nil
|
108
|
+
@name = sdn.last
|
109
|
+
}
|
110
|
+
@domain = domain
|
111
|
+
@content_type = content_type
|
80
112
|
@params = Parameters.new(params)
|
81
|
-
@childrens = Array.new
|
82
113
|
send('type=', type)
|
83
|
-
|
84
|
-
@engine = engine || parent.engine
|
85
|
-
@domain = domain || parent.domain
|
86
|
-
@format = format || parent.format
|
87
|
-
else
|
88
|
-
@engine = engine
|
89
|
-
@domain = domain
|
90
|
-
@format = format || DEFAULT_FORMAT
|
91
|
-
end
|
92
|
-
super "#{path}/#{@name}.#{RIG_EXTENSION}.#{@format}"
|
114
|
+
super "#{path}/#{@name}.#{RIG_EXTENSION}.#{content_type}"
|
93
115
|
end
|
94
116
|
|
95
117
|
def parse!
|
96
|
-
@parser = ParserNext.new self
|
97
|
-
|
118
|
+
@parser = ParserNext.new self, domain: domain, content_type: content_type, bindable: bindable?
|
119
|
+
parser.parse!
|
98
120
|
self
|
99
121
|
end
|
100
122
|
|
101
123
|
def modified?
|
102
|
-
super || (
|
124
|
+
super || (parser && parser.childrens.index { |tpl|
|
103
125
|
tpl.modified?
|
104
126
|
})
|
105
127
|
end
|
@@ -108,15 +130,15 @@ module Tzispa
|
|
108
130
|
!content.empty? && !parser.empty?
|
109
131
|
end
|
110
132
|
|
111
|
-
def render(context)
|
112
|
-
parse! unless
|
113
|
-
binder
|
114
|
-
binder.bind! if binder
|
115
|
-
|
133
|
+
def render(context, binder=nil)
|
134
|
+
parse! unless parser
|
135
|
+
binder ||= TemplateBinder.for self, context
|
136
|
+
binder.bind! if binder&.respond_to?(:bind!)
|
137
|
+
parser.render binder
|
116
138
|
end
|
117
139
|
|
118
140
|
def path
|
119
|
-
"#{
|
141
|
+
@path ||= "#{domain.path}/view/#{subdomain || '_'}/#{type.to_s.downcase}"
|
120
142
|
end
|
121
143
|
|
122
144
|
def create(content='')
|
@@ -150,20 +172,22 @@ module Tzispa
|
|
150
172
|
end
|
151
173
|
|
152
174
|
def binder_require
|
153
|
-
"
|
175
|
+
@binder_require ||= "view/#{subdomain || '_'}/#{type}/#{name.downcase}"
|
154
176
|
end
|
155
177
|
|
156
178
|
def binder_namespace
|
157
|
-
"#{
|
179
|
+
@binder_namespace ||= "#{domain.name.to_s.camelize}::#{subdomain&.camelize}View"
|
158
180
|
end
|
159
181
|
|
160
182
|
def binder_class_name
|
161
|
-
@name.camelize
|
183
|
+
@binder_class_name ||= @name.camelize
|
162
184
|
end
|
163
185
|
|
164
186
|
def binder_class
|
165
|
-
@
|
166
|
-
|
187
|
+
@binder_class ||= begin
|
188
|
+
domain.require binder_require
|
189
|
+
"#{binder_namespace}::#{binder_class_name}#{type.to_s.capitalize}".constantize
|
190
|
+
end
|
167
191
|
end
|
168
192
|
|
169
193
|
private
|
@@ -176,7 +200,7 @@ module Tzispa
|
|
176
200
|
def create_binder
|
177
201
|
::File.open("#{domain.path}/#{binder_require}.rb", "w") { |f|
|
178
202
|
f.puts write_binder_code
|
179
|
-
} if
|
203
|
+
} if type == :block
|
180
204
|
end
|
181
205
|
|
182
206
|
def write_binder_code
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'forwardable'
|
4
|
+
|
5
|
+
module Tzispa
|
6
|
+
module Rig
|
7
|
+
|
8
|
+
class Token
|
9
|
+
extend Forwardable
|
10
|
+
|
11
|
+
RE_ANCHOR = /(\$\$\h+\$\$)/
|
12
|
+
|
13
|
+
attr_reader :type, :parser
|
14
|
+
def_delegators :@parser, :domain, :content_type, :template
|
15
|
+
|
16
|
+
def initialize(parser, type)
|
17
|
+
@parser = parser
|
18
|
+
@type = type
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.instance(parser, type, match)
|
22
|
+
case type
|
23
|
+
when :meta
|
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]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def anchor
|
45
|
+
@anchor ||= "$$#{"%x" % object_id}$$".freeze
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
require 'tzispa/rig/type_token/api_url'
|
51
|
+
require 'tzispa/rig/type_token/expression'
|
52
|
+
require 'tzispa/rig/type_token/statement'
|
53
|
+
require 'tzispa/rig/type_token/block'
|
54
|
+
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tzispa
|
4
|
+
module Rig
|
5
|
+
module TypeToken
|
6
|
+
|
7
|
+
class Url < Rig::Token
|
8
|
+
|
9
|
+
attr_reader :layout, :params, :app_name
|
10
|
+
|
11
|
+
def initialize(parser, type, layout, params, app_name = nil)
|
12
|
+
super(parser, type)
|
13
|
+
@layout = layout
|
14
|
+
@params = params
|
15
|
+
@app_name = app_name&.to_sym
|
16
|
+
end
|
17
|
+
|
18
|
+
def render(binder)
|
19
|
+
b_layout = bind_value(@layout.dup, binder).to_sym
|
20
|
+
h_params = Rig::Parameters.new(bind_value(@params&.dup, binder)).to_h
|
21
|
+
case type
|
22
|
+
when :purl
|
23
|
+
render_purl(binder, app_name, b_layout, h_params)
|
24
|
+
when :url
|
25
|
+
render_url(binder, app_name, b_layout, h_params)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
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) :
|
32
|
+
binder.context.layout_path(b_layout, h_params)
|
33
|
+
end
|
34
|
+
|
35
|
+
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) :
|
38
|
+
binder.context.layout_canonical_url(b_layout, h_params)
|
39
|
+
end
|
40
|
+
|
41
|
+
def bind_value(value, binder)
|
42
|
+
value&.gsub(RE_ANCHOR) { |match|
|
43
|
+
parser.tokens.select { |p| p.anchor == match}.first.render(binder)
|
44
|
+
}
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
class Api < Rig::Token
|
51
|
+
|
52
|
+
attr_reader :handler, :verb, :predicate, :app_name
|
53
|
+
|
54
|
+
def initialize(parser, type, handler, verb, predicate, sufix, app_name = nil)
|
55
|
+
super(parser, type)
|
56
|
+
@handler = handler
|
57
|
+
@verb = verb
|
58
|
+
@predicate = predicate
|
59
|
+
@sufix = sufix
|
60
|
+
@app_name = app_name&.to_sym
|
61
|
+
end
|
62
|
+
|
63
|
+
def render(binder)
|
64
|
+
b_handler = bind_value @handler.dup, binder
|
65
|
+
b_verb = bind_value @verb.dup, binder
|
66
|
+
b_predicate = bind_value( @predicate.dup, binder ) if @predicate
|
67
|
+
b_sufix = bind_value( @sufix.dup, binder ) if @sufix
|
68
|
+
binder.context.send(type.to_sym, b_handler, b_verb, b_predicate, b_sufix, app_name)
|
69
|
+
end
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
def bind_value(value, binder)
|
74
|
+
value.gsub(RE_ANCHOR) { |match|
|
75
|
+
parser.tokens.select { |p| p.anchor == match}.first.render(binder)
|
76
|
+
}
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,144 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tzispa
|
4
|
+
module Rig
|
5
|
+
module TypeToken
|
6
|
+
|
7
|
+
class Block < Rig::Token
|
8
|
+
|
9
|
+
attr_reader :id, :params
|
10
|
+
|
11
|
+
def initialize(parser, type, id, params)
|
12
|
+
super(parser, type)
|
13
|
+
@id = id
|
14
|
+
@params = params
|
15
|
+
end
|
16
|
+
|
17
|
+
def parse!
|
18
|
+
# to avoid infinite recursion
|
19
|
+
@parsed_block = obtain_block @id
|
20
|
+
parser.childrens << @parsed_block
|
21
|
+
self
|
22
|
+
end
|
23
|
+
|
24
|
+
def render(binder)
|
25
|
+
blk = @parsed_block.dup
|
26
|
+
blk.params = bind_value(@params.dup, binder) if @params
|
27
|
+
blk.render binder.context
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def bind_value(value, binder)
|
33
|
+
value.gsub(RE_ANCHOR) { |match|
|
34
|
+
parser.tokens.select { |p| p.anchor == match}.first.render(binder)
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
def obtain_block(id)
|
39
|
+
case id
|
40
|
+
when '__empty__'
|
41
|
+
Rig::Engine.empty
|
42
|
+
when template&.id
|
43
|
+
# to avoid infinite recursion
|
44
|
+
template&.type == :block ?
|
45
|
+
template :
|
46
|
+
Rig::Engine.block(name: id, domain: domain, content_type: content_type)
|
47
|
+
else
|
48
|
+
Rig::Engine.block(name: id, domain: domain, content_type: content_type)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
class IBlock < Rig::Token
|
57
|
+
|
58
|
+
attr_reader :id, :id_then, :params_then, :id_else, :params_else
|
59
|
+
|
60
|
+
def initialize(parser, type, test, id_then, params_then, id_else, params_else)
|
61
|
+
super(parser, type)
|
62
|
+
@id = test
|
63
|
+
@id_then = id_then
|
64
|
+
@params_then = params_then
|
65
|
+
@id_else = id_else
|
66
|
+
@params_else = params_else
|
67
|
+
end
|
68
|
+
|
69
|
+
def parse!
|
70
|
+
@block_then = obtain_block @id_then
|
71
|
+
@block_else = obtain_block @id_else
|
72
|
+
parser.childrens << @block_then << @block_else
|
73
|
+
self
|
74
|
+
end
|
75
|
+
|
76
|
+
def render(binder)
|
77
|
+
if binder.data.respond_to?(@id) && binder.data.send(@id)
|
78
|
+
blk = @block_then.dup
|
79
|
+
blk.params = bind_value(@params_then.dup, binder) if @params_then
|
80
|
+
else
|
81
|
+
blk = @block_else.dup
|
82
|
+
blk.params = bind_value(@params_else.dup, binder) if @params_else
|
83
|
+
end
|
84
|
+
blk.render binder.context
|
85
|
+
end
|
86
|
+
|
87
|
+
private
|
88
|
+
|
89
|
+
def obtain_block(id)
|
90
|
+
case id
|
91
|
+
when '__empty__'
|
92
|
+
Rig::Engine.empty
|
93
|
+
when template&.id
|
94
|
+
# to avoid infinite recursion
|
95
|
+
template&.type == :block ?
|
96
|
+
template :
|
97
|
+
Rig::Engine.block(name: id, domain: domain, content_type: content_type)
|
98
|
+
else
|
99
|
+
Rig::Engine.block(name: id, domain: domain, content_type: content_type)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def bind_value(value, binder)
|
104
|
+
value.gsub(RE_ANCHOR) { |match|
|
105
|
+
parser.tokens.select { |p| p.anchor == match}.first.render(binder)
|
106
|
+
}
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
|
112
|
+
class Static < Rig::Token
|
113
|
+
|
114
|
+
attr_reader :id, :params
|
115
|
+
|
116
|
+
def initialize(parser, type, id, params)
|
117
|
+
super(parser, type)
|
118
|
+
@id = id
|
119
|
+
@params = params
|
120
|
+
end
|
121
|
+
|
122
|
+
def parse!
|
123
|
+
@parsed_static = Tzispa::Rig::Engine.static name: @id, domain: domain, content_type: content_type
|
124
|
+
parser.childrens << @parsed_static
|
125
|
+
self
|
126
|
+
end
|
127
|
+
|
128
|
+
def render(binder)
|
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
|
136
|
+
blk.render binder.context
|
137
|
+
end
|
138
|
+
|
139
|
+
end
|
140
|
+
|
141
|
+
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'tzispa/utils/string'
|
4
|
+
|
5
|
+
module Tzispa
|
6
|
+
module Rig
|
7
|
+
module TypeToken
|
8
|
+
|
9
|
+
class Meta < Rig::Token
|
10
|
+
|
11
|
+
attr_reader :id
|
12
|
+
|
13
|
+
def initialize(parser, type, id)
|
14
|
+
super(parser, type)
|
15
|
+
@id = id.to_sym
|
16
|
+
end
|
17
|
+
|
18
|
+
def render(binder)
|
19
|
+
if binder.data.respond_to? @id
|
20
|
+
binder.data.send(@id).to_s
|
21
|
+
else
|
22
|
+
unknown
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def unknown
|
29
|
+
@unknown ||= "#{@id}"
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
class Var < Rig::Token
|
36
|
+
using Tzispa::Utils
|
37
|
+
|
38
|
+
attr_reader :id
|
39
|
+
|
40
|
+
def initialize(parser, type, format, id)
|
41
|
+
super(parser, type)
|
42
|
+
@format = format
|
43
|
+
@id = id.to_sym
|
44
|
+
end
|
45
|
+
|
46
|
+
def render(binder)
|
47
|
+
if binder.data.respond_to?(@id)
|
48
|
+
value = binder.data.send(@id).to_s
|
49
|
+
value.send(parser.content_escape_method) rescue value
|
50
|
+
else
|
51
|
+
unknown
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def unknown
|
58
|
+
@unknown ||= "#{@id}"
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'forwardable'
|
4
|
+
|
5
|
+
module Tzispa
|
6
|
+
module Rig
|
7
|
+
module TypeToken
|
8
|
+
|
9
|
+
class Loop < Rig::Token
|
10
|
+
extend Forwardable
|
11
|
+
|
12
|
+
attr_reader :id, :body_parser
|
13
|
+
def_delegators :@body_parser, :attribute_tags, :loop_parser
|
14
|
+
|
15
|
+
def initialize(parser, type, id, body)
|
16
|
+
super(parser, type)
|
17
|
+
@id = id.to_sym
|
18
|
+
@body = body
|
19
|
+
end
|
20
|
+
|
21
|
+
def parse!
|
22
|
+
@body_parser = Rig::ParserNext.new(template, text: @body, parent: parser, bindable: true ).parse!
|
23
|
+
self
|
24
|
+
end
|
25
|
+
|
26
|
+
def render(binder)
|
27
|
+
String.new.tap { |text|
|
28
|
+
looper = binder.data.send(@id) if binder.data.respond_to?(@id)
|
29
|
+
looper&.data&.each { |loop_item|
|
30
|
+
text << body_parser.render(loop_item) if loop_item
|
31
|
+
} if looper
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
class Ife < Rig::Token
|
39
|
+
|
40
|
+
attr_reader :test, :then_parser, :else_parser
|
41
|
+
|
42
|
+
def initialize(parser, type, test, then_body, else_body)
|
43
|
+
super(parser, type)
|
44
|
+
@test = test.to_sym
|
45
|
+
@then_body = then_body
|
46
|
+
@else_body = else_body
|
47
|
+
end
|
48
|
+
|
49
|
+
def parse!
|
50
|
+
@then_parser = Rig::ParserNext.new(template, text: @then_body, parent: parser ).parse!
|
51
|
+
@else_parser = @else_body ? Rig::ParserNext.new(template, text: @else_body, parent: parser ).parse! : nil
|
52
|
+
self
|
53
|
+
end
|
54
|
+
|
55
|
+
def attribute_tags
|
56
|
+
@attribute_tags ||= [test].concat(then_parser.attribute_tags).concat(else_parser&.attribute_tags || Array.new).compact.uniq.freeze
|
57
|
+
end
|
58
|
+
|
59
|
+
def loop_parser(id)
|
60
|
+
@then_parser.loop_parser(id).concat(else_parser&.loop_parser(id) || Array.new).compact.freeze
|
61
|
+
end
|
62
|
+
|
63
|
+
def render(binder)
|
64
|
+
test_eval = binder.data && binder.data.respond_to?(test) && binder.data.send(test)
|
65
|
+
ifeparser = test_eval ? then_parser : else_parser
|
66
|
+
ifeparser ? ifeparser.render(binder) : ''
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
data/lib/tzispa/rig/version.rb
CHANGED
data/lib/tzispa/rig.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
module Tzispa
|
2
2
|
module Rig
|
3
|
-
|
3
|
+
|
4
4
|
require 'tzispa/rig/version'
|
5
5
|
require 'tzispa/rig/parameters'
|
6
|
+
require 'tzispa/rig/token'
|
6
7
|
require 'tzispa/rig/parsernext'
|
8
|
+
require 'tzispa/rig/template'
|
7
9
|
require 'tzispa/rig/binder'
|
8
|
-
require 'tzispa/rig/template'
|
9
10
|
require 'tzispa/rig/engine'
|
10
11
|
|
11
12
|
end
|