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,11 +1,11 @@
1
- /* Please see the LICENSE file for copyright and distribution information */
2
-
3
- #ifndef __RXML_DOCUMENT__
4
- #define __RXML_DOCUMENT__
5
-
6
- extern VALUE cXMLDocument;
7
- void rxml_init_document();
8
- VALUE rxml_document_wrap(xmlDocPtr xnode);
9
-
10
- typedef xmlChar * xmlCharPtr;
11
- #endif
1
+ /* Please see the LICENSE file for copyright and distribution information */
2
+
3
+ #ifndef __RXML_DOCUMENT__
4
+ #define __RXML_DOCUMENT__
5
+
6
+ extern VALUE cXMLDocument;
7
+ void rxml_init_document();
8
+ VALUE rxml_document_wrap(xmlDocPtr xnode);
9
+
10
+ typedef xmlChar * xmlCharPtr;
11
+ #endif
@@ -1,268 +1,248 @@
1
- #include "ruby_libxml.h"
2
- #include "ruby_xml_dtd.h"
3
-
4
- /*
5
- * Document-class: LibXML::XML::Dtd
6
- *
7
- * The XML::Dtd class is used to prepare DTD's for validation of xml
8
- * documents.
9
- *
10
- * DTDs can be created from a string or a pair of public and system identifiers.
11
- * Once a Dtd object is instantiated, an XML document can be validated by the
12
- * XML::Document#validate method providing the XML::Dtd object as parameeter.
13
- * The method will raise an exception if the document is
14
- * not valid.
15
- *
16
- * Basic usage:
17
- *
18
- * # parse DTD
19
- * dtd = XML::Dtd.new(<<EOF)
20
- * <!ELEMENT root (item*) >
21
- * <!ELEMENT item (#PCDATA) >
22
- * EOF
23
- *
24
- * # parse xml document to be validated
25
- * instance = XML::Document.file('instance.xml')
26
- *
27
- * # validate
28
- * instance.validate(dtd)
29
- */
30
-
31
- VALUE cXMLDtd;
32
-
33
- void rxml_dtd_free(xmlDtdPtr xdtd)
34
- {
35
- /* Set _private to NULL so that we won't reuse the
36
- same, freed, Ruby wrapper object later.*/
37
- xdtd->_private = NULL;
38
-
39
- if (xdtd->doc == NULL && xdtd->parent == NULL)
40
- xmlFreeDtd(xdtd);
41
- }
42
-
43
- void rxml_dtd_mark(xmlDtdPtr xdtd)
44
- {
45
- if (xdtd == NULL)
46
- return;
47
-
48
- if (xdtd->_private == NULL)
49
- {
50
- return;
51
- }
52
-
53
- rxml_node_mark((xmlNodePtr) xdtd);
54
- }
55
-
56
-
57
- static VALUE rxml_dtd_alloc(VALUE klass)
58
- {
59
- return Data_Wrap_Struct(klass, rxml_dtd_mark, rxml_dtd_free, NULL);
60
- }
61
-
62
- VALUE rxml_dtd_wrap(xmlDtdPtr xdtd)
63
- {
64
- VALUE result;
65
-
66
- // This node is already wrapped
67
- if (xdtd->_private != NULL)
68
- return (VALUE) xdtd->_private;
69
-
70
- result = Data_Wrap_Struct(cXMLDtd, NULL, NULL, xdtd);
71
-
72
- xdtd->_private = (void*) result;
73
-
74
- return result;
75
- }
76
-
77
- /*
78
- * call-seq:
79
- * dtd.external_id -> "string"
80
- *
81
- * Obtain this dtd's external identifer (for a PUBLIC DTD).
82
- */
83
- static VALUE rxml_dtd_external_id_get(VALUE self)
84
- {
85
- xmlDtdPtr xdtd;
86
- Data_Get_Struct(self, xmlDtd, xdtd);
87
-
88
-
89
- if (xdtd->ExternalID == NULL)
90
- return (Qnil);
91
- else
92
- return (rxml_new_cstr((const char*) xdtd->ExternalID, NULL));
93
- }
94
-
95
- /*
96
- * call-seq:
97
- * dtd.name -> "string"
98
- *
99
- * Obtain this dtd's name.
100
- */
101
- static VALUE rxml_dtd_name_get(VALUE self)
102
- {
103
- xmlDtdPtr xdtd;
104
- Data_Get_Struct(self, xmlDtd, xdtd);
105
-
106
-
107
- if (xdtd->name == NULL)
108
- return (Qnil);
109
- else
110
- return (rxml_new_cstr((const char*) xdtd->name, NULL));
111
- }
112
-
113
-
114
- /*
115
- * call-seq:
116
- * dtd.uri -> "string"
117
- *
118
- * Obtain this dtd's URI (for a SYSTEM or PUBLIC DTD).
119
- */
120
- static VALUE rxml_dtd_uri_get(VALUE self)
121
- {
122
- xmlDtdPtr xdtd;
123
- Data_Get_Struct(self, xmlDtd, xdtd);
124
-
125
- if (xdtd->SystemID == NULL)
126
- return (Qnil);
127
- else
128
- return (rxml_new_cstr((const char*) xdtd->SystemID, NULL));
129
- }
130
-
131
- /*
132
- * call-seq:
133
- * node.type -> num
134
- *
135
- * Obtain this node's type identifier.
136
- */
137
- static VALUE rxml_dtd_type(VALUE self)
138
- {
139
- xmlDtdPtr xdtd;
140
- Data_Get_Struct(self, xmlDtd, xdtd);
141
- return (INT2NUM(xdtd->type));
142
- }
143
-
144
- /*
145
- * call-seq:
146
- * XML::Dtd.new("DTD string") -> dtd
147
- * XML::Dtd.new("public", "system") -> dtd
148
- * XML::Dtd.new("name", "public", "system", document) -> external subset dtd
149
- * XML::Dtd.new("name", "public", "system", document, false) -> internal subset dtd
150
- * XML::Dtd.new("name", "public", "system", document, true) -> internal subset dtd
151
- *
152
- * Create a new Dtd from the specified public and system
153
- * identifiers.
154
- */
155
- static VALUE rxml_dtd_initialize(int argc, VALUE *argv, VALUE self)
156
- {
157
- VALUE external, system, dtd_string;
158
- xmlParserInputBufferPtr buffer;
159
- xmlCharEncoding enc = XML_CHAR_ENCODING_NONE;
160
- xmlChar *new_string;
161
- xmlDtdPtr xdtd;
162
-
163
- // 1 argument -- string --> parsujeme jako dtd
164
- // 2 arguments -- public, system --> bude se hledat
165
- // 3 arguments -- public, system, name --> creates an external subset (any parameter may be nil)
166
- // 4 arguments -- public, system, name, doc --> creates an external subset (any parameter may be nil)
167
- // 5 arguments -- public, system, name, doc, true --> creates an internal subset (all but last parameter may be nil)
168
- switch (argc)
169
- {
170
- case 3:
171
- case 4:
172
- case 5: {
173
- VALUE name, doc, internal;
174
- const xmlChar *xname = NULL, *xpublic = NULL, *xsystem = NULL;
175
- xmlDocPtr xdoc = NULL;
176
-
177
- rb_scan_args(argc, argv, "32", &external, &system, &name, &doc, &internal);
178
-
179
- if (external != Qnil) {
180
- Check_Type(external, T_STRING);
181
- xpublic = (const xmlChar*) StringValuePtr(external);
182
- }
183
- if (system != Qnil) {
184
- Check_Type(system, T_STRING);
185
- xsystem = (const xmlChar*) StringValuePtr(system);
186
- }
187
- if (name != Qnil) {
188
- Check_Type(name, T_STRING);
189
- xname = (const xmlChar*) StringValuePtr(name);
190
- }
191
- if (doc != Qnil) {
192
- if (rb_obj_is_kind_of(doc, cXMLDocument) == Qfalse)
193
- rb_raise(rb_eTypeError, "Must pass an XML::Document object");
194
- Data_Get_Struct(doc, xmlDoc, xdoc);
195
- }
196
-
197
- if (internal == Qnil || internal == Qfalse)
198
- xdtd = xmlNewDtd(xdoc, xname, xpublic, xsystem);
199
- else
200
- xdtd = xmlCreateIntSubset(xdoc, xname, xpublic, xsystem);
201
-
202
- if (xdtd == NULL)
203
- rxml_raise(&xmlLastError);
204
-
205
- /* Document will free this dtd now. */
206
- RDATA(self)->dfree = NULL;
207
- DATA_PTR(self) = xdtd;
208
-
209
- xmlSetTreeDoc((xmlNodePtr) xdtd, xdoc);
210
- }
211
- break;
212
-
213
- case 2:
214
- rb_scan_args(argc, argv, "20", &external, &system);
215
-
216
- Check_Type(external, T_STRING);
217
- Check_Type(system, T_STRING);
218
-
219
- xdtd = xmlParseDTD((xmlChar*) StringValuePtr(external),
220
- (xmlChar*) StringValuePtr(system));
221
-
222
- if (xdtd == NULL)
223
- rxml_raise(&xmlLastError);
224
-
225
- DATA_PTR(self) = xdtd;
226
-
227
- xmlSetTreeDoc((xmlNodePtr) xdtd, NULL);
228
- break;
229
-
230
- case 1:
231
- rb_scan_args(argc, argv, "10", &dtd_string);
232
- Check_Type(dtd_string, T_STRING);
233
-
234
- /* Note that buffer is freed by xmlParserInputBufferPush*/
235
- buffer = xmlAllocParserInputBuffer(enc);
236
- new_string = xmlStrdup((xmlChar*) StringValuePtr(dtd_string));
237
- xmlParserInputBufferPush(buffer, xmlStrlen(new_string),
238
- (const char*) new_string);
239
-
240
- xdtd = xmlIOParseDTD(NULL, buffer, enc);
241
-
242
- if (xdtd == NULL)
243
- rxml_raise(&xmlLastError);
244
-
245
- xmlFree(new_string);
246
-
247
- DATA_PTR(self) = xdtd;
248
- break;
249
-
250
- default:
251
- rb_raise(rb_eArgError, "wrong number of arguments");
252
- }
253
-
254
- return self;
255
- }
256
-
257
- void rxml_init_dtd()
258
- {
259
- cXMLDtd = rb_define_class_under(mXML, "Dtd", rb_cObject);
260
- rb_define_alloc_func(cXMLDtd, rxml_dtd_alloc);
261
- rb_define_method(cXMLDtd, "initialize", rxml_dtd_initialize, -1);
262
- rb_define_method(cXMLDtd, "external_id", rxml_dtd_external_id_get, 0);
263
- rb_define_method(cXMLDtd, "name", rxml_dtd_name_get, 0);
264
- rb_define_method(cXMLDtd, "uri", rxml_dtd_uri_get, 0);
265
- rb_define_method(cXMLDtd, "node_type", rxml_dtd_type, 0);
266
- rb_define_alias(cXMLDtd, "system_id", "uri");
267
- }
268
-
1
+ #include "ruby_libxml.h"
2
+ #include "ruby_xml_dtd.h"
3
+
4
+ /*
5
+ * Document-class: LibXML::XML::Dtd
6
+ *
7
+ * The XML::Dtd class is used to prepare DTD's for validation of xml
8
+ * documents.
9
+ *
10
+ * DTDs can be created from a string or a pair of public and system identifiers.
11
+ * Once a Dtd object is instantiated, an XML document can be validated by the
12
+ * XML::Document#validate method providing the XML::Dtd object as parameeter.
13
+ * The method will raise an exception if the document is
14
+ * not valid.
15
+ *
16
+ * Basic usage:
17
+ *
18
+ * # parse DTD
19
+ * dtd = XML::Dtd.new(<<EOF)
20
+ * <!ELEMENT root (item*) >
21
+ * <!ELEMENT item (#PCDATA) >
22
+ * EOF
23
+ *
24
+ * # parse xml document to be validated
25
+ * instance = XML::Document.file('instance.xml')
26
+ *
27
+ * # validate
28
+ * instance.validate(dtd)
29
+ */
30
+
31
+ VALUE cXMLDtd;
32
+
33
+ void rxml_dtd_free(xmlDtdPtr xdtd)
34
+ {
35
+ if (xdtd->doc == NULL && xdtd->parent == NULL)
36
+ xmlFreeDtd(xdtd);
37
+ }
38
+
39
+ void rxml_dtd_mark(xmlDtdPtr xdtd)
40
+ {
41
+ if (xdtd && xdtd->doc)
42
+ {
43
+ VALUE doc = (VALUE)xdtd->doc->_private;
44
+ rb_gc_mark(doc);
45
+ }
46
+ }
47
+
48
+ static VALUE rxml_dtd_alloc(VALUE klass)
49
+ {
50
+ return Data_Wrap_Struct(klass, rxml_dtd_mark, rxml_dtd_free, NULL);
51
+ }
52
+
53
+ VALUE rxml_dtd_wrap(xmlDtdPtr xdtd)
54
+ {
55
+ return Data_Wrap_Struct(cXMLDtd, NULL, NULL, xdtd);
56
+ }
57
+
58
+ /*
59
+ * call-seq:
60
+ * dtd.external_id -> "string"
61
+ *
62
+ * Obtain this dtd's external identifer (for a PUBLIC DTD).
63
+ */
64
+ static VALUE rxml_dtd_external_id_get(VALUE self)
65
+ {
66
+ xmlDtdPtr xdtd;
67
+ Data_Get_Struct(self, xmlDtd, xdtd);
68
+
69
+
70
+ if (xdtd->ExternalID == NULL)
71
+ return (Qnil);
72
+ else
73
+ return (rxml_new_cstr( xdtd->ExternalID, NULL));
74
+ }
75
+
76
+ /*
77
+ * call-seq:
78
+ * dtd.name -> "string"
79
+ *
80
+ * Obtain this dtd's name.
81
+ */
82
+ static VALUE rxml_dtd_name_get(VALUE self)
83
+ {
84
+ xmlDtdPtr xdtd;
85
+ Data_Get_Struct(self, xmlDtd, xdtd);
86
+
87
+
88
+ if (xdtd->name == NULL)
89
+ return (Qnil);
90
+ else
91
+ return (rxml_new_cstr( xdtd->name, NULL));
92
+ }
93
+
94
+
95
+ /*
96
+ * call-seq:
97
+ * dtd.uri -> "string"
98
+ *
99
+ * Obtain this dtd's URI (for a SYSTEM or PUBLIC DTD).
100
+ */
101
+ static VALUE rxml_dtd_uri_get(VALUE self)
102
+ {
103
+ xmlDtdPtr xdtd;
104
+ Data_Get_Struct(self, xmlDtd, xdtd);
105
+
106
+ if (xdtd->SystemID == NULL)
107
+ return (Qnil);
108
+ else
109
+ return (rxml_new_cstr( xdtd->SystemID, NULL));
110
+ }
111
+
112
+ /*
113
+ * call-seq:
114
+ * node.type -> num
115
+ *
116
+ * Obtain this node's type identifier.
117
+ */
118
+ static VALUE rxml_dtd_type(VALUE self)
119
+ {
120
+ xmlDtdPtr xdtd;
121
+ Data_Get_Struct(self, xmlDtd, xdtd);
122
+ return (INT2NUM(xdtd->type));
123
+ }
124
+
125
+ /*
126
+ * call-seq:
127
+ * XML::Dtd.new("DTD string") -> dtd
128
+ * XML::Dtd.new("public", "system") -> dtd
129
+ * XML::Dtd.new("name", "public", "system", document) -> external subset dtd
130
+ * XML::Dtd.new("name", "public", "system", document, false) -> internal subset dtd
131
+ * XML::Dtd.new("name", "public", "system", document, true) -> internal subset dtd
132
+ *
133
+ * Create a new Dtd from the specified public and system
134
+ * identifiers.
135
+ */
136
+ static VALUE rxml_dtd_initialize(int argc, VALUE *argv, VALUE self)
137
+ {
138
+ VALUE external, system, dtd_string;
139
+ xmlParserInputBufferPtr buffer;
140
+ xmlCharEncoding enc = XML_CHAR_ENCODING_NONE;
141
+ xmlChar *new_string;
142
+ xmlDtdPtr xdtd;
143
+
144
+ // 1 argument -- string --> parsujeme jako dtd
145
+ // 2 arguments -- public, system --> bude se hledat
146
+ // 3 arguments -- public, system, name --> creates an external subset (any parameter may be nil)
147
+ // 4 arguments -- public, system, name, doc --> creates an external subset (any parameter may be nil)
148
+ // 5 arguments -- public, system, name, doc, true --> creates an internal subset (all but last parameter may be nil)
149
+ switch (argc)
150
+ {
151
+ case 3:
152
+ case 4:
153
+ case 5: {
154
+ VALUE name, doc, internal;
155
+ const xmlChar *xname = NULL, *xpublic = NULL, *xsystem = NULL;
156
+ xmlDocPtr xdoc = NULL;
157
+
158
+ rb_scan_args(argc, argv, "32", &external, &system, &name, &doc, &internal);
159
+
160
+ if (external != Qnil) {
161
+ Check_Type(external, T_STRING);
162
+ xpublic = (const xmlChar*) StringValuePtr(external);
163
+ }
164
+ if (system != Qnil) {
165
+ Check_Type(system, T_STRING);
166
+ xsystem = (const xmlChar*) StringValuePtr(system);
167
+ }
168
+ if (name != Qnil) {
169
+ Check_Type(name, T_STRING);
170
+ xname = (const xmlChar*) StringValuePtr(name);
171
+ }
172
+ if (doc != Qnil) {
173
+ if (rb_obj_is_kind_of(doc, cXMLDocument) == Qfalse)
174
+ rb_raise(rb_eTypeError, "Must pass an LibXML::XML::Document object");
175
+ Data_Get_Struct(doc, xmlDoc, xdoc);
176
+ }
177
+
178
+ if (internal == Qnil || internal == Qfalse)
179
+ xdtd = xmlNewDtd(xdoc, xname, xpublic, xsystem);
180
+ else
181
+ xdtd = xmlCreateIntSubset(xdoc, xname, xpublic, xsystem);
182
+
183
+ if (xdtd == NULL)
184
+ rxml_raise(&xmlLastError);
185
+
186
+ /* Document will free this dtd now. */
187
+ RDATA(self)->dfree = NULL;
188
+ DATA_PTR(self) = xdtd;
189
+
190
+ xmlSetTreeDoc((xmlNodePtr) xdtd, xdoc);
191
+ }
192
+ break;
193
+
194
+ case 2:
195
+ rb_scan_args(argc, argv, "20", &external, &system);
196
+
197
+ Check_Type(external, T_STRING);
198
+ Check_Type(system, T_STRING);
199
+
200
+ xdtd = xmlParseDTD((xmlChar*) StringValuePtr(external),
201
+ (xmlChar*) StringValuePtr(system));
202
+
203
+ if (xdtd == NULL)
204
+ rxml_raise(&xmlLastError);
205
+
206
+ DATA_PTR(self) = xdtd;
207
+
208
+ xmlSetTreeDoc((xmlNodePtr) xdtd, NULL);
209
+ break;
210
+
211
+ case 1:
212
+ rb_scan_args(argc, argv, "10", &dtd_string);
213
+ Check_Type(dtd_string, T_STRING);
214
+
215
+ /* Note that buffer is freed by xmlParserInputBufferPush*/
216
+ buffer = xmlAllocParserInputBuffer(enc);
217
+ new_string = xmlStrdup((xmlChar*) StringValuePtr(dtd_string));
218
+ xmlParserInputBufferPush(buffer, xmlStrlen(new_string),
219
+ (const char*) new_string);
220
+
221
+ xdtd = xmlIOParseDTD(NULL, buffer, enc);
222
+
223
+ if (xdtd == NULL)
224
+ rxml_raise(&xmlLastError);
225
+
226
+ xmlFree(new_string);
227
+
228
+ DATA_PTR(self) = xdtd;
229
+ break;
230
+
231
+ default:
232
+ rb_raise(rb_eArgError, "wrong number of arguments");
233
+ }
234
+
235
+ return self;
236
+ }
237
+
238
+ void rxml_init_dtd()
239
+ {
240
+ cXMLDtd = rb_define_class_under(mXML, "Dtd", rb_cObject);
241
+ rb_define_alloc_func(cXMLDtd, rxml_dtd_alloc);
242
+ rb_define_method(cXMLDtd, "initialize", rxml_dtd_initialize, -1);
243
+ rb_define_method(cXMLDtd, "external_id", rxml_dtd_external_id_get, 0);
244
+ rb_define_method(cXMLDtd, "name", rxml_dtd_name_get, 0);
245
+ rb_define_method(cXMLDtd, "uri", rxml_dtd_uri_get, 0);
246
+ rb_define_method(cXMLDtd, "node_type", rxml_dtd_type, 0);
247
+ rb_define_alias(cXMLDtd, "system_id", "uri");
248
+ }