ox 2.14.13 → 2.14.15
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/README.md +1 -1
- data/ext/ox/attr.h +33 -39
- data/ext/ox/base64.c +48 -42
- data/ext/ox/base64.h +4 -4
- data/ext/ox/buf.h +80 -86
- data/ext/ox/builder.c +378 -423
- data/ext/ox/cache.c +2 -2
- data/ext/ox/cache8.c +37 -40
- data/ext/ox/cache8.h +7 -7
- data/ext/ox/dump.c +838 -867
- data/ext/ox/err.c +16 -13
- data/ext/ox/err.h +11 -12
- data/ext/ox/extconf.rb +5 -5
- data/ext/ox/gen_load.c +135 -137
- data/ext/ox/hash_load.c +130 -148
- data/ext/ox/helper.h +32 -39
- data/ext/ox/intern.c +1 -2
- data/ext/ox/obj_load.c +590 -644
- data/ext/ox/ox.c +2 -2
- data/ext/ox/ox.h +5 -5
- data/ext/ox/parse.c +836 -874
- data/ext/ox/sax.c +38 -23
- data/ext/ox/sax.h +2 -2
- data/ext/ox/sax_as.c +78 -94
- data/ext/ox/sax_buf.c +85 -94
- data/ext/ox/sax_buf.h +101 -120
- data/ext/ox/sax_hint.c +175 -184
- data/ext/ox/sax_hint.h +19 -19
- data/ext/ox/sax_stack.h +59 -45
- data/ext/ox/slotcache.c +2 -2
- data/ext/ox/slotcache.h +4 -4
- data/ext/ox/special.c +320 -327
- data/ext/ox/special.h +2 -2
- data/ext/ox/type.h +19 -19
- data/lib/ox/bag.rb +13 -9
- data/lib/ox/cdata.rb +0 -2
- data/lib/ox/comment.rb +0 -2
- data/lib/ox/doctype.rb +0 -2
- data/lib/ox/document.rb +3 -5
- data/lib/ox/element.rb +41 -26
- data/lib/ox/error.rb +0 -3
- data/lib/ox/hasattrs.rb +7 -8
- data/lib/ox/instruct.rb +4 -6
- data/lib/ox/node.rb +3 -4
- data/lib/ox/raw.rb +0 -2
- data/lib/ox/sax.rb +20 -36
- data/lib/ox/version.rb +1 -2
- data/lib/ox/xmlrpc_adapter.rb +4 -6
- data/lib/ox.rb +15 -16
- metadata +6 -5
data/ext/ox/special.h
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
|
9
9
|
#include <stdint.h>
|
10
10
|
|
11
|
-
extern char*
|
12
|
-
extern char*
|
11
|
+
extern char *ox_ucs_to_utf8_chars(char *text, uint64_t u);
|
12
|
+
extern char *ox_entity_lookup(char *text, const char *key);
|
13
13
|
|
14
14
|
#endif /* OX_SPECIAL_H */
|
data/ext/ox/type.h
CHANGED
@@ -7,31 +7,31 @@
|
|
7
7
|
#define OX_TYPE_H
|
8
8
|
|
9
9
|
typedef enum {
|
10
|
-
NoCode
|
11
|
-
ArrayCode
|
10
|
+
NoCode = 0,
|
11
|
+
ArrayCode = 'a',
|
12
12
|
String64Code = 'b', /* base64 encoded String */
|
13
|
-
ClassCode
|
13
|
+
ClassCode = 'c',
|
14
14
|
Symbol64Code = 'd', /* base64 encoded Symbol */
|
15
|
-
DateCode
|
15
|
+
DateCode = 'D',
|
16
16
|
BigDecimalCode = 'B',
|
17
17
|
ExceptionCode = 'e',
|
18
|
-
FloatCode
|
19
|
-
RegexpCode
|
20
|
-
HashCode
|
21
|
-
FixnumCode
|
22
|
-
BignumCode
|
23
|
-
KeyCode
|
18
|
+
FloatCode = 'f',
|
19
|
+
RegexpCode = 'g',
|
20
|
+
HashCode = 'h',
|
21
|
+
FixnumCode = 'i',
|
22
|
+
BignumCode = 'j',
|
23
|
+
KeyCode = 'k', /* indicates the value is a hash key, kind of a hack */
|
24
24
|
RationalCode = 'l',
|
25
|
-
SymbolCode
|
25
|
+
SymbolCode = 'm',
|
26
26
|
FalseClassCode = 'n',
|
27
|
-
ObjectCode
|
28
|
-
RefCode
|
29
|
-
RangeCode
|
30
|
-
StringCode
|
31
|
-
TimeCode
|
32
|
-
StructCode
|
33
|
-
ComplexCode
|
34
|
-
RawCode
|
27
|
+
ObjectCode = 'o',
|
28
|
+
RefCode = 'p',
|
29
|
+
RangeCode = 'r',
|
30
|
+
StringCode = 's',
|
31
|
+
TimeCode = 't',
|
32
|
+
StructCode = 'u',
|
33
|
+
ComplexCode = 'v',
|
34
|
+
RawCode = 'x',
|
35
35
|
TrueClassCode = 'y',
|
36
36
|
NilClassCode = 'z',
|
37
37
|
} Type;
|
data/lib/ox/bag.rb
CHANGED
@@ -1,13 +1,10 @@
|
|
1
|
-
|
2
1
|
module Ox
|
3
|
-
|
4
2
|
# A generic class that is used only for storing attributes. It is the base
|
5
3
|
# Class for auto-generated classes in the storage system. Instance variables
|
6
4
|
# are added using the instance_variable_set() method. All instance variables
|
7
5
|
# can be accessed using the variable name (without the @ prefix). No setters
|
8
6
|
# are provided as the Class is intended for reading only.
|
9
7
|
class Bag
|
10
|
-
|
11
8
|
# The initializer can take multiple arguments in the form of key values
|
12
9
|
# where the key is the variable name and the value is the variable
|
13
10
|
# value. This is intended for testing purposes only.
|
@@ -17,9 +14,9 @@ module Ox
|
|
17
14
|
#
|
18
15
|
# Ox::Bag.new(:@x => 42, :@y => 57)
|
19
16
|
#
|
20
|
-
def initialize(args={
|
21
|
-
args.each do |k,v|
|
22
|
-
|
17
|
+
def initialize(args={})
|
18
|
+
args.each do |k, v|
|
19
|
+
instance_variable_set(k, v)
|
23
20
|
end
|
24
21
|
end
|
25
22
|
|
@@ -29,6 +26,7 @@ module Ox
|
|
29
26
|
# reader, otherwise false.
|
30
27
|
def respond_to?(m)
|
31
28
|
return true if super
|
29
|
+
|
32
30
|
at_m = ('@' + m.to_s).to_sym
|
33
31
|
instance_variables.include?(at_m)
|
34
32
|
end
|
@@ -42,9 +40,13 @@ module Ox
|
|
42
40
|
#
|
43
41
|
# _raise_ [NoMethodError] if the instance variable is not defined.
|
44
42
|
def method_missing(m, *args, &block)
|
45
|
-
|
43
|
+
unless args.nil? or args.empty?
|
44
|
+
raise ArgumentError.new("wrong number of arguments (#{args.size} for 0) to method #{m}")
|
45
|
+
end
|
46
|
+
|
46
47
|
at_m = ('@' + m.to_s).to_sym
|
47
48
|
raise NoMethodError.new("undefined method #{m}", m) unless instance_variable_defined?(at_m)
|
49
|
+
|
48
50
|
instance_variable_get(at_m)
|
49
51
|
end
|
50
52
|
|
@@ -53,16 +55,18 @@ module Ox
|
|
53
55
|
# *return* [Boolean] true if each variable and value are the same, otherwise false.
|
54
56
|
def eql?(other)
|
55
57
|
return false if (other.nil? or self.class != other.class)
|
58
|
+
|
56
59
|
ova = other.instance_variables
|
57
60
|
iv = instance_variables
|
58
61
|
return false if ova.size != iv.size
|
62
|
+
|
59
63
|
iv.each do |vid|
|
60
64
|
return false if instance_variable_get(vid) != other.instance_variable_get(vid)
|
61
65
|
end
|
62
66
|
true
|
63
67
|
end
|
64
68
|
alias == eql?
|
65
|
-
|
69
|
+
|
66
70
|
# Define a new class based on the Ox::Bag class. This is used internally in
|
67
71
|
# the Ox module and is available to service wrappers that receive XML
|
68
72
|
# requests that include Objects of Classes not defined in the storage
|
@@ -75,6 +79,7 @@ module Ox
|
|
75
79
|
classname = classname.to_s unless classname.is_a?(String)
|
76
80
|
tokens = classname.split('::').map { |n| n.to_sym }
|
77
81
|
raise NameError.new("Invalid classname '#{classname}") if tokens.empty?
|
82
|
+
|
78
83
|
m = Object
|
79
84
|
tokens[0..-2].each do |sym|
|
80
85
|
if m.const_defined?(sym)
|
@@ -94,6 +99,5 @@ module Ox
|
|
94
99
|
end
|
95
100
|
c
|
96
101
|
end
|
97
|
-
|
98
102
|
end # Bag
|
99
103
|
end # Ox
|
data/lib/ox/cdata.rb
CHANGED
data/lib/ox/comment.rb
CHANGED
data/lib/ox/doctype.rb
CHANGED
data/lib/ox/document.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
module Ox
|
3
2
|
# Represents an XML document. It has a fixed set of attributes which form
|
4
3
|
# the XML prolog. A Document includes Elements.
|
@@ -10,14 +9,14 @@ module Ox
|
|
10
9
|
# - _:standalone_ [String] indicates the document is standalone
|
11
10
|
def initialize(prolog={})
|
12
11
|
super(nil)
|
13
|
-
@attributes = {
|
12
|
+
@attributes = {}
|
14
13
|
@attributes[:version] = prolog[:version] unless prolog[:version].nil?
|
15
14
|
@attributes[:encoding] = prolog[:encoding] unless prolog[:encoding].nil?
|
16
15
|
@attributes[:standalone] = prolog[:standalone] unless prolog[:standalone].nil?
|
17
16
|
end
|
18
|
-
|
17
|
+
|
19
18
|
# Returns the first Element in the document.
|
20
|
-
def root
|
19
|
+
def root
|
21
20
|
unless !instance_variable_defined?(:@nodes) || @nodes.nil?
|
22
21
|
@nodes.each do |n|
|
23
22
|
return n if n.is_a?(::Ox::Element)
|
@@ -25,6 +24,5 @@ module Ox
|
|
25
24
|
end
|
26
25
|
nil
|
27
26
|
end
|
28
|
-
|
29
27
|
end # Document
|
30
28
|
end # Ox
|
data/lib/ox/element.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
|
2
1
|
module Ox
|
3
|
-
|
4
2
|
# An Element represents a element of an XML document. It has a name,
|
5
3
|
# attributes, and sub-nodes.
|
6
4
|
#
|
@@ -58,7 +56,8 @@ module Ox
|
|
58
56
|
# so multiple appends can be chained together.
|
59
57
|
# - +node+ [Node] Node to append to the nodes array
|
60
58
|
def <<(node)
|
61
|
-
raise
|
59
|
+
raise 'argument to << must be a String or Ox::Node.' unless node.is_a?(String) or node.is_a?(Node)
|
60
|
+
|
62
61
|
@nodes = [] if !instance_variable_defined?(:@nodes) or @nodes.nil?
|
63
62
|
@nodes << node
|
64
63
|
self
|
@@ -68,7 +67,8 @@ module Ox
|
|
68
67
|
# so multiple appends can be chained together.
|
69
68
|
# - +node+ [Node] Node to prepend to the nodes array
|
70
69
|
def prepend_child(node)
|
71
|
-
raise
|
70
|
+
raise 'argument to << must be a String or Ox::Node.' unless node.is_a?(String) or node.is_a?(Node)
|
71
|
+
|
72
72
|
@nodes = [] if !instance_variable_defined?(:@nodes) or @nodes.nil?
|
73
73
|
@nodes.unshift(node)
|
74
74
|
self
|
@@ -80,15 +80,16 @@ module Ox
|
|
80
80
|
# *return* [Boolean] true if both Objects are equivalent, otherwise false.
|
81
81
|
def eql?(other)
|
82
82
|
return false unless super(other)
|
83
|
-
return false unless
|
84
|
-
return false unless
|
83
|
+
return false unless attributes == other.attributes
|
84
|
+
return false unless nodes == other.nodes
|
85
|
+
|
85
86
|
true
|
86
87
|
end
|
87
88
|
alias == eql?
|
88
89
|
|
89
90
|
# Returns the first String in the elements nodes array or nil if there is
|
90
91
|
# no String node.
|
91
|
-
def text
|
92
|
+
def text
|
92
93
|
nodes.each { |n| return n if n.is_a?(String) }
|
93
94
|
nil
|
94
95
|
end
|
@@ -97,15 +98,16 @@ module Ox
|
|
97
98
|
# (String) node. Note the existing nodes array is modified and not replaced.
|
98
99
|
# - +txt+ [String] to become the only element of the nodes array
|
99
100
|
def replace_text(txt)
|
100
|
-
raise
|
101
|
-
|
101
|
+
raise 'the argument to replace_text() must be a String' unless txt.is_a?(String)
|
102
|
+
|
103
|
+
@nodes.clear
|
102
104
|
@nodes << txt
|
103
105
|
end
|
104
106
|
|
105
107
|
# Return true if all the key-value pairs in the cond Hash match the
|
106
108
|
# @attributes key-values.
|
107
109
|
def attr_match(cond)
|
108
|
-
cond.each_pair { |k,v| return false unless v == @attributes[k.to_sym] || v == @attributes[k.to_s] }
|
110
|
+
cond.each_pair { |k, v| return false unless v == @attributes[k.to_sym] || v == @attributes[k.to_s] }
|
109
111
|
true
|
110
112
|
end
|
111
113
|
|
@@ -161,6 +163,7 @@ module Ox
|
|
161
163
|
# - +path+ [String] path to the Nodes to locate
|
162
164
|
def locate(path)
|
163
165
|
return [self] if path.nil?
|
166
|
+
|
164
167
|
found = []
|
165
168
|
pa = path.split('/')
|
166
169
|
if '*' == path[0]
|
@@ -183,6 +186,7 @@ module Ox
|
|
183
186
|
# - +children+ [Array] array of OX
|
184
187
|
def remove_children(*children)
|
185
188
|
return self if children.compact.empty?
|
189
|
+
|
186
190
|
recursive_children_removal(children.compact.map { |c| c.object_id })
|
187
191
|
self
|
188
192
|
end
|
@@ -198,6 +202,7 @@ module Ox
|
|
198
202
|
del_locate(path.split('/')) unless path.nil?
|
199
203
|
self
|
200
204
|
end
|
205
|
+
|
201
206
|
# Handles the 'easy' API that allows navigating a simple XML by
|
202
207
|
# referencing elements and attributes by name.
|
203
208
|
# - +id+ [Symbol] element or attribute name
|
@@ -209,17 +214,20 @@ module Ox
|
|
209
214
|
ids = id.to_s
|
210
215
|
i = args[0].to_i # will be 0 if no arg or parsing fails
|
211
216
|
nodes.each do |n|
|
212
|
-
|
213
|
-
|
214
|
-
has_some = true
|
215
|
-
i -= 1
|
217
|
+
unless (n.is_a?(Element) || n.is_a?(Instruct)) && (n.value == id || n.value == ids || name_matchs?(n.value, ids))
|
218
|
+
next
|
216
219
|
end
|
220
|
+
return n if 0 == i
|
221
|
+
|
222
|
+
has_some = true
|
223
|
+
i -= 1
|
217
224
|
end
|
218
225
|
if instance_variable_defined?(:@attributes)
|
219
226
|
return @attributes[id] if @attributes.has_key?(id)
|
220
227
|
return @attributes[ids] if @attributes.has_key?(ids)
|
221
228
|
end
|
222
229
|
return nil if has_some
|
230
|
+
|
223
231
|
raise NoMethodError.new("#{ids} not found", name)
|
224
232
|
end
|
225
233
|
|
@@ -228,6 +236,7 @@ module Ox
|
|
228
236
|
# *return* true if the element has a member that matches the provided name.
|
229
237
|
def respond_to?(id, inc_all=false)
|
230
238
|
return true if super
|
239
|
+
|
231
240
|
id_str = id.to_s
|
232
241
|
id_sym = id.to_sym
|
233
242
|
nodes.each do |n|
|
@@ -247,10 +256,11 @@ module Ox
|
|
247
256
|
step = path[0]
|
248
257
|
if step.start_with?('@') # attribute
|
249
258
|
raise InvalidPath.new(path) unless 1 == path.size
|
259
|
+
|
250
260
|
if instance_variable_defined?(:@attributes)
|
251
261
|
step = step[1..-1]
|
252
262
|
sym_step = step.to_sym
|
253
|
-
@attributes.each do |k,v|
|
263
|
+
@attributes.each do |k, v|
|
254
264
|
found << v if ('?' == step or k == step or k == sym_step)
|
255
265
|
end
|
256
266
|
end
|
@@ -261,6 +271,7 @@ module Ox
|
|
261
271
|
else
|
262
272
|
name = step[0..i-1]
|
263
273
|
raise InvalidPath.new(path) unless step.end_with?(']')
|
274
|
+
|
264
275
|
i += 1
|
265
276
|
qual = step[i..i] # step[i] would be better but some rubies (jruby, ree, rbx) take that as a Fixnum.
|
266
277
|
if '0' <= qual and qual <= '9'
|
@@ -270,13 +281,13 @@ module Ox
|
|
270
281
|
end
|
271
282
|
index = step[i..-2].to_i
|
272
283
|
end
|
273
|
-
if '?'
|
284
|
+
if ['?', '*'].include?(name)
|
274
285
|
match = nodes
|
275
286
|
elsif '^' == name[0..0] # 1.8.7 thinks name[0] is a fixnum
|
276
287
|
case name[1..-1]
|
277
|
-
|
288
|
+
when 'Element'
|
278
289
|
match = nodes.select { |e| e.is_a?(Element) }
|
279
|
-
|
290
|
+
when 'String', 'Text'
|
280
291
|
match = nodes.select { |e| e.is_a?(String) }
|
281
292
|
when 'Comment'
|
282
293
|
match = nodes.select { |e| e.is_a?(Comment) }
|
@@ -285,7 +296,7 @@ module Ox
|
|
285
296
|
when 'DocType'
|
286
297
|
match = nodes.select { |e| e.is_a?(DocType) }
|
287
298
|
else
|
288
|
-
#puts "*** no match on #{name}"
|
299
|
+
# puts "*** no match on #{name}"
|
289
300
|
match = []
|
290
301
|
end
|
291
302
|
else
|
@@ -302,7 +313,7 @@ module Ox
|
|
302
313
|
when '>'
|
303
314
|
match = index <= match.size ? match[index + 1..-1] : []
|
304
315
|
when '@'
|
305
|
-
k,v = step[i..-2].split('=')
|
316
|
+
k, v = step[i..-2].split('=')
|
306
317
|
if v
|
307
318
|
match = match.select { |n| n.is_a?(Element) && (v == n.attributes[k.to_sym] || v == n.attributes[k]) }
|
308
319
|
else
|
@@ -328,10 +339,11 @@ module Ox
|
|
328
339
|
step = path[0]
|
329
340
|
if step.start_with?('@') # attribute
|
330
341
|
raise InvalidPath.new(path) unless 1 == path.size
|
342
|
+
|
331
343
|
if instance_variable_defined?(:@attributes)
|
332
344
|
step = step[1..-1]
|
333
345
|
sym_step = step.to_sym
|
334
|
-
@attributes.delete_if { |k,v| '?' == step || k.to_sym == sym_step }
|
346
|
+
@attributes.delete_if { |k, v| '?' == step || k.to_sym == sym_step }
|
335
347
|
end
|
336
348
|
else # element name
|
337
349
|
if (i = step.index('[')).nil? # just name
|
@@ -340,6 +352,7 @@ module Ox
|
|
340
352
|
else
|
341
353
|
name = step[0..i-1]
|
342
354
|
raise InvalidPath.new(path) unless step.end_with?(']')
|
355
|
+
|
343
356
|
i += 1
|
344
357
|
qual = step[i..i] # step[i] would be better but some rubies (jruby, ree, rbx) take that as a Fixnum.
|
345
358
|
if '0' <= qual and qual <= '9'
|
@@ -349,13 +362,13 @@ module Ox
|
|
349
362
|
end
|
350
363
|
index = step[i..-2].to_i
|
351
364
|
end
|
352
|
-
if '?'
|
365
|
+
if ['?', '*'].include?(name)
|
353
366
|
match = nodes
|
354
367
|
elsif '^' == name[0..0] # 1.8.7 thinks name[0] is a fixnum
|
355
368
|
case name[1..-1]
|
356
|
-
|
369
|
+
when 'Element'
|
357
370
|
match = nodes.select { |e| e.is_a?(Element) }
|
358
|
-
|
371
|
+
when 'String', 'Text'
|
359
372
|
match = nodes.select { |e| e.is_a?(String) }
|
360
373
|
when 'Comment'
|
361
374
|
match = nodes.select { |e| e.is_a?(Comment) }
|
@@ -364,7 +377,7 @@ module Ox
|
|
364
377
|
when 'DocType'
|
365
378
|
match = nodes.select { |e| e.is_a?(DocType) }
|
366
379
|
else
|
367
|
-
#puts "*** no match on #{name}"
|
380
|
+
# puts "*** no match on #{name}"
|
368
381
|
match = []
|
369
382
|
end
|
370
383
|
else
|
@@ -381,7 +394,7 @@ module Ox
|
|
381
394
|
when '>'
|
382
395
|
match = index <= match.size ? match[index + 1..-1] : []
|
383
396
|
when '@'
|
384
|
-
k,v = step[i..-2].split('=')
|
397
|
+
k, v = step[i..-2].split('=')
|
385
398
|
if v
|
386
399
|
match = match.select { |n| n.is_a?(Element) && (v == n.attributes[k.to_sym] || v == n.attributes[k]) }
|
387
400
|
else
|
@@ -427,6 +440,7 @@ module Ox
|
|
427
440
|
# - +found+ [Array] An array of Ox::Element
|
428
441
|
def recursive_children_removal(found)
|
429
442
|
return if found.empty?
|
443
|
+
|
430
444
|
nodes.tap do |ns|
|
431
445
|
# found.delete(n.object_id) stops looking for an already found object_id
|
432
446
|
ns.delete_if { |n| found.include?(n.object_id) ? found.delete(n.object_id) : false }
|
@@ -438,6 +452,7 @@ module Ox
|
|
438
452
|
|
439
453
|
def name_matchs?(pat, id)
|
440
454
|
return false unless pat.length == id.length
|
455
|
+
|
441
456
|
pat.length.times { |i| return false unless '_' == id[i] || pat[i] == id[i] }
|
442
457
|
true
|
443
458
|
end
|
data/lib/ox/error.rb
CHANGED
data/lib/ox/hasattrs.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
|
2
1
|
module Ox
|
3
|
-
|
4
2
|
# An Object that includes the HasAttrs module can have attributes which are a Hash of String values and either String
|
5
3
|
# or Symbol keys.
|
6
4
|
#
|
@@ -10,7 +8,7 @@ module Ox
|
|
10
8
|
# Returns all the attributes of the Instruct as a Hash.
|
11
9
|
# *return* [Hash] all attributes and attribute values.
|
12
10
|
def attributes
|
13
|
-
@attributes = {
|
11
|
+
@attributes = {} if !instance_variable_defined?(:@attributes) or @attributes.nil?
|
14
12
|
@attributes
|
15
13
|
end
|
16
14
|
|
@@ -18,6 +16,7 @@ module Ox
|
|
18
16
|
# - +attr+ [Symbol|String] attribute name or key to return the value for
|
19
17
|
def [](attr)
|
20
18
|
return nil unless instance_variable_defined?(:@attributes) and @attributes.is_a?(Hash)
|
19
|
+
|
21
20
|
@attributes[attr] or (attr.is_a?(String) ? @attributes[attr.to_sym] : @attributes[attr.to_s])
|
22
21
|
end
|
23
22
|
|
@@ -25,14 +24,15 @@ module Ox
|
|
25
24
|
# - +attr+ [Symbol|String] attribute name or key
|
26
25
|
# - +value+ [Object] value for the attribute
|
27
26
|
def []=(attr, value)
|
28
|
-
raise
|
29
|
-
|
27
|
+
raise 'argument to [] must be a Symbol or a String.' unless attr.is_a?(Symbol) or attr.is_a?(String)
|
28
|
+
|
29
|
+
@attributes = {} if !instance_variable_defined?(:@attributes) or @attributes.nil?
|
30
30
|
a_str = attr.to_s
|
31
31
|
a_sym = attr.to_sym
|
32
32
|
if @attributes.has_key?(a_str)
|
33
|
-
|
33
|
+
attr = a_str
|
34
34
|
elsif @attributes.has_key?(a_sym)
|
35
|
-
|
35
|
+
attr = a_sym
|
36
36
|
end
|
37
37
|
@attributes[attr] = value.to_s
|
38
38
|
end
|
@@ -50,6 +50,5 @@ module Ox
|
|
50
50
|
end
|
51
51
|
raise NoMethodError.new("#{ids} not found", name)
|
52
52
|
end
|
53
|
-
|
54
53
|
end # HasAttrs
|
55
54
|
end # Ox
|
data/lib/ox/instruct.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
|
2
1
|
module Ox
|
3
|
-
|
4
2
|
# An Instruct represents a processing instruction of an XML document. It has a target, attributes, and a value or
|
5
3
|
# content. The content will be all characters with the exception of the target. If the content follows a regular
|
6
4
|
# attribute format then the attributes will be set to the parsed values. If it does not follow the attribute formate
|
@@ -19,18 +17,18 @@ module Ox
|
|
19
17
|
@content = nil
|
20
18
|
end
|
21
19
|
alias target value
|
22
|
-
|
20
|
+
|
23
21
|
# Returns true if this Object and other are of the same type and have the
|
24
22
|
# equivalent value and the equivalent elements otherwise false is returned.
|
25
23
|
# - +other+ [Object] Object compare _self_ to.
|
26
24
|
# *return* [Boolean] true if both Objects are equivalent, otherwise false.
|
27
25
|
def eql?(other)
|
28
26
|
return false unless super(other)
|
29
|
-
return false unless
|
30
|
-
return false unless
|
27
|
+
return false unless attributes == other.attributes
|
28
|
+
return false unless content == other.content
|
29
|
+
|
31
30
|
true
|
32
31
|
end
|
33
32
|
alias == eql?
|
34
|
-
|
35
33
|
end # Instruct
|
36
34
|
end # Ox
|
data/lib/ox/node.rb
CHANGED
@@ -1,10 +1,9 @@
|
|
1
|
-
|
2
1
|
module Ox
|
3
2
|
# The Node is the base class for all other in the Ox module.
|
4
3
|
class Node
|
5
4
|
# String value associated with the Node.
|
6
5
|
attr_accessor :value
|
7
|
-
|
6
|
+
|
8
7
|
# Creates a new Node with the specified String value.
|
9
8
|
# - +value+ [String] string value for the Node
|
10
9
|
def initialize(value)
|
@@ -16,9 +15,9 @@ module Ox
|
|
16
15
|
# - +other+ [Object] Object to compare _self_ to.
|
17
16
|
def eql?(other)
|
18
17
|
return false if (other.nil? or self.class != other.class)
|
19
|
-
|
18
|
+
|
19
|
+
other.value == value
|
20
20
|
end
|
21
21
|
alias == eql?
|
22
|
-
|
23
22
|
end # Node
|
24
23
|
end # Ox
|
data/lib/ox/raw.rb
CHANGED
data/lib/ox/sax.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
module Ox
|
3
2
|
# A SAX style parse handler. The Ox::Sax handler class should be subclasses
|
4
3
|
# and then used with the Ox.sax_parse() method. The Sax methods will then be
|
@@ -6,7 +5,7 @@ module Ox
|
|
6
5
|
# IO streams.<p/>
|
7
6
|
#
|
8
7
|
# *Example*
|
9
|
-
#
|
8
|
+
#
|
10
9
|
# require 'ox'
|
11
10
|
#
|
12
11
|
# class MySax < ::Ox::Sax
|
@@ -56,10 +55,10 @@ module Ox
|
|
56
55
|
# will hold the number of bytes from the start of the document.
|
57
56
|
class Sax
|
58
57
|
# Create a new instance of the Sax handler class.
|
59
|
-
def initialize
|
60
|
-
|
61
|
-
|
62
|
-
|
58
|
+
def initialize
|
59
|
+
# @pos = nil
|
60
|
+
# @line = nil
|
61
|
+
# @column = nil
|
63
62
|
end
|
64
63
|
|
65
64
|
# To make the desired methods active while parsing the desired method
|
@@ -67,47 +66,32 @@ module Ox
|
|
67
66
|
# they will not be called during parsing.
|
68
67
|
private
|
69
68
|
|
70
|
-
def instruct(target)
|
71
|
-
end
|
69
|
+
def instruct(target); end
|
72
70
|
|
73
|
-
def end_instruct(target)
|
74
|
-
end
|
71
|
+
def end_instruct(target); end
|
75
72
|
|
76
|
-
def attr(name, str)
|
77
|
-
end
|
73
|
+
def attr(name, str); end
|
78
74
|
|
79
|
-
def attr_value(name, value)
|
80
|
-
end
|
75
|
+
def attr_value(name, value); end
|
81
76
|
|
82
|
-
def attrs_done
|
83
|
-
end
|
77
|
+
def attrs_done; end
|
84
78
|
|
85
|
-
def doctype(str)
|
86
|
-
end
|
79
|
+
def doctype(str); end
|
87
80
|
|
88
|
-
def comment(str)
|
89
|
-
end
|
81
|
+
def comment(str); end
|
90
82
|
|
91
|
-
def cdata(str)
|
92
|
-
end
|
83
|
+
def cdata(str); end
|
93
84
|
|
94
|
-
def text(str)
|
95
|
-
end
|
85
|
+
def text(str); end
|
96
86
|
|
97
|
-
def value(value)
|
98
|
-
end
|
87
|
+
def value(value); end
|
99
88
|
|
100
|
-
def start_element(name)
|
101
|
-
end
|
89
|
+
def start_element(name); end
|
102
90
|
|
103
|
-
def end_element(name)
|
104
|
-
end
|
105
|
-
|
106
|
-
def error(message, line, column)
|
107
|
-
end
|
91
|
+
def end_element(name); end
|
108
92
|
|
109
|
-
def
|
110
|
-
|
111
|
-
|
93
|
+
def error(message, line, column); end
|
94
|
+
|
95
|
+
def abort(name); end
|
112
96
|
end # Sax
|
113
97
|
end # Ox
|
data/lib/ox/version.rb
CHANGED