rexleparser 0.9.10 → 1.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6ab3ac71d4b2615369aa480a89962c79578eb04a3c149a929a23db877ed2e8d0
4
- data.tar.gz: e3fec0abf560e6ab097ac72c869db24ebf62a901978162103cccaaa5c6b38f42
3
+ metadata.gz: a6291ec758a59d1737240656c502a96250c5fe6cdd230a452c220ba34c17f091
4
+ data.tar.gz: c9edbdc47b4e728598407ddd23da8d5622ed699069061742497d3017477e25bc
5
5
  SHA512:
6
- metadata.gz: b8781aafeffd836f86f1a430e4fbb6dddf93a983237db4274db8c487a79ed6ec763994f02968471cc0665e67e5fec1daee099feda9654875d705aba15ef1b1e6
7
- data.tar.gz: 389d4e385e9e965489fe09d13919656f3f0a24a9dc8a15a15d1672132927a87e0751368210747c9399d03460d673c742830d3448e385f328919dfddb2e837dcb
6
+ metadata.gz: 2665fb624f0b3fee4e4304c304c093900685e6708bfc62209fa54a0f0108e7e195844285fa7a677a91d83f0ee72c306ca8f785052cd7d6c51dba3ab1ea3950b9
7
+ data.tar.gz: 8c7d22a214d798f867d670c300d2b61c2235a17c437823ac7f5978dcb3c80015d3887dfc2f7f22b421d58d6b3b321eaa327ac931cb0448c06c1d1f71f70640ae
checksums.yaml.gz.sig CHANGED
Binary file
data/lib/rexleparser.rb CHANGED
@@ -7,20 +7,20 @@
7
7
  class Attributes < Hash
8
8
 
9
9
  class Value < String
10
-
10
+
11
11
  def initialize(value)
12
12
  #jr2020-04-30 super(value.gsub("'", '&apos;'))
13
13
  super(value)
14
14
  end
15
-
15
+
16
16
  def <(val2)
17
17
  self.to_f < val2.to_f
18
- end
19
-
18
+ end
19
+
20
20
  def >(val2)
21
21
  self.to_f > val2.to_f
22
22
  end
23
-
23
+
24
24
  def inspect()
25
25
  super().gsub('&lt;','<',).gsub('&gt;','>').gsub('&pos;',"'")
26
26
  end
@@ -28,13 +28,13 @@ class Attributes < Hash
28
28
  def to_s(unescape: true)
29
29
  unescape ? self.gsub('&amp;','&').gsub('&pos;',"'") : self
30
30
  end
31
-
32
- end
33
-
31
+
32
+ end
33
+
34
34
  def initialize(h={})
35
35
  super().merge! h
36
36
  end
37
-
37
+
38
38
  def []=(k,v)
39
39
  super(k, k != :class ? Value.new(v) : v)
40
40
  end
@@ -48,197 +48,236 @@ class Attributes < Hash
48
48
  end
49
49
 
50
50
  end
51
-
51
+
52
52
  def merge(h)
53
53
 
54
- h2 = h.inject({}) do |r, kv|
54
+ h2 = h.inject({}) do |r, kv|
55
55
  k, raw_v = kv
56
56
  v = raw_v.is_a?(String) ? Value.new(raw_v) : raw_v
57
- r.merge(k => v)
57
+ r.merge(k => v)
58
58
  end
59
-
59
+
60
60
  super(h2)
61
-
61
+
62
62
  end
63
63
  end
64
64
 
65
+
65
66
  class RexleParserException < Exception
66
67
  end
67
68
 
68
69
  class RexleParser
69
70
 
70
- attr_reader :instructions, :doctype, :to_a
71
+ attr_reader :stack
71
72
 
72
- def initialize(raw_s)
73
-
74
- super()
75
- s = raw_s.clone.strip
76
- return if s.empty?
73
+ def initialize(raws, debug: false)
77
74
 
75
+ s = raws.strip
76
+ @debug = debug
77
+ @a = []
78
+ @stack = []
79
+
78
80
  raw_xml, raw_instrctns = if s.lines.first =~ /<?xml/ then
79
- s.split(/(?=\?>\s*<\w)/,2).reverse
81
+ s.split(/(?<=\?>)/,2).reverse
80
82
  else
