libxml-ruby 2.8.0 → 3.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (204) hide show
  1. checksums.yaml +5 -5
  2. data/HISTORY +842 -775
  3. data/LICENSE +20 -20
  4. data/MANIFEST +166 -166
  5. data/README.rdoc +217 -184
  6. data/Rakefile +90 -78
  7. data/ext/libxml/extconf.h +3 -0
  8. data/ext/libxml/extconf.rb +61 -116
  9. data/ext/libxml/libxml.c +80 -76
  10. data/ext/libxml/ruby_libxml.h +67 -75
  11. data/ext/libxml/ruby_xml.c +933 -893
  12. data/ext/libxml/ruby_xml.h +10 -10
  13. data/ext/libxml/ruby_xml_attr.c +333 -333
  14. data/ext/libxml/ruby_xml_attr.h +12 -12
  15. data/ext/libxml/ruby_xml_attr_decl.c +153 -153
  16. data/ext/libxml/ruby_xml_attr_decl.h +11 -11
  17. data/ext/libxml/ruby_xml_attributes.c +275 -275
  18. data/ext/libxml/ruby_xml_attributes.h +15 -15
  19. data/ext/libxml/ruby_xml_cbg.c +85 -85
  20. data/ext/libxml/ruby_xml_document.c +1123 -1147
  21. data/ext/libxml/ruby_xml_document.h +11 -11
  22. data/ext/libxml/ruby_xml_dtd.c +248 -268
  23. data/ext/libxml/ruby_xml_dtd.h +9 -9
  24. data/ext/libxml/ruby_xml_encoding.c +250 -260
  25. data/ext/libxml/ruby_xml_encoding.h +16 -19
  26. data/ext/libxml/ruby_xml_error.c +996 -996
  27. data/ext/libxml/ruby_xml_error.h +12 -12
  28. data/ext/libxml/ruby_xml_html_parser.c +89 -92
  29. data/ext/libxml/ruby_xml_html_parser.h +10 -10
  30. data/ext/libxml/ruby_xml_html_parser_context.c +337 -338
  31. data/ext/libxml/ruby_xml_html_parser_context.h +10 -10
  32. data/ext/libxml/ruby_xml_html_parser_options.c +46 -46
  33. data/ext/libxml/ruby_xml_html_parser_options.h +10 -10
  34. data/ext/libxml/ruby_xml_input_cbg.c +191 -191
  35. data/ext/libxml/ruby_xml_input_cbg.h +20 -20
  36. data/ext/libxml/ruby_xml_io.c +47 -50
  37. data/ext/libxml/ruby_xml_io.h +10 -10
  38. data/ext/libxml/ruby_xml_namespace.c +153 -153
  39. data/ext/libxml/ruby_xml_namespace.h +10 -10
  40. data/ext/libxml/ruby_xml_namespaces.c +293 -293
  41. data/ext/libxml/ruby_xml_namespaces.h +9 -9
  42. data/ext/libxml/ruby_xml_node.c +1402 -1452
  43. data/ext/libxml/ruby_xml_node.h +13 -11
  44. data/ext/libxml/ruby_xml_parser.c +91 -94
  45. data/ext/libxml/ruby_xml_parser.h +12 -12
  46. data/ext/libxml/ruby_xml_parser_context.c +999 -1001
  47. data/ext/libxml/ruby_xml_parser_context.h +10 -10
  48. data/ext/libxml/ruby_xml_parser_options.c +66 -66
  49. data/ext/libxml/ruby_xml_parser_options.h +12 -12
  50. data/ext/libxml/ruby_xml_reader.c +1239 -1228
  51. data/ext/libxml/ruby_xml_reader.h +17 -17
  52. data/ext/libxml/ruby_xml_relaxng.c +110 -111
  53. data/ext/libxml/ruby_xml_relaxng.h +10 -10
  54. data/ext/libxml/ruby_xml_sax2_handler.c +326 -328
  55. data/ext/libxml/ruby_xml_sax2_handler.h +10 -10
  56. data/ext/libxml/ruby_xml_sax_parser.c +116 -120
  57. data/ext/libxml/ruby_xml_sax_parser.h +10 -10
  58. data/ext/libxml/ruby_xml_schema.c +278 -301
  59. data/ext/libxml/ruby_xml_schema.h +809 -809
  60. data/ext/libxml/ruby_xml_schema_attribute.c +109 -109
  61. data/ext/libxml/ruby_xml_schema_attribute.h +15 -15
  62. data/ext/libxml/ruby_xml_schema_element.c +95 -94
  63. data/ext/libxml/ruby_xml_schema_element.h +14 -14
  64. data/ext/libxml/ruby_xml_schema_facet.c +52 -52
  65. data/ext/libxml/ruby_xml_schema_facet.h +13 -13
  66. data/ext/libxml/ruby_xml_schema_type.c +232 -259
  67. data/ext/libxml/ruby_xml_schema_type.h +9 -9
  68. data/ext/libxml/ruby_xml_version.h +9 -9
  69. data/ext/libxml/ruby_xml_writer.c +1133 -1137
  70. data/ext/libxml/ruby_xml_writer.h +10 -10
  71. data/ext/libxml/ruby_xml_xinclude.c +16 -16
  72. data/ext/libxml/ruby_xml_xinclude.h +11 -11
  73. data/ext/libxml/ruby_xml_xpath.c +194 -188
  74. data/ext/libxml/ruby_xml_xpath.h +13 -13
  75. data/ext/libxml/ruby_xml_xpath_context.c +360 -361
  76. data/ext/libxml/ruby_xml_xpath_context.h +9 -9
  77. data/ext/libxml/ruby_xml_xpath_expression.c +81 -81
  78. data/ext/libxml/ruby_xml_xpath_expression.h +10 -10
  79. data/ext/libxml/ruby_xml_xpath_object.c +338 -335
  80. data/ext/libxml/ruby_xml_xpath_object.h +17 -17
  81. data/ext/libxml/ruby_xml_xpointer.c +99 -99
  82. data/ext/libxml/ruby_xml_xpointer.h +11 -11
  83. data/ext/vc/libxml_ruby.sln +17 -15
  84. data/lib/libxml-ruby.rb +30 -0
  85. data/lib/libxml.rb +3 -33
  86. data/lib/libxml/node.rb +2 -78
  87. data/lib/libxml/parser.rb +0 -266
  88. data/lib/libxml/sax_parser.rb +0 -17
  89. data/lib/libxml/schema.rb +47 -66
  90. data/lib/libxml/schema/attribute.rb +19 -19
  91. data/lib/libxml/schema/element.rb +19 -27
  92. data/lib/libxml/schema/type.rb +21 -29
  93. data/libxml-ruby.gemspec +48 -44
  94. data/script/benchmark/depixelate +634 -634
  95. data/script/benchmark/hamlet.xml +9054 -9054
  96. data/script/benchmark/parsecount +170 -170
  97. data/script/benchmark/throughput +41 -41
  98. data/script/test +6 -6
  99. data/setup.rb +0 -1
  100. data/test/c14n/given/example-1.xml +14 -14
  101. data/test/c14n/given/example-2.xml +11 -11
  102. data/test/c14n/given/example-3.xml +18 -18
  103. data/test/c14n/given/example-4.xml +9 -9
  104. data/test/c14n/given/example-5.xml +12 -12
  105. data/test/c14n/given/example-6.xml +2 -2
  106. data/test/c14n/given/example-7.xml +11 -11
  107. data/test/c14n/given/example-8.xml +11 -11
  108. data/test/c14n/given/example-8.xpath +9 -9
  109. data/test/c14n/result/1-1-without-comments/example-1 +3 -3
  110. data/test/c14n/result/1-1-without-comments/example-2 +10 -10
  111. data/test/c14n/result/1-1-without-comments/example-3 +13 -13
  112. data/test/c14n/result/1-1-without-comments/example-4 +8 -8
  113. data/test/c14n/result/1-1-without-comments/example-5 +2 -2
  114. data/test/c14n/result/with-comments/example-1 +5 -5
  115. data/test/c14n/result/with-comments/example-2 +10 -10
  116. data/test/c14n/result/with-comments/example-3 +13 -13
  117. data/test/c14n/result/with-comments/example-4 +8 -8
  118. data/test/c14n/result/with-comments/example-5 +3 -3
  119. data/test/c14n/result/without-comments/example-1 +3 -3
  120. data/test/c14n/result/without-comments/example-2 +10 -10
  121. data/test/c14n/result/without-comments/example-3 +13 -13
  122. data/test/c14n/result/without-comments/example-4 +8 -8
  123. data/test/c14n/result/without-comments/example-5 +2 -2
  124. data/test/model/atom.xml +12 -12
  125. data/test/model/bands.iso-8859-1.xml +4 -4
  126. data/test/model/bands.utf-8.xml +4 -4
  127. data/test/model/bands.xml +4 -4
  128. data/test/model/books.xml +153 -153
  129. data/test/model/cwm_1_0.xml +11336 -0
  130. data/test/model/merge_bug_data.xml +58 -58
  131. data/test/model/ruby-lang.html +238 -238
  132. data/test/model/rubynet.xml +79 -79
  133. data/test/model/shiporder.rnc +28 -28
  134. data/test/model/shiporder.rng +86 -86
  135. data/test/model/shiporder.xml +22 -22
  136. data/test/model/shiporder.xsd +39 -39
  137. data/test/model/soap.xml +27 -27
  138. data/test/model/xinclude.xml +4 -4
  139. data/test/test.xml +2 -0
  140. data/test/{tc_attr.rb → test_attr.rb} +23 -25
  141. data/test/{tc_attr_decl.rb → test_attr_decl.rb} +13 -14
  142. data/test/{tc_attributes.rb → test_attributes.rb} +11 -18
  143. data/test/{tc_canonicalize.rb → test_canonicalize.rb} +36 -41
  144. data/test/test_deprecated_require.rb +12 -0
  145. data/test/{tc_document.rb → test_document.rb} +32 -27
  146. data/test/test_document_write.rb +146 -0
  147. data/test/{tc_dtd.rb → test_dtd.rb} +28 -29
  148. data/test/{tc_encoding.rb → test_encoding.rb} +129 -126
  149. data/test/{tc_encoding_sax.rb → test_encoding_sax.rb} +7 -6
  150. data/test/test_error.rb +178 -0
  151. data/test/test_helper.rb +3 -10
  152. data/test/test_html_parser.rb +162 -0
  153. data/test/test_html_parser_context.rb +23 -0
  154. data/test/test_namespace.rb +60 -0
  155. data/test/{tc_namespaces.rb → test_namespaces.rb} +34 -44
  156. data/test/{tc_node.rb → test_node.rb} +68 -47
  157. data/test/{tc_node_cdata.rb → test_node_cdata.rb} +12 -13
  158. data/test/{tc_node_comment.rb → test_node_comment.rb} +7 -8
  159. data/test/{tc_node_copy.rb → test_node_copy.rb} +4 -6
  160. data/test/{tc_node_edit.rb → test_node_edit.rb} +23 -41
  161. data/test/{tc_node_pi.rb → test_node_pi.rb} +37 -40
  162. data/test/{tc_node_text.rb → test_node_text.rb} +10 -12
  163. data/test/{tc_node_write.rb → test_node_write.rb} +18 -29
  164. data/test/test_node_xlink.rb +28 -0
  165. data/test/test_parser.rb +324 -0
  166. data/test/{tc_parser_context.rb → test_parser_context.rb} +41 -42
  167. data/test/{tc_properties.rb → test_properties.rb} +6 -7
  168. data/test/test_reader.rb +363 -0
  169. data/test/test_relaxng.rb +53 -0
  170. data/test/{tc_sax_parser.rb → test_sax_parser.rb} +36 -37
  171. data/test/{tc_schema.rb → test_schema.rb} +43 -37
  172. data/test/test_suite.rb +38 -40
  173. data/test/{tc_traversal.rb → test_traversal.rb} +5 -6
  174. data/test/{tc_writer.rb → test_writer.rb} +468 -448
  175. data/test/{tc_xinclude.rb → test_xinclude.rb} +4 -5
  176. data/test/test_xml.rb +262 -0
  177. data/test/{tc_xpath.rb → test_xpath.rb} +31 -32
  178. data/test/{tc_xpath_context.rb → test_xpath_context.rb} +8 -9
  179. data/test/test_xpath_expression.rb +37 -0
  180. data/test/{tc_xpointer.rb → test_xpointer.rb} +16 -18
  181. metadata +117 -95
  182. data/lib/libxml/ns.rb +0 -22
  183. data/lib/libxml/properties.rb +0 -23
  184. data/lib/libxml/reader.rb +0 -29
  185. data/lib/libxml/xpath_object.rb +0 -16
  186. data/test/etc_doc_to_s.rb +0 -21
  187. data/test/ets_doc_file.rb +0 -17
  188. data/test/ets_doc_to_s.rb +0 -23
  189. data/test/ets_gpx.rb +0 -28
  190. data/test/ets_node_gc.rb +0 -23
  191. data/test/ets_test.xml +0 -2
  192. data/test/ets_tsr.rb +0 -11
  193. data/test/tc_deprecated_require.rb +0 -13
  194. data/test/tc_document_write.rb +0 -196
  195. data/test/tc_error.rb +0 -180
  196. data/test/tc_html_parser.rb +0 -153
  197. data/test/tc_html_parser_context.rb +0 -24
  198. data/test/tc_namespace.rb +0 -62
  199. data/test/tc_node_xlink.rb +0 -29
  200. data/test/tc_parser.rb +0 -381
  201. data/test/tc_reader.rb +0 -400
  202. data/test/tc_relaxng.rb +0 -54
  203. data/test/tc_xml.rb +0 -226
  204. data/test/tc_xpath_expression.rb +0 -38
@@ -1,10 +1,10 @@
1
- /* Please see the LICENSE file for copyright and distribution information */
2
-
3
- #ifndef __RUBY_XML_H__
4
- #define __RUBY_XML_H__
5
-
6
- extern VALUE mXML;
7
- int rxml_libxml_default_options();
8
- void rxml_init_xml(void);
9
-
10
- #endif
1
+ /* Please see the LICENSE file for copyright and distribution information */
2
+
3
+ #ifndef __RUBY_XML_H__
4
+ #define __RUBY_XML_H__
5
+
6
+ extern VALUE mXML;
7
+ int rxml_libxml_default_options();
8
+ void rxml_init_xml(void);
9
+
10
+ #endif
@@ -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 or xnode->_private
23
- this works out fine. Previous versions of the bindings had a one to
24
- one mapping between ruby object and xml attribute, but that could
25
- result in segfaults because the ruby object could be gc'ed. In theory
26
- the mark method on the parent node could prevent that, but if an
27
- attribute is returned using an xpath statement then the node would
28
- never by surfaced to ruby and the mark method never 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((const char*) 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((const char*) 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
+ }