rexle 0.9.28 → 0.9.29

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/rexle.rb +42 -31
  2. metadata +1 -1
data/lib/rexle.rb CHANGED
@@ -200,7 +200,7 @@ class Rexle
200
200
 
201
201
  #results = raw_results.inject(&:+)
202
202
  results = raw_results.last
203
- procs[results.class.to_s.to_sym].call(results)
203
+ procs[results.class.to_s.to_sym].call(results) if results
204
204
 
205
205
  else
206
206
  m, xpath_value = fn_match.captures
@@ -213,9 +213,9 @@ class Rexle
213
213
 
214
214
  #remove any pre'fixes
215
215
  #@rexle.prefixes.each {|x| xpath_value.sub!(x + ':','') }
216
- flag_func = false
216
+ flag_func = false
217
217
 
218
- xpath_value = raw_xpath_value.sub(/^\[/,'*[')
218
+ xpath_value = raw_xpath_value #.sub(/^\[/,'*[')
219
219
  #xpath_value.sub!(/\.\/(?=[\/])/,'')
220
220
 
221
221
  if xpath_value[/^[\w\/]+\s*=.*/] then
@@ -231,7 +231,7 @@ class Rexle
231
231
  #xpath_value.sub!(/^attribute::/,'*/attribute::')
232
232
  raw_path, raw_condition = xpath_value.sub(/^\.?\/(?!\/)/,'')\
233
233
  .match(/([^\[]+)(\[[^\]]+\])?/).captures
234
-
234
+
235
235
  remaining_path = ($').to_s
236
236
 
237
237
  r = raw_path[/([^\/]+)(?=\/\/)/,1]
@@ -249,20 +249,24 @@ class Rexle
249
249
  a_path.shift
250
250
  return @value
251
251
  else
252
+
252
253
  attribute = xpath_value[/^(attribute::|@)(.*)/,2]
254
+
253
255
  return [@attributes[attribute.to_sym]] if attribute and @attributes and @attributes.has_key?(attribute.to_sym)
254
256
  s = a_path.shift
255
257
  end
256
258
 
257
259
  # isolate the xpath to return just the path to the current element
260
+
258
261
  elmnt_path = s[/^([\w:\*]+\[[^\]]+\])|[\/]+{,2}[^\/]+/]
259
262
  element_part = elmnt_path[/(^@?[^\[]+)?/,1] if elmnt_path
260
-
263
+
261
264
  if element_part then
262
265
  unless element_part[/^@/] then
263
266
  element_name = element_part[/^[\w:\*\.]+/]
264
267
  else
265
- condition = element_part
268
+
269
+ condition = xpath_value[/^\[/] ? xpath_value : element_part
266
270
  element_name = nil
267
271
  end
268
272
 
@@ -270,9 +274,14 @@ class Rexle
270
274
 
271
275
  #element_name ||= '*'
272
276
  raw_condition = '' if condition
273
-
274
277
  attr_search = format_condition(condition) if condition and condition.length > 0
275
278
 
279
+ attr_search2 = xpath_value[/^\[(.*)\]$/,1]
280
+ if attr_search2 then
281
+ r4 = attribute_search(attr_search, self, self.attributes)
282
+ return r4
283
+ end
284
+
276
285
  return_elements = []
277
286
 
278
287
  if raw_path[0,2] == '//' then
@@ -282,15 +291,13 @@ class Rexle
282
291
  return [self]
283
292
  else
284
293
 
285
-
286
- return_elements = @child_lookup.map.with_index.select do |x|
287
-
288
- (x[0][0] == element_name || element_name == '.') or \
289
- (element_name == '*' && x[0].is_a?(Array))
290
- end
294
+ return_elements = @child_lookup.map.with_index.select do |x|
295
+ (x[0][0] == element_name || element_name == '.') or \
296
+ (element_name == '*' && x[0].is_a?(Array))
297
+ end
291
298
 
292
299
  end
293
-
300
+
294
301
 
295
302
  if return_elements.length > 0 then
296
303
 
@@ -520,7 +527,8 @@ class Rexle
520
527
 
521
528
  def scan_match(node, xpath)
522
529
 
523
- r = node.xpath(xpath[2..-1])
530
+ #r = node.xpath(xpath[2..-1].sub(/^\w+\/?/,''))
531
+ r = node.xpath(xpath[2..-1]) || []
524
532
  r << node.children.map {|n| scan_match(n, xpath) if n.is_a? Rexle::Element}
525
533
  r
526
534
  end
@@ -534,21 +542,7 @@ class Rexle
534
542
  h = x[0][1] # <-- fetch the attributes
535
543
 
536
544
  if attr_search then
537
- if attr_search.is_a? Fixnum then
538
- block_given? ? blk.call(e) : e if i == attr_search
539
- elsif attr_search[/i\s[<>\=]\s\d+/] and eval(attr_search) then
540
- block_given? ? blk.call(e) : e
541
- elsif h and attr_search[/^h\[/] and eval(attr_search)
542
- block_given? ? blk.call(e) : e
543
- elsif attr_search[/^\(name ==/] and e.child_lookup.select{|name, attributes, value| eval(attr_search) }.length > 0
544
- block_given? ? blk.call(e) : e
545
- elsif attr_search[/^\(name ==/] and eval(attr_search)
546
- block_given? ? blk.call(e) : e
547
- elsif attr_search[/^e\.value/] and eval(attr_search)
548
- block_given? ? blk.call(e) : e
549
- elsif attr_search[/^e\.xpath/] and eval(attr_search)
550
- block_given? ? blk.call(e) : e
551
- end
545
+ attribute_search(attr_search,e, h, i, &blk)
552
546
  else
553
547
 
554
548
  block_given? ? blk.call(e) : e
@@ -556,6 +550,23 @@ class Rexle
556
550
 
557
551
  end
558
552
 
553
+ def attribute_search(attr_search, e, h, i=nil, &blk)
554
+ if attr_search.is_a? Fixnum then
555
+ block_given? ? blk.call(e) : e if i == attr_search
556
+ elsif attr_search[/i\s[<>\=]\s\d+/] and eval(attr_search) then
557
+ block_given? ? blk.call(e) : e
558
+ elsif h and attr_search[/^h\[/] and eval(attr_search)
559
+ block_given? ? blk.call(e) : e
560
+ elsif attr_search[/^\(name ==/] and e.child_lookup.select{|name, attributes, value| eval(attr_search) }.length > 0
561
+ block_given? ? blk.call(e) : e
562
+ elsif attr_search[/^\(name ==/] and eval(attr_search)
563
+ block_given? ? blk.call(e) : e
564
+ elsif attr_search[/^e\.value/] and eval(attr_search)
565
+ block_given? ? blk.call(e) : e
566
+ elsif attr_search[/^e\.xpath/] and eval(attr_search)
567
+ block_given? ? blk.call(e) : e
568
+ end
569
+ end
559
570
  end # -- end of element --
560
571
 
561
572
  class Elements
@@ -683,4 +694,4 @@ class Rexle
683
694
  [node.name, node.text.to_s, attributes, *children]
684
695
  end
685
696
 
686
- end
697
+ end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: rexle
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.9.28
5
+ version: 0.9.29
6
6
  platform: ruby
7
7
  authors:
8
8
  - James Robertson