fabulator 0.0.5 → 0.0.6
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.
- data/History.txt +9 -1
- data/VERSION +1 -1
- data/features/step_definitions/expression_steps.rb +2 -1
- data/lib/fabulator/action_lib.rb +7 -7
- data/lib/fabulator/core/constraint.rb +10 -6
- data/lib/fabulator/core/group.rb +1 -28
- data/lib/fabulator/core/parameter.rb +4 -22
- data/lib/fabulator/core/transition.rb +5 -26
- data/lib/fabulator/expr/context.rb +9 -6
- data/lib/fabulator/expr/node.rb +0 -53
- data/lib/fabulator/expr/parser.rb +18 -10
- data/lib/fabulator/expr/predicates.rb +0 -10
- data/lib/fabulator/template/parse_result.rb +14 -7
- data/xsm_expression_parser.racc +11 -2
- metadata +4 -4
data/History.txt
CHANGED
@@ -1,4 +1,12 @@
|
|
1
|
-
=== 0.0.
|
1
|
+
=== 0.0.6 2010-08-27
|
2
|
+
|
3
|
+
* 4 minor enhancement:
|
4
|
+
* Better regex for matching quoted strings in expressions
|
5
|
+
* Less duplication of compile-time contexts
|
6
|
+
* Template add_caption call can take a hash or a node context
|
7
|
+
* set_value can take a node as a source instead of only an expression
|
8
|
+
|
9
|
+
=== 0.0.5 2010-08-18
|
2
10
|
|
3
11
|
* 2 major enhancements:
|
4
12
|
* unified predicate execution so numeric indexes and boolean logic
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.6
|
@@ -71,7 +71,8 @@ Then /I should get the type (.*)/ do |t|
|
|
71
71
|
end
|
72
72
|
|
73
73
|
Then /I should get (\d+) items?/ do |count|
|
74
|
-
@result.
|
74
|
+
#puts "result types: #{@result.collect{|r| r.class.name}.join(', ')}"
|
75
|
+
@result.size.should == count
|
75
76
|
end
|
76
77
|
|
77
78
|
Then /item (\d+) should be (\[.*\])/ do |i,t|
|
data/lib/fabulator/action_lib.rb
CHANGED
@@ -175,13 +175,13 @@ module Fabulator
|
|
175
175
|
end
|
176
176
|
end
|
177
177
|
end
|
178
|
-
|
179
|
-
|
180
|
-
return d1[t2.join('')]
|
181
|
-
elsif !common.empty?
|
182
|
-
return d1[common.sort_by{ |c| d1[c][:w] * d2[c][:w] / d1[c][:path].size / d2[c][:path].size }.reverse.first]
|
183
|
-
end
|
178
|
+
r = self._select_type_path(d1, d2, t2, ordered)
|
179
|
+
return r unless r.nil?
|
184
180
|
end
|
181
|
+
return self._select_type_path(d1, d2, t2, ordered)
|
182
|
+
end
|
183
|
+
|
184
|
+
def self._select_type_path(d1, d2, t2, ordered)
|
185
185
|
common = d1.keys & d2.keys
|
186
186
|
if ordered && common.include?(t2.join(''))
|
187
187
|
return d1[t2.join('')]
|
@@ -205,7 +205,7 @@ module Fabulator
|
|
205
205
|
|
206
206
|
def compile_action(e, c)
|
207
207
|
if self.class.method_defined? "action:#{e.name}"
|
208
|
-
send "action:#{e.name}", e, c
|
208
|
+
send "action:#{e.name}", e, c #.merge(e)
|
209
209
|
end
|
210
210
|
end
|
211
211
|
|
@@ -66,8 +66,7 @@ module Fabulator
|
|
66
66
|
return sense.call(paths) if select.nil?
|
67
67
|
opts = @select.run(ctx).collect { |o| o.to_s }
|
68
68
|
if !opts.include?(ctx.root.to_s)
|
69
|
-
paths
|
70
|
-
paths[1] += [ ctx.root.path ]
|
69
|
+
invalidate_path(paths, ctx.root)
|
71
70
|
end
|
72
71
|
return sense.call(paths)
|
73
72
|
when 'all':
|
@@ -94,8 +93,7 @@ module Fabulator
|
|
94
93
|
end
|
95
94
|
end
|
96
95
|
if !calc_values.include?(ctx.root.value)
|
97
|
-
paths
|
98
|
-
paths[1] += [ ctx.root.path ]
|
96
|
+
invalidate_path(paths, ctx.root)
|
99
97
|
end
|
100
98
|
return sense.call(paths)
|
101
99
|
end
|
@@ -103,8 +101,7 @@ module Fabulator
|
|
103
101
|
fl = (@params['floor'].run(ctx) rescue nil)
|
104
102
|
ce = (@params['ceiling'].run(ctx) rescue nil)
|
105
103
|
if !fl.nil? && fl > c.value || !ce.nil? && ce < c.value
|
106
|
-
paths
|
107
|
-
paths[1] += [ c.path ]
|
104
|
+
invalidate_path(paths, c)
|
108
105
|
end
|
109
106
|
return sense.call(r)
|
110
107
|
else
|
@@ -112,6 +109,13 @@ module Fabulator
|
|
112
109
|
end
|
113
110
|
end
|
114
111
|
end
|
112
|
+
|
113
|
+
protected
|
114
|
+
|
115
|
+
def invalidate_path(paths, root)
|
116
|
+
paths[0] -= [ root.path ]
|
117
|
+
paths[1] += [ root.path ]
|
118
|
+
end
|
115
119
|
end
|
116
120
|
end
|
117
121
|
end
|
data/lib/fabulator/core/group.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Fabulator
|
2
2
|
module Core
|
3
3
|
class Group < Fabulator::Action
|
4
|
-
attr_accessor :name, :params, :tags
|
4
|
+
attr_accessor :name, :params, :tags, :required_params
|
5
5
|
|
6
6
|
namespace Fabulator::FAB_NS
|
7
7
|
|
@@ -91,33 +91,6 @@ module Fabulator
|
|
91
91
|
end
|
92
92
|
ret
|
93
93
|
end
|
94
|
-
|
95
|
-
def test_constraints(context)
|
96
|
-
passed = [ ]
|
97
|
-
failed = [ ]
|
98
|
-
@context.with(context) do |ctx|
|
99
|
-
roots = self.get_context(ctx)
|
100
|
-
roots.each do |root|
|
101
|
-
@params.each do |param|
|
102
|
-
p_ctx = param.get_context(ctx.with_root(root))
|
103
|
-
if !p_ctx.nil? && !p_ctx.empty?
|
104
|
-
p_ctx.each do |p|
|
105
|
-
@constraints.each do |c|
|
106
|
-
r = c.test_constraint(ctx.with_root(p))
|
107
|
-
passed += r[0]
|
108
|
-
failed += r[1]
|
109
|
-
end
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|
115
|
-
if failed.empty?
|
116
|
-
return [ passed.uniq, [] ]
|
117
|
-
else
|
118
|
-
return [ (passed - failed).uniq, failed ]
|
119
|
-
end
|
120
|
-
end
|
121
94
|
end
|
122
95
|
end
|
123
96
|
end
|
@@ -16,6 +16,10 @@ module Fabulator
|
|
16
16
|
[ @name ]
|
17
17
|
end
|
18
18
|
|
19
|
+
def names
|
20
|
+
[ @name ]
|
21
|
+
end
|
22
|
+
|
19
23
|
def compile_xml(xml, context)
|
20
24
|
super
|
21
25
|
|
@@ -101,28 +105,6 @@ module Fabulator
|
|
101
105
|
return res
|
102
106
|
end
|
103
107
|
|
104
|
-
def test_constraints(context)
|
105
|
-
@context.with(context) do |ctx|
|
106
|
-
me = ctx.traverse_path(@name)
|
107
|
-
return [ [ me.collect{ |m| m.path } ], [] ] if @constraints.empty?
|
108
|
-
paths = [ [], [] ]
|
109
|
-
if @all_constraints
|
110
|
-
@constraints.each do |c|
|
111
|
-
p = c.test_constraints(ctx, me)
|
112
|
-
paths[0] += p[0]
|
113
|
-
paths[1] += p[1]
|
114
|
-
end
|
115
|
-
return [ (paths[0] - paths[1]).uniq, paths[1].uniq ]
|
116
|
-
else
|
117
|
-
@constraints.each do |c|
|
118
|
-
p = c.test_constraints(ctx, me)
|
119
|
-
paths[0] += p[0]
|
120
|
-
paths[1] += p[1]
|
121
|
-
end
|
122
|
-
return [ paths[0].uniq, (paths[1] - paths[0]).uniq ]
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
126
108
|
end
|
127
109
|
end
|
128
110
|
end
|
@@ -39,28 +39,7 @@ module Fabulator
|
|
39
39
|
case e.name
|
40
40
|
# TODO: handle parameters when inheriting
|
41
41
|
when 'params':
|
42
|
-
|
43
|
-
@select = p_ctx.get_select('/')
|
44
|
-
|
45
|
-
e.each_element do |ee|
|
46
|
-
next unless ee.namespaces.namespace.href == FAB_NS
|
47
|
-
case ee.name
|
48
|
-
when 'group':
|
49
|
-
if !inheriting
|
50
|
-
g = Group.new.compile_xml(ee, p_ctx)
|
51
|
-
@params << g
|
52
|
-
else
|
53
|
-
tags = (ee.attributes.get_attribute_ns(FAB_NS, 'tag').value rescue '').split(/\s+/)
|
54
|
-
end
|
55
|
-
when 'param':
|
56
|
-
if !inheriting
|
57
|
-
p = Parameter.new.compile_xml(ee, p_ctx)
|
58
|
-
@params << p
|
59
|
-
else
|
60
|
-
tags = (ee.attributes.get_attribute_ns(FAB_NS, 'tag').value rescue '').split(/\s+/)
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
42
|
+
@params << Group.new.compile_xml(e, @context)
|
64
43
|
end
|
65
44
|
end
|
66
45
|
self
|
@@ -126,10 +105,10 @@ module Fabulator
|
|
126
105
|
res[:valid].delete(k)
|
127
106
|
end
|
128
107
|
|
129
|
-
res[:score] = (res[:valid].size+1)*(params.size)
|
130
|
-
|
131
|
-
|
132
|
-
|
108
|
+
res[:score] = (res[:valid].size+1)*(params.size) /
|
109
|
+
(res[:missing].size + 1) /
|
110
|
+
(res[:invalid].size + 1) /
|
111
|
+
(res[:unknown].size + 1)
|
133
112
|
return res
|
134
113
|
end
|
135
114
|
|
@@ -239,17 +239,18 @@ module Fabulator
|
|
239
239
|
v = parser.parse(v,self) if v.is_a?(String)
|
240
240
|
end
|
241
241
|
|
242
|
-
return [] if p.nil?
|
243
|
-
|
242
|
+
#return [] if p.nil?
|
243
|
+
p = [ self.root ] if p.nil?
|
244
|
+
|
244
245
|
p = [ p ] unless p.is_a?(Array)
|
245
246
|
|
246
247
|
ret = [ ]
|
247
248
|
|
248
249
|
p.each do |pp|
|
249
|
-
tgts = pp.run(self, true)
|
250
|
+
tgts = pp.is_a?(Fabulator::Expr::Node) ? [ pp ] : pp.run(self, true)
|
250
251
|
src = nil
|
251
252
|
if !v.nil?
|
252
|
-
src = v.run(self)
|
253
|
+
src = v.is_a?(Fabulator::Expr::Node) ? [ v ] : v.run(self)
|
253
254
|
end
|
254
255
|
|
255
256
|
tgts.each do |tgt|
|
@@ -305,7 +306,9 @@ module Fabulator
|
|
305
306
|
else
|
306
307
|
root_context = root_context.first
|
307
308
|
end
|
308
|
-
if d.is_a?(
|
309
|
+
if d.is_a?(Fabulator::Expr::Node)
|
310
|
+
self.set_value(p, d)
|
311
|
+
elsif d.is_a?(Array)
|
309
312
|
node_name = root_context.name
|
310
313
|
root_context = root_context.parent
|
311
314
|
# get rid of empty children so we don't have problems later
|
@@ -322,7 +325,7 @@ module Fabulator
|
|
322
325
|
d.each_pair do |k,v|
|
323
326
|
bits = k.split('.')
|
324
327
|
c = self.with_root(root_context).traverse_path(bits,true).first
|
325
|
-
if v.is_a?(Hash) || v.is_a?(Array)
|
328
|
+
if v.is_a?(Hash) || v.is_a?(Array) || v.is_a?(Fabulator::Expr::Node)
|
326
329
|
self.with_root(c).merge_data(v)
|
327
330
|
else
|
328
331
|
c.value = v
|
data/lib/fabulator/expr/node.rb
CHANGED
@@ -84,59 +84,6 @@ module Fabulator
|
|
84
84
|
node
|
85
85
|
end
|
86
86
|
|
87
|
-
def merge_data(d,p = nil)
|
88
|
-
# we have a hash or array based on root (r)
|
89
|
-
if p.nil?
|
90
|
-
root_context = [ self ]
|
91
|
-
else
|
92
|
-
root_context = self.traverse_path(p,true)
|
93
|
-
end
|
94
|
-
if root_context.size > 1
|
95
|
-
# see if we need to prune
|
96
|
-
new_rc = [ ]
|
97
|
-
root_context.each do |c|
|
98
|
-
if c.children.size == 0 && c.value.nil?
|
99
|
-
c.parent.prune(c) if c.parent
|
100
|
-
else
|
101
|
-
new_rc << c
|
102
|
-
end
|
103
|
-
end
|
104
|
-
if new_rc.size > 0
|
105
|
-
raise "Unable to merge data into multiple places simultaneously"
|
106
|
-
else
|
107
|
-
root_context = new_rc
|
108
|
-
end
|
109
|
-
else
|
110
|
-
root_context = root_context.first
|
111
|
-
end
|
112
|
-
if d.is_a?(Array)
|
113
|
-
node_name = root_context.name
|
114
|
-
root_context = root_context.parent
|
115
|
-
# get rid of empty children so we don't have problems later
|
116
|
-
root_context.children.each do |c|
|
117
|
-
if c.children.size == 0 && c.name == node_name && c.value.nil?
|
118
|
-
c.parent.prune(c)
|
119
|
-
end
|
120
|
-
end
|
121
|
-
d.each do |i|
|
122
|
-
c = root_context.create_child(node_name)
|
123
|
-
c.merge_data(i)
|
124
|
-
end
|
125
|
-
elsif d.is_a?(Hash)
|
126
|
-
d.each_pair do |k,v|
|
127
|
-
bits = k.split('.')
|
128
|
-
c = root_context.traverse_path(bits,true).first
|
129
|
-
if v.is_a?(Hash) || v.is_a?(Array)
|
130
|
-
c.merge_data(v)
|
131
|
-
else
|
132
|
-
c.value = v
|
133
|
-
end
|
134
|
-
end
|
135
|
-
else
|
136
|
-
c = root_context.parent.create_child(root_context.name, d)
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
87
|
def parent=(p)
|
141
88
|
@parent = p
|
142
89
|
@axis = p.axis
|
@@ -9,7 +9,7 @@ module Fabulator
|
|
9
9
|
module Expr
|
10
10
|
class Parser < Racc::Parser
|
11
11
|
|
12
|
-
module_eval(<<'...end xsm_expression_parser.racc/module_eval...', 'xsm_expression_parser.racc',
|
12
|
+
module_eval(<<'...end xsm_expression_parser.racc/module_eval...', 'xsm_expression_parser.racc', 187)
|
13
13
|
require 'fabulator/expr'
|
14
14
|
require 'rational'
|
15
15
|
require 'bigdecimal'
|
@@ -41,6 +41,7 @@ module_eval(<<'...end xsm_expression_parser.racc/module_eval...', 'xsm_expressio
|
|
41
41
|
:axis_name => %r{(?:attribute|child|child-or-self|descendant|descendant-or-self|method|self)},
|
42
42
|
:namespace_name => %r{(?:context|global|local|session|universal)},
|
43
43
|
:number => %r{(-?\d+(?:\.\d+)?|\.\d+)},
|
44
|
+
:literal => %r{((?:"(?:[^\\"]*(?:\\.[^\\"]*)*)")|(?:'(?:[^\\']*(?:\\.[^\\']*)*)'))},
|
44
45
|
}
|
45
46
|
|
46
47
|
@@regex[:axis] = %r{(#{@@regex[:ncname]})\s*(?=::)}
|
@@ -88,7 +89,7 @@ module_eval(<<'...end xsm_expression_parser.racc/module_eval...', 'xsm_expressio
|
|
88
89
|
== & && ||
|
89
90
|
}.split(/\s*/), '[', ',', '$' ].each { |t| @@preceding_tokens[t] = true }
|
90
91
|
|
91
|
-
@@regex[:general] = Regexp.compile(%{^(?:#{@@regex[:function_name]}|#{@@regex[:axis]}|#{@@regex[:name_colon_star]}|#{@@regex[:qname]}
|
92
|
+
@@regex[:general] = Regexp.compile(%{^(?:#{@@regex[:function_name]}|#{@@regex[:axis]}|#{@@regex[:name_colon_star]}|#{@@regex[:qname]}|#{@@regex[:literal]}|#{@@regex[:number]}|#{@@regex[:dollar_qname]}|#{@@regex[:dollar_int]}|(#{@@regex[:simple_tokens]}))})
|
92
93
|
|
93
94
|
def next_token
|
94
95
|
@token = nil
|
@@ -1410,21 +1411,28 @@ module_eval(<<'.,.,', 'xsm_expression_parser.racc', 158)
|
|
1410
1411
|
end
|
1411
1412
|
.,.,
|
1412
1413
|
|
1413
|
-
module_eval(<<'.,.,', 'xsm_expression_parser.racc',
|
1414
|
+
module_eval(<<'.,.,', 'xsm_expression_parser.racc', 160)
|
1414
1415
|
def _reduce_90(val, _values, result)
|
1415
|
-
|
1416
|
+
result = Fabulator::Expr::Function.new(@context, val[0], val[1])
|
1417
|
+
# when 'any' : Fabulator::Expr::AnyExpr.new(@context, val[1])
|
1418
|
+
# when 'all' : Fabulator::Expr::AllExpr.new(@context, val[1])
|
1419
|
+
# when 'one' : Fabulator::Expr::OneExpr.new(@context, val[1])
|
1420
|
+
# when 'none': Fabulator::Expr::NoneExpr.new(@context, val[1])
|
1421
|
+
# else Fabulator::Expr::Function.new(@context, val[0], val[1])
|
1422
|
+
# end
|
1423
|
+
|
1416
1424
|
result
|
1417
1425
|
end
|
1418
1426
|
.,.,
|
1419
1427
|
|
1420
|
-
module_eval(<<'.,.,', 'xsm_expression_parser.racc',
|
1428
|
+
module_eval(<<'.,.,', 'xsm_expression_parser.racc', 169)
|
1421
1429
|
def _reduce_91(val, _values, result)
|
1422
1430
|
result = Fabulator::Expr::List.new(val[1])
|
1423
1431
|
result
|
1424
1432
|
end
|
1425
1433
|
.,.,
|
1426
1434
|
|
1427
|
-
module_eval(<<'.,.,', 'xsm_expression_parser.racc',
|
1435
|
+
module_eval(<<'.,.,', 'xsm_expression_parser.racc', 172)
|
1428
1436
|
def _reduce_92(val, _values, result)
|
1429
1437
|
result = [ ]
|
1430
1438
|
result
|
@@ -1433,14 +1441,14 @@ module_eval(<<'.,.,', 'xsm_expression_parser.racc', 164)
|
|
1433
1441
|
|
1434
1442
|
# reduce 93 omitted
|
1435
1443
|
|
1436
|
-
module_eval(<<'.,.,', 'xsm_expression_parser.racc',
|
1444
|
+
module_eval(<<'.,.,', 'xsm_expression_parser.racc', 175)
|
1437
1445
|
def _reduce_94(val, _values, result)
|
1438
1446
|
result = [ val[0] ]
|
1439
1447
|
result
|
1440
1448
|
end
|
1441
1449
|
.,.,
|
1442
1450
|
|
1443
|
-
module_eval(<<'.,.,', 'xsm_expression_parser.racc',
|
1451
|
+
module_eval(<<'.,.,', 'xsm_expression_parser.racc', 176)
|
1444
1452
|
def _reduce_95(val, _values, result)
|
1445
1453
|
result = val[0] + [ val[2] ]
|
1446
1454
|
result
|
@@ -1449,14 +1457,14 @@ module_eval(<<'.,.,', 'xsm_expression_parser.racc', 168)
|
|
1449
1457
|
|
1450
1458
|
# reduce 96 omitted
|
1451
1459
|
|
1452
|
-
module_eval(<<'.,.,', 'xsm_expression_parser.racc',
|
1460
|
+
module_eval(<<'.,.,', 'xsm_expression_parser.racc', 179)
|
1453
1461
|
def _reduce_97(val, _values, result)
|
1454
1462
|
result = val[0].to_s
|
1455
1463
|
result
|
1456
1464
|
end
|
1457
1465
|
.,.,
|
1458
1466
|
|
1459
|
-
module_eval(<<'.,.,', 'xsm_expression_parser.racc',
|
1467
|
+
module_eval(<<'.,.,', 'xsm_expression_parser.racc', 180)
|
1460
1468
|
def _reduce_98(val, _values, result)
|
1461
1469
|
result = val[1]
|
1462
1470
|
result
|
@@ -55,15 +55,5 @@ module Fabulator
|
|
55
55
|
return possible
|
56
56
|
end
|
57
57
|
end
|
58
|
-
|
59
|
-
class IndexPredicate
|
60
|
-
def initialize(l)
|
61
|
-
@indices = l
|
62
|
-
end
|
63
|
-
|
64
|
-
def run(context)
|
65
|
-
@indices.collect { |e| e.run(context).collect{ |i| i.to([FAB_NS, 'numeric']).value.to_i } }.flatten
|
66
|
-
end
|
67
|
-
end
|
68
58
|
end
|
69
59
|
end
|
@@ -95,18 +95,25 @@ module Fabulator::Template
|
|
95
95
|
each_form_element do |el|
|
96
96
|
id = el_id(el)
|
97
97
|
next if id == ''
|
98
|
-
|
98
|
+
caption = nil
|
99
|
+
if captions.is_a?(Hash)
|
100
|
+
caption = captions[id]
|
101
|
+
else
|
102
|
+
caption = captions.traverse_path(id.split('.')).first.to_s
|
103
|
+
end
|
104
|
+
|
105
|
+
next if caption.nil?
|
99
106
|
|
100
107
|
is_grid = false
|
101
108
|
if el.name == 'grid'
|
102
109
|
else
|
103
|
-
|
104
|
-
if
|
105
|
-
el << text_node('caption',
|
110
|
+
cap = el.find_first('./caption')
|
111
|
+
if cap.nil?
|
112
|
+
el << text_node('caption', caption)
|
106
113
|
else
|
107
|
-
|
108
|
-
|
109
|
-
|
114
|
+
cap.content = caption
|
115
|
+
cap.parent << text_node('caption', caption)
|
116
|
+
cap.remove!
|
110
117
|
end
|
111
118
|
end
|
112
119
|
end
|
data/xsm_expression_parser.racc
CHANGED
@@ -157,7 +157,15 @@ rule
|
|
157
157
|
| tuple
|
158
158
|
| LITERAL { result = Fabulator::Expr::Literal.new(val[0], [ Fabulator::FAB_NS, 'string' ]) }
|
159
159
|
| NUMBER { result = Fabulator::Expr::Literal.new(val[0] =~ /\./ ? val[0].to_d.to_r : val[0].to_i.to_r, [ Fabulator::FAB_NS, 'numeric' ]) }
|
160
|
-
| FUNCTION_NAME list {
|
160
|
+
| FUNCTION_NAME list {
|
161
|
+
result = Fabulator::Expr::Function.new(@context, val[0], val[1])
|
162
|
+
# when 'any' : Fabulator::Expr::AnyExpr.new(@context, val[1])
|
163
|
+
# when 'all' : Fabulator::Expr::AllExpr.new(@context, val[1])
|
164
|
+
# when 'one' : Fabulator::Expr::OneExpr.new(@context, val[1])
|
165
|
+
# when 'none': Fabulator::Expr::NoneExpr.new(@context, val[1])
|
166
|
+
# else Fabulator::Expr::Function.new(@context, val[0], val[1])
|
167
|
+
# end
|
168
|
+
}
|
161
169
|
|
162
170
|
list: LP opt_args RP { result = Fabulator::Expr::List.new(val[1]) }
|
163
171
|
|
@@ -207,6 +215,7 @@ end
|
|
207
215
|
:axis_name => %r{(?:attribute|child|child-or-self|descendant|descendant-or-self|method|self)},
|
208
216
|
:namespace_name => %r{(?:context|global|local|session|universal)},
|
209
217
|
:number => %r{(-?\d+(?:\.\d+)?|\.\d+)},
|
218
|
+
:literal => %r{((?:"(?:[^\\"]*(?:\\.[^\\"]*)*)")|(?:'(?:[^\\']*(?:\\.[^\\']*)*)'))},
|
210
219
|
}
|
211
220
|
|
212
221
|
@@regex[:axis] = %r{(#{@@regex[:ncname]})\s*(?=::)}
|
@@ -254,7 +263,7 @@ end
|
|
254
263
|
== & && ||
|
255
264
|
}.split(/\s*/), '[', ',', '$' ].each { |t| @@preceding_tokens[t] = true }
|
256
265
|
|
257
|
-
@@regex[:general] = Regexp.compile(%{^(?:#{@@regex[:function_name]}|#{@@regex[:axis]}|#{@@regex[:name_colon_star]}|#{@@regex[:qname]}
|
266
|
+
@@regex[:general] = Regexp.compile(%{^(?:#{@@regex[:function_name]}|#{@@regex[:axis]}|#{@@regex[:name_colon_star]}|#{@@regex[:qname]}|#{@@regex[:literal]}|#{@@regex[:number]}|#{@@regex[:dollar_qname]}|#{@@regex[:dollar_int]}|(#{@@regex[:simple_tokens]}))})
|
258
267
|
|
259
268
|
def next_token
|
260
269
|
@token = nil
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fabulator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 6
|
10
|
+
version: 0.0.6
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- James Smith
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-08-
|
18
|
+
date: 2010-08-27 00:00:00 +00:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|