rexleparser 0.3.3 → 0.4.0

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/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