@@ -47,7 +47,10 @@ class XPathParser
47
47
include XMLTokens
48
48
LITERAL = /^'([^']*)'|^"([^"]*)"/u
49
49
50
+ DEBUG = ( ENV [ "REXML_XPATH_PARSER_DEBUG" ] == "true" )
51
+
50
52
def initialize ( strict : false )
53
+ @debug = DEBUG
51
54
@parser = REXML ::Parsers ::XPathParser . new
52
55
@namespaces = nil
53
56
@variables = { }
@@ -162,10 +165,10 @@ def get_namespace( node, prefix )
162
165
# Expr takes a stack of path elements and a set of nodes (either a Parent
163
166
# or an Array and returns an Array of matching nodes
164
167
def expr ( path_stack , nodeset , context = nil )
165
- # enter(:expr, path_stack, nodeset)
168
+ enter ( :expr , path_stack , nodeset ) if @debug
166
169
return nodeset if path_stack . length == 0 || nodeset . length == 0
167
170
while path_stack . length > 0
168
- # trace(:while, path_stack, nodeset)
171
+ trace ( :while , path_stack , nodeset ) if @debug
169
172
if nodeset . length == 0
170
173
path_stack . clear
171
174
return [ ]
@@ -184,7 +187,7 @@ def expr( path_stack, nodeset, context=nil )
184
187
child ( nodeset )
185
188
end
186
189
when :literal
187
- # trace(:literal, path_stack, nodeset)
190
+ trace ( :literal , path_stack , nodeset ) if @debug
188
191
return path_stack . shift
189
192
when :attribute
190
193
nodeset = step ( path_stack , any_type : :attribute ) do
@@ -343,7 +346,7 @@ def expr( path_stack, nodeset, context=nil )
343
346
left = expr ( path_stack . shift , nodeset . dup , context )
344
347
right = expr ( path_stack . shift , nodeset . dup , context )
345
348
res = equality_relational_compare ( left , op , right )
346
- # trace(op, left, right, res)
349
+ trace ( op , left , right , res ) if @debug
347
350
return res
348
351
349
352
when :and
@@ -422,14 +425,14 @@ def expr( path_stack, nodeset, context=nil )
422
425
end
423
426
end # while
424
427
return nodeset
425
- # ensure
426
- # leave(:expr, path_stack, nodeset)
428
+ ensure
429
+ leave ( :expr , path_stack , nodeset ) if @debug
427
430
end
428
431
429
432
def step ( path_stack , any_type : :element , order : :forward )
430
433
nodesets = yield
431
434
begin
432
- # enter(:step, path_stack, nodesets)
435
+ enter ( :step , path_stack , nodesets ) if @debug
433
436
nodesets = node_test ( path_stack , nodesets , any_type : any_type )
434
437
while path_stack [ 0 ] == :predicate
435
438
path_stack . shift # :predicate
@@ -457,13 +460,13 @@ def step(path_stack, any_type: :element, order: :forward)
457
460
new_nodeset << XPathNode . new ( node , position : new_nodeset . size + 1 )
458
461
end
459
462
new_nodeset
460
- # ensure
461
- # leave(:step, path_stack, new_nodeset)
463
+ ensure
464
+ leave ( :step , path_stack , new_nodeset ) if @debug
462
465
end
463
466
end
464
467
465
468
def node_test ( path_stack , nodesets , any_type : :element )
466
- # enter(:node_test, path_stack, nodesets)
469
+ enter ( :node_test , path_stack , nodesets ) if @debug
467
470
operator = path_stack . shift
468
471
case operator
469
472
when :qname
@@ -563,8 +566,8 @@ def node_test(path_stack, nodesets, any_type: :element)
563
566
raise message
564
567
end
565
568
new_nodesets
566
- # ensure
567
- # leave(:node_test, path_stack, new_nodesets)
569
+ ensure
570
+ leave ( :node_test , path_stack , new_nodesets ) if @debug
568
571
end
569
572
570
573
def filter_nodeset ( nodeset )
@@ -577,7 +580,7 @@ def filter_nodeset(nodeset)
577
580
end
578
581
579
582
def evaluate_predicate ( expression , nodesets )
580
- # enter(:predicate, expression, nodesets)
583
+ enter ( :predicate , expression , nodesets ) if @debug
581
584
new_nodesets = nodesets . collect do |nodeset |
582
585
new_nodeset = [ ]
583
586
subcontext = { :size => nodeset . size }
@@ -590,7 +593,7 @@ def evaluate_predicate(expression, nodesets)
590
593
subcontext [ :index ] = index + 1
591
594
end
592
595
result = expr ( expression . dclone , [ node ] , subcontext )
593
- # trace(:predicate_evaluate, expression, node, subcontext, result)
596
+ trace ( :predicate_evaluate , expression , node , subcontext , result ) if @debug
594
597
result = result [ 0 ] if result . kind_of? Array and result . length == 1
595
598
if result . kind_of? Numeric
596
599
if result == node . position
@@ -611,8 +614,8 @@ def evaluate_predicate(expression, nodesets)
611
614
new_nodeset
612
615
end
613
616
new_nodesets
614
- # ensure
615
- # leave(:predicate, new_nodesets)
617
+ ensure
618
+ leave ( :predicate , new_nodesets ) if @debug
616
619
end
617
620
618
621
def trace ( *args )
0 commit comments