luoma 0.1.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 +7 -0
- checksums.yaml.gz.sig +2 -0
- data/.rdoc_options +16 -0
- data/CHANGELOG.md +5 -0
- data/LICENSE.txt +21 -0
- data/README.md +68 -0
- data/Rakefile +69 -0
- data/Steepfile +41 -0
- data/certs/jgrp.pem +27 -0
- data/docs/configuration.md +180 -0
- data/docs/custom_filters.md +3 -0
- data/docs/custom_tags.md +3 -0
- data/docs/expressions.md +3 -0
- data/docs/extension_types.md +41 -0
- data/docs/filter_reference.md +1702 -0
- data/docs/index.md +73 -0
- data/docs/luoma_for_template_authors.md +3 -0
- data/docs/markdown.md +111 -0
- data/docs/predicate_reference.md +3 -0
- data/docs/static_analysis.md +3 -0
- data/docs/tag_reference.md +352 -0
- data/docs/template_loaders.md +177 -0
- data/docs/undefined_variables.md +3 -0
- data/docs-requirements.txt +11 -0
- data/docs_/cycle.md +17 -0
- data/docs_/font_rendering_example.md +157 -0
- data/docs_/header_block_example.md +51 -0
- data/docs_/increment_and_decrement.md +49 -0
- data/docs_/logo_style_example.md +40 -0
- data/docs_/migration.md +11 -0
- data/docs_/notes.md +19 -0
- data/lib/luoma/cache.rb +80 -0
- data/lib/luoma/chain_hash.rb +54 -0
- data/lib/luoma/context.rb +227 -0
- data/lib/luoma/drop.rb +84 -0
- data/lib/luoma/drops/block.rb +33 -0
- data/lib/luoma/drops/expression.rb +29 -0
- data/lib/luoma/drops/html_safe.rb +36 -0
- data/lib/luoma/drops/range.rb +69 -0
- data/lib/luoma/drops/undefined.rb +119 -0
- data/lib/luoma/environment.rb +479 -0
- data/lib/luoma/errors.rb +79 -0
- data/lib/luoma/escape.rb +35 -0
- data/lib/luoma/expression.rb +1271 -0
- data/lib/luoma/filter.rb +97 -0
- data/lib/luoma/filters/array.rb +372 -0
- data/lib/luoma/filters/date.rb +19 -0
- data/lib/luoma/filters/default.rb +16 -0
- data/lib/luoma/filters/json.rb +14 -0
- data/lib/luoma/filters/math.rb +84 -0
- data/lib/luoma/filters/size.rb +13 -0
- data/lib/luoma/filters/slice.rb +52 -0
- data/lib/luoma/filters/sort.rb +113 -0
- data/lib/luoma/filters/string.rb +186 -0
- data/lib/luoma/fnv.rb +15 -0
- data/lib/luoma/lexer.rb +106 -0
- data/lib/luoma/lexer_legacy.rb +396 -0
- data/lib/luoma/lexer_unified.rb +279 -0
- data/lib/luoma/loader.rb +50 -0
- data/lib/luoma/loaders/choice_loader.rb +20 -0
- data/lib/luoma/loaders/file_system_loader.rb +75 -0
- data/lib/luoma/loaders/mixins.rb +52 -0
- data/lib/luoma/markup.rb +109 -0
- data/lib/luoma/parser.rb +252 -0
- data/lib/luoma/parser_unified.rb +979 -0
- data/lib/luoma/predicates/blank.rb +19 -0
- data/lib/luoma/predicates/defined.rb +10 -0
- data/lib/luoma/predicates/empty.rb +15 -0
- data/lib/luoma/predicates/type.rb +35 -0
- data/lib/luoma/static_analysis.rb +427 -0
- data/lib/luoma/tags/assign.rb +63 -0
- data/lib/luoma/tags/break.rb +23 -0
- data/lib/luoma/tags/capture.rb +43 -0
- data/lib/luoma/tags/case.rb +137 -0
- data/lib/luoma/tags/comment.rb +17 -0
- data/lib/luoma/tags/continue.rb +23 -0
- data/lib/luoma/tags/define.rb +42 -0
- data/lib/luoma/tags/else.rb +30 -0
- data/lib/luoma/tags/for.rb +108 -0
- data/lib/luoma/tags/if.rb +109 -0
- data/lib/luoma/tags/import.rb +91 -0
- data/lib/luoma/tags/include.rb +77 -0
- data/lib/luoma/tags/output.rb +20 -0
- data/lib/luoma/tags/raw.rb +26 -0
- data/lib/luoma/tags/render.rb +92 -0
- data/lib/luoma/tags/with.rb +55 -0
- data/lib/luoma/template.rb +178 -0
- data/lib/luoma/token.rb +84 -0
- data/lib/luoma/version.rb +5 -0
- data/lib/luoma.rb +75 -0
- data/sig/luoma/cache.rbs +44 -0
- data/sig/luoma/chain_hash.rbs +26 -0
- data/sig/luoma/context.rbs +115 -0
- data/sig/luoma/drop.rbs +44 -0
- data/sig/luoma/drops/block.rbs +10 -0
- data/sig/luoma/drops/expression.rbs +10 -0
- data/sig/luoma/drops/html_safe.rbs +14 -0
- data/sig/luoma/drops/range.rbs +15 -0
- data/sig/luoma/drops/undefined.rbs +27 -0
- data/sig/luoma/environment.rbs +212 -0
- data/sig/luoma/errors.rbs +67 -0
- data/sig/luoma/escape.rbs +15 -0
- data/sig/luoma/expression.rbs +514 -0
- data/sig/luoma/filter.rbs +66 -0
- data/sig/luoma/filters/array.rbs +74 -0
- data/sig/luoma/filters/date.rbs +9 -0
- data/sig/luoma/filters/default.rbs +8 -0
- data/sig/luoma/filters/json.rbs +7 -0
- data/sig/luoma/filters/math.rbs +37 -0
- data/sig/luoma/filters/size.rbs +6 -0
- data/sig/luoma/filters/slice.rbs +10 -0
- data/sig/luoma/filters/sort.rbs +17 -0
- data/sig/luoma/filters/string.rbs +103 -0
- data/sig/luoma/fnv.rbs +3 -0
- data/sig/luoma/lexer.rbs +42 -0
- data/sig/luoma/lexer_legacy.rbs +81 -0
- data/sig/luoma/lexer_unified.rbs +49 -0
- data/sig/luoma/loader.rbs +40 -0
- data/sig/luoma/loaders/choice_loader.rbs +9 -0
- data/sig/luoma/loaders/file_system_loader.rbs +19 -0
- data/sig/luoma/loaders/mixins.rbs +16 -0
- data/sig/luoma/markup.rbs +68 -0
- data/sig/luoma/parser.rbs +105 -0
- data/sig/luoma/parser_unified.rbs +150 -0
- data/sig/luoma/predicates/blank.rbs +6 -0
- data/sig/luoma/predicates/defined.rbs +6 -0
- data/sig/luoma/predicates/empty.rbs +6 -0
- data/sig/luoma/predicates/type.rbs +21 -0
- data/sig/luoma/static_analysis.rbs +141 -0
- data/sig/luoma/tags/assign.rbs +12 -0
- data/sig/luoma/tags/break.rbs +11 -0
- data/sig/luoma/tags/capture.rbs +14 -0
- data/sig/luoma/tags/case.rbs +36 -0
- data/sig/luoma/tags/comment.rbs +11 -0
- data/sig/luoma/tags/continue.rbs +11 -0
- data/sig/luoma/tags/define.rbs +16 -0
- data/sig/luoma/tags/else.rbs +17 -0
- data/sig/luoma/tags/for.rbs +26 -0
- data/sig/luoma/tags/if.rbs +45 -0
- data/sig/luoma/tags/import.rbs +13 -0
- data/sig/luoma/tags/include.rbs +13 -0
- data/sig/luoma/tags/output.rbs +13 -0
- data/sig/luoma/tags/raw.rbs +11 -0
- data/sig/luoma/tags/render.rbs +13 -0
- data/sig/luoma/tags/with.rbs +15 -0
- data/sig/luoma/template.rbs +117 -0
- data/sig/luoma/token.rbs +81 -0
- data/sig/luoma.rbs +11 -0
- data/zensical.toml +363 -0
- data.tar.gz.sig +0 -0
- metadata +233 -0
- metadata.gz.sig +0 -0
|
@@ -0,0 +1,514 @@
|
|
|
1
|
+
module Luoma
|
|
2
|
+
type t_path_segment = Name | StringLiteral | IndexSelector | Variable | Predicate
|
|
3
|
+
|
|
4
|
+
interface _Traversable
|
|
5
|
+
def children: () -> Array[_Traversable]
|
|
6
|
+
def to_s: () -> String
|
|
7
|
+
def class: () -> untyped
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
class Expression
|
|
11
|
+
@token: t_token
|
|
12
|
+
|
|
13
|
+
@span: t_token
|
|
14
|
+
|
|
15
|
+
attr_reader token: t_token
|
|
16
|
+
|
|
17
|
+
attr_reader span: t_token
|
|
18
|
+
|
|
19
|
+
# (t_token) -> void
|
|
20
|
+
def initialize: (t_token token) -> void
|
|
21
|
+
|
|
22
|
+
# (RenderContext) -> untyped
|
|
23
|
+
def evaluate: (RenderContext context) -> untyped
|
|
24
|
+
|
|
25
|
+
# () -> Array[_Traversable]
|
|
26
|
+
def children: () -> Array[_Traversable]
|
|
27
|
+
|
|
28
|
+
# () -> Array[Name]
|
|
29
|
+
def scope: () -> Array[Name]
|
|
30
|
+
|
|
31
|
+
def to_s: () -> String
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
class GroupExpression < Expression
|
|
35
|
+
@expr: Expression
|
|
36
|
+
|
|
37
|
+
@segments: Array[t_path_segment]
|
|
38
|
+
|
|
39
|
+
# (t_token, Expression, Array[t_path_segment]) -> void
|
|
40
|
+
def initialize: (t_token token, Expression expr, Array[t_path_segment] segments) -> void
|
|
41
|
+
|
|
42
|
+
# (t_token) -> self
|
|
43
|
+
def with: (t_token token) -> self
|
|
44
|
+
|
|
45
|
+
# (Array[t_path_segment]) -> String
|
|
46
|
+
def path: (Array[t_path_segment]) -> String
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
class TernaryExpression < Expression
|
|
50
|
+
@consequence: Expression
|
|
51
|
+
|
|
52
|
+
@condition: Expression
|
|
53
|
+
|
|
54
|
+
@alternative: Expression?
|
|
55
|
+
|
|
56
|
+
# (t_token, Expression, Expression, Expression?) -> void
|
|
57
|
+
def initialize: (t_token token, Expression consequence, Expression condition, Expression? alternative) -> void
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
class FilteredExpression < Expression
|
|
61
|
+
@left: Expression
|
|
62
|
+
|
|
63
|
+
@filter: Filter
|
|
64
|
+
|
|
65
|
+
@name: String?
|
|
66
|
+
|
|
67
|
+
@span: t_token
|
|
68
|
+
|
|
69
|
+
def initialize: (t_token token, Expression left, Filter filter) -> void
|
|
70
|
+
|
|
71
|
+
def evaluate_lambda: (LambdaExpr expr, RenderContext context) -> untyped
|
|
72
|
+
|
|
73
|
+
def evaluate_filter: (String name, RenderContext context) -> untyped
|
|
74
|
+
|
|
75
|
+
def normalize_arguments: (RenderContext context, ::Method method, Array[untyped] args, Hash[Symbol, untyped] kwargs) -> [Array[untyped], Hash[Symbol, untyped]]
|
|
76
|
+
|
|
77
|
+
def validate_arguments: (
|
|
78
|
+
RenderContext context,
|
|
79
|
+
::Method method,
|
|
80
|
+
Array[untyped] args,
|
|
81
|
+
Hash[Symbol, untyped] kwargs,
|
|
82
|
+
required_positional: untyped,
|
|
83
|
+
optional_positional: untyped,
|
|
84
|
+
has_rest: untyped,
|
|
85
|
+
required_keys: untyped,
|
|
86
|
+
optional_keys: untyped,
|
|
87
|
+
has_keyrest: untyped
|
|
88
|
+
) -> void
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
class PrefixExpression < Expression
|
|
92
|
+
@right: Expression
|
|
93
|
+
|
|
94
|
+
# (t_token, Expression) -> void
|
|
95
|
+
def initialize: (t_token token, Expression right) -> void
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
class NotExpression < PrefixExpression
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
class PosExpression < PrefixExpression
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
class NegExpression < PrefixExpression
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
class InfixExpression < Expression
|
|
108
|
+
@left: untyped
|
|
109
|
+
|
|
110
|
+
@right: untyped
|
|
111
|
+
|
|
112
|
+
@span: untyped
|
|
113
|
+
|
|
114
|
+
# (t_token, Expression, Expression) -> void
|
|
115
|
+
def initialize: (t_token token, Expression left, Expression right) -> void
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
class CoalesceExpression < InfixExpression
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
class OrExpression < InfixExpression
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
class AndExpression < InfixExpression
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
class EqExpression < InfixExpression
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
class NeExpression < InfixExpression
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
class LtExpression < InfixExpression
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
class LeExpression < InfixExpression
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
class GtExpression < InfixExpression
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
class GeExpression < InfixExpression
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
class ContainsExpression < InfixExpression
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
class InExpression < InfixExpression
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
class AddExpression < InfixExpression
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
class SubExpression < InfixExpression
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
class MulExpression < InfixExpression
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
class DivExpression < InfixExpression
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
class ModExpression < InfixExpression
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
class Variable < Expression
|
|
167
|
+
@root: Name | StringLiteral | Variable
|
|
168
|
+
|
|
169
|
+
@segments: Array[t_path_segment]
|
|
170
|
+
|
|
171
|
+
@span: t_token
|
|
172
|
+
|
|
173
|
+
attr_reader root: Name | StringLiteral | Variable
|
|
174
|
+
|
|
175
|
+
attr_reader segments: Array[t_path_segment]
|
|
176
|
+
|
|
177
|
+
# (t_token, Name | StringLiteral | Variable, Array[PathSegment])
|
|
178
|
+
def initialize: (t_token token, Name | StringLiteral | Variable, Array[t_path_segment]) -> void
|
|
179
|
+
|
|
180
|
+
# (RenderContext) -> untyped
|
|
181
|
+
def evaluate: (RenderContext context) -> untyped
|
|
182
|
+
|
|
183
|
+
# () -> String
|
|
184
|
+
def to_s: () -> String
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
def ident?: (String name) -> bool
|
|
188
|
+
|
|
189
|
+
private
|
|
190
|
+
|
|
191
|
+
# (Array[PathSegment]) -> String
|
|
192
|
+
def path: (Array[t_path_segment] segments) -> String
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
class IndexSelector < Expression
|
|
196
|
+
@value: Integer
|
|
197
|
+
|
|
198
|
+
attr_reader value: Integer
|
|
199
|
+
|
|
200
|
+
# (t_token, Integer)
|
|
201
|
+
def initialize: (t_token token, Integer value) -> void
|
|
202
|
+
|
|
203
|
+
# (RenderContext) -> untyped
|
|
204
|
+
def evaluate: (RenderContext context) -> untyped
|
|
205
|
+
|
|
206
|
+
# () -> Array[_Traversable]
|
|
207
|
+
def children: () -> ::Array[Luoma::_Traversable]
|
|
208
|
+
|
|
209
|
+
# () -> String
|
|
210
|
+
def to_s: () -> String
|
|
211
|
+
|
|
212
|
+
def with: (t_token token) -> self
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
class Lambda < Expression
|
|
216
|
+
@params: Array[Name]
|
|
217
|
+
|
|
218
|
+
@expr: Expression
|
|
219
|
+
|
|
220
|
+
# (t_token, Array[Name], Expression) -> void
|
|
221
|
+
def initialize: (t_token token, Array[Name] params, Expression expr) -> void
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
class StringLiteral < Expression
|
|
225
|
+
@segments: Array[String|Expression]
|
|
226
|
+
|
|
227
|
+
attr_reader segments: Array[String|Expression]
|
|
228
|
+
|
|
229
|
+
# (t_token, Array[String|Expression], t_token)
|
|
230
|
+
def initialize: (t_token token, Array[String|Expression] segments, t_token end_token) -> void
|
|
231
|
+
|
|
232
|
+
def with: (t_token token) -> self
|
|
233
|
+
|
|
234
|
+
# () -> String?
|
|
235
|
+
def value: () -> String?
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
class IntegerLiteral < Expression
|
|
239
|
+
@value: Integer
|
|
240
|
+
|
|
241
|
+
attr_reader value: Integer
|
|
242
|
+
|
|
243
|
+
# (t_token, Integer)
|
|
244
|
+
def initialize: (t_token token, Integer value) -> void
|
|
245
|
+
|
|
246
|
+
# (RenderContext) -> untyped
|
|
247
|
+
def evaluate: (RenderContext context) -> untyped
|
|
248
|
+
|
|
249
|
+
# () -> Array[_Traversable]
|
|
250
|
+
def children: () -> ::Array[_Traversable]
|
|
251
|
+
|
|
252
|
+
# () -> String
|
|
253
|
+
def to_s: () -> String
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
class FloatLiteral < Expression
|
|
257
|
+
@value: Float
|
|
258
|
+
|
|
259
|
+
attr_reader value: Float
|
|
260
|
+
|
|
261
|
+
# (t_token, Float)
|
|
262
|
+
def initialize: (t_token token, Float value) -> void
|
|
263
|
+
|
|
264
|
+
# (RenderContext) -> untyped
|
|
265
|
+
def evaluate: (RenderContext context) -> untyped
|
|
266
|
+
|
|
267
|
+
# () -> Array[_Traversable]
|
|
268
|
+
def children: () -> ::Array[_Traversable]
|
|
269
|
+
|
|
270
|
+
# () -> String
|
|
271
|
+
def to_s: () -> String
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
class BooleanLiteral < Expression
|
|
275
|
+
@value: bool
|
|
276
|
+
|
|
277
|
+
attr_reader value: bool
|
|
278
|
+
|
|
279
|
+
# (t_token, bool)
|
|
280
|
+
def initialize: (t_token token, bool value) -> void
|
|
281
|
+
|
|
282
|
+
# (RenderContext) -> untyped
|
|
283
|
+
def evaluate: (RenderContext context) -> untyped
|
|
284
|
+
|
|
285
|
+
# () -> Array[_Traversable]
|
|
286
|
+
def children: () -> ::Array[_Traversable]
|
|
287
|
+
|
|
288
|
+
# () -> String
|
|
289
|
+
def to_s: () -> String
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
class NullLiteral < Expression
|
|
293
|
+
# (RenderContext) -> untyped
|
|
294
|
+
def evaluate: (RenderContext context) -> untyped
|
|
295
|
+
|
|
296
|
+
# () -> Array[_Traversable]
|
|
297
|
+
def children: () -> ::Array[_Traversable]
|
|
298
|
+
|
|
299
|
+
# () -> String
|
|
300
|
+
def to_s: () -> String
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
class RangeLiteral < Expression
|
|
304
|
+
@start: Expression
|
|
305
|
+
|
|
306
|
+
@stop: Expression
|
|
307
|
+
|
|
308
|
+
# (t_token, Expression, Expression) -> void
|
|
309
|
+
def initialize: (t_token token, Expression start, Expression stop) -> void
|
|
310
|
+
|
|
311
|
+
# (RenderContext) -> untyped
|
|
312
|
+
def evaluate: (RenderContext context) -> untyped
|
|
313
|
+
|
|
314
|
+
# () -> Array[_Traversable]
|
|
315
|
+
def children: () -> ::Array[_Traversable]
|
|
316
|
+
|
|
317
|
+
# () -> String
|
|
318
|
+
def to_s: () -> ::String
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
class ArrayLiteral < Expression
|
|
322
|
+
@items: Array[Expression|Spread]
|
|
323
|
+
|
|
324
|
+
def initialize: (t_token token, Array[Expression|Spread] items) -> void
|
|
325
|
+
|
|
326
|
+
def with: (t_token token) -> self
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
class ObjectLiteral < Expression
|
|
330
|
+
@items: Array[Item|Spread]
|
|
331
|
+
|
|
332
|
+
# (t_token token, Array[Item|Spread] items) -> void
|
|
333
|
+
def initialize: (t_token token, Array[Item|Spread] items) -> void
|
|
334
|
+
|
|
335
|
+
def with: (untyped token) -> self
|
|
336
|
+
end
|
|
337
|
+
|
|
338
|
+
class Predicate < Expression
|
|
339
|
+
@value: String
|
|
340
|
+
|
|
341
|
+
attr_reader value: String
|
|
342
|
+
|
|
343
|
+
# (t_token, String) -> void
|
|
344
|
+
def initialize: (t_token token, String value) -> void
|
|
345
|
+
end
|
|
346
|
+
|
|
347
|
+
class Spread
|
|
348
|
+
@token: t_token
|
|
349
|
+
|
|
350
|
+
@expr: Expression
|
|
351
|
+
|
|
352
|
+
attr_reader token: t_token
|
|
353
|
+
|
|
354
|
+
attr_reader expr: Expression
|
|
355
|
+
|
|
356
|
+
def initialize: (t_token token, Expression expr) -> void
|
|
357
|
+
|
|
358
|
+
# () -> Array[_Traversable]
|
|
359
|
+
def children: () -> ::Array[_Traversable]
|
|
360
|
+
|
|
361
|
+
# () -> String
|
|
362
|
+
def to_s: () -> ::String
|
|
363
|
+
end
|
|
364
|
+
|
|
365
|
+
class Item
|
|
366
|
+
@token: t_token
|
|
367
|
+
|
|
368
|
+
@key: Name
|
|
369
|
+
|
|
370
|
+
@expr: Expression
|
|
371
|
+
|
|
372
|
+
attr_reader token: t_token
|
|
373
|
+
|
|
374
|
+
attr_reader key: Name
|
|
375
|
+
|
|
376
|
+
attr_reader expr: Expression
|
|
377
|
+
|
|
378
|
+
# (t_token, Name, Expression) -> void
|
|
379
|
+
def initialize: (t_token token, Name key, Expression expr) -> void
|
|
380
|
+
|
|
381
|
+
# () -> Array[_Traversable]
|
|
382
|
+
def children: () -> ::Array[_Traversable]
|
|
383
|
+
|
|
384
|
+
# () -> String
|
|
385
|
+
def to_s: () -> ::String
|
|
386
|
+
end
|
|
387
|
+
|
|
388
|
+
class Name
|
|
389
|
+
@token: t_token
|
|
390
|
+
|
|
391
|
+
@value: String
|
|
392
|
+
|
|
393
|
+
@span: t_token
|
|
394
|
+
|
|
395
|
+
attr_reader token: t_token
|
|
396
|
+
|
|
397
|
+
attr_reader span: t_token
|
|
398
|
+
|
|
399
|
+
attr_reader value: String
|
|
400
|
+
|
|
401
|
+
# (t_token, String) -> void
|
|
402
|
+
def initialize: (t_token token, String value) -> void
|
|
403
|
+
|
|
404
|
+
# (RenderContext) -> untyped
|
|
405
|
+
def evaluate: (RenderContext context) -> untyped
|
|
406
|
+
|
|
407
|
+
# () -> Array[_Traversable]
|
|
408
|
+
def children: () -> ::Array[Luoma::_Traversable]
|
|
409
|
+
|
|
410
|
+
# () -> String
|
|
411
|
+
def to_s: () -> String
|
|
412
|
+
end
|
|
413
|
+
|
|
414
|
+
class Filter
|
|
415
|
+
@token: t_token
|
|
416
|
+
|
|
417
|
+
@name: Variable
|
|
418
|
+
|
|
419
|
+
@args: Array[Expression]
|
|
420
|
+
|
|
421
|
+
@kwargs: Array[KeywordArgument]
|
|
422
|
+
|
|
423
|
+
@span: t_token
|
|
424
|
+
|
|
425
|
+
attr_reader token: t_token
|
|
426
|
+
|
|
427
|
+
attr_reader span: t_token
|
|
428
|
+
|
|
429
|
+
attr_reader name: Variable
|
|
430
|
+
|
|
431
|
+
attr_reader kwargs: Array[KeywordArgument]
|
|
432
|
+
|
|
433
|
+
attr_reader args: Array[Expression]
|
|
434
|
+
|
|
435
|
+
# (t_token, Name, Array[Expression | KeywordArgument])
|
|
436
|
+
def initialize: (t_token token, Variable name, Array[Expression] args, Array[KeywordArgument] kwargs) -> void
|
|
437
|
+
|
|
438
|
+
def children: () -> Array[Luoma::_Traversable]
|
|
439
|
+
|
|
440
|
+
def to_s: () -> (::String)
|
|
441
|
+
end
|
|
442
|
+
|
|
443
|
+
class KeywordArgument
|
|
444
|
+
@token: t_token
|
|
445
|
+
|
|
446
|
+
@name: Name
|
|
447
|
+
|
|
448
|
+
@expression: Expression
|
|
449
|
+
|
|
450
|
+
@span: t_token
|
|
451
|
+
|
|
452
|
+
attr_reader token: t_token
|
|
453
|
+
|
|
454
|
+
attr_reader span: t_token
|
|
455
|
+
|
|
456
|
+
attr_reader name: Name
|
|
457
|
+
|
|
458
|
+
attr_reader expression: Expression
|
|
459
|
+
|
|
460
|
+
# (t_token, Name, Expression) -> void
|
|
461
|
+
def initialize: (t_token token, Name name, Expression expression) -> void
|
|
462
|
+
|
|
463
|
+
# () -> Array[_Traversable]
|
|
464
|
+
def children: () -> ::Array[_Traversable]
|
|
465
|
+
|
|
466
|
+
# () -> String
|
|
467
|
+
def to_s: () -> ::String
|
|
468
|
+
|
|
469
|
+
def deconstruct: () -> ::Array[untyped]
|
|
470
|
+
|
|
471
|
+
def deconstruct_keys: (untyped keys) -> { name: untyped, expression: untyped }
|
|
472
|
+
end
|
|
473
|
+
|
|
474
|
+
class PredicateFunction
|
|
475
|
+
@name: String
|
|
476
|
+
|
|
477
|
+
@func: untyped
|
|
478
|
+
|
|
479
|
+
attr_reader name: String
|
|
480
|
+
|
|
481
|
+
attr_reader func: untyped
|
|
482
|
+
|
|
483
|
+
# (String, untyped) -> void
|
|
484
|
+
def initialize: (String name, untyped func) -> void
|
|
485
|
+
|
|
486
|
+
# (RenderContext, untyped) -> bool
|
|
487
|
+
def call: (RenderContext context, untyped obj) -> bool
|
|
488
|
+
end
|
|
489
|
+
|
|
490
|
+
class LambdaExpr
|
|
491
|
+
@params: Array[String]
|
|
492
|
+
|
|
493
|
+
@expr: Expression
|
|
494
|
+
|
|
495
|
+
@context: RenderContext
|
|
496
|
+
|
|
497
|
+
attr_reader params: Array[String]
|
|
498
|
+
|
|
499
|
+
# (Array[String], Expression, RenderContext) -> void
|
|
500
|
+
def initialize: (Array[String] params, Expression expr, RenderContext context) -> void
|
|
501
|
+
|
|
502
|
+
# (Array[Untyped]) -> untyped
|
|
503
|
+
def call: (Array[untyped] args) -> untyped
|
|
504
|
+
|
|
505
|
+
# (Enumerable[untyped]) -> Array[untyped]
|
|
506
|
+
def broadcast_with_index: (Enumerable[untyped] enum) -> Array[untyped]
|
|
507
|
+
|
|
508
|
+
# (untyped, Integer) -> untyped
|
|
509
|
+
def call_with_index: (untyped value, Integer index) -> untyped
|
|
510
|
+
end
|
|
511
|
+
|
|
512
|
+
# (Expression) -> String
|
|
513
|
+
def self.tree_view: (Expression) -> String
|
|
514
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
module Luoma
|
|
2
|
+
class FilterContext
|
|
3
|
+
@token: t_token
|
|
4
|
+
|
|
5
|
+
@render_context: RenderContext
|
|
6
|
+
|
|
7
|
+
@env: Environment
|
|
8
|
+
|
|
9
|
+
attr_reader token: t_token
|
|
10
|
+
|
|
11
|
+
attr_reader render_context: RenderContext
|
|
12
|
+
|
|
13
|
+
attr_reader env: Environment
|
|
14
|
+
|
|
15
|
+
# (t_token, RenderContext)
|
|
16
|
+
def initialize: (t_token token, RenderContext render_context) -> void
|
|
17
|
+
|
|
18
|
+
# (String) -> TemplateTypeError
|
|
19
|
+
def type_error: (String message) -> TemplateTypeError
|
|
20
|
+
|
|
21
|
+
# (String) -> FilterArgumentError
|
|
22
|
+
def argument_error: (String message) -> FilterArgumentError
|
|
23
|
+
|
|
24
|
+
# (untyped) -> Array[untyped]
|
|
25
|
+
def to_a: (untyped obj) -> Array[untyped]
|
|
26
|
+
|
|
27
|
+
# (untyped) -> Hash[untyped, untyped]
|
|
28
|
+
def to_h: (untyped obj) -> Hash[untyped, untyped]
|
|
29
|
+
|
|
30
|
+
# [X] (untyped, ?default: X) -> (Integer | X)
|
|
31
|
+
def to_i: [X] (untyped obj, ?default: X) -> (Integer | X)
|
|
32
|
+
|
|
33
|
+
# (untyped) -> String
|
|
34
|
+
def to_string: (untyped obj) -> String
|
|
35
|
+
|
|
36
|
+
# [X] (untyped, ?default: X) -> (Numeric | X)
|
|
37
|
+
def to_numeric: [X] (untyped obj, ?default: X) -> (Numeric | X)
|
|
38
|
+
|
|
39
|
+
# (untyped) -> Enumerable[untyped]
|
|
40
|
+
def to_enumerable: (untyped obj) -> Enumerable[untyped]
|
|
41
|
+
|
|
42
|
+
# (untyped) -> untyped
|
|
43
|
+
def to_date: (untyped obj) -> untyped
|
|
44
|
+
|
|
45
|
+
# (untyped) -> bool
|
|
46
|
+
def nothing?: (untyped obj) -> bool
|
|
47
|
+
|
|
48
|
+
# (untyped) -> bool
|
|
49
|
+
def truthy?: (untyped obj) -> untyped
|
|
50
|
+
|
|
51
|
+
# (untyped, untyped) -> bool
|
|
52
|
+
def eq?: (untyped obj, untyped other) -> untyped
|
|
53
|
+
|
|
54
|
+
# (untyped, untyped) -> bool
|
|
55
|
+
def lt?: (untyped obj, untyped other) -> untyped
|
|
56
|
+
|
|
57
|
+
# (untyped, untyped) -> (-1 | 1 | 0 | nil)
|
|
58
|
+
def cmp: (untyped left, untyped right) -> (-1 | 1 | 0 | nil)
|
|
59
|
+
|
|
60
|
+
# (untyped) -> bool
|
|
61
|
+
def empty?: (untyped obj) -> bool
|
|
62
|
+
|
|
63
|
+
# (untyped, untyped, ?default: untyped?) -> untyped
|
|
64
|
+
def fetch: (untyped obj, untyped key, ?default: untyped) -> untyped
|
|
65
|
+
end
|
|
66
|
+
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
module Luoma
|
|
2
|
+
module Filters
|
|
3
|
+
# Return the concatenation of items in _left_ separated by _sep_.
|
|
4
|
+
# Coerce items in _left_ to strings if they aren't strings already.
|
|
5
|
+
def self.join: (FilterContext context, untyped left, ?::String sep) -> untyped
|
|
6
|
+
|
|
7
|
+
# If _left_ is enumerable, return _left_ flattened to _depth_. Otherwise
|
|
8
|
+
# return _left_.
|
|
9
|
+
def self.flatten: (FilterContext context, untyped left, ?untyped? depth) -> untyped
|
|
10
|
+
|
|
11
|
+
# Return _true_ if at least one item in _left_ is truthy.
|
|
12
|
+
def self.any: (FilterContext context, untyped left, ?untyped key, ?untyped value) -> untyped
|
|
13
|
+
|
|
14
|
+
# Return true if all items in _left_ are truthy.
|
|
15
|
+
def self.all: (FilterContext context, untyped left, ?untyped key, ?untyped value) -> untyped
|
|
16
|
+
|
|
17
|
+
# Return a copy of _left_ with nil items removed.
|
|
18
|
+
# Coerce _left_ to an array-like object if it is not one already.
|
|
19
|
+
#
|
|
20
|
+
# If _key_ is given, assume items in _left_ are hash-like and remove items from _left_
|
|
21
|
+
# where `item.fetch(key, nil)` is nil.
|
|
22
|
+
#
|
|
23
|
+
# If key is not `:nothing`, coerce it to a string before calling `fetch` on items in
|
|
24
|
+
# _left_.
|
|
25
|
+
def self.compact: (FilterContext context, untyped left, ?untyped key) -> untyped
|
|
26
|
+
|
|
27
|
+
# Return _left_ concatenated with _right_, or nil if _right_ is not an array.
|
|
28
|
+
# Coerce _left_ to an array if it isn't an array already.
|
|
29
|
+
def self.concat: (FilterContext context, untyped left, untyped right) -> untyped
|
|
30
|
+
|
|
31
|
+
def self.find: (FilterContext context, untyped left, untyped key, ?untyped? value) -> (untyped | nil)
|
|
32
|
+
|
|
33
|
+
def self.find_index: (FilterContext context, untyped left, untyped key, ?untyped? value) -> (untyped | nil)
|
|
34
|
+
|
|
35
|
+
def self.has: (FilterContext context, untyped left, untyped key, ?untyped? value) -> (true | false)
|
|
36
|
+
|
|
37
|
+
# Return the first item in _left_, or `nil` if _left_ does not have a first item.
|
|
38
|
+
def self.first: (FilterContext context, untyped left) -> untyped
|
|
39
|
+
|
|
40
|
+
# Return the last item in _left_, or `nil` if _left_ does not have a last item.
|
|
41
|
+
def self.last: (FilterContext context, untyped left) -> untyped
|
|
42
|
+
|
|
43
|
+
def self.map: (FilterContext context, untyped left, untyped key) -> untyped
|
|
44
|
+
|
|
45
|
+
def self.flat_map: (FilterContext context, untyped left, untyped key) -> untyped
|
|
46
|
+
|
|
47
|
+
# Return _left_ with all items in reverse order.
|
|
48
|
+
# Coerce _left_ to an array if it isn't an array already.
|
|
49
|
+
def self.reverse: (FilterContext context, untyped left) -> untyped
|
|
50
|
+
|
|
51
|
+
def self.reject: (FilterContext context, untyped left, untyped key, ?untyped? value) -> untyped
|
|
52
|
+
|
|
53
|
+
def self.where: (FilterContext context, untyped left, untyped key, ?untyped? value) -> untyped
|
|
54
|
+
|
|
55
|
+
# Deduplicate items in _left_.
|
|
56
|
+
# Coerce _left_ to an array if it isn't an array already.
|
|
57
|
+
def self.uniq: (FilterContext context, untyped left, ?untyped? key) -> untyped
|
|
58
|
+
|
|
59
|
+
# Return the sum of all numeric values in the input array.
|
|
60
|
+
def self.sum: (FilterContext context, untyped left, ?untyped? key) -> untyped
|
|
61
|
+
|
|
62
|
+
# Combine _left_ with _right_, producing an array or pairs.
|
|
63
|
+
# Coerce _left_ and _right_ to arrays if they aren't arrays already.
|
|
64
|
+
def self.zip: (FilterContext context, untyped left, untyped right) -> untyped
|
|
65
|
+
|
|
66
|
+
# Return the minimum numeric value found in _left_.
|
|
67
|
+
# Coerce _left_ to an array if it's not an array already.
|
|
68
|
+
def self.min: (FilterContext context, untyped left, ?untyped key) -> untyped
|
|
69
|
+
|
|
70
|
+
# Return the maximum numeric value found in _left_.
|
|
71
|
+
# Coerce _left_ to an array if it's not an array already.
|
|
72
|
+
def self.max: (FilterContext context, untyped left, ?untyped key) -> untyped
|
|
73
|
+
end
|
|
74
|
+
end
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
module Luoma
|
|
2
|
+
|
|
3
|
+
module Filters
|
|
4
|
+
# Format date and time object _left_ with _format_.
|
|
5
|
+
# Coerce _left_ to a `Time` if it is not a time-like object already.
|
|
6
|
+
# Coerce _format_ to a string if it is not a string already.
|
|
7
|
+
def self.date: (FilterContext context, untyped left, untyped format) -> untyped
|
|
8
|
+
end
|
|
9
|
+
end
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
module Luoma
|
|
2
|
+
|
|
3
|
+
module Filters
|
|
4
|
+
# Return _left_, or _default_ if _obj_ is `nil`, `false` or empty.
|
|
5
|
+
# If _allow_false_ is `true`, _left_ is returned if _left_ is `false`.
|
|
6
|
+
def self.default: (FilterContext context, untyped left, ?::String default, ?allow_false: bool) -> untyped
|
|
7
|
+
end
|
|
8
|
+
end
|