rexleparser 0.3.3 → 0.4.0

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 +68 -80
  2. metadata +3 -3
data/lib/rexleparser.rb CHANGED
@@ -6,14 +6,11 @@
6
6
  class RexleParser
7
7
 
8
8
  def initialize(s)
9
-
10
9
  super()
11
10
  @a = scan_element(s.gsub(/<\?[^>]+>/,'').split(//))
12
11
  end
13
12
 
14
- def to_a()
15
- @a
16
- end
13
+ def to_a() @a end
17
14
 
18
15
  def to_s()
19
16
  name, value, attributes, *remaining = @a
@@ -34,116 +31,107 @@ class RexleParser
34
31
 
35
32
  a.shift until a[0] == '<' and a[1] != '/' or a.length < 1
36
33
 
37
- if a.length > 1 then
38
- a.shift
39
-
40
- # CDATA ?
41
- if a[0..1].join == '![' then
42
-
43
- name = '!['
44
- 8.times{ a.shift }
45
- value = ''
46
-
47
- value << a.shift until a[0..2].join == ']]>' or a.length <= 1
48
- a.slice!(0,3)
49
- element = [name, value, {}]
50
- elsif a[0..2].join == '!--' then
51
- name = '!-'
52
- #<![CDATA[
53
- #<!--
54
- 3.times{ a.shift }
55
- value = ''
56
-
57
- value << a.shift until a[0..2].join == '-->' or a.length <= 1
58
- a.slice!(0,3)
59
- element = [name, value, {}]
60
- else
34
+ return unless a.length > 1
61
35
 
62
- name = ''
63
- name << a.shift
64
- name << a.shift while a[0] != ' ' and a[0] != '>' and a[0] != '/'
36
+ a.shift
65
37
 
66
- if name then
38
+ # CDATA ?
39
+ if a[0..1].join == '![' then
67
40
 
68
- # find the closing tag
69
- i = a.index('>')
70
- raw_values = ''
41
+ name = '!['
42
+ 8.times{ a.shift }
43
+ value = ''
71
44
 
72
- # is it a self closing tag?
73
- if a[i-1] == '/' then
45
+ value << a.shift until a[0..2].join == ']]>' or a.length <= 1
46
+ a.slice!(0,3)
47
+ element = [name, value, {}]
48
+ elsif a[0..2].join == '!--' then
49
+ name = '!-'
50
+ #<![CDATA[
51
+ #<!--
52
+ 3.times{ a.shift }
53
+ value = ''
74
54
 
75
- raw_values << a.shift until (a[0] + a[1..-1].join.strip[0]) == '/>'
55
+ value << a.shift until a[0..2].join == '-->' or a.length <= 1
56
+ a.slice!(0,3)
57
+ element = [name, value, {}]
58
+ else
76
59
 
77
- a.shift until a[0] == '<' or a.length < 1
78
- raw_values.strip!
60
+ name = ''
61
+ name << a.shift
62
+ name << a.shift while a[0] != ' ' and a[0] != '>' and a[0] != '/'
79
63
 
80
- attributes = get_attributes(raw_values) if raw_values.length > 0
81
-
82
- element = [name, '', attributes]
64
+ return unless name
83
65
 
84
- element
85
- else
66
+ # find the closing tag
67
+ i = a.index('>')
68
+ raw_values = ''
86
69
 
87
- raw_values << a.shift until a[0] == '<'
88
- #puts 'raw_values: ' + raw_values.inspect
89
- value, attributes = get_value_and_attributes(raw_values) if raw_values.length > 0
70
+ # is it a self closing tag?
71
+ if a[i-1] == '/' then
90
72
 
91
- element = [name, value, attributes]
92
-
93
- tag = a[0, name.length + 3].join
73
+ raw_values << a.shift until (a[0] + a[1..-1].join.strip[0]) == '/>'
74
+ a.shift until a[0] == '<' or a.length < 1
75
+ raw_values.strip!
94
76
 
95
- if a.length > 0 then
77
+ attributes = get_attributes(raw_values) if raw_values.length > 0
78
+ return [name, '', attributes]
79
+
80
+ else
96
81
 
97
- children = true
98
- children = false if tag == "</%s>" % name
82
+ raw_values << a.shift until a[0] == '<'
83
+
84
+ if raw_values.length > 0 then
85
+ value, attributes = get_value_and_attribs(raw_values)
86
+ end
87
+
88
+ element = [name, value, attributes]
89
+ tag = a[0, name.length + 3].join
99
90
 
100
- if children == true then
91
+ return unless a.length > 0
92
+
93
+ children = tag == ("</%s>" % name) ? false : true
101
94
 
102
- scan_elements(a, element) until (a[0, name.length + 3].join == "</%s>" % [name]) or a.length < 2
95
+ if children == true then
103
96
 
104
- #(r = scan_element(a); element << r if r) until (a[0, name.length + 3].join == "</%s>" % [name]) or a.length < 2
105
- a.slice!(0, name.length + 3) if a[0, name.length + 3].join == "</%s>" % name
106
- a.shift until a[0] == '<' or a.length <= 1
107
- else
97
+ xa = scan_elements(a, element) until (a[0, name.length + 3].join \
98
+ == "</%s>" % [name]) or a.length < 2
108
99
 
109
- #check for its end tag
110
- a.slice!(0, name.length + 3) if a[0, name.length + 3].join == "</%s>" % name
111
- text_remaining = []
112
- text_remaining << a.shift until a[0] == '<' or a.length <= 1
100
+ xa.shift until xa[0] == '>' or xa.length <= 1
101
+ xa.shift
102
+ after_text = []
103
+ after_text << xa.shift until xa[0] == '<' or xa.length <= 1
104
+
105
+ return after_text.length >= 1 ? [element, after_text.join] : element
113
106
 
114
- remaining = text_remaining.join unless text_remaining.empty?
115
- #puts 'element: ' + element.inspect
116
- end
117
- end
107
+ else
118
108
 
119
- element
120
- end
109
+ #check for its end tag
110
+ a.slice!(0, name.length + 3) if a[0, name.length + 3].join \
111
+ == "</%s>" % name
112
+ after_text = []
113
+ after_text << a.shift until a[0] == '<' or a.length <= 1
121
114
 
122
-
123
- if remaining.nil? then #or remaining.strip.empty? then
124
- return element
125
- else
126
- return [element, remaining]
127
- end
115
+ return after_text.length >= 1 ? [element, after_text.join] : element
128
116
 
129
117
  end
130
118
  end
131
-
132
119
  end
120
+
133
121
  end
134
122
 
135
123
  def scan_elements(a, element)
136
124
  r = scan_element(a)
137
125
 
138
126
  if r and r[0].is_a?(Array) then
139
- element = r.inject(element) {|r,x| r << x} if r
127
+ element = r.inject(element) {|r,x| r << x} if r
140
128
  elsif r
141
129
  element << r
142
130
  end
131
+ return a
143
132
  end
144
133
 
145
- def get_value_and_attributes(raw_values)
146
- attributes = {}
134
+ def get_value_and_attribs(raw_values)
147
135
 
148
136
  match_found = raw_values.match(/(.*)>([^>]*$)/)
149
137
  if match_found then
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: rexleparser
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.3.3
5
+ version: 0.4.0
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-06-24 00:00:00 Z
13
+ date: 2012-07-14 00:00:00 Z
14
14
  dependencies: []
15
15
 
16
16
  description:
@@ -49,6 +49,6 @@ rubyforge_project:
49
49
  rubygems_version: 1.8.23
50
50
  signing_key:
51
51
  specification_version: 3
52
- summary: rexleparser
52
+ summary: Rexleparser is an XML parser used by the Rexle gem
53
53
  test_files: []
54
54