libxml-ruby 5.0.4 → 5.0.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 (97) hide show
  1. checksums.yaml +4 -4
  2. data/HISTORY +17 -6
  3. data/README.rdoc +1 -1
  4. data/Rakefile +98 -98
  5. data/ext/libxml/extconf.h +1 -0
  6. data/ext/libxml/extconf.rb +5 -0
  7. data/ext/libxml/libxml.c +79 -79
  8. data/ext/libxml/ruby_xml.c +556 -556
  9. data/ext/libxml/ruby_xml_attr.c +333 -333
  10. data/ext/libxml/ruby_xml_attr.h +12 -12
  11. data/ext/libxml/ruby_xml_attr_decl.h +11 -11
  12. data/ext/libxml/ruby_xml_attributes.h +17 -17
  13. data/ext/libxml/ruby_xml_cbg.c +85 -85
  14. data/ext/libxml/ruby_xml_document.c +1129 -1129
  15. data/ext/libxml/ruby_xml_dtd.c +257 -257
  16. data/ext/libxml/ruby_xml_dtd.h +9 -9
  17. data/ext/libxml/ruby_xml_encoding.c +250 -250
  18. data/ext/libxml/ruby_xml_error.c +1003 -1003
  19. data/ext/libxml/ruby_xml_error.h +14 -14
  20. data/ext/libxml/ruby_xml_html_parser.c +91 -91
  21. data/ext/libxml/ruby_xml_html_parser.h +10 -10
  22. data/ext/libxml/ruby_xml_html_parser_context.c +351 -351
  23. data/ext/libxml/ruby_xml_html_parser_context.h +10 -10
  24. data/ext/libxml/ruby_xml_html_parser_options.c +48 -48
  25. data/ext/libxml/ruby_xml_html_parser_options.h +10 -10
  26. data/ext/libxml/ruby_xml_input_cbg.c +188 -188
  27. data/ext/libxml/ruby_xml_input_cbg.h +20 -20
  28. data/ext/libxml/ruby_xml_io.c +47 -47
  29. data/ext/libxml/ruby_xml_io.h +10 -10
  30. data/ext/libxml/ruby_xml_namespace.c +151 -151
  31. data/ext/libxml/ruby_xml_namespace.h +10 -10
  32. data/ext/libxml/ruby_xml_namespaces.c +293 -293
  33. data/ext/libxml/ruby_xml_namespaces.h +9 -9
  34. data/ext/libxml/ruby_xml_node.h +13 -13
  35. data/ext/libxml/ruby_xml_parser.c +91 -91
  36. data/ext/libxml/ruby_xml_parser.h +10 -10
  37. data/ext/libxml/ruby_xml_parser_context.c +1009 -1009
  38. data/ext/libxml/ruby_xml_parser_context.h +10 -10
  39. data/ext/libxml/ruby_xml_parser_options.c +74 -74
  40. data/ext/libxml/ruby_xml_parser_options.h +10 -10
  41. data/ext/libxml/ruby_xml_reader.h +14 -14
  42. data/ext/libxml/ruby_xml_relaxng.h +8 -8
  43. data/ext/libxml/ruby_xml_sax2_handler.c +326 -326
  44. data/ext/libxml/ruby_xml_sax2_handler.h +10 -10
  45. data/ext/libxml/ruby_xml_sax_parser.c +108 -108
  46. data/ext/libxml/ruby_xml_sax_parser.h +10 -10
  47. data/ext/libxml/ruby_xml_schema.h +25 -25
  48. data/ext/libxml/ruby_xml_schema_attribute.h +37 -37
  49. data/ext/libxml/ruby_xml_schema_element.h +11 -11
  50. data/ext/libxml/ruby_xml_schema_facet.c +50 -50
  51. data/ext/libxml/ruby_xml_schema_facet.h +9 -9
  52. data/ext/libxml/ruby_xml_schema_type.h +9 -9
  53. data/ext/libxml/ruby_xml_version.h +9 -9
  54. data/ext/libxml/ruby_xml_writer.c +1124 -1124
  55. data/ext/libxml/ruby_xml_writer.h +6 -6
  56. data/ext/libxml/ruby_xml_xinclude.c +20 -20
  57. data/ext/libxml/ruby_xml_xinclude.h +11 -11
  58. data/ext/libxml/ruby_xml_xpath.c +195 -195
  59. data/ext/libxml/ruby_xml_xpath.h +15 -15
  60. data/ext/libxml/ruby_xml_xpath_context.c +362 -362
  61. data/ext/libxml/ruby_xml_xpath_context.h +9 -9
  62. data/ext/libxml/ruby_xml_xpath_expression.h +10 -10
  63. data/ext/libxml/ruby_xml_xpath_object.h +17 -17
  64. data/lib/libxml/attr.rb +122 -122
  65. data/lib/libxml/attr_decl.rb +80 -80
  66. data/lib/libxml/attributes.rb +13 -13
  67. data/lib/libxml/document.rb +194 -194
  68. data/lib/libxml/error.rb +95 -95
  69. data/lib/libxml/hpricot.rb +77 -77
  70. data/lib/libxml/html_parser.rb +96 -96
  71. data/lib/libxml/namespace.rb +61 -61
  72. data/lib/libxml/namespaces.rb +37 -37
  73. data/lib/libxml/node.rb +323 -323
  74. data/lib/libxml/parser.rb +102 -102
  75. data/lib/libxml/sax_callbacks.rb +179 -179
  76. data/lib/libxml/sax_parser.rb +40 -40
  77. data/lib/libxml/tree.rb +28 -28
  78. data/lib/libxml-ruby.rb +2 -2
  79. data/lib/libxml.rb +4 -4
  80. data/lib/xml/libxml.rb +10 -10
  81. data/lib/xml.rb +13 -13
  82. data/libxml-ruby.gemspec +50 -49
  83. data/test/test_document.rb +140 -140
  84. data/test/test_document_write.rb +142 -142
  85. data/test/test_dtd.rb +126 -126
  86. data/test/test_encoding.rb +126 -126
  87. data/test/test_error.rb +197 -194
  88. data/test/test_helper.rb +21 -20
  89. data/test/test_namespace.rb +58 -58
  90. data/test/test_node.rb +235 -235
  91. data/test/test_node_write.rb +93 -93
  92. data/test/test_parser.rb +333 -333
  93. data/test/test_reader.rb +364 -364
  94. data/test/test_writer.rb +500 -468
  95. data/test/test_xml.rb +168 -168
  96. metadata +5 -5
  97. data/test/test.rb +0 -5
