rexle 0.9.63 → 0.9.64

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 +30 -10
  2. metadata +2 -2
data/lib/rexle.rb CHANGED
@@ -10,6 +10,8 @@ require 'cgi'
10
10
  include REXML
11
11
 
12
12
  # modifications:
13
+ # 06-Nov-2012: additional xpath predicate now implemented e.g.
14
+ # fun/. > 200 => [false, false, true, true]
13
15
  # 21-Oct-2012: xpath predicate now implemented e.g. fun/@id='4' => true
14
16
  # 20-Oct-2012: feature: added Rexle::Element#texts which is the equivalent
15
17
  # of REXML::Element#texts
@@ -88,7 +90,7 @@ module XMLhelper
88
90
  def pretty_print(nodes, indent='0')
89
91
  indent = indent.to_i
90
92
 
91
- nodes.select(){|x| x.is_a? Rexle::Element or x.strip.length > 0}
93
+ nodes.select(){|x| x.is_a? Rexle::Element or (x.is_a? String and x.strip.length > 0)}
92
94
  .map.with_index do |x, i|
93
95
 
94
96
  if x.is_a? Rexle::Element then
@@ -220,7 +222,15 @@ class Rexle
220
222
  # Array: proc {|x| x.flatten.compact},
221
223
  if (fn_match and fn_match.captures.first[/^(attribute|@)/]) or fn_match.nil? then
222
224
  procs = {
223
- Array: proc {|x| block_given? ? x : x.flatten.uniq },
225
+ #jr061012 Array: proc {|x| block_given? ? x : x.flatten.uniq },
226
+ Array: proc { |x|
227
+ if block_given? then
228
+ x.flatten(1)
229
+ else
230
+ rs = x.flatten
231
+ rs.any?{|x| x == true or x == false} ? rs : rs.uniq(&:object_id)
232
+ end
233
+ },
224
234
  String: proc {|x| x},
225
235
  Hash: proc {|x| x},
226
236
  TrueClass: proc{|x| x},
@@ -231,9 +241,9 @@ class Rexle
231
241
  raw_results = path.split('|').map do |xp|
232
242
  query_xpath(xp, bucket, &blk)
233
243
  end
234
-
235
- results = raw_results.last
236
- results = [true] if results.is_a? Array and results.flatten.any?{|x| x == true}
244
+
245
+ results = raw_results
246
+
237
247
  procs[results.class.to_s.to_sym].call(results) if results
238
248
 
239
249
  else
@@ -295,10 +305,12 @@ class Rexle
295
305
 
296
306
  elmnt_path = s[/^([\w:\*]+\[[^\]]+\])|[\/]+{,2}[^\/]+/]
297
307
  element_part = elmnt_path[/(^@?[^\[]+)?/,1] if elmnt_path
298
-
308
+
299
309
  if element_part then
300
- unless element_part[/^@/] then
310
+
311
+ unless element_part[/^(@|[@\.\w]+[\s=])/] then
301
312
  element_name = element_part[/^[\w:\*\.]+/]
313
+
302
314
  else
303
315
  if xpath_value[/^\[/] then
304
316
  condition = xpath_value
@@ -565,7 +577,6 @@ class Rexle
565
577
  else
566
578
 
567
579
  andor_items = raw_items.map.with_index.select{|x,i| x[/\band\b|\bor\b/]}.map{|x| [x.last, x.last + 1]}.flatten
568
-
569
580
  indices = [0] + andor_items + [raw_items.length]
570
581
 
571
582
  if raw_items[0][0] == '@' then
@@ -587,6 +598,7 @@ class Rexle
587
598
  else
588
599
 
589
600
  cons_items = indices.each_cons(2).map{|x,y| raw_items.slice(x...y)}
601
+
590
602
  items = cons_items.map do |x|
591
603
 
592
604
  if x.length >= 3 then
@@ -664,6 +676,7 @@ class Rexle
664
676
  end
665
677
 
666
678
  def attribute_search(attr_search, e, h, i=nil, &blk)
679
+
667
680
  if attr_search.is_a? Fixnum then
668
681
  block_given? ? blk.call(e) : e if i == attr_search
669
682
  elsif attr_search[/i\s[<>\=]\s\d+/] and eval(attr_search) then
@@ -674,8 +687,15 @@ class Rexle
674
687
  block_given? ? blk.call(e) : e
675
688
  elsif attr_search[/^\(name ==/] and eval(attr_search)
676
689
  block_given? ? blk.call(e) : e
677
- elsif attr_search[/^e\.value/] and eval(attr_search)
678
- block_given? ? blk.call(e) : e
690
+ elsif attr_search[/^e\.value/]
691
+
692
+ v = attr_search[/[^\s]+$/]
693
+ duck_type = %w(to_f to_i to_s).detect {|x| v == v.send(x).to_s}
694
+ attr_search.sub!(/^e.value/,'e.value.' + duck_type)
695
+
696
+ if eval(attr_search) then
697
+ block_given? ? blk.call(e) : e
698
+ end
679
699
  elsif attr_search[/^e\.xpath/] and eval(attr_search)
680
700
  block_given? ? blk.call(e) : e
681
701
  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.63
5
+ version: 0.9.64
6
6
  platform: ruby
7
7
  authors:
8
8
  - James Robertson
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2012-10-23 00:00:00 Z
13
+ date: 2012-11-06 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rexleparser