libxml-ruby 2.8.0 → 3.2.1

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 (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,20 +1,20 @@
1
- #ifndef _INPUT_CBG_
2
- #define _INPUT_CBG_
3
-
4
- void rxml_init_input_callbacks(void);
5
-
6
- typedef struct ic_doc_context {
7
- char *buffer;
8
- char *bpos;
9
- int remaining;
10
- } ic_doc_context;
11
-
12
- typedef struct ic_scheme {
13
- char *scheme_name;
14
- VALUE class;
15
- int name_len;
16
-
17
- struct ic_scheme *next_scheme;
18
- } ic_scheme;
19
-
20
- #endif
1
+ #ifndef _INPUT_CBG_
2
+ #define _INPUT_CBG_
3
+
4
+ void rxml_init_input_callbacks(void);
5
+
6
+ typedef struct ic_doc_context {
7
+ char *buffer;
8
+ char *bpos;
9
+ int remaining;
10
+ } ic_doc_context;
11
+
12
+ typedef struct ic_scheme {
13
+ char *scheme_name;
14
+ VALUE class;
15
+ int name_len;
16
+
17
+ struct ic_scheme *next_scheme;
18
+ } ic_scheme;
19
+
20
+ #endif
@@ -1,50 +1,47 @@
1
- /* Please see the LICENSE file for copyright and distribution information */
2
-
3
- #include "extconf.h"
4
- #include "ruby_libxml.h"
5
-
6
- static ID READ_METHOD;
7
- #ifndef HAVE_RB_IO_BUFWRITE
8
- static ID WRITE_METHOD;
9
- #endif /* !HAVE_RB_IO_BUFWRITE */
10
-
11
- /* This method is called by libxml when it wants to read
12
- more data from a stream. We go with the duck typing
13
- solution to support StringIO objects. */
14
- int rxml_read_callback(void *context, char *buffer, int len)
15
- {
16
- VALUE io = (VALUE) context;
17
- VALUE string = rb_funcall(io, READ_METHOD, 1, INT2NUM(len));
18
- int size;
19
-
20
- if (string == Qnil)
21
- return 0;
22
-
23
- size = RSTRING_LEN(string);
24
- memcpy(buffer, StringValuePtr(string), size);
25
-
26
- return size;
27
- }
28
-
29
- int rxml_write_callback(void *context, const char *buffer, int len)
30
- {
31
- #ifndef HAVE_RB_IO_BUFWRITE
32
- VALUE io, written, string;
33
-
34
- io = (VALUE) context;
35
- string = rb_str_new(buffer, len);
36
- written = rb_funcall(io, WRITE_METHOD, 1, string);
37
-
38
- return NUM2INT(written);
39
- #else
40
- return rb_io_bufwrite((VALUE) context, buffer, (size_t) len);
41
- #endif /* !HAVE_RB_IO_BUFWRITE */
42
- }
43
-
44
- void rxml_init_io(void)
45
- {
46
- READ_METHOD = rb_intern("read");
47
- #ifndef HAVE_RB_IO_BUFWRITE
48
- WRITE_METHOD = rb_intern("write");
49
- #endif /* !HAVE_RB_IO_BUFWRITE */
50
- }
1
+ /* Please see the LICENSE file for copyright and distribution information */
2
+
3
+ #include "ruby_libxml.h"
4
+ #include <ruby/io.h>
5
+
6
+ static ID READ_METHOD;
7
+ static ID WRITE_METHOD;
8
+
9
+ /* This method is called by libxml when it wants to read
10
+ more data from a stream. We go with the duck typing
11
+ solution to support StringIO objects. */
12
+ int rxml_read_callback(void *context, char *buffer, int len)
13
+ {
14
+ VALUE io = (VALUE) context;
15
+ VALUE string = rb_funcall(io, READ_METHOD, 1, INT2NUM(len));
16
+ size_t size;
17
+
18
+ if (string == Qnil)
19
+ return 0;
20
+
21
+ size = RSTRING_LEN(string);
22
+ memcpy(buffer, StringValuePtr(string), size);
23
+
24
+ return (int)size;
25
+ }
26
+
27
+ int rxml_write_callback(VALUE io, const char *buffer, int len)
28
+ {
29
+ if (rb_io_check_io(io) == Qnil)
30
+ {
31
+ // Could be StringIO
32
+ VALUE written, string;
33
+ string = rb_external_str_new_with_enc(buffer, strlen(buffer), rb_enc_get(io));
34
+ written = rb_funcall(io, WRITE_METHOD, 1, string);
35
+ return NUM2INT(written);
36
+ }
37
+ else
38
+ {
39
+ return (int)rb_io_bufwrite(io, buffer, (size_t)len);
40
+ }
41
+ }
42
+
43
+ void rxml_init_io(void)
44
+ {
45
+ READ_METHOD = rb_intern("read");
46
+ WRITE_METHOD = rb_intern("write");
47
+ }
@@ -1,10 +1,10 @@
1
- /* Please see the LICENSE file for copyright and distribution information */
2
-
3
- #ifndef __RXML_IO__
4
- #define __RXML_IO__
5
-
6
- int rxml_read_callback(void *context, char *buffer, int len);
7
- int rxml_write_callback(void *context, const char *buffer, int len);
8
- void rxml_init_io(void);
9
-
10
- #endif
1
+ /* Please see the LICENSE file for copyright and distribution information */
2
+
3
+ #ifndef __RXML_IO__
4
+ #define __RXML_IO__
5
+
6
+ int rxml_read_callback(void *context, char *buffer, int len);
7
+ int rxml_write_callback(VALUE io, const char *buffer, int len);
8
+ void rxml_init_io(void);
9
+
10
+ #endif
@@ -1,153 +1,153 @@
1
- /* Please see the LICENSE file for copyright and distribution information */
2
-
3
- #include "ruby_libxml.h"
4
- #include "ruby_xml_namespace.h"
5
-
6
- VALUE cXMLNamespace;
7
-
8
- /* Document-class: LibXML::XML::Namespace
9
- *
10
- * The Namespace class represents an XML namespace.
11
- * To add a namespace to a node, create a new instance
12
- * of this class. Note that this does *not* assign the
13
- * node to the namespace. To do that see the
14
- * XML::Namespaces#namespace method.
15
- *
16
- * Usage:
17
- *
18
- * node = XML::Node.new('<Envelope>')
19
- * XML::Namespace.new(node, 'soap', 'http://schemas.xmlsoap.org/soap/envelope/')
20
- * assert_equal("<Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"/>", node.to_s)
21
- * assert_nil(node.namespaces.namespace)
22
- */
23
-
24
- /* Namespaces are owned and freed by their nodes. Thus, its easier for the
25
- ruby bindings to not manage attribute memory management. */
26
-
27
- static VALUE rxml_namespace_alloc(VALUE klass)
28
- {
29
- return Data_Wrap_Struct(klass, NULL, NULL, NULL);
30
- }
31
-
32
- VALUE rxml_namespace_wrap(xmlNsPtr xns)
33
- {
34
- return Data_Wrap_Struct(cXMLNamespace, NULL, NULL, xns);
35
- }
36
-
37
-
38
- /*
39
- * call-seq:
40
- * initialize(node, "prefix", "href") -> XML::Namespace
41
- *
42
- * Create a new namespace and adds it to the specified node.
43
- * Note this does *not* assign the node to the namespace.
44
- * To do that see the XML::Namespaces#namespace method.
45
- */
46
- static VALUE rxml_namespace_initialize(VALUE self, VALUE node, VALUE prefix,
47
- VALUE href)
48
- {
49
- xmlNodePtr xnode;
50
- xmlChar *xmlPrefix;
51
- xmlNsPtr xns;
52
-
53
- Check_Type(node, T_DATA);
54
- Data_Get_Struct(node, xmlNode, xnode);
55
-
56
- /* Prefix can be null - that means its the default namespace */
57
- xmlPrefix = NIL_P(prefix) ? NULL : (xmlChar *)StringValuePtr(prefix);
58
- xns = xmlNewNs(xnode, (xmlChar*) StringValuePtr(href), xmlPrefix);
59
-
60
- if (!xns)
61
- rxml_raise(&xmlLastError);
62
-
63
- DATA_PTR(self) = xns;
64
- return self;
65
- }
66
-
67
- /*
68
- * call-seq:
69
- * ns.href -> "href"
70
- *
71
- * Usage:
72
- *
73
- * doc = XML::Document.string('<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"/>')
74
- * ns = doc.root.namespaces.find_by_href('http://schemas.xmlsoap.org/soap/envelope/')
75
- * assert_equal('http://schemas.xmlsoap.org/soap/envelope/', ns.href)
76
- */
77
- static VALUE rxml_namespace_href_get(VALUE self)
78
- {
79
- xmlNsPtr xns;
80
- Data_Get_Struct(self, xmlNs, xns);
81
- if (xns->href == NULL)
82
- return Qnil;
83
- else
84
- return rxml_new_cstr((const char*) xns->href, NULL);
85
- }
86
-
87
- /*
88
- * call-seq:
89
- * ns.node_type -> num
90
- *
91
- * Obtain this namespace's type identifier.
92
- */
93
- static VALUE rxml_namespace_node_type(VALUE self)
94
- {
95
- xmlNsPtr xns;
96
- Data_Get_Struct(self, xmlNs, xns);
97
- return INT2NUM(xns->type);
98
- }
99
-
100
- /*
101
- * call-seq:
102
- * ns.prefix -> "prefix"
103
- *
104
- * Obtain the namespace's prefix.
105
- *
106
- * Usage:
107
- *
108
- * doc = XML::Document.string('<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"/>')
109
- * ns = doc.root.namespaces.find_by_href('http://schemas.xmlsoap.org/soap/envelope/')
110
- * assert_equal('soap', ns.prefix)
111
- */
112
- static VALUE rxml_namespace_prefix_get(VALUE self)
113
- {
114
- xmlNsPtr xns;
115
- Data_Get_Struct(self, xmlNs, xns);
116
- if (xns->prefix == NULL)
117
- return Qnil;
118
- else
119
- return rxml_new_cstr((const char*) xns->prefix, NULL);
120
- }
121
-
122
- /*
123
- * call-seq:
124
- * ns.next -> XML::Namespace
125
- *
126
- * Obtain the next namespace.
127
- *
128
- * Usage:
129
- *
130
- * doc = XML::Document.string('<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"/>')
131
- * ns = doc.root.namespaces.find_by_href('http://schemas.xmlsoap.org/soap/envelope/')
132
- * assert_nil(ns.next)
133
- */
134
- static VALUE rxml_namespace_next(VALUE self)
135
- {
136
- xmlNsPtr xns;
137
- Data_Get_Struct(self, xmlNs, xns);
138
- if (xns == NULL || xns->next == NULL)
139
- return (Qnil);
140
- else
141
- return rxml_namespace_wrap(xns->next);
142
- }
143
-
144
- void rxml_init_namespace(void)
145
- {
146
- cXMLNamespace = rb_define_class_under(mXML, "Namespace", rb_cObject);
147
- rb_define_alloc_func(cXMLNamespace, rxml_namespace_alloc);
148
- rb_define_method(cXMLNamespace, "initialize", rxml_namespace_initialize, 3);
149
- rb_define_method(cXMLNamespace, "href", rxml_namespace_href_get, 0);
150
- rb_define_method(cXMLNamespace, "next", rxml_namespace_next, 0);
151
- rb_define_method(cXMLNamespace, "node_type", rxml_namespace_node_type, 0);
152
- rb_define_method(cXMLNamespace, "prefix", rxml_namespace_prefix_get, 0);
153
- }
1
+ /* Please see the LICENSE file for copyright and distribution information */
2
+
3
+ #include "ruby_libxml.h"
4
+ #include "ruby_xml_namespace.h"
5
+
6
+ VALUE cXMLNamespace;
7
+
8
+ /* Document-class: LibXML::XML::Namespace
9
+ *
10
+ * The Namespace class represents an XML namespace.
11
+ * To add a namespace to a node, create a new instance
12
+ * of this class. Note that this does *not* assign the
13
+ * node to the namespace. To do that see the
14
+ * XML::Namespaces#namespace method.
15
+ *
16
+ * Usage:
17
+ *
18
+ * node = XML::Node.new('<Envelope>')
19
+ * XML::Namespace.new(node, 'soap', 'http://schemas.xmlsoap.org/soap/envelope/')
20
+ * assert_equal("<Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"/>", node.to_s)
21
+ * assert_nil(node.namespaces.namespace)
22
+ */
23
+
24
+ /* Namespaces are owned and freed by their nodes. Thus, its easier for the
25
+ ruby bindings to not manage attribute memory management. */
26
+
27
+ static VALUE rxml_namespace_alloc(VALUE klass)
28
+ {
29
+ return Data_Wrap_Struct(klass, NULL, NULL, NULL);
30
+ }
31
+
32
+ VALUE rxml_namespace_wrap(xmlNsPtr xns)
33
+ {
34
+ return Data_Wrap_Struct(cXMLNamespace, NULL, NULL, xns);
35
+ }
36
+
37
+
38
+ /*
39
+ * call-seq:
40
+ * initialize(node, "prefix", "href") -> XML::Namespace
41
+ *
42
+ * Create a new namespace and adds it to the specified node.
43
+ * Note this does *not* assign the node to the namespace.
44
+ * To do that see the XML::Namespaces#namespace method.
45
+ */
46
+ static VALUE rxml_namespace_initialize(VALUE self, VALUE node, VALUE prefix,
47
+ VALUE href)
48
+ {
49
+ xmlNodePtr xnode;
50
+ xmlChar *xmlPrefix;
51
+ xmlNsPtr xns;
52
+
53
+ Check_Type(node, T_DATA);
54
+ Data_Get_Struct(node, xmlNode, xnode);
55
+
56
+ /* Prefix can be null - that means its the default namespace */
57
+ xmlPrefix = NIL_P(prefix) ? NULL : (xmlChar *)StringValuePtr(prefix);
58
+ xns = xmlNewNs(xnode, (xmlChar*) StringValuePtr(href), xmlPrefix);
59
+
60
+ if (!xns)
61
+ rxml_raise(&xmlLastError);
62
+
63
+ DATA_PTR(self) = xns;
64
+ return self;
65
+ }
66
+
67
+ /*
68
+ * call-seq:
69
+ * ns.href -> "href"
70
+ *
71
+ * Usage:
72
+ *
73
+ * doc = XML::Document.string('<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"/>')
74
+ * ns = doc.root.namespaces.find_by_href('http://schemas.xmlsoap.org/soap/envelope/')
75
+ * assert_equal('http://schemas.xmlsoap.org/soap/envelope/', ns.href)
76
+ */
77
+ static VALUE rxml_namespace_href_get(VALUE self)
78
+ {
79
+ xmlNsPtr xns;
80
+ Data_Get_Struct(self, xmlNs, xns);
81
+ if (xns->href == NULL)
82
+ return Qnil;
83
+ else
84
+ return rxml_new_cstr( xns->href, NULL);
85
+ }
86
+
87
+ /*
88
+ * call-seq:
89
+ * ns.node_type -> num
90
+ *
91
+ * Obtain this namespace's type identifier.
92
+ */
93
+ static VALUE rxml_namespace_node_type(VALUE self)
94
+ {
95
+ xmlNsPtr xns;
96
+ Data_Get_Struct(self, xmlNs, xns);
97
+ return INT2NUM(xns->type);
98
+ }
99
+
100
+ /*
101
+ * call-seq:
102
+ * ns.prefix -> "prefix"
103
+ *
104
+ * Obtain the namespace's prefix.
105
+ *
106
+ * Usage:
107
+ *
108
+ * doc = XML::Document.string('<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"/>')
109
+ * ns = doc.root.namespaces.find_by_href('http://schemas.xmlsoap.org/soap/envelope/')
110
+ * assert_equal('soap', ns.prefix)
111
+ */
112
+ static VALUE rxml_namespace_prefix_get(VALUE self)
113
+ {
114
+ xmlNsPtr xns;
115
+ Data_Get_Struct(self, xmlNs, xns);
116
+ if (xns->prefix == NULL)
117
+ return Qnil;
118
+ else
119
+ return rxml_new_cstr( xns->prefix, NULL);
120
+ }
121
+
122
+ /*
123
+ * call-seq:
124
+ * ns.next -> XML::Namespace
125
+ *
126
+ * Obtain the next namespace.
127
+ *
128
+ * Usage:
129
+ *
130
+ * doc = XML::Document.string('<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"/>')
131
+ * ns = doc.root.namespaces.find_by_href('http://schemas.xmlsoap.org/soap/envelope/')
132
+ * assert_nil(ns.next)
133
+ */
134
+ static VALUE rxml_namespace_next(VALUE self)
135
+ {
136
+ xmlNsPtr xns;
137
+ Data_Get_Struct(self, xmlNs, xns);
138
+ if (xns == NULL || xns->next == NULL)
139
+ return (Qnil);
140
+ else
141
+ return rxml_namespace_wrap(xns->next);
142
+ }
143
+
144
+ void rxml_init_namespace(void)
145
+ {
146
+ cXMLNamespace = rb_define_class_under(mXML, "Namespace", rb_cObject);
147
+ rb_define_alloc_func(cXMLNamespace, rxml_namespace_alloc);
148
+ rb_define_method(cXMLNamespace, "initialize", rxml_namespace_initialize, 3);
149
+ rb_define_method(cXMLNamespace, "href", rxml_namespace_href_get, 0);
150
+ rb_define_method(cXMLNamespace, "next", rxml_namespace_next, 0);
151
+ rb_define_method(cXMLNamespace, "node_type", rxml_namespace_node_type, 0);
152
+ rb_define_method(cXMLNamespace, "prefix", rxml_namespace_prefix_get, 0);
153
+ }