opulent 1.5.5 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CODE_OF_CONDUCT.md +13 -0
- data/{LICENSE → LICENSE.md} +0 -0
- data/bin/opulent +0 -0
- data/lib/opulent.rb +10 -10
- data/lib/opulent/compiler.rb +15 -9
- data/lib/opulent/compiler/buffer.rb +123 -62
- data/lib/opulent/compiler/comment.rb +3 -4
- data/lib/opulent/compiler/control.rb +20 -26
- data/lib/opulent/compiler/define.rb +88 -36
- data/lib/opulent/compiler/doctype.rb +20 -22
- data/lib/opulent/compiler/eval.rb +23 -2
- data/lib/opulent/compiler/filter.rb +4 -5
- data/lib/opulent/compiler/node.rb +18 -12
- data/lib/opulent/compiler/root.rb +4 -5
- data/lib/opulent/compiler/text.rb +7 -2
- data/lib/opulent/compiler/yield.rb +2 -3
- data/lib/opulent/engine.rb +21 -20
- data/lib/opulent/exec.rb +21 -63
- data/lib/opulent/logger.rb +230 -3
- data/lib/opulent/parser.rb +14 -76
- data/lib/opulent/parser/comment.rb +45 -34
- data/lib/opulent/parser/control.rb +132 -111
- data/lib/opulent/parser/define.rb +15 -12
- data/lib/opulent/parser/doctype.rb +15 -15
- data/lib/opulent/parser/eval.rb +16 -6
- data/lib/opulent/parser/expression.rb +87 -84
- data/lib/opulent/parser/filter.rb +31 -25
- data/lib/opulent/parser/include.rb +38 -42
- data/lib/opulent/parser/node.rb +136 -118
- data/lib/opulent/parser/root.rb +24 -18
- data/lib/opulent/parser/text.rb +150 -123
- data/lib/opulent/parser/yield.rb +23 -23
- data/lib/opulent/settings.rb +70 -51
- data/lib/opulent/tokens.rb +17 -15
- data/lib/opulent/utils.rb +5 -4
- data/lib/opulent/version.rb +1 -1
- metadata +4 -43
- data/.libold/opulent.rb +0 -96
- data/.libold/opulent/context.rb +0 -80
- data/.libold/opulent/engine.rb +0 -88
- data/.libold/opulent/filter.rb +0 -101
- data/.libold/opulent/logger.rb +0 -67
- data/.libold/opulent/nodes.rb +0 -13
- data/.libold/opulent/nodes/block.rb +0 -29
- data/.libold/opulent/nodes/comment.rb +0 -35
- data/.libold/opulent/nodes/control.rb +0 -230
- data/.libold/opulent/nodes/define.rb +0 -42
- data/.libold/opulent/nodes/eval.rb +0 -41
- data/.libold/opulent/nodes/expression.rb +0 -28
- data/.libold/opulent/nodes/filter.rb +0 -70
- data/.libold/opulent/nodes/helper.rb +0 -69
- data/.libold/opulent/nodes/node.rb +0 -101
- data/.libold/opulent/nodes/root.rb +0 -62
- data/.libold/opulent/nodes/text.rb +0 -54
- data/.libold/opulent/nodes/theme.rb +0 -36
- data/.libold/opulent/parser.rb +0 -252
- data/.libold/opulent/parser/block.rb +0 -70
- data/.libold/opulent/parser/comment.rb +0 -32
- data/.libold/opulent/parser/control.rb +0 -83
- data/.libold/opulent/parser/define.rb +0 -39
- data/.libold/opulent/parser/eval.rb +0 -33
- data/.libold/opulent/parser/expression.rb +0 -350
- data/.libold/opulent/parser/filter.rb +0 -41
- data/.libold/opulent/parser/node.rb +0 -232
- data/.libold/opulent/parser/root.rb +0 -96
- data/.libold/opulent/parser/text.rb +0 -114
- data/.libold/opulent/parser/theme.rb +0 -36
- data/.libold/opulent/preprocessor.rb +0 -102
- data/.libold/opulent/runtime.rb +0 -144
- data/.libold/opulent/template.rb +0 -43
- data/.libold/opulent/tokens.rb +0 -276
- data/.libold/opulent/version.rb +0 -5
- data/.travis.yml +0 -4
- data/benchmark/benchmark.rb +0 -57
- data/benchmark/cases/node/node.haml +0 -7
- data/benchmark/cases/node/node.op +0 -7
- data/benchmark/cases/node/node.slim +0 -7
@@ -14,21 +14,24 @@ module Opulent
|
|
14
14
|
# @param nodes [Array] Parent node to which we append to
|
15
15
|
#
|
16
16
|
def define(parent, indent)
|
17
|
-
|
18
|
-
# Process data
|
19
|
-
name = accept(:node, :*).to_sym
|
17
|
+
return unless accept(:def)
|
20
18
|
|
21
|
-
|
22
|
-
|
19
|
+
# Definition parent check
|
20
|
+
Logger.error :parse, @code, @i, @j, :definition if parent[@type] != :root
|
23
21
|
|
24
|
-
|
25
|
-
|
26
|
-
# nodes (we do not check if they are have a definition or not).
|
27
|
-
root definition, indent
|
22
|
+
# Process data
|
23
|
+
name = accept(:node, :*).to_sym
|
28
24
|
|
29
|
-
|
30
|
-
|
31
|
-
|
25
|
+
# Create node
|
26
|
+
definition = [:def, name, { parameters: attributes }, [], indent]
|
27
|
+
|
28
|
+
# Set definition as root node and let the parser know that we're inside
|
29
|
+
# a definition. This is used because inside definitions we do not
|
30
|
+
# process nodes (we do not check if they are have a definition or not).
|
31
|
+
root definition, indent
|
32
|
+
|
33
|
+
# Add to parent
|
34
|
+
@definitions[name] = definition
|
32
35
|
end
|
33
36
|
end
|
34
37
|
end
|
@@ -1,15 +1,15 @@
|
|
1
|
-
# @Opulent
|
2
|
-
module Opulent
|
3
|
-
# @Parser
|
4
|
-
class Parser
|
5
|
-
# Match one line or multiline comments
|
6
|
-
#
|
7
|
-
def doctype(parent, indent)
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
1
|
+
# @Opulent
|
2
|
+
module Opulent
|
3
|
+
# @Parser
|
4
|
+
class Parser
|
5
|
+
# Match one line or multiline comments
|
6
|
+
#
|
7
|
+
def doctype(parent, indent)
|
8
|
+
return unless accept :doctype
|
9
|
+
|
10
|
+
buffer = accept(:line_feed)
|
11
|
+
|
12
|
+
parent[@children] << [:doctype, buffer.strip.to_sym, {}, nil, indent]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/opulent/parser/eval.rb
CHANGED
@@ -6,16 +6,26 @@ module Opulent
|
|
6
6
|
#
|
7
7
|
def evaluate(parent, indent)
|
8
8
|
# Accept eval or multiline eval syntax and return a new node,
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
return unless accept :eval
|
10
|
+
|
11
|
+
multiline = accept(:text)
|
12
|
+
|
13
|
+
if multiline
|
14
|
+
# Get first evaluation line
|
15
|
+
evaluate_code = accept(:line_feed) || ''
|
16
|
+
|
12
17
|
# Get all the lines which are more indented than the current one
|
13
|
-
eval_node = [:evaluate,
|
14
|
-
eval_node[@value] += accept(:newline) ||
|
18
|
+
eval_node = [:evaluate, evaluate_code.strip, {}, nil, indent]
|
19
|
+
eval_node[@value] += accept(:newline) || ''
|
15
20
|
eval_node[@value] += get_indented_lines(indent)
|
21
|
+
else
|
22
|
+
evaluate_code = accept(:line_feed) || ''
|
23
|
+
eval_node = [:evaluate, evaluate_code.strip, {}, [], indent]
|
24
|
+
|
25
|
+
root eval_node, indent
|
16
26
|
end
|
17
27
|
|
18
|
-
parent[@children] << eval_node
|
28
|
+
parent[@children] << eval_node
|
19
29
|
end
|
20
30
|
end
|
21
31
|
end
|
@@ -5,46 +5,50 @@ module Opulent
|
|
5
5
|
# Check if the parser matches an expression node
|
6
6
|
#
|
7
7
|
def expression(allow_assignments = true, wrapped = true, whitespace = true)
|
8
|
-
buffer =
|
8
|
+
buffer = ''
|
9
9
|
|
10
10
|
# Build a ruby expression out of accepted literals
|
11
|
-
while (term = (whitespace ? accept(:whitespace) : nil)
|
12
|
-
modifier
|
13
|
-
identifier
|
14
|
-
method_call
|
15
|
-
paranthesis
|
16
|
-
array
|
17
|
-
hash
|
18
|
-
symbol
|
19
|
-
percent
|
11
|
+
while (term = (whitespace ? accept(:whitespace) : nil) ||
|
12
|
+
modifier ||
|
13
|
+
identifier ||
|
14
|
+
method_call ||
|
15
|
+
paranthesis ||
|
16
|
+
array ||
|
17
|
+
hash ||
|
18
|
+
symbol ||
|
19
|
+
percent ||
|
20
20
|
primary_term)
|
21
21
|
buffer += term
|
22
22
|
|
23
23
|
# Accept operations which have a right term and raise an error if
|
24
24
|
# we have an unfinished expression such as "a +", "b - 1 >" and other
|
25
25
|
# expressions following the same pattern
|
26
|
-
if wrapped && (op = operation ||
|
26
|
+
if wrapped && (op = operation ||
|
27
|
+
(allow_assignments ? accept_stripped(:exp_assignment) : nil))
|
28
|
+
|
27
29
|
buffer += op
|
28
30
|
if (right_term = expression(allow_assignments, wrapped)).nil?
|
29
|
-
error :expression
|
31
|
+
Logger.error :parse, @code, @i, @j, :expression
|
30
32
|
else
|
31
33
|
buffer += right_term[@value]
|
32
34
|
end
|
33
|
-
elsif (
|
34
|
-
buffer
|
35
|
+
elsif (op = array || op = method_call || op = ternary_operator(allow_assignments, wrapped))
|
36
|
+
p buffer
|
37
|
+
p op
|
38
|
+
buffer += op
|
35
39
|
end
|
36
40
|
|
37
41
|
# Do not continue if the expression has whitespace method calls in
|
38
42
|
# an unwrapped context because this will confuse the parser
|
39
43
|
unless buffer.strip.empty?
|
40
|
-
break
|
44
|
+
break if lookahead(:exp_identifier_lookahead).nil?
|
41
45
|
end
|
42
46
|
end
|
43
47
|
|
44
48
|
if buffer.strip.empty?
|
45
|
-
|
49
|
+
undo buffer
|
46
50
|
else
|
47
|
-
|
51
|
+
[:expression, buffer.strip, {}]
|
48
52
|
end
|
49
53
|
end
|
50
54
|
|
@@ -55,12 +59,12 @@ module Opulent
|
|
55
59
|
# [array_elements]
|
56
60
|
#
|
57
61
|
def array
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
62
|
+
return unless (buffer = accept :square_bracket)
|
63
|
+
accept_newline
|
64
|
+
buffer += array_elements
|
65
|
+
accept_newline
|
66
|
+
buffer += accept :'[', :*
|
67
|
+
buffer
|
64
68
|
end
|
65
69
|
|
66
70
|
# Recursively gather expressions separated by a comma and add them to the
|
@@ -75,7 +79,7 @@ module Opulent
|
|
75
79
|
buffer += term[@value]
|
76
80
|
# If there is an array_terminator ",", recursively gather the next
|
77
81
|
# array element into the buffer
|
78
|
-
if (terminator = accept_stripped :comma)
|
82
|
+
if (terminator = accept_stripped :comma)
|
79
83
|
accept_newline
|
80
84
|
buffer += array_elements terminator
|
81
85
|
end
|
@@ -83,11 +87,9 @@ module Opulent
|
|
83
87
|
|
84
88
|
# Array ended prematurely with a trailing comma, therefore the current
|
85
89
|
# parsing process will stop
|
86
|
-
if buffer.strip[-1] == ','
|
87
|
-
error :array_elements_terminator
|
88
|
-
end
|
90
|
+
error :array_elements_terminator if buffer.strip[-1] == ','
|
89
91
|
|
90
|
-
|
92
|
+
buffer
|
91
93
|
end
|
92
94
|
|
93
95
|
# Check if it's possible to parse a ruby hash literal. First, try to see
|
@@ -97,12 +99,12 @@ module Opulent
|
|
97
99
|
# { hash_elements }
|
98
100
|
#
|
99
101
|
def hash
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
102
|
+
return unless (buffer = accept :curly_bracket)
|
103
|
+
accept_newline
|
104
|
+
buffer += hash_elements
|
105
|
+
accept_newline
|
106
|
+
buffer += accept :'{', :*
|
107
|
+
buffer
|
106
108
|
end
|
107
109
|
|
108
110
|
# Recursively gather expression attributions separated by a comma and add
|
@@ -113,7 +115,7 @@ module Opulent
|
|
113
115
|
# @param buffer [String] Accumulator for the hash elements
|
114
116
|
#
|
115
117
|
def hash_elements(buffer = '')
|
116
|
-
value =
|
118
|
+
value = proc do
|
117
119
|
# Get the value associated to the current hash key
|
118
120
|
if (exp = expression)
|
119
121
|
buffer += exp[@value]
|
@@ -123,7 +125,7 @@ module Opulent
|
|
123
125
|
|
124
126
|
# If there is an hash_terminator ",", recursively gather the next
|
125
127
|
# array element into the buffer
|
126
|
-
if (terminator = accept_stripped :comma)
|
128
|
+
if (terminator = accept_stripped :comma)
|
127
129
|
accept_newline
|
128
130
|
buffer += hash_elements terminator
|
129
131
|
end
|
@@ -139,7 +141,7 @@ module Opulent
|
|
139
141
|
value[]
|
140
142
|
elsif (exp = expression false)
|
141
143
|
buffer += exp[@value]
|
142
|
-
if(assign = accept_stripped :hash_assignment)
|
144
|
+
if (assign = accept_stripped :hash_assignment)
|
143
145
|
buffer += assign
|
144
146
|
value[]
|
145
147
|
else
|
@@ -149,31 +151,28 @@ module Opulent
|
|
149
151
|
|
150
152
|
# Array ended prematurely with a trailing comma, therefore the current
|
151
153
|
# parsing process will stop
|
152
|
-
if buffer.strip[-1] == ','
|
153
|
-
error :hash_elements_terminator
|
154
|
-
end
|
154
|
+
error :hash_elements_terminator if buffer.strip[-1] == ','
|
155
155
|
|
156
|
-
|
156
|
+
buffer
|
157
157
|
end
|
158
158
|
|
159
159
|
# Accept a ruby identifier such as a class, module, method or variable
|
160
160
|
#
|
161
161
|
def identifier
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
end
|
166
|
-
return buffer
|
162
|
+
return unless (buffer = accept :exp_identifier)
|
163
|
+
if (args = call)
|
164
|
+
buffer += args
|
167
165
|
end
|
166
|
+
buffer
|
168
167
|
end
|
169
168
|
|
170
169
|
# Check if it's possible to parse a ruby paranthesis expression wrapper.
|
171
170
|
#
|
172
171
|
def paranthesis
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
172
|
+
return unless (buffer = accept :round_bracket)
|
173
|
+
buffer += expression[@value]
|
174
|
+
buffer += accept_stripped :'(', :*
|
175
|
+
buffer
|
177
176
|
end
|
178
177
|
|
179
178
|
# Check if it's possible to parse a ruby call literal. First, try to see
|
@@ -183,10 +182,11 @@ module Opulent
|
|
183
182
|
# ( call_elements )
|
184
183
|
#
|
185
184
|
def call
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
185
|
+
return unless (buffer = accept :round_bracket)
|
186
|
+
|
187
|
+
buffer += call_elements
|
188
|
+
buffer += accept_stripped :'(', :*
|
189
|
+
buffer
|
190
190
|
end
|
191
191
|
|
192
192
|
# Recursively gather expression attributes separated by a comma and add
|
@@ -215,13 +215,13 @@ module Opulent
|
|
215
215
|
|
216
216
|
# If there is an comma ",", recursively gather the next
|
217
217
|
# array element into the buffer
|
218
|
-
if (terminator = accept_stripped :comma)
|
218
|
+
if (terminator = accept_stripped :comma)
|
219
219
|
buffer += call_elements terminator
|
220
220
|
end
|
221
221
|
elsif (exp = expression(true))
|
222
222
|
buffer += exp[@value]
|
223
223
|
|
224
|
-
if(assign = accept_stripped :hash_assignment)
|
224
|
+
if (assign = accept_stripped :hash_assignment)
|
225
225
|
buffer += assign
|
226
226
|
|
227
227
|
# Get the value associated to the current hash key
|
@@ -234,7 +234,7 @@ module Opulent
|
|
234
234
|
|
235
235
|
# If there is an comma ",", recursively gather the next
|
236
236
|
# array element into the buffer
|
237
|
-
if (terminator = accept_stripped :comma)
|
237
|
+
if (terminator = accept_stripped :comma)
|
238
238
|
buffer += call_elements terminator
|
239
239
|
end
|
240
240
|
end
|
@@ -248,14 +248,13 @@ module Opulent
|
|
248
248
|
# :symbol
|
249
249
|
#
|
250
250
|
def symbol
|
251
|
-
|
252
|
-
|
251
|
+
return unless (colon = accept :colon)
|
252
|
+
return undo colon if lookahead(:whitespace)
|
253
253
|
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
end
|
254
|
+
if (exp = expression).nil?
|
255
|
+
error :symbol
|
256
|
+
else
|
257
|
+
colon + exp[@value]
|
259
258
|
end
|
260
259
|
end
|
261
260
|
|
@@ -268,30 +267,29 @@ module Opulent
|
|
268
267
|
accept(:exp_context) || accept(:exp_module)
|
269
268
|
end
|
270
269
|
|
271
|
-
|
272
270
|
# Accept a ruby percentage operator for arrays of strings, symbols and
|
273
271
|
# simple escaped strings
|
274
272
|
#
|
275
273
|
# %w(word1 word2 word3)
|
276
274
|
#
|
277
275
|
def percent
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
unless Tokens[match_name]
|
283
|
-
match_end = Tokens.bracket(match_start) || match_start
|
276
|
+
return unless (buffer = accept_stripped :exp_percent)
|
277
|
+
match_start = buffer[-1]
|
278
|
+
match_name = :"percent#{match_start}"
|
284
279
|
|
285
|
-
|
286
|
-
|
280
|
+
unless Tokens[match_name]
|
281
|
+
match_end = Tokens.bracket(match_start) || match_start
|
287
282
|
|
288
|
-
|
283
|
+
match_inner = "\\#{match_start}"
|
284
|
+
match_inner += "\\#{match_end}" unless match_end == match_start
|
289
285
|
|
290
|
-
|
291
|
-
end
|
286
|
+
pattern = /(((?:[^#{match_inner}\\]|\\.)*?)#{'\\' + match_end})/
|
292
287
|
|
293
|
-
|
288
|
+
Tokens[match_name] = pattern
|
294
289
|
end
|
290
|
+
|
291
|
+
buffer += accept match_name
|
292
|
+
buffer
|
295
293
|
end
|
296
294
|
|
297
295
|
# Accept any primary term and return it without the leading whitespace to
|
@@ -306,12 +304,12 @@ module Opulent
|
|
306
304
|
# /.*/
|
307
305
|
#
|
308
306
|
def primary_term
|
309
|
-
accept_stripped(:exp_string)
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
307
|
+
accept_stripped(:exp_string) ||
|
308
|
+
accept_stripped(:exp_fixnum) ||
|
309
|
+
accept_stripped(:exp_double) ||
|
310
|
+
accept_stripped(:exp_nil) ||
|
311
|
+
accept_stripped(:exp_regex) ||
|
312
|
+
accept_stripped(:exp_boolean)
|
315
313
|
end
|
316
314
|
|
317
315
|
# Accept an operation between two or more expressions
|
@@ -323,7 +321,12 @@ module Opulent
|
|
323
321
|
# Accept a ruby method call modifier
|
324
322
|
#
|
325
323
|
def method_call
|
326
|
-
accept(:exp_method_call)
|
324
|
+
return unless (method_code = accept(:exp_method_call))
|
325
|
+
|
326
|
+
argument = call
|
327
|
+
method_code += argument if argument
|
328
|
+
|
329
|
+
method_code
|
327
330
|
end
|
328
331
|
|
329
332
|
# Accept ternary operator syntax
|
@@ -1,25 +1,31 @@
|
|
1
|
-
# @Opulent
|
2
|
-
module Opulent
|
3
|
-
# @Parser
|
4
|
-
class Parser
|
5
|
-
# Check if we match an compile time filter
|
6
|
-
#
|
7
|
-
# :filter
|
8
|
-
#
|
9
|
-
# @param parent [Node] Parent node to which we append the element
|
10
|
-
#
|
11
|
-
def filter(parent, indent)
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
1
|
+
# @Opulent
|
2
|
+
module Opulent
|
3
|
+
# @Parser
|
4
|
+
class Parser
|
5
|
+
# Check if we match an compile time filter
|
6
|
+
#
|
7
|
+
# :filter
|
8
|
+
#
|
9
|
+
# @param parent [Node] Parent node to which we append the element
|
10
|
+
#
|
11
|
+
def filter(parent, indent)
|
12
|
+
return unless (filter_name = accept :filter)
|
13
|
+
|
14
|
+
# Get element attributes
|
15
|
+
atts = attributes(shorthand_attributes) || {}
|
16
|
+
|
17
|
+
# Accept inline text or multiline text feed as first child
|
18
|
+
error :fiter unless accept(:line_feed).strip.empty?
|
19
|
+
|
20
|
+
# Get everything under the filter and set it as the node value
|
21
|
+
# and create a new node and set its extension
|
22
|
+
parent[@children] << [
|
23
|
+
:filter,
|
24
|
+
filter_name[1..-1].to_sym,
|
25
|
+
atts,
|
26
|
+
get_indented_lines(indent),
|
27
|
+
indent
|
28
|
+
]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|