81
83
  s
82
84
  end
85
+ puts 'raw_xml: ' + raw_xml.inspect if @debug
83
86
  @instructions = raw_instrctns ? \
84
87
  raw_instrctns.scan(/<\?([\w-]+) ([^\?]+)/) : []
85
88
  @doctype = s.slice!(/<!DOCTYPE html>\n?/) if s.lines.first =~ /<\!DOCTYPE/
86
- @to_a = reverse(parse_node(raw_xml.strip.reverse))
89
+
90
+ # scancom is run twice because we 1st check for comment tags and then cdata tags
91
+ @a = parse(scancom(scancom(raw_xml), type: :cdata)).flatten(1)
87
92
 
88
93
  end
89
94
 
90
- private
91
-
92
-
93
- def scan_next(r, tagname)
94
-
95
- j = tagname
96
-
97
- if r[0] == '>' then
98
-
99
- # end tag match
100
- tag = r[/^>[^<]+</]
101
-
102
- if tag[1][/[ \w"']/] and tag[-2] != '/' then
103
-
104
- # is it the end tag to match the start tag?
105
- tag = r.slice!(/^>[^<]+</)
106
- end_tag = tag[/^>[^>]*#{j}<$/]
107
-
108
- if end_tag then
109
-
110
- j = nil
111
- return [:end_tag, end_tag]
112
-
113
- elsif tag[/^>[^>]*\w+<$/] then
114
- # broken tag found
115
- broken_tag = tag
116
- return [:child, [nil, [], broken_tag]] if broken_tag
117
- else
118
-
119
- text, newtag = tag.sub('>',';tg&').split(/>/,2)
120
-
121
- if newtag then
122
- tag = newtag
123
- r.prepend '>' + tag
124
- end
125
-
126
- return [:child, text]
127
- end
128
- elsif r[0,3] == '>--' then # comment tag found
95
+ def to_a()
96
+ @a
97
+ end
129
98
 
130
- r.slice!(0,3)
131
- i = r =~ /(\-\-!<)/
132
- s = r.slice!(0,i)
133
- r.slice!(0,4)
99
+ private
100
+
101
+ def ehead(raws)
102
+
103
+ s = raws.lstrip
104
+ puts '_s: ' + s.inspect if @debug
105
+ # fetch the element head
106
+ tag = s =~ /<[^>]+\/?>/
107
+ s2 = s[tag+1..-1]
108
+ tagb = s2 =~ />/
109
+ return unless tag
110
+
111
+ len = tagb+1-tag
112
+
113
+ if @debug then
114
+ puts 'ehead()/detail: ' + [tag, tagb, len, s[tag,len+1]].inspect
115
+ end
134
116
 
135
- tagname, content = ['-!',s]
117
+ [s[tag,len+1], s[len+1..-1]]
136
118
 
137
- return [:child, [">#{tagname}<", [content], ">#{tagname}/<"]]
119
+ end
138
120
 
139
- elsif r[0,3] == '>]]' then # CDATA tag found
121
+ def get_attributes(raw_attributes)
122
+
123
+ r1 = /([\w\-:\(\)]+\='[^']*)'/
124
+ r2 = /([\w\-:\(\)]+\="[^"]*)"/
125
+
126
+ r = raw_attributes.scan(/#{r1}|#{r2}/).map(&:compact)\
127
+ .flatten.inject(Attributes.new) do |r, x|
128
+ attr_name, raw_val = x.split(/=/,2)
129
+ val = attr_name != 'class' ? raw_val[1..-1] : raw_val[1..-1].split
130
+ r.merge(attr_name.to_sym => val)
131
+ end
140
132
 
141
- r.slice!(0,3)
142
- i = r =~ /(\[ATADC\[!<)/
143
- s = r.slice!(0,i)
144
- r.slice!(0,9)
133
+ return r
134
+ end
145
135
 
146
- tagname, content = ['[!',s]
136
+ def parse(raws, a=[], cur=nil)
147
137
 
148
- return [:child, [">#{tagname}<", [content], ">#{tagname}/<"]]
138
+ s = raws #.lstrip
139
+
140
+ if @debug then
141
+ puts '.parse() s: ' + s.inspect[0..600]
142
+ puts '.parse() a: ' + a.inspect[0..699]
143
+ puts '.parse() cur: ' + cur.inspect[0..799]
144
+ end
149
145
 
150
- elsif tag[/>\/|\/<$/] or tag[/^>.*[\w!]+\/<$/] then
146
+ # if self-closing tag
147
+ if s =~ /^<[^<]+\/>/ then
151
148
 
152
- return [:newnode]
149
+ tag = s[/^<[^<]+\/>/]
150
+ puts 'parse() self-closing/tag: ' + tag.inspect if @debug
151
+ tail = $'
152
+
153
+ if @debug then
154
+ puts 'parse() self-closing tag found'
155
+ puts 'parse()/tail: ' + tail.inspect
156
+ end
157
+
158
+ a2 = parsetag(tag)
159
+ puts '_a: ' + a.inspect if @debug
160
+ cur ? a.last << a2 : a << a2
161
+
162
+ parse(tail, a, cur)
163
+
164
+ # is it the head?
165
+ elsif (s =~ /^<[^\/>]+>/) == 0 then
166
+
167
+ puts 'parse()/head found' if @debug
168
+
169
+ tag, tail = ehead(s)
170
+
171
+ if @debug then
172
+ puts 'parse() tag: ' + tag.inspect
173
+ puts 'parse() tail: ' + tail.inspect
174
+ end
175
+ # add it to the list
176
+ a2 = parsetag(tag)
153
177
 
178
+ puts '_cur: ' + cur.inspect if @debug
179
+ if cur then
180
+ cur << a2
181
+ cur2 = cur.last
154
182
  else
183
+ a << a2
184
+ cur2 = a.last
185
+ end
155
186
 
156
- r.sub!('>',';tg&')
157
- i = r =~ />(?:[\-\/"'\w]|\]\])/ # collect until a tag is found or a CDATA element
158
- text = r.slice!(0,i)
159
-
160
- return [:child, text] if text
161
-
162
- end # end of tag match
163
-
164
- else
165
-
166
- # it's a text value
167
- i = r =~ />(?:[\-\/"'\w]|\]\])/ # collect until a tag is found or a CDATA element
168
- text = r.slice!(0,i)
169
-
170
- return [:child, text] if text
171
- end
172
- end
187
+ puts '_a: ' + a.inspect if @debug
173
188
 
174
- def parse_node(r, j=nil)
189
+ # add it to the stack
190
+ @stack.push cur2
175
191
 
176
- return unless r.length > 0
177
- tag = r.slice!(/^>[^<]+</) if (r =~ /^>[^<]+</) == 0
178
- tagname = tag[/([\w!:]+)\/?<$/,1]
192
+ parse(tail, a, cur2)
193
+
194
+ elsif (s =~ /^[^<]/) == 0
179
195
 
180
- # self closing tag?
181
- if tag[/^>\/.*#{tagname}<$/m] then
182
- return [">/#{tagname}<", [], "#{tag.sub(/>\//,'>')}"]
183
- end
196
+ puts 'parse() we have text!' if @debug
197
+ text = raws[/[^<]+/m] #
198
+ remaining = $'
199
+
200
+ if @debug then
201
+ puts 'parse() text: ' + text.inspect
202
+ puts 'cur tag: ' + cur[0].inspect
203
+ end
204
+
205
+ cur << if cur[0][0] == '!' then
206
+ text.gsub('&lt;','<').gsub('&gt;','>').gsub('&amp;','&')
207
+ else
208
+ text.gsub(/>/,'&gt;').gsub(/</, '&lt;')
209
+ end
184
210
 
185
- start_tag, children, end_tag = tag, [], nil
211
+ puts 'remaining: ' + remaining.inspect if @debug
212
+ parse(remaining, a, cur) if remaining.length > 0
213
+
214
+
215
+ # is it a closing tag?
216
+ elsif s =~ /^\s?<\/\w+>/m
217
+
218
+ tail = s[/^\s*<\/\w+>(.*)/m,1]
219
+
220
+ if @debug then
221
+ puts 'parse()/closing tag ' + s[/^\s*<\/\w+>/].inspect
222
+ puts '>a: ' + a.inspect
223
+ end
224
+
225
+ @stack.pop
226
+ #a << []
227
+ parse(tail, a, @stack.last)
228
+
229
+ elsif s.empty? and @stack.length > 0
230
+
231
+ puts 'parse() no end tag!' if @debug
186
232
 
187
- unless start_tag[1..-3][/\w+$/] then
188
- raise RexleParserException, 'invalid closing tag found ' + \
189
- start_tag.reverse + '; context: ' + r[0..120].reverse.inspect
190
233
  end
191
234
 
192
- until end_tag do
235
+ return a
193
236
 
194
- key, res = scan_next r, tagname
195
-
196
- case key
197
- when :end_tag
198
- end_tag = res
199
- r2 = [start_tag, children, end_tag]
200
- end_tag = nil
201
-
202
- return r2
203
- when :child
204
- children << res
205
- when :newnode
206
- children << parse_node(r, tagname)
207
- else
208
- break
209
- end
210
- end
211
-
212
- [start_tag, children, end_tag]
213
237
  end
214
238
 
215
- def get_attributes(raw_attributes)
216
-
217
- r1 = /([\w\-:\(\)]+\='[^']*)'/
218
- r2 = /([\w\-:\(\)]+\="[^"]*)"/
219
-
220
- r = raw_attributes.scan(/#{r1}|#{r2}/).map(&:compact)\
221
- .flatten.inject(Attributes.new) do |r, x|
222
- attr_name, raw_val = x.split(/=/,2)
223
- val = attr_name != 'class' ? raw_val[1..-1] : raw_val[1..-1].split
224
- r.merge(attr_name.to_sym => val)
239
+ # we parse the tag because it contains more than just the name it often contains attributes
240
+ #
241
+ def parsetag(s)
242
+
243
+ puts 'parsetag:' + s.inspect if @debug
244
+ rawtagname, rawattr = s[1..-2].sub(/\/$/,'').match(/^(\w+) *(.*)/)\
245
+ .values_at(1,2)
246
+
247
+ tagname = case rawtagname.to_sym
248
+ when :_comment
249
+ '!-'
250
+ when :_cdata
251
+ '!['
252
+ else
253
+ rawtagname
225
254
  end
226
255
 
227
- return r
256
+ [tagname, get_attributes(rawattr)]
228
257
  end
229
258
 
230
- def reverse(raw_obj)
259
+ def scancom(s, type=:comment)
231
260
 
232
- return unless raw_obj
233
- obj = raw_obj.clone
234
- return obj.reverse! if obj.is_a? String
261
+ tag1 = ['<!--', '-->', 'comment', '<!--']
262
+ tag2 = ['<![CDATA[', '\]\]>', 'cdata', '\<!\[CDATA\[']
263
+ tag = type == :comment ? tag1 : tag2
235
264
 
236
- tag = obj.pop.reverse
265
+ #puts 'tag: ' + tag.inspect
266
+ istart = s =~ /#{tag[3]}/
267
+ return s unless istart
237
268
 
238
- children = obj[-1]
269
+ iend = s =~ /#{tag[1]}/
270
+ comment ="<_%s>%s</_%s>" % [tag[2], s[istart+tag[0].length.. iend-1].gsub('&','&amp;').gsub('<','&lt;').gsub('>','&gt;'), tag[2]]
239
271
 
240
- r = children.reverse.map {|x| reverse(x)}
272
+ if @debug then
273
+ puts 'comment: ' + comment.inspect
274
+ # construct the new string
275
+ puts 'istart: ' + istart.inspect
276
+ end
277
+
278
+ s3 = s[0,istart].to_s + comment + s[iend+3..-1]
279
+ scancom(s3, type)
241
280
 
242
- return [tag[/[!\-\w:\[]+/], get_attributes(tag), *r]
243
281
  end
282
+
244
283
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rexleparser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.10
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -10,32 +10,33 @@ bindir: bin
10
10
  cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
- MIIEXjCCAsagAwIBAgIBATANBgkqhkiG9w0BAQsFADAsMSowKAYDVQQDDCFnZW1t
14
- YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjEwNDAxMTI1NDA1WhcN
15
- MjIwNDAxMTI1NDA1WjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
- cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQC9tf0T
17
- BYEECADFGYQisEHfQBwZtTbhsjWGAsDG1CCEg+Zje9gQIwCPVPUYtEiZkmPtb2en
18
- YQ0gdCvrSdaxyeP+O7UnN2sR/Rb0G/4Nx3gzY5e+k1PeZ+YEHhehzF/CjpxCpief
19
- Mhi2HgToCQ71U1iyUT3Squb3CBA6vwLJI6MMh71GWU01aqrMT/l9W3vN54SAZ5i7
20
- Ud9nVF4JsMXwHyzikv5MH6WwIOzMhqKMUxaAeeGAlFN3u2G2DGW+7fd9/z5zpD6S
21
- XJEvqjllf5fetAk77Lvw7hPfK0gHJHwTva7k87K704pYgKvi8bAwcnhk/aHXgyON
22
- D42nLpNYipRRVTXiNXxo9svPTSDGsee5e0prmpC/U9bD2T4SxCrM7VvfVWXbhhEX
23
- 47iZDeo2KllKmocjA02vfqtbaQXEATi3fSz/pdRpCr1g/Rd/JdAjRnxHgUu1q1TU
24
- JU99/sfjaxBGvbL+C20cfMgdXdPrkGPNsiEDqfxK5IIBfaob8cp6jzKNDosCAwEA
25
- AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUgG4OM1TJ
26
- YfZh1FAIhnVN+TXDs64wJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
27
- c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
28
- BgkqhkiG9w0BAQsFAAOCAYEACka8bLaU+wG55T9M2lqOrmXMsKpHQ5xtmSQk29OJ
29
- 4FUZ4aJEhTYxzJosvMNpauZVyrk+KyF/8uuGz5CfG/aPbOboB9+EIsmIcvRZ696M
30
- BUXc6OuHE8SL0C9yuB9PloIZy2nxrRENFSV5xxyMS04bcaQjKCqtKw69+QT6lbra
31
- iAU2EIebKyy0UIbrJSBIDKfig9KMEUrXvFUR4hu0lWpeT1bwq4sYeIeZNcg3v/y3
32
- EbV3QK7AumvKgYvaz7iTu+9FKWT7AqIOH9wuPNPeXDLgyuKhLjdMaugz0wy6RYhT
33
- Q8tgppTgSzQP8XwMg3xsaM+gWHbRLy8tO+3dkWTPN1m0xETWlSWFCiyi6oq8G4wC
34
- t4pClPXscWrfmQa/u189WCF/O5BbsElrKQqx0vjq73l2apKjN9xViJi4LrEsZTuz
35
- cF/nszU+U7PJ1WnQ+W7QTqoViru4N0S9bwi3YV5F5NPPeVnnrtmC2yruRfgTCI4b
36
- 3nEas0DJDZbQSkPP1mVcybEA
13
+ MIIEljCCAv6gAwIBAgIBATANBgkqhkiG9w0BAQsFADBIMRIwEAYDVQQDDAlnZW1t
14
+ YXN0ZXIxHjAcBgoJkiaJk/IsZAEZFg5qYW1lc3JvYmVydHNvbjESMBAGCgmSJomT
15
+ 8ixkARkWAmV1MB4XDTIzMDMwNzEyNDM0MVoXDTI0MDMwNjEyNDM0MVowSDESMBAG
16
+ A1UEAwwJZ2VtbWFzdGVyMR4wHAYKCZImiZPyLGQBGRYOamFtZXNyb2JlcnRzb24x
17
+ EjAQBgoJkiaJk/IsZAEZFgJldTCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoC
18
+ ggGBAMXdVvebuQa1+janwRx6yjABUKs2WSd6ns81LBol0KgH8Lmjj5CdIJHK/IFZ
19
+ pcjvbJCSNJS9eREO4RnHkJTUpYE6xgTboCsSMdTpJU3MK2Y+PHXQu5YJHBQQBWSe
20
+ LORpuKuhQuhU+oQgxnuszksIO1UBU+Xh0D5dntbWpiFBGPzTctoBTtJqBdClZwXc
21
+ s1mAmXhAkeK2hmT0Rw/IY2CqZAMeMbrVZBaqazYvqXvfDisRPMMZVZMz9al3w6IE
22
+ L9E4tDbU1sExjUgVGB+BIV6SIG5kYrOzpDKnZXhvPbmUR08iZeTe0IpUIFMIYPIy
23
+ kPJxO45OaxLwnabV+jC38P2CV4Pbx6dij/M/mWisD/az4kzmw1kGUMGJiPIn/XRX
24
+ mLOOxuCQxHDts+7tvD+/wTtSIxklsvVKz49QH1ybNrOdoYQuB8qNnLPFzKFr+5SC
25
+ ojuaJ45mf/Uv3Orps8LXj8WmOBvbJWC1/Lglhy+hhGV/7gh1EKVMpx6AwKcJ1+85
26
+ R19PMQIDAQABo4GKMIGHMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
27
+ BBQiPSrne0dHxLynj/1izBmEwv/lkTAmBgNVHREEHzAdgRtnZW1tYXN0ZXJAamFt
28
+ ZXNyb2JlcnRzb24uZXUwJgYDVR0SBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
29
+ c29uLmV1MA0GCSqGSIb3DQEBCwUAA4IBgQBWIQG28MQXuVSHsAw/rQuaE1FpOmz0
30
+ AXWhHK1oDWxkoPTBIoLil2M2PI3htcBBRLUzyli9XFvqjzuO+J8LpWqs2iddxjXP
31
+ 3xtUg0h+0urVRk00xwsnPLppwT7VxvycQifN31En8rMEzd24V5FKkn90brdokVQC
32
+ 5aL/9LD3S5k3t4AyUcGeOFuU+k87lEz8bzKk2wjOjzpgxjNyqeK6h0iFeA94rhnp
33
+ HPaebr7ytgAR3dKU/Zr/gmZdQroli86LaOqGK1AJQ9E1RFBKwKluNa27dR3VyqBA
34
+ VG1Z/9QNxm0ivqKr7samwkNUGiql+s4CPZndbJD/hmDDdmCtYf1mywCAUOh+DrfU
35
+ iKwWhO5Qmo/RUOvr0a4KtP5i0N7qY1LFMSCpfCRTS9zTlfTIjs1ipAnWhLcqp5Js
36
+ NMSYHad41dFYLrVyE7mdZdIVlFqIdG+V1x7iY+zPpg7FS/8EUnK5zUxMC0YoLeK2
37
+ hcHycb1NL9Ujb7onXEop5Dobym6xO6V+yBY=
37
38
  -----END CERTIFICATE-----
38
- date: 2022-01-21 00:00:00.000000000 Z
39
+ date: 2023-03-07 00:00:00.000000000 Z
39
40
  dependencies: []
40
41
  description:
41
42
  email: digital.robertson@gmail.com
@@ -63,8 +64,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
63
64
  - !ruby/object:Gem::Version
64
65
  version: '0'
65
66
  requirements: []
66
- rubyforge_project:
67
- rubygems_version: 2.7.10
67
+ rubygems_version: 3.4.6
68
68
  signing_key:
69
69
  specification_version: 4
70
70
  summary: Rexleparser is an XML parser used by the Rexle gem
metadata.gz.sig CHANGED
@@ -1,2 +1,3 @@
1
- |h�$bI�ȸ)u���|@b͊U������ڮ7e���;�
2
-  q���k���eջ�S��ed�qo��/; 1OnU/�¼�m��=�1��#eP����E������3SQ!n�gʌ�;$ggY�~��1 ���,x_oA2��03L��_^�@B_" 1W����|�Gbr6c{��l��>�}&���f����u2��o���6'C��e�>Ϛ-K0n�p�
1
+ ,����<�a��1�����$n�]�� ᆧAWεp����J���z {�0aM��p�٥tP�u���,k���l ygܖ|8��P�t"}����ej
2
+ +֢��PJ{ݍ��}ׄ��vj a�m,�G��]��ӡ� ���h&r����C*�r��3I=�i��O�ɂ�7�]~��?����CH��Z��j���*�9���ե�ӱM��R+��a����n�3ͣJ��Lm�,��mU&���2>@G���aOQ0b�&��%�.��
3
+ |d�!lDO#�3{�oV��+�(��7<j��pc� "�z���֤�ϗ'�m�si�0�}��y��eP1�:���Dcյ���6=�R,�s�{�7�d}�jj�h�f�j��