rexleparser 0.2.5 → 0.2.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.
Files changed (2) hide show
  1. data/lib/rexleparser.rb +36 -9
  2. metadata +1 -1
data/lib/rexleparser.rb CHANGED
@@ -5,8 +5,10 @@
5
5
 
6
6
  class RexleParser
7
7
 
8
- def initialize(s)
9
- @a = scan_element(s.sub(/<\?[^>]+>/,'').split(//))
8
+ def initialize(s)
9
+
10
+ super()
11
+ @a = scan_element(s.sub(/<\?[^>]+>/,'').split(//))
10
12
  end
11
13
 
12
14
  def to_a()
@@ -46,7 +48,9 @@ class RexleParser
46
48
 
47
49
  # is it a self closing tag?
48
50
  if a[i-1] == '/' then
49
- raw_values << a.shift until a[0] == '/'
51
+
52
+ raw_values << a.shift until (a[0] + a[1..-1].join.strip[0]) == '/>'
53
+ puts 'raw_values: ' + raw_values
50
54
  a.shift until a[0] == '<' or a.length < 1
51
55
  raw_values.strip!
52
56
 
@@ -55,6 +59,7 @@ class RexleParser
55
59
  else
56
60
 
57
61
  raw_values << a.shift until a[0] == '<'
62
+ #puts 'raw_values: ' + raw_values.inspect
58
63
  value, attributes = get_value_and_attributes(raw_values) if raw_values.length > 0
59
64
 
60
65
  element = [name, value, attributes]
@@ -68,19 +73,31 @@ class RexleParser
68
73
 
69
74
  if children == true then
70
75
 
71
- (r = scan_element(a); element << r if r) until (a[0, name.length + 3].join == "</%s>" % [name]) or a.length < 2
76
+ scan_elements(a, element) until (a[0, name.length + 3].join == "</%s>" % [name]) or a.length < 2
77
+
78
+ #(r = scan_element(a); element << r if r) until (a[0, name.length + 3].join == "</%s>" % [name]) or a.length < 2
72
79
  a.slice!(0, name.length + 3) if a[0, name.length + 3].join == "</%s>" % name
73
80
  a.shift until a[0] == '<' or a.length <= 1
74
81
  else
82
+
75
83
  #check for its end tag
76
84
  a.slice!(0, name.length + 3) if a[0, name.length + 3].join == "</%s>" % name
77
- a.shift until a[0] == '<' or a.length <= 1
85
+ text_remaining = []
86
+ text_remaining << a.shift until a[0] == '<' or a.length <= 1
87
+
88
+ remaining = text_remaining.join unless text_remaining.empty?
89
+ #puts 'element: ' + element.inspect
78
90
  end
79
91
  end
80
92
 
81
93
  end
82
94
 
83
- return element
95
+ #return remaining ? [element, remaining] : element
96
+ if remaining.nil? then
97
+ return element
98
+ else
99
+ return [element, remaining]
100
+ end
84
101
 
85
102
  end
86
103
  end
@@ -88,6 +105,16 @@ class RexleParser
88
105
  end
89
106
  end
90
107
 
108
+ def scan_elements(a, element)
109
+ r = scan_element(a)
110
+
111
+ if r and r[0].is_a?(Array) then
112
+ element = r.inject(element) {|r,x| r << x} if r
113
+ elsif r
114
+ element << r
115
+ end
116
+ end
117
+
91
118
  def get_value_and_attributes(raw_values)
92
119
  attributes = {}
93
120
 
@@ -101,10 +128,10 @@ class RexleParser
101
128
  end
102
129
 
103
130
  def get_attributes(raw_attributes)
104
- raw_attributes.scan(/(\w+\='[^']+')|(\w+\="[^"]+")/).map(&:compact).flatten.inject({}) do |r, x|
131
+ raw_attributes.scan(/([\w:]+\='[^']+')|([\w:]+\="[^"]+")/).map(&:compact).flatten.inject({}) do |r, x|
132
+
105
133
  attr_name, val = x.split(/=/)
106
- r.merge(attr_name.to_sym => val[1..-2])
134
+ r.merge(attr_name => val[1..-2])
107
135
  end
108
136
  end
109
-
110
137
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: rexleparser
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.2.5
5
+ version: 0.2.6
6
6
  platform: ruby
7
7
  authors:
8
8
  - James Robertson