@@ -1,333 +1,333 @@
1
- /* Please see the LICENSE file for copyright and distribution information */
2
-
3
- /*
4
- * Document-class: LibXML::XML::Attr
5
- *
6
- * Provides access to an attribute defined on an element.
7
- *
8
- * Basic Usage:
9
- *
10
- * require 'test_helper'
11
- *
12
- * doc = XML::Document.new(<some_file>)
13
- * attribute = doc.root.attributes.get_attribute_ns('http://www.w3.org/1999/xlink', 'href')
14
- * attribute.name == 'href'
15
- * attribute.value == 'http://www.mydocument.com'
16
- * attribute.remove!
17
- */
18
-
19
- /* Attributes are owned and freed by their nodes. Thus, its easier for the
20
- ruby bindings to not manage attribute memory management. This does mean
21
- that accessing a particular attribute multiple times will return multiple
22
- different ruby objects. Since we are not using free this works out fine.
23
- Previous versions of the bindings had a one to one mapping between ruby
24
- object and xml attribute, but that could result in segfaults because the
25
- ruby object could be gc'ed. In theory the mark method on the parent node
26
- could prevent that, but if an attribute is returned using an xpath statement
27
- then the node would never by surfaced to ruby and the mark method never
28
- called. */
29
-
30
- #include "ruby_libxml.h"
31
- #include "ruby_xml_attr.h"
32
-
33
- VALUE cXMLAttr;
34
-
35
- void rxml_attr_mark(xmlAttrPtr xattr)
36
- {
37
- /* This can happen if Ruby does a GC run after creating the
38
- new attribute but before initializing it. */
39
- if (xattr != NULL)
40
- rxml_node_mark((xmlNodePtr) xattr);
41
- }
42
-
43
- VALUE rxml_attr_wrap(xmlAttrPtr xattr)
44
- {
45
- return Data_Wrap_Struct(cXMLAttr, rxml_attr_mark, NULL, xattr);
46
- }
47
-
48
- static VALUE rxml_attr_alloc(VALUE klass)
49
- {
50
- return Data_Wrap_Struct(klass, rxml_attr_mark, NULL, NULL);
51
- }
52
-
53
- /*
54
- * call-seq:
55
- * attr.initialize(node, "name", "value")
56
- *
57
- * Creates a new attribute for the node.
58
- *
59
- * node: The XML::Node that will contain the attribute
60
- * name: The name of the attribute
61
- * value: The value of the attribute
62
- *
63
- * attr = XML::Attr.new(doc.root, 'name', 'libxml')
64
- */
65
- static VALUE rxml_attr_initialize(int argc, VALUE *argv, VALUE self)
66
- {
67
- VALUE node = argv[0];
68
- VALUE name = argv[1];
69
- VALUE value = argv[2];
70
- VALUE ns = (argc == 4 ? argv[3] : Qnil);
71
-
72
- xmlNodePtr xnode;
73
- xmlAttrPtr xattr;
74
-
75
- if (argc < 3 || argc > 4)
76
- rb_raise(rb_eArgError, "Wrong number of arguments (3 or 4)");
77
-
78
- Check_Type(name, T_STRING);
79
- Check_Type(value, T_STRING);
80
-
81
- Data_Get_Struct(node, xmlNode, xnode);
82
-
83
- if (xnode->type != XML_ELEMENT_NODE)
84
- rb_raise(rb_eArgError, "Attributes can only be created on element nodes.");
85
-
86
- if (NIL_P(ns))
87
- {
88
- xattr = xmlNewProp(xnode, (xmlChar*)StringValuePtr(name), (xmlChar*)StringValuePtr(value));
89
- }
90
- else
91
- {
92
- xmlNsPtr xns;
93
- Data_Get_Struct(ns, xmlNs, xns);
94
- xattr = xmlNewNsProp(xnode, xns, (xmlChar*)StringValuePtr(name), (xmlChar*)StringValuePtr(value));
95
- }
96
-
97
- if (!xattr)
98
- rb_raise(rb_eRuntimeError, "Could not create attribute.");
99
-
100
- DATA_PTR( self) = xattr;
101
- return self;
102
- }
103
-
104
- /*
105
- * call-seq:
106
- * attr.child -> node
107
- *
108
- * Obtain this attribute's child attribute(s).
109
- */
110
- static VALUE rxml_attr_child_get(VALUE self)
111
- {
112
- xmlAttrPtr xattr;
113
- Data_Get_Struct(self, xmlAttr, xattr);
114
- if (xattr->children == NULL)
115
- return Qnil;
116
- else
117
- return rxml_node_wrap((xmlNodePtr) xattr->children);
118
- }
119
-
120
-
121
- /*
122
- * call-seq:
123
- * attr.doc -> XML::Document
124
- *
125
- * Returns this attribute's document.
126
- *
127
- * doc.root.attributes.get_attribute('name').doc == doc
128
- */
129
- static VALUE rxml_attr_doc_get(VALUE self)
130
- {
131
- xmlAttrPtr xattr;
132
- Data_Get_Struct(self, xmlAttr, xattr);
133
- if (xattr->doc == NULL)
134
- return Qnil;
135
- else
136
- return rxml_document_wrap(xattr->doc);
137
- }
138
-
139
- /*
140
- * call-seq:
141
- * attr.last -> node
142
- *
143
- * Obtain the last attribute.
144
- */
145
- static VALUE rxml_attr_last_get(VALUE self)
146
- {
147
- xmlAttrPtr xattr;
148
- Data_Get_Struct(self, xmlAttr, xattr);
149
- if (xattr->last == NULL)
150
- return Qnil;
151
- else
152
- return rxml_node_wrap(xattr->last);
153
- }
154
-
155
- /*
156
- * call-seq:
157
- * attr.name -> "name"
158
- *
159
- * Obtain this attribute's name.
160
- */
161
- static VALUE rxml_attr_name_get(VALUE self)
162
- {
163
- xmlAttrPtr xattr;
164
- Data_Get_Struct(self, xmlAttr, xattr);
165
-
166
- if (xattr->name == NULL)
167
- return Qnil;
168
- else
169
- return rxml_new_cstr( xattr->name, NULL);
170
- }
171
-
172
- /*
173
- * call-seq:
174
- * attr.next -> node
175
- *
176
- * Obtain the next attribute.
177
- */
178
- static VALUE rxml_attr_next_get(VALUE self)
179
- {
180
- xmlAttrPtr xattr;
181
- Data_Get_Struct(self, xmlAttr, xattr);
182
- if (xattr->next == NULL)
183
- return Qnil;
184
- else
185
- return rxml_attr_wrap(xattr->next);
186
- }
187
-
188
- /*
189
- * call-seq:
190
- * attr.node_type -> num
191
- *
192
- * Obtain this node's type identifier.
193
- */
194
- static VALUE rxml_attr_node_type(VALUE self)
195
- {
196
- xmlAttrPtr xattr;
197
- Data_Get_Struct(self, xmlAttr, xattr);
198
- return INT2NUM(xattr->type);
199
- }
200
-
201
- /*
202
- * call-seq:
203
- * attr.ns -> namespace
204
- *
205
- * Obtain this attribute's associated XML::NS, if any.
206
- */
207
- static VALUE rxml_attr_ns_get(VALUE self)
208
- {
209
- xmlAttrPtr xattr;
210
- Data_Get_Struct(self, xmlAttr, xattr);
211
- if (xattr->ns == NULL)
212
- return Qnil;
213
- else
214
- return rxml_namespace_wrap(xattr->ns);
215
- }
216
-
217
- /*
218
- * call-seq:
219
- * attr.parent -> node
220
- *
221
- * Obtain this attribute node's parent.
222
- */
223
- static VALUE rxml_attr_parent_get(VALUE self)
224
- {
225
- xmlAttrPtr xattr;
226
- Data_Get_Struct(self, xmlAttr, xattr);
227
- if (xattr->parent == NULL)
228
- return Qnil;
229
- else
230
- return rxml_node_wrap(xattr->parent);
231
- }
232
-
233
- /*
234
- * call-seq:
235
- * attr.prev -> node
236
- *
237
- * Obtain the previous attribute.
238
- */
239
- static VALUE rxml_attr_prev_get(VALUE self)
240
- {
241
- xmlAttrPtr xattr;
242
- Data_Get_Struct(self, xmlAttr, xattr);
243
- if (xattr->prev == NULL)
244
- return Qnil;
245
- else
246
- return rxml_attr_wrap(xattr->prev);
247
- }
248
-
249
- /*
250
- * call-seq:
251
- * attr.remove! -> nil
252
- *
253
- * Removes this attribute from it's parent. Note
254
- * the attribute and its content is freed and can
255
- * no longer be used. If you try to use it you
256
- * will get a segmentation fault.
257
- */
258
- static VALUE rxml_attr_remove_ex(VALUE self)
259
- {
260
- xmlAttrPtr xattr;
261
- Data_Get_Struct(self, xmlAttr, xattr);
262
- xmlRemoveProp(xattr);
263
-
264
- RDATA(self)->data = NULL;
265
- RDATA(self)->dfree = NULL;
266
- RDATA(self)->dmark = NULL;
267
-
268
- return Qnil;
269
- }
270
-
271
- /*
272
- * call-seq:
273
- * attr.value -> "value"
274
- *
275
- * Obtain the value of this attribute.
276
- */
277
- VALUE rxml_attr_value_get(VALUE self)
278
- {
279
- xmlAttrPtr xattr;
280
- xmlChar *value;
281
- VALUE result = Qnil;
282
-
283
- Data_Get_Struct(self, xmlAttr, xattr);
284
- value = xmlNodeGetContent((xmlNodePtr)xattr);
285
-
286
- if (value != NULL)
287
- {
288
- result = rxml_new_cstr( value, NULL);
289
- xmlFree(value);
290
- }
291
- return result;
292
- }
293
-
294
- /*
295
- * call-seq:
296
- * attr.value = "value"
297
- *
298
- * Sets the value of this attribute.
299
- */
300
- VALUE rxml_attr_value_set(VALUE self, VALUE val)
301
- {
302
- xmlAttrPtr xattr;
303
-
304
- Check_Type(val, T_STRING);
305
- Data_Get_Struct(self, xmlAttr, xattr);
306
-
307
- if (xattr->ns)
308
- xmlSetNsProp(xattr->parent, xattr->ns, xattr->name,
309
- (xmlChar*) StringValuePtr(val));
310
- else
311
- xmlSetProp(xattr->parent, xattr->name, (xmlChar*) StringValuePtr(val));
312
-
313
- return (self);
314
- }
315
-
316
- void rxml_init_attr(void)
317
- {
318
- cXMLAttr = rb_define_class_under(mXML, "Attr", rb_cObject);
319
- rb_define_alloc_func(cXMLAttr, rxml_attr_alloc);
320
- rb_define_method(cXMLAttr, "initialize", rxml_attr_initialize, -1);
321
- rb_define_method(cXMLAttr, "child", rxml_attr_child_get, 0);
322
- rb_define_method(cXMLAttr, "doc", rxml_attr_doc_get, 0);
323
- rb_define_method(cXMLAttr, "last", rxml_attr_last_get, 0);
324
- rb_define_method(cXMLAttr, "name", rxml_attr_name_get, 0);
325
- rb_define_method(cXMLAttr, "next", rxml_attr_next_get, 0);
326
- rb_define_method(cXMLAttr, "node_type", rxml_attr_node_type, 0);
327
- rb_define_method(cXMLAttr, "ns", rxml_attr_ns_get, 0);
328
- rb_define_method(cXMLAttr, "parent", rxml_attr_parent_get, 0);
329
- rb_define_method(cXMLAttr, "prev", rxml_attr_prev_get, 0);
330
- rb_define_method(cXMLAttr, "remove!", rxml_attr_remove_ex, 0);
331
- rb_define_method(cXMLAttr, "value", rxml_attr_value_get, 0);
332
- rb_define_method(cXMLAttr, "value=", rxml_attr_value_set, 1);
333
- }
1
+ /* Please see the LICENSE file for copyright and distribution information */
2
+
3
+ /*
4
+ * Document-class: LibXML::XML::Attr
5
+ *
6
+ * Provides access to an attribute defined on an element.
7
+ *
8
+ * Basic Usage:
9
+ *
10
+ * require 'test_helper'
11
+ *
12
+ * doc = XML::Document.new(<some_file>)
13
+ * attribute = doc.root.attributes.get_attribute_ns('http://www.w3.org/1999/xlink', 'href')
14
+ * attribute.name == 'href'
15
+ * attribute.value == 'http://www.mydocument.com'
16
+ * attribute.remove!
17
+ */
18
+
19
+ /* Attributes are owned and freed by their nodes. Thus, its easier for the
20
+ ruby bindings to not manage attribute memory management. This does mean
21
+ that accessing a particular attribute multiple times will return multiple
22
+ different ruby objects. Since we are not using free this works out fine.
23
+ Previous versions of the bindings had a one to one mapping between ruby
24
+ object and xml attribute, but that could result in segfaults because the
25
+ ruby object could be gc'ed. In theory the mark method on the parent node
26
+ could prevent that, but if an attribute is returned using an xpath statement
27
+ then the node would never by surfaced to ruby and the mark method never
28
+ called. */
29
+
30
+ #include "ruby_libxml.h"
31
+ #include "ruby_xml_attr.h"
32
+
33
+ VALUE cXMLAttr;
34
+
35
+ void rxml_attr_mark(xmlAttrPtr xattr)
36
+ {
37
+ /* This can happen if Ruby does a GC run after creating the
38
+ new attribute but before initializing it. */
39
+ if (xattr != NULL)
40
+ rxml_node_mark((xmlNodePtr) xattr);
41
+ }
42
+
43
+ VALUE rxml_attr_wrap(xmlAttrPtr xattr)
44
+ {
45
+ return Data_Wrap_Struct(cXMLAttr, rxml_attr_mark, NULL, xattr);
46
+ }
47
+
48
+ static VALUE rxml_attr_alloc(VALUE klass)
49
+ {
50
+ return Data_Wrap_Struct(klass, rxml_attr_mark, NULL, NULL);
51
+ }
52
+
53
+ /*
54
+ * call-seq:
55
+ * attr.initialize(node, "name", "value")
56
+ *
57
+ * Creates a new attribute for the node.
58
+ *
59
+ * node: The XML::Node that will contain the attribute
60
+ * name: The name of the attribute
61
+ * value: The value of the attribute
62
+ *
63
+ * attr = XML::Attr.new(doc.root, 'name', 'libxml')
64
+ */
65
+ static VALUE rxml_attr_initialize(int argc, VALUE *argv, VALUE self)
66
+ {
67
+ VALUE node = argv[0];
68
+ VALUE name = argv[1];
69
+ VALUE value = argv[2];
70
+ VALUE ns = (argc == 4 ? argv[3] : Qnil);
71
+
72
+ xmlNodePtr xnode;
73
+ xmlAttrPtr xattr;
74
+
75
+ if (argc < 3 || argc > 4)
76
+ rb_raise(rb_eArgError, "Wrong number of arguments (3 or 4)");
77
+
78
+ Check_Type(name, T_STRING);
79
+ Check_Type(value, T_STRING);
80
+
81
+ Data_Get_Struct(node, xmlNode, xnode);
82
+
83
+ if (xnode->type != XML_ELEMENT_NODE)
84
+ rb_raise(rb_eArgError, "Attributes can only be created on element nodes.");
85
+
86
+ if (NIL_P(ns))
87
+ {
88
+ xattr = xmlNewProp(xnode, (xmlChar*)StringValuePtr(name), (xmlChar*)StringValuePtr(value));
89
+ }
90
+ else
91
+ {
92
+ xmlNsPtr xns;
93
+ Data_Get_Struct(ns, xmlNs, xns);
94
+ xattr = xmlNewNsProp(xnode, xns, (xmlChar*)StringValuePtr(name), (xmlChar*)StringValuePtr(value));
95
+ }
96
+
97
+ if (!xattr)
98
+ rb_raise(rb_eRuntimeError, "Could not create attribute.");
99
+
100
+ DATA_PTR( self) = xattr;
101
+ return self;
102
+ }
103
+
104
+ /*
105
+ * call-seq:
106
+ * attr.child -> node
107
+ *
108
+ * Obtain this attribute's child attribute(s).
109
+ */
110
+ static VALUE rxml_attr_child_get(VALUE self)
111
+ {
112
+ xmlAttrPtr xattr;
113
+ Data_Get_Struct(self, xmlAttr, xattr);
114
+ if (xattr->children == NULL)
115
+ return Qnil;
116
+ else
117
+ return rxml_node_wrap((xmlNodePtr) xattr->children);
118
+ }
119
+
120
+
121
+ /*
122
+ * call-seq:
123
+ * attr.doc -> XML::Document
124
+ *
125
+ * Returns this attribute's document.
126
+ *
127
+ * doc.root.attributes.get_attribute('name').doc == doc
128
+ */
129
+ static VALUE rxml_attr_doc_get(VALUE self)
130
+ {
131
+ xmlAttrPtr xattr;
132
+ Data_Get_Struct(self, xmlAttr, xattr);
133
+ if (xattr->doc == NULL)
134
+ return Qnil;
135
+ else
136
+ return rxml_document_wrap(xattr->doc);
137
+ }
138
+
139
+ /*
140
+ * call-seq:
141
+ * attr.last -> node
142
+ *
143
+ * Obtain the last attribute.
144
+ */
145
+ static VALUE rxml_attr_last_get(VALUE self)
146
+ {
147
+ xmlAttrPtr xattr;
148
+ Data_Get_Struct(self, xmlAttr, xattr);
149
+ if (xattr->last == NULL)
150
+ return Qnil;
151
+ else
152
+ return rxml_node_wrap(xattr->last);
153
+ }
154
+
155
+ /*
156
+ * call-seq:
157
+ * attr.name -> "name"
158
+ *
159
+ * Obtain this attribute's name.
160
+ */
161
+ static VALUE rxml_attr_name_get(VALUE self)
162
+ {
163
+ xmlAttrPtr xattr;
164
+ Data_Get_Struct(self, xmlAttr, xattr);
165
+
166
+ if (xattr->name == NULL)
167
+ return Qnil;
168
+ else
169
+ return rxml_new_cstr( xattr->name, NULL);
170
+ }
171
+
172
+ /*
173
+ * call-seq:
174
+ * attr.next -> node
175
+ *
176
+ * Obtain the next attribute.
177
+ */
178
+ static VALUE rxml_attr_next_get(VALUE self)
179
+ {
180
+ xmlAttrPtr xattr;
181
+ Data_Get_Struct(self, xmlAttr, xattr);
182
+ if (xattr->next == NULL)
183
+ return Qnil;
184
+ else
185
+ return rxml_attr_wrap(xattr->next);
186
+ }
187
+
188
+ /*
189
+ * call-seq:
190
+ * attr.node_type -> num
191
+ *
192
+ * Obtain this node's type identifier.
193
+ */
194
+ static VALUE rxml_attr_node_type(VALUE self)
195
+ {
196
+ xmlAttrPtr xattr;
197
+ Data_Get_Struct(self, xmlAttr, xattr);
198
+ return INT2NUM(xattr->type);
199
+ }
200
+
201
+ /*
202
+ * call-seq:
203
+ * attr.ns -> namespace
204
+ *
205
+ * Obtain this attribute's associated XML::NS, if any.
206
+ */
207
+ static VALUE rxml_attr_ns_get(VALUE self)
208
+ {
209
+ xmlAttrPtr xattr;
210
+ Data_Get_Struct(self, xmlAttr, xattr);
211
+ if (xattr->ns == NULL)
212
+ return Qnil;
213
+ else
214
+ return rxml_namespace_wrap(xattr->ns);
215
+ }
216
+
217
+ /*
218
+ * call-seq:
219
+ * attr.parent -> node
220
+ *
221
+ * Obtain this attribute node's parent.
222
+ */
223
+ static VALUE rxml_attr_parent_get(VALUE self)
224
+ {
225
+ xmlAttrPtr xattr;
226
+ Data_Get_Struct(self, xmlAttr, xattr);
227
+ if (xattr->parent == NULL)
228
+ return Qnil;
229
+ else
230
+ return rxml_node_wrap(xattr->parent);
231
+ }
232
+
233
+ /*
234
+ * call-seq:
235
+ * attr.prev -> node
236
+ *
237
+ * Obtain the previous attribute.
238
+ */
239
+ static VALUE rxml_attr_prev_get(VALUE self)
240
+ {
241
+ xmlAttrPtr xattr;
242
+ Data_Get_Struct(self, xmlAttr, xattr);
243
+ if (xattr->prev == NULL)
244
+ return Qnil;
245
+ else
246
+ return rxml_attr_wrap(xattr->prev);
247
+ }
248
+
249
+ /*
250
+ * call-seq:
251
+ * attr.remove! -> nil
252
+ *
253
+ * Removes this attribute from it's parent. Note
254
+ * the attribute and its content is freed and can
255
+ * no longer be used. If you try to use it you
256
+ * will get a segmentation fault.
257
+ */
258
+ static VALUE rxml_attr_remove_ex(VALUE self)
259
+ {
260
+ xmlAttrPtr xattr;
261
+ Data_Get_Struct(self, xmlAttr, xattr);
262
+ xmlRemoveProp(xattr);
263
+
264
+ RDATA(self)->data = NULL;
265
+ RDATA(self)->dfree = NULL;
266
+ RDATA(self)->dmark = NULL;
267
+
268
+ return Qnil;
269
+ }
270
+
271
+ /*
272
+ * call-seq:
273
+ * attr.value -> "value"
274
+ *
275
+ * Obtain the value of this attribute.
276
+ */
277
+ VALUE rxml_attr_value_get(VALUE self)
278
+ {
279
+ xmlAttrPtr xattr;
280
+ xmlChar *value;
281
+ VALUE result = Qnil;
282
+
283
+ Data_Get_Struct(self, xmlAttr, xattr);
284
+ value = xmlNodeGetContent((xmlNodePtr)xattr);
285
+
286
+ if (value != NULL)
287
+ {
288
+ result = rxml_new_cstr( value, NULL);
289
+ xmlFree(value);
290
+ }
291
+ return result;
292
+ }
293
+
294
+ /*
295
+ * call-seq:
296
+ * attr.value = "value"
297
+ *
298
+ * Sets the value of this attribute.
299
+ */
300
+ VALUE rxml_attr_value_set(VALUE self, VALUE val)
301
+ {
302
+ xmlAttrPtr xattr;
303
+
304
+ Check_Type(val, T_STRING);
305
+ Data_Get_Struct(self, xmlAttr, xattr);
306
+
307
+ if (xattr->ns)
308
+ xmlSetNsProp(xattr->parent, xattr->ns, xattr->name,
309
+ (xmlChar*) StringValuePtr(val));
310
+ else
311
+ xmlSetProp(xattr->parent, xattr->name, (xmlChar*) StringValuePtr(val));
312
+
313
+ return (self);
314
+ }
315
+
316
+ void rxml_init_attr(void)
317
+ {
318
+ cXMLAttr = rb_define_class_under(mXML, "Attr", rb_cObject);
319
+ rb_define_alloc_func(cXMLAttr, rxml_attr_alloc);
320
+ rb_define_method(cXMLAttr, "initialize", rxml_attr_initialize, -1);
321
+ rb_define_method(cXMLAttr, "child", rxml_attr_child_get, 0);
322
+ rb_define_method(cXMLAttr, "doc", rxml_attr_doc_get, 0);
323
+ rb_define_method(cXMLAttr, "last", rxml_attr_last_get, 0);
324
+ rb_define_method(cXMLAttr, "name", rxml_attr_name_get, 0);
325
+ rb_define_method(cXMLAttr, "next", rxml_attr_next_get, 0);
326
+ rb_define_method(cXMLAttr, "node_type", rxml_attr_node_type, 0);
327
+ rb_define_method(cXMLAttr, "ns", rxml_attr_ns_get, 0);
328
+ rb_define_method(cXMLAttr, "parent", rxml_attr_parent_get, 0);
329
+ rb_define_method(cXMLAttr, "prev", rxml_attr_prev_get, 0);
330
+ rb_define_method(cXMLAttr, "remove!", rxml_attr_remove_ex, 0);
331
+ rb_define_method(cXMLAttr, "value", rxml_attr_value_get, 0);
332
+ rb_define_method(cXMLAttr, "value=", rxml_attr_value_set, 1);
333
+ }
@@ -1,12 +1,12 @@
1
- /* Please see the LICENSE file for copyright and distribution information */
2
-
3
- #ifndef __RXML_ATTR__
4
- #define __RXML_ATTR__
5
-
6
- extern VALUE cXMLAttr;
7
-
8
- void rxml_init_attr(void);
9
- VALUE rxml_attr_wrap(xmlAttrPtr xattr);
10
- VALUE rxml_attr_value_get(VALUE self);
11
- VALUE rxml_attr_value_set(VALUE self, VALUE val);
12
- #endif
1
+ /* Please see the LICENSE file for copyright and distribution information */
2
+
3
+ #ifndef __RXML_ATTR__
4
+ #define __RXML_ATTR__
5
+
6
+ extern VALUE cXMLAttr;
7
+
8
+ void rxml_init_attr(void);
9
+ VALUE rxml_attr_wrap(xmlAttrPtr xattr);
10
+ VALUE rxml_attr_value_get(VALUE self);
11
+ VALUE rxml_attr_value_set(VALUE self, VALUE val);
12
+ #endif