rexle 0.9.15 → 0.9.16

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 -38
  2. metadata +2 -2
@@ -9,8 +9,8 @@ require 'polyrex-parser'
9
9
  require 'cgi'
10
10
  include REXML
11
11
 
12
-
13
12
  # modifications:
13
+ # 14-Jan-2012: Implemented Rexle::Elements#each
14
14
  # 21-Dec-2011: Bug fix: xpath modified to allow querying from the actual
15
15
  # root rather than the 1st child element from the root
16
16
  # 04-Sep-2011: Bug fix: xpath will now only return Rexle:elements when
@@ -52,10 +52,10 @@ module XMLhelper
52
52
  out << x.value unless x.value.nil? || x.value.empty?
53
53
  out << scan_print(x.children)
54
54
  out << "</%s>" % x.name
55
- elsif x.name == '!-' then
56
- "<!--%s-->" % x.value
57
- else
58
- "<![CDATA[%s]]>" % x.value
55
+ elsif x.name == '!-' then
56
+ "<!--%s-->" % x.value
57
+ else
58
+ "<![CDATA[%s]]>" % x.value
59
59
  end
60
60
  elsif x.is_a? String then
61
61
  x
@@ -108,17 +108,21 @@ class Rexle
108
108
  Array: proc {|x| x},
109
109
  :"REXML::Document" => proc {|x| scan_doc x.root}
110
110
  }
111
-
111
+
112
112
  doc_node = ['doc','',{}]
113
+
113
114
  @a = procs[x.class.to_s.to_sym].call(x)
114
115
  @doc = scan_element(*(doc_node << @a))
115
-
116
+
116
117
  # fetch the namespaces
117
118
  @prefixes = []
118
119
  if @doc.root.attributes then
120
+
119
121
  xmlns = @doc.root.attributes.select {|k,v| k[/^xmlns:/]}
120
122
  @prefixes = xmlns.keys.map{|x| x[/\w+$/]}
121
123
  end
124
+
125
+
122
126
  end
123
127
 
124
128
  end
@@ -172,21 +176,20 @@ class Rexle
172
176
 
173
177
  # Array: proc {|x| x.flatten.compact},
174
178
  if (fn_match and fn_match.captures.first[/^(attribute|@)/]) or fn_match.nil? then
175
- procs = {
176
- Array: proc {|x| block_given? ? x : x.flatten },
177
- String: proc {|x| x},
178
- TrueClass: proc{|x| x},
179
- FalseClass: proc{|x| x},
180
- :"Rexle::Element" => proc {|x| [x]}
181
- }
182
- bucket = []
183
- result = query_xpath(path, bucket, &blk)
184
- procs[result.class.to_s.to_sym].call(result)
185
-
179
+ procs = {
180
+ Array: proc {|x| block_given? ? x : x.flatten },
181
+ String: proc {|x| x},
182
+ TrueClass: proc{|x| x},
183
+ FalseClass: proc{|x| x},
184
+ :"Rexle::Element" => proc {|x| [x]}
185
+ }
186
+ bucket = []
187
+ result = query_xpath(path, bucket, &blk)
188
+ procs[result.class.to_s.to_sym].call(result)
189
+
186
190
  else
187
-
188
- m, xpath_value = fn_match.captures
189
- method(m.to_sym).call(xpath_value)
191
+ m, xpath_value = fn_match.captures
192
+ method(m.to_sym).call(xpath_value)
190
193
  end
191
194
 
192
195
  end
@@ -207,11 +210,11 @@ class Rexle
207
210
  #return [(result.is_a?(Rexle::Element) ? true : false)]
208
211
  end
209
212
 
213
+ #xpath_value.sub!(/^attribute::/,'*/attribute::')
210
214
  raw_path, raw_condition = xpath_value.sub(/^\/(?!\/)/,'').match(/([^\[]+)(\[[^\]]+\])?/).captures
211
215
 
212
216
  remaining_path = ($').to_s
213
217
  a_path = raw_path.split('/')
214
-
215
218
  condition = raw_condition if a_path.length <= 1
216
219
 
217
220
  if raw_path[0,2] == '//' then
@@ -225,12 +228,10 @@ class Rexle
225
228
  return [@attributes[attribute.to_sym]] if attribute and @attributes and @attributes.has_key?(attribute.to_sym)
226
229
 
227
230
  s = a_path.shift
228
-
229
231
  end
230
232
 
231
233
  # isolate the xpath to return just the path to the current element
232
234
  elmnt_path = s[/^([\w\*]+\[[^\]]+\])|[\/]+{,2}[^\/]+/]
233
-
234
235
  element_part = elmnt_path[/(^@?[^\[]+)?/,1] if elmnt_path
235
236
 
236
237
  if element_part then
@@ -243,6 +244,7 @@ class Rexle
243
244
 
244
245
  end
245
246
 
247
+ #element_name ||= '*'
246
248
  raw_condition = '' if condition
247
249
 
248
250
  attr_search = format_condition(condition) if condition and condition.length > 0
@@ -254,17 +256,17 @@ class Rexle
254
256
  return rs
255
257
  else
256
258
 
257
- return_elements = @child_lookup.map.with_index.select do |x|
258
- (x[0][0] == element_name || element_name == '.') or \
259
- (element_name == '*' && x[0].is_a?(Array))
260
- end
259
+ return_elements = @child_lookup.map.with_index.select do |x|
260
+ (x[0][0] == element_name || element_name == '.') or \
261
+ (element_name == '*' && x[0].is_a?(Array))
262
+ end
263
+
261
264
  end
262
265
 
263
266
  if return_elements.length > 0 then
264
267
 
265
268
  if (a_path + [remaining_path]).join.empty? then
266
269
  rlist = return_elements.map.with_index {|x,i| filter(x, i+1, attr_search, &blk)}.compact
267
-
268
270
  rlist = rlist[0] if rlist.length == 1
269
271
  else
270
272
 
@@ -320,6 +322,7 @@ class Rexle
320
322
  end
321
323
 
322
324
  def inspect()
325
+
323
326
  if self.xml.length > 30 then
324
327
  "%s ... </>" % self.xml[/<[^>]+>/]
325
328
  else
@@ -367,7 +370,7 @@ class Rexle
367
370
 
368
371
  def elements(s=nil)
369
372
  procs = {
370
- NilClass: proc {Elements.new(@child_elements)},
373
+ NilClass: proc {Elements.new(@child_elements.select{|x| x.is_a? Rexle::Element })},
371
374
  String: proc {|x| @child_elements[x]}
372
375
  }
373
376
 
@@ -425,6 +428,7 @@ class Rexle
425
428
 
426
429
  def format_condition(condition)
427
430
 
431
+ #raw_items = condition[1..-1].scan(/\'[^\']*\'|and|or|\d+|[!=]+|[@\w\.\/]+/)
428
432
  raw_items = condition[1..-1].scan(/\'[^\']*\'|and|or|\d+|[!=<>]+|position\(\)|[@\w\.\/]+/)
429
433
 
430
434
  if raw_items[0][/^\d+$/] then
@@ -448,7 +452,7 @@ class Rexle
448
452
  "h[:'%s'] %s %s" % x
449
453
  else
450
454
 
451
- x.join[/^(and|or)$/] ? x : ("h[:'%s']" % x)
455
+ x.join[/^(and|or)$/] ? x : ("h[:'%s']" % x)
452
456
  end
453
457
  end
454
458
 
@@ -489,19 +493,17 @@ class Rexle
489
493
 
490
494
  r = node.xpath(xpath[2..-1])
491
495
  r << node.children.map {|n| scan_match(n, xpath) if n.is_a? Rexle::Element}
492
-
493
496
  r
494
497
  end
495
498
 
496
499
  def filter(raw_element, i, attr_search, &blk)
497
500
 
498
501
  x = raw_element
499
-
500
502
  e = @child_elements[x.last]
501
- name, value = e.name, e.value if e.is_a? Rexle::Element
502
- h = x[0][1] # <-- fetch the attributes
503
-
503
+ name, value = e.name, e.value if e.is_a? Rexle::Element
504
504
 
505
+ h = x[0][1] # <-- fetch the attributes
506
+
505
507
  if attr_search then
506
508
  if attr_search.is_a? Fixnum then
507
509
  block_given? ? blk.call(e) : e if i == attr_search
@@ -510,14 +512,12 @@ class Rexle
510
512
  elsif h and attr_search[/^h\[/] and eval(attr_search)
511
513
  block_given? ? blk.call(e) : e
512
514
  elsif attr_search[/^\(name ==/] and e.child_lookup.select{|name, attributes, value| eval(attr_search) }.length > 0
513
-
514
515
  block_given? ? blk.call(e) : e
515
516
  elsif attr_search[/^\(name ==/] and eval(attr_search)
516
517
  block_given? ? blk.call(e) : e
517
518
  elsif attr_search[/^e\.value/] and eval(attr_search)
518
519
  block_given? ? blk.call(e) : e
519
520
  elsif attr_search[/^e\.xpath/] and eval(attr_search)
520
-
521
521
  block_given? ? blk.call(e) : e
522
522
  end
523
523
  else
@@ -538,6 +538,10 @@ class Rexle
538
538
  def [](i)
539
539
  @elements[i-1]
540
540
  end
541
+
542
+ def each(&blk) @elements.each(&blk) end
543
+ def to_a() @elements end
544
+
541
545
  end # -- end of elements --
542
546
 
543
547
 
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: rexle
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.9.15
5
+ version: 0.9.16
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: 2011-12-21 00:00:00 +00:00
13
+ date: 2012-01-14 00:00:00 +00:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency