libxml-ruby 4.1.2 → 6.0.0

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 (172) hide show
  1. checksums.yaml +4 -4
  2. data/{HISTORY → CHANGELOG.md} +875 -887
  3. data/LICENSE +20 -20
  4. data/README.md +67 -0
  5. data/Rakefile +77 -98
  6. data/ext/libxml/extconf.rb +39 -20
  7. data/ext/libxml/libxml.c +67 -79
  8. data/ext/libxml/ruby_libxml.h +43 -44
  9. data/ext/libxml/ruby_xml.c +556 -899
  10. data/ext/libxml/ruby_xml.h +9 -10
  11. data/ext/libxml/ruby_xml_attr.c +338 -333
  12. data/ext/libxml/ruby_xml_attr.h +13 -12
  13. data/ext/libxml/ruby_xml_attr_decl.c +19 -12
  14. data/ext/libxml/ruby_xml_attr_decl.h +11 -11
  15. data/ext/libxml/ruby_xml_attributes.c +18 -9
  16. data/ext/libxml/ruby_xml_attributes.h +17 -15
  17. data/ext/libxml/ruby_xml_document.c +1142 -1129
  18. data/ext/libxml/ruby_xml_document.h +12 -11
  19. data/ext/libxml/ruby_xml_dtd.c +287 -248
  20. data/ext/libxml/ruby_xml_dtd.h +10 -9
  21. data/ext/libxml/ruby_xml_encoding.c +250 -250
  22. data/ext/libxml/ruby_xml_encoding.h +20 -18
  23. data/ext/libxml/ruby_xml_error.c +1003 -996
  24. data/ext/libxml/ruby_xml_error.h +14 -14
  25. data/ext/libxml/ruby_xml_html_parser.c +91 -91
  26. data/ext/libxml/ruby_xml_html_parser.h +10 -10
  27. data/ext/libxml/ruby_xml_html_parser_context.c +364 -337
  28. data/ext/libxml/ruby_xml_html_parser_context.h +11 -10
  29. data/ext/libxml/ruby_xml_html_parser_options.c +48 -48
  30. data/ext/libxml/ruby_xml_html_parser_options.h +10 -10
  31. data/ext/libxml/ruby_xml_input_cbg.c +216 -188
  32. data/ext/libxml/ruby_xml_input_cbg.h +20 -20
  33. data/ext/libxml/ruby_xml_io.c +49 -47
  34. data/ext/libxml/ruby_xml_io.h +10 -10
  35. data/ext/libxml/ruby_xml_namespace.c +159 -154
  36. data/ext/libxml/ruby_xml_namespace.h +11 -10
  37. data/ext/libxml/ruby_xml_namespaces.c +313 -293
  38. data/ext/libxml/ruby_xml_namespaces.h +9 -9
  39. data/ext/libxml/ruby_xml_node.c +1433 -1398
  40. data/ext/libxml/ruby_xml_node.h +15 -13
  41. data/ext/libxml/ruby_xml_parser.c +91 -91
  42. data/ext/libxml/ruby_xml_parser.h +10 -10
  43. data/ext/libxml/ruby_xml_parser_context.c +1016 -1001
  44. data/ext/libxml/ruby_xml_parser_context.h +11 -10
  45. data/ext/libxml/ruby_xml_parser_options.c +74 -66
  46. data/ext/libxml/ruby_xml_parser_options.h +10 -10
  47. data/ext/libxml/ruby_xml_reader.c +40 -31
  48. data/ext/libxml/ruby_xml_reader.h +14 -14
  49. data/ext/libxml/ruby_xml_registry.c +31 -0
  50. data/ext/libxml/ruby_xml_registry.h +22 -0
  51. data/ext/libxml/ruby_xml_relaxng.c +21 -5
  52. data/ext/libxml/ruby_xml_relaxng.h +9 -8
  53. data/ext/libxml/ruby_xml_sax2_handler.c +326 -326
  54. data/ext/libxml/ruby_xml_sax2_handler.h +10 -10
  55. data/ext/libxml/ruby_xml_sax_parser.c +108 -116
  56. data/ext/libxml/ruby_xml_sax_parser.h +10 -10
  57. data/ext/libxml/ruby_xml_schema.c +22 -15
  58. data/ext/libxml/ruby_xml_schema.h +26 -25
  59. data/ext/libxml/ruby_xml_schema_attribute.c +7 -7
  60. data/ext/libxml/ruby_xml_schema_attribute.h +37 -37
  61. data/ext/libxml/ruby_xml_schema_element.c +8 -8
  62. data/ext/libxml/ruby_xml_schema_element.h +11 -11
  63. data/ext/libxml/ruby_xml_schema_facet.c +50 -50
  64. data/ext/libxml/ruby_xml_schema_facet.h +9 -9
  65. data/ext/libxml/ruby_xml_schema_type.c +12 -19
  66. data/ext/libxml/ruby_xml_schema_type.h +9 -9
  67. data/ext/libxml/ruby_xml_version.h +9 -9
  68. data/ext/libxml/ruby_xml_writer.c +183 -185
  69. data/ext/libxml/ruby_xml_writer.h +6 -6
  70. data/ext/libxml/ruby_xml_xinclude.c +20 -20
  71. data/ext/libxml/ruby_xml_xinclude.h +11 -11
  72. data/ext/libxml/ruby_xml_xpath.c +195 -195
  73. data/ext/libxml/ruby_xml_xpath.h +15 -15
  74. data/ext/libxml/ruby_xml_xpath_context.c +408 -362
  75. data/ext/libxml/ruby_xml_xpath_context.h +9 -9
  76. data/ext/libxml/ruby_xml_xpath_expression.c +12 -6
  77. data/ext/libxml/ruby_xml_xpath_expression.h +11 -10
  78. data/ext/libxml/ruby_xml_xpath_object.c +69 -54
  79. data/ext/libxml/ruby_xml_xpath_object.h +19 -17
  80. data/ext/vc/libxml_ruby/libxml_ruby.vcxproj +271 -0
  81. data/ext/xcode/libxml-ruby.xcodeproj/project.pbxproj +633 -0
  82. data/ext/xcode/libxml-ruby.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  83. data/ext/xcode/libxml-ruby.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  84. data/ext/xcode/libxml-ruby.xcodeproj/xcshareddata/xcschemes/libxml-ruby.xcscheme +80 -0
  85. data/lib/libxml/attr.rb +122 -122
  86. data/lib/libxml/attr_decl.rb +80 -80
  87. data/lib/libxml/attributes.rb +13 -13
  88. data/lib/libxml/document.rb +165 -194
  89. data/lib/libxml/error.rb +122 -95
  90. data/lib/libxml/html_parser.rb +80 -96
  91. data/lib/libxml/namespace.rb +61 -61
  92. data/lib/libxml/namespaces.rb +37 -37
  93. data/lib/libxml/node.rb +321 -323
  94. data/lib/libxml/parser.rb +94 -100
  95. data/lib/libxml/sax_callbacks.rb +179 -179
  96. data/lib/libxml/sax_parser.rb +40 -40
  97. data/lib/libxml/schema/attribute.rb +27 -19
  98. data/lib/libxml/schema/element.rb +20 -0
  99. data/lib/libxml/schema/type.rb +44 -21
  100. data/lib/libxml/schema.rb +47 -47
  101. data/lib/libxml/tree.rb +28 -28
  102. data/lib/libxml-ruby.rb +30 -30
  103. data/libxml-ruby.gemspec +46 -48
  104. data/test/c14n/result/1-1-without-comments/example-1 +3 -3
  105. data/test/c14n/result/1-1-without-comments/example-2 +10 -10
  106. data/test/c14n/result/1-1-without-comments/example-3 +13 -13
  107. data/test/c14n/result/1-1-without-comments/example-4 +8 -8
  108. data/test/c14n/result/1-1-without-comments/example-5 +2 -2
  109. data/test/c14n/result/with-comments/example-1 +5 -5
  110. data/test/c14n/result/with-comments/example-2 +10 -10
  111. data/test/c14n/result/with-comments/example-3 +13 -13
  112. data/test/c14n/result/with-comments/example-4 +8 -8
  113. data/test/c14n/result/with-comments/example-5 +3 -3
  114. data/test/c14n/result/without-comments/example-1 +3 -3
  115. data/test/c14n/result/without-comments/example-2 +10 -10
  116. data/test/c14n/result/without-comments/example-3 +13 -13
  117. data/test/c14n/result/without-comments/example-4 +8 -8
  118. data/test/c14n/result/without-comments/example-5 +2 -2
  119. data/test/test_attr.rb +179 -180
  120. data/test/test_attr_decl.rb +131 -131
  121. data/test/test_attributes.rb +135 -135
  122. data/test/test_canonicalize.rb +122 -120
  123. data/test/test_document.rb +138 -132
  124. data/test/test_document_write.rb +142 -145
  125. data/test/test_dtd.rb +134 -129
  126. data/test/test_encoding.rb +126 -129
  127. data/test/test_encoding_sax.rb +114 -114
  128. data/test/test_error.rb +197 -194
  129. data/test/test_helper.rb +21 -13
  130. data/test/test_html_parser.rb +166 -162
  131. data/test/test_html_parser_context.rb +22 -22
  132. data/test/test_input_callbacks.rb +36 -0
  133. data/test/test_namespace.rb +58 -60
  134. data/test/test_namespaces.rb +200 -200
  135. data/test/test_node.rb +251 -237
  136. data/test/test_node_cdata.rb +50 -50
  137. data/test/test_node_comment.rb +32 -32
  138. data/test/test_node_copy.rb +40 -40
  139. data/test/test_node_edit.rb +176 -158
  140. data/test/test_node_pi.rb +37 -37
  141. data/test/test_node_text.rb +69 -69
  142. data/test/test_node_write.rb +93 -96
  143. data/test/test_node_xlink.rb +28 -28
  144. data/test/test_parser.rb +297 -324
  145. data/test/test_parser_context.rb +198 -198
  146. data/test/test_properties.rb +38 -38
  147. data/test/test_reader.rb +413 -364
  148. data/test/test_relaxng.rb +59 -53
  149. data/test/test_sax_parser.rb +345 -326
  150. data/test/test_schema.rb +28 -0
  151. data/test/test_traversal.rb +152 -152
  152. data/test/test_writer.rb +469 -468
  153. data/test/test_xinclude.rb +20 -20
  154. data/test/test_xml.rb +164 -267
  155. data/test/test_xpath.rb +244 -244
  156. data/test/test_xpath_context.rb +87 -87
  157. data/test/test_xpath_expression.rb +37 -37
  158. metadata +49 -31
  159. data/README.rdoc +0 -217
  160. data/ext/libxml/extconf.h +0 -3
  161. data/ext/libxml/ruby_xml_cbg.c +0 -85
  162. data/lib/libxml/hpricot.rb +0 -78
  163. data/lib/libxml.rb +0 -5
  164. data/lib/xml/libxml.rb +0 -10
  165. data/lib/xml.rb +0 -14
  166. data/script/benchmark/depixelate +0 -634
  167. data/script/benchmark/hamlet.xml +0 -9055
  168. data/script/benchmark/parsecount +0 -170
  169. data/script/benchmark/sock_entries.xml +0 -507
  170. data/script/benchmark/throughput +0 -41
  171. data/script/test +0 -6
  172. data/test/test_deprecated_require.rb +0 -12
@@ -1,326 +1,326 @@
1
- /* Please see the LICENSE file for copyright and distribution information */
2
-
3
- #include "ruby_libxml.h"
4
- #include "ruby_xml_sax2_handler.h"
5
-
6
-
7
- VALUE cbidOnCdataBlock;
8
- VALUE cbidOnCharacters;
9
- VALUE cbidOnComment;
10
- VALUE cbidOnEndDocument;
11
- VALUE cbidOnEndElement;
12
- VALUE cbidOnEndElementNs;
13
- VALUE cbidOnExternalSubset;
14
- VALUE cbidOnHasExternalSubset;
15
- VALUE cbidOnHasInternalSubset;
16
- VALUE cbidOnInternalSubset;
17
- VALUE cbidOnIsStandalone;
18
- VALUE cbidOnError;
19
- VALUE cbidOnProcessingInstruction;
20
- VALUE cbidOnReference;
21
- VALUE cbidOnStartElement;
22
- VALUE cbidOnStartElementNs;
23
- VALUE cbidOnStartDocument;
24
-
25
- /* ====== Callbacks =========== */
26
- static void cdata_block_callback(void *ctx, const xmlChar *value, int len)
27
- {
28
- VALUE handler = (VALUE) ctx;
29
-
30
- if (handler != Qnil)
31
- {
32
- rb_funcall(handler, cbidOnCdataBlock,1, rxml_new_cstr_len(value, len, NULL));
33
- }
34
- }
35
-
36
- static void characters_callback(void *ctx, const xmlChar *chars, int len)
37
- {
38
- VALUE handler = (VALUE) ctx;
39
-
40
- if (handler != Qnil)
41
- {
42
- VALUE rchars = rxml_new_cstr_len(chars, len, NULL);
43
- rb_funcall(handler, cbidOnCharacters, 1, rchars);
44
- }
45
- }
46
-
47
- static void comment_callback(void *ctx, const xmlChar *msg)
48
- {
49
- VALUE handler = (VALUE) ctx;
50
-
51
- if (handler != Qnil)
52
- {
53
- rb_funcall(handler, cbidOnComment, 1, rxml_new_cstr(msg, NULL));
54
- }
55
- }
56
-
57
- static void end_document_callback(void *ctx)
58
- {
59
- VALUE handler = (VALUE) ctx;
60
-
61
- if (handler != Qnil)
62
- {
63
- rb_funcall(handler, cbidOnEndDocument, 0);
64
- }
65
- }
66
-
67
- static void end_element_ns_callback(void *ctx, const xmlChar *xlocalname, const xmlChar *xprefix, const xmlChar *xURI)
68
- {
69
- VALUE handler = (VALUE) ctx;
70
-
71
- if (handler == Qnil)
72
- return;
73
-
74
- /* Call end element for old-times sake */
75
- if (rb_respond_to(handler, cbidOnEndElement))
76
- {
77
- VALUE name;
78
- if (xprefix)
79
- {
80
- name = rxml_new_cstr(xprefix, NULL);
81
- rb_str_cat2(name, ":");
82
- rb_str_cat2(name, (const char*)xlocalname);
83
- }
84
- else
85
- {
86
- name = rxml_new_cstr(xlocalname, NULL);
87
- }
88
- rb_funcall(handler, cbidOnEndElement, 1, name);
89
- }
90
-
91
- rb_funcall(handler, cbidOnEndElementNs, 3,
92
- rxml_new_cstr(xlocalname, NULL),
93
- xprefix ? rxml_new_cstr(xprefix, NULL) : Qnil,
94
- xURI ? rxml_new_cstr(xURI, NULL) : Qnil);
95
- }
96
-
97
- static void external_subset_callback(void *ctx, const xmlChar *name, const xmlChar *extid, const xmlChar *sysid)
98
- {
99
- VALUE handler = (VALUE) ctx;
100
-
101
- if (handler != Qnil)
102
- {
103
- VALUE rname = name ? rxml_new_cstr(name, NULL) : Qnil;
104
- VALUE rextid = extid ? rxml_new_cstr(extid, NULL) : Qnil;
105
- VALUE rsysid = sysid ? rxml_new_cstr(sysid, NULL) : Qnil;
106
- rb_funcall(handler, cbidOnExternalSubset, 3, rname, rextid, rsysid);
107
- }
108
- }
109
-
110
- static void has_external_subset_callback(void *ctx)
111
- {
112
- VALUE handler = (VALUE) ctx;
113
-
114
- if (handler != Qnil)
115
- {
116
- rb_funcall(handler, cbidOnHasExternalSubset, 0);
117
- }
118
- }
119
-
120
- static void has_internal_subset_callback(void *ctx)
121
- {
122
- VALUE handler = (VALUE) ctx;
123
-
124
- if (handler != Qnil)
125
- {
126
- rb_funcall(handler, cbidOnHasInternalSubset, 0);
127
- }
128
- }
129
-
130
- static void internal_subset_callback(void *ctx, const xmlChar *name, const xmlChar *extid, const xmlChar *sysid)
131
- {
132
- VALUE handler = (VALUE) ctx;
133
-
134
- if (handler != Qnil)
135
- {
136
- VALUE rname = name ? rxml_new_cstr(name, NULL) : Qnil;
137
- VALUE rextid = extid ? rxml_new_cstr(extid, NULL) : Qnil;
138
- VALUE rsysid = sysid ? rxml_new_cstr(sysid, NULL) : Qnil;
139
- rb_funcall(handler, cbidOnInternalSubset, 3, rname, rextid, rsysid);
140
- }
141
- }
142
-
143
- static void is_standalone_callback(void *ctx)
144
- {
145
- VALUE handler = (VALUE) ctx;
146
-
147
- if (handler != Qnil)
148
- {
149
- rb_funcall(handler, cbidOnIsStandalone,0);
150
- }
151
- }
152
-
153
- static void processing_instruction_callback(void *ctx, const xmlChar *target, const xmlChar *data)
154
- {
155
- VALUE handler = (VALUE) ctx;
156
-
157
- if (handler != Qnil)
158
- {
159
- VALUE rtarget = target ? rxml_new_cstr(target, NULL) : Qnil;
160
- VALUE rdata = data ? rxml_new_cstr(data, NULL) : Qnil;
161
- rb_funcall(handler, cbidOnProcessingInstruction, 2, rtarget, rdata);
162
- }
163
- }
164
-
165
- static void reference_callback(void *ctx, const xmlChar *name)
166
- {
167
- VALUE handler = (VALUE) ctx;
168
-
169
- if (handler != Qnil)
170
- {
171
- rb_funcall(handler, cbidOnReference, 1, rxml_new_cstr(name, NULL));
172
- }
173
- }
174
-
175
- static void start_document_callback(void *ctx)
176
- {
177
- VALUE handler = (VALUE) ctx;
178
-
179
- if (handler != Qnil)
180
- {
181
- rb_funcall(handler, cbidOnStartDocument, 0);
182
- }
183
- }
184
-
185
- static void start_element_ns_callback(void *ctx,
186
- const xmlChar *xlocalname, const xmlChar *xprefix, const xmlChar *xURI,
187
- int nb_namespaces, const xmlChar **xnamespaces,
188
- int nb_attributes, int nb_defaulted, const xmlChar **xattributes)
189
- {
190
- VALUE handler = (VALUE) ctx;
191
- VALUE attributes = rb_hash_new();
192
- VALUE namespaces = rb_hash_new();
193
-
194
- if (handler == Qnil)
195
- return;
196
-
197
- if (xattributes)
198
- {
199
- /* Each attribute is an array of [localname, prefix, URI, value, end] */
200
- int i;
201
- for (i = 0;i < nb_attributes * 5; i+=5)
202
- {
203
- VALUE attrName = rxml_new_cstr(xattributes[i+0], NULL);
204
- long attrLen = (long)(xattributes[i+4] - xattributes[i+3]);
205
- VALUE attrValue = rxml_new_cstr_len(xattributes[i+3], attrLen, NULL);
206
- rb_hash_aset(attributes, attrName, attrValue);
207
- }
208
- }
209
-
210
- if (xnamespaces)
211
- {
212
- int i;
213
- for (i = 0;i < nb_namespaces * 2; i+=2)
214
- {
215
- VALUE nsPrefix = xnamespaces[i+0] ? rxml_new_cstr(xnamespaces[i+0], NULL) : Qnil;
216
- VALUE nsURI = xnamespaces[i+1] ? rxml_new_cstr(xnamespaces[i+1], NULL) : Qnil;
217
- rb_hash_aset(namespaces, nsPrefix, nsURI);
218
- }
219
- }
220
-
221
- /* Call start element for old-times sake */
222
- if (rb_respond_to(handler, cbidOnStartElement))
223
- {
224
- VALUE name;
225
- if (xprefix)
226
- {
227
- name = rxml_new_cstr(xprefix, NULL);
228
- rb_str_cat2(name, ":");
229
- rb_str_cat2(name, (const char*)xlocalname);
230
- }
231
- else
232
- {
233
- name = rxml_new_cstr(xlocalname, NULL);
234
- }
235
- rb_funcall(handler, cbidOnStartElement, 2, name, attributes);
236
- }
237
-
238
- rb_funcall(handler, cbidOnStartElementNs, 5,
239
- rxml_new_cstr(xlocalname, NULL),
240
- attributes,
241
- xprefix ? rxml_new_cstr(xprefix, NULL) : Qnil,
242
- xURI ? rxml_new_cstr(xURI, NULL) : Qnil,
243
- namespaces);
244
- }
245
-
246
- static void structured_error_callback(void *ctx, xmlErrorPtr xerror)
247
- {
248
- /* Older versions of Libxml will pass a NULL context from the sax parser. Fixed on
249
- Feb 23, 2011. See:
250
-
251
- http://git.gnome.org/browse/libxml2/commit/?id=241d4a1069e6bedd0ee2295d7b43858109c1c6d1 */
252
-
253
- VALUE handler;
254
-
255
- #if LIBXML_VERSION <= 20708
256
- xmlParserCtxtPtr ctxt = (xmlParserCtxt*)(xerror->ctxt);
257
- ctx = ctxt->userData;
258
- #endif
259
-
260
- handler = (VALUE) ctx;
261
-
262
- if (handler != Qnil)
263
- {
264
- VALUE error = rxml_error_wrap(xerror);
265
- rb_funcall(handler, cbidOnError, 1, error);
266
- }
267
- }
268
-
269
- /* ====== Handler =========== */
270
- xmlSAXHandler rxml_sax_handler = {
271
- (internalSubsetSAXFunc) internal_subset_callback,
272
- (isStandaloneSAXFunc) is_standalone_callback,
273
- (hasInternalSubsetSAXFunc) has_internal_subset_callback,
274
- (hasExternalSubsetSAXFunc) has_external_subset_callback,
275
- 0, /* resolveEntity */
276
- 0, /* getEntity */
277
- 0, /* entityDecl */
278
- 0, /* notationDecl */
279
- 0, /* attributeDecl */
280
- 0, /* elementDecl */
281
- 0, /* unparsedEntityDecl */
282
- 0, /* setDocumentLocator */
283
- (startDocumentSAXFunc) start_document_callback,
284
- (endDocumentSAXFunc) end_document_callback,
285
- 0, /* Use start_element_ns_callback instead */
286
- 0, /* Use end_element_ns_callback instead */
287
- (referenceSAXFunc) reference_callback,
288
- (charactersSAXFunc) characters_callback,
289
- 0, /* ignorableWhitespace */
290
- (processingInstructionSAXFunc) processing_instruction_callback,
291
- (commentSAXFunc) comment_callback,
292
- 0, /* xmlStructuredErrorFunc is used instead */
293
- 0, /* xmlStructuredErrorFunc is used instead */
294
- 0, /* xmlStructuredErrorFunc is used instead */
295
- 0, /* xmlGetParameterEntity */
296
- (cdataBlockSAXFunc) cdata_block_callback,
297
- (externalSubsetSAXFunc) external_subset_callback,
298
- XML_SAX2_MAGIC, /* force SAX2 */
299
- 0, /* _private */
300
- (startElementNsSAX2Func) start_element_ns_callback,
301
- (endElementNsSAX2Func) end_element_ns_callback,
302
- (xmlStructuredErrorFunc) structured_error_callback
303
- };
304
-
305
- void rxml_init_sax2_handler(void)
306
- {
307
-
308
- /* SaxCallbacks */
309
- cbidOnCdataBlock = rb_intern("on_cdata_block");
310
- cbidOnCharacters = rb_intern("on_characters");
311
- cbidOnComment = rb_intern("on_comment");
312
- cbidOnEndDocument = rb_intern("on_end_document");
313
- cbidOnEndElement = rb_intern("on_end_element");
314
- cbidOnEndElementNs = rb_intern("on_end_element_ns");
315
- cbidOnError = rb_intern("on_error");
316
- cbidOnExternalSubset = rb_intern("on_external_subset");
317
- cbidOnHasExternalSubset = rb_intern("on_has_external_subset");
318
- cbidOnHasInternalSubset = rb_intern("on_has_internal_subset");
319
- cbidOnInternalSubset = rb_intern("on_internal_subset");
320
- cbidOnIsStandalone = rb_intern("on_is_standalone");
321
- cbidOnProcessingInstruction = rb_intern("on_processing_instruction");
322
- cbidOnReference = rb_intern("on_reference");
323
- cbidOnStartElement = rb_intern("on_start_element");
324
- cbidOnStartElementNs = rb_intern("on_start_element_ns");
325
- cbidOnStartDocument = rb_intern("on_start_document");
326
- }
1
+ /* Please see the LICENSE file for copyright and distribution information */
2
+
3
+ #include "ruby_libxml.h"
4
+ #include "ruby_xml_sax2_handler.h"
5
+
6
+
7
+ VALUE cbidOnCdataBlock;
8
+ VALUE cbidOnCharacters;
9
+ VALUE cbidOnComment;
10
+ VALUE cbidOnEndDocument;
11
+ VALUE cbidOnEndElement;
12
+ VALUE cbidOnEndElementNs;
13
+ VALUE cbidOnExternalSubset;
14
+ VALUE cbidOnHasExternalSubset;
15
+ VALUE cbidOnHasInternalSubset;
16
+ VALUE cbidOnInternalSubset;
17
+ VALUE cbidOnIsStandalone;
18
+ VALUE cbidOnError;
19
+ VALUE cbidOnProcessingInstruction;
20
+ VALUE cbidOnReference;
21
+ VALUE cbidOnStartElement;
22
+ VALUE cbidOnStartElementNs;
23
+ VALUE cbidOnStartDocument;
24
+
25
+ /* ====== Callbacks =========== */
26
+ static void cdata_block_callback(void *ctx, const xmlChar *value, int len)
27
+ {
28
+ VALUE handler = (VALUE) ctx;
29
+
30
+ if (handler != Qnil)
31
+ {
32
+ rb_funcall(handler, cbidOnCdataBlock,1, rxml_new_cstr_len(value, len, NULL));
33
+ }
34
+ }
35
+
36
+ static void characters_callback(void *ctx, const xmlChar *chars, int len)
37
+ {
38
+ VALUE handler = (VALUE) ctx;
39
+
40
+ if (handler != Qnil)
41
+ {
42
+ VALUE rchars = rxml_new_cstr_len(chars, len, NULL);
43
+ rb_funcall(handler, cbidOnCharacters, 1, rchars);
44
+ }
45
+ }
46
+
47
+ static void comment_callback(void *ctx, const xmlChar *msg)
48
+ {
49
+ VALUE handler = (VALUE) ctx;
50
+
51
+ if (handler != Qnil)
52
+ {
53
+ rb_funcall(handler, cbidOnComment, 1, rxml_new_cstr(msg, NULL));
54
+ }
55
+ }
56
+
57
+ static void end_document_callback(void *ctx)
58
+ {
59
+ VALUE handler = (VALUE) ctx;
60
+
61
+ if (handler != Qnil)
62
+ {
63
+ rb_funcall(handler, cbidOnEndDocument, 0);
64
+ }
65
+ }
66
+
67
+ static void end_element_ns_callback(void *ctx, const xmlChar *xlocalname, const xmlChar *xprefix, const xmlChar *xURI)
68
+ {
69
+ VALUE handler = (VALUE) ctx;
70
+
71
+ if (handler == Qnil)
72
+ return;
73
+
74
+ /* Call end element for old-times sake */
75
+ if (rb_respond_to(handler, cbidOnEndElement))
76
+ {
77
+ VALUE name;
78
+ if (xprefix)
79
+ {
80
+ name = rxml_new_cstr(xprefix, NULL);
81
+ rb_str_cat2(name, ":");
82
+ rb_str_cat2(name, (const char*)xlocalname);
83
+ }
84
+ else
85
+ {
86
+ name = rxml_new_cstr(xlocalname, NULL);
87
+ }
88
+ rb_funcall(handler, cbidOnEndElement, 1, name);
89
+ }
90
+
91
+ rb_funcall(handler, cbidOnEndElementNs, 3,
92
+ rxml_new_cstr(xlocalname, NULL),
93
+ xprefix ? rxml_new_cstr(xprefix, NULL) : Qnil,
94
+ xURI ? rxml_new_cstr(xURI, NULL) : Qnil);
95
+ }
96
+
97
+ static void external_subset_callback(void *ctx, const xmlChar *name, const xmlChar *extid, const xmlChar *sysid)
98
+ {
99
+ VALUE handler = (VALUE) ctx;
100
+
101
+ if (handler != Qnil)
102
+ {
103
+ VALUE rname = name ? rxml_new_cstr(name, NULL) : Qnil;
104
+ VALUE rextid = extid ? rxml_new_cstr(extid, NULL) : Qnil;
105
+ VALUE rsysid = sysid ? rxml_new_cstr(sysid, NULL) : Qnil;
106
+ rb_funcall(handler, cbidOnExternalSubset, 3, rname, rextid, rsysid);
107
+ }
108
+ }
109
+
110
+ static void has_external_subset_callback(void *ctx)
111
+ {
112
+ VALUE handler = (VALUE) ctx;
113
+
114
+ if (handler != Qnil)
115
+ {
116
+ rb_funcall(handler, cbidOnHasExternalSubset, 0);
117
+ }
118
+ }
119
+
120
+ static void has_internal_subset_callback(void *ctx)
121
+ {
122
+ VALUE handler = (VALUE) ctx;
123
+
124
+ if (handler != Qnil)
125
+ {
126
+ rb_funcall(handler, cbidOnHasInternalSubset, 0);
127
+ }
128
+ }
129
+
130
+ static void internal_subset_callback(void *ctx, const xmlChar *name, const xmlChar *extid, const xmlChar *sysid)
131
+ {
132
+ VALUE handler = (VALUE) ctx;
133
+
134
+ if (handler != Qnil)
135
+ {
136
+ VALUE rname = name ? rxml_new_cstr(name, NULL) : Qnil;
137
+ VALUE rextid = extid ? rxml_new_cstr(extid, NULL) : Qnil;
138
+ VALUE rsysid = sysid ? rxml_new_cstr(sysid, NULL) : Qnil;
139
+ rb_funcall(handler, cbidOnInternalSubset, 3, rname, rextid, rsysid);
140
+ }
141
+ }
142
+
143
+ static void is_standalone_callback(void *ctx)
144
+ {
145
+ VALUE handler = (VALUE) ctx;
146
+
147
+ if (handler != Qnil)
148
+ {
149
+ rb_funcall(handler, cbidOnIsStandalone,0);
150
+ }
151
+ }
152
+
153
+ static void processing_instruction_callback(void *ctx, const xmlChar *target, const xmlChar *data)
154
+ {
155
+ VALUE handler = (VALUE) ctx;
156
+
157
+ if (handler != Qnil)
158
+ {
159
+ VALUE rtarget = target ? rxml_new_cstr(target, NULL) : Qnil;
160
+ VALUE rdata = data ? rxml_new_cstr(data, NULL) : Qnil;
161
+ rb_funcall(handler, cbidOnProcessingInstruction, 2, rtarget, rdata);
162
+ }
163
+ }
164
+
165
+ static void reference_callback(void *ctx, const xmlChar *name)
166
+ {
167
+ VALUE handler = (VALUE) ctx;
168
+
169
+ if (handler != Qnil)
170
+ {
171
+ rb_funcall(handler, cbidOnReference, 1, rxml_new_cstr(name, NULL));
172
+ }
173
+ }
174
+
175
+ static void start_document_callback(void *ctx)
176
+ {
177
+ VALUE handler = (VALUE) ctx;
178
+
179
+ if (handler != Qnil)
180
+ {
181
+ rb_funcall(handler, cbidOnStartDocument, 0);
182
+ }
183
+ }
184
+
185
+ static void start_element_ns_callback(void *ctx,
186
+ const xmlChar *xlocalname, const xmlChar *xprefix, const xmlChar *xURI,
187
+ int nb_namespaces, const xmlChar **xnamespaces,
188
+ int nb_attributes, int nb_defaulted, const xmlChar **xattributes)
189
+ {
190
+ VALUE handler = (VALUE) ctx;
191
+ VALUE attributes = rb_hash_new();
192
+ VALUE namespaces = rb_hash_new();
193
+
194
+ if (handler == Qnil)
195
+ return;
196
+
197
+ if (xattributes)
198
+ {
199
+ /* Each attribute is an array of [localname, prefix, URI, value, end] */
200
+ int i;
201
+ for (i = 0;i < nb_attributes * 5; i+=5)
202
+ {
203
+ VALUE attrName = rxml_new_cstr(xattributes[i+0], NULL);
204
+ long attrLen = (long)(xattributes[i+4] - xattributes[i+3]);
205
+ VALUE attrValue = rxml_new_cstr_len(xattributes[i+3], attrLen, NULL);
206
+ rb_hash_aset(attributes, attrName, attrValue);
207
+ }
208
+ }
209
+
210
+ if (xnamespaces)
211
+ {
212
+ int i;
213
+ for (i = 0;i < nb_namespaces * 2; i+=2)
214
+ {
215
+ VALUE nsPrefix = xnamespaces[i+0] ? rxml_new_cstr(xnamespaces[i+0], NULL) : Qnil;
216
+ VALUE nsURI = xnamespaces[i+1] ? rxml_new_cstr(xnamespaces[i+1], NULL) : Qnil;
217
+ rb_hash_aset(namespaces, nsPrefix, nsURI);
218
+ }
219
+ }
220
+
221
+ /* Call start element for old-times sake */
222
+ if (rb_respond_to(handler, cbidOnStartElement))
223
+ {
224
+ VALUE name;
225
+ if (xprefix)
226
+ {
227
+ name = rxml_new_cstr(xprefix, NULL);
228
+ rb_str_cat2(name, ":");
229
+ rb_str_cat2(name, (const char*)xlocalname);
230
+ }
231
+ else
232
+ {
233
+ name = rxml_new_cstr(xlocalname, NULL);
234
+ }
235
+ rb_funcall(handler, cbidOnStartElement, 2, name, attributes);
236
+ }
237
+
238
+ rb_funcall(handler, cbidOnStartElementNs, 5,
239
+ rxml_new_cstr(xlocalname, NULL),
240
+ attributes,
241
+ xprefix ? rxml_new_cstr(xprefix, NULL) : Qnil,
242
+ xURI ? rxml_new_cstr(xURI, NULL) : Qnil,
243
+ namespaces);
244
+ }
245
+
246
+ static void structured_error_callback(void *ctx, const xmlError *xerror)
247
+ {
248
+ /* Older versions of Libxml will pass a NULL context from the sax parser. Fixed on
249
+ Feb 23, 2011. See:
250
+
251
+ http://git.gnome.org/browse/libxml2/commit/?id=241d4a1069e6bedd0ee2295d7b43858109c1c6d1 */
252
+
253
+ VALUE handler;
254
+
255
+ #if LIBXML_VERSION <= 20708
256
+ xmlParserCtxtPtr ctxt = (xmlParserCtxt*)(xerror->ctxt);
257
+ ctx = ctxt->userData;
258
+ #endif
259
+
260
+ handler = (VALUE) ctx;
261
+
262
+ if (handler != Qnil)
263
+ {
264
+ VALUE error = rxml_error_wrap(xerror);
265
+ rb_funcall(handler, cbidOnError, 1, error);
266
+ }
267
+ }
268
+
269
+ /* ====== Handler =========== */
270
+ xmlSAXHandler rxml_sax_handler = {
271
+ (internalSubsetSAXFunc) internal_subset_callback,
272
+ (isStandaloneSAXFunc) is_standalone_callback,
273
+ (hasInternalSubsetSAXFunc) has_internal_subset_callback,
274
+ (hasExternalSubsetSAXFunc) has_external_subset_callback,
275
+ 0, /* resolveEntity */
276
+ 0, /* getEntity */
277
+ 0, /* entityDecl */
278
+ 0, /* notationDecl */
279
+ 0, /* attributeDecl */
280
+ 0, /* elementDecl */
281
+ 0, /* unparsedEntityDecl */
282
+ 0, /* setDocumentLocator */
283
+ (startDocumentSAXFunc) start_document_callback,
284
+ (endDocumentSAXFunc) end_document_callback,
285
+ 0, /* Use start_element_ns_callback instead */
286
+ 0, /* Use end_element_ns_callback instead */
287
+ (referenceSAXFunc) reference_callback,
288
+ (charactersSAXFunc) characters_callback,
289
+ 0, /* ignorableWhitespace */
290
+ (processingInstructionSAXFunc) processing_instruction_callback,
291
+ (commentSAXFunc) comment_callback,
292
+ 0, /* xmlStructuredErrorFunc is used instead */
293
+ 0, /* xmlStructuredErrorFunc is used instead */
294
+ 0, /* xmlStructuredErrorFunc is used instead */
295
+ 0, /* xmlGetParameterEntity */
296
+ (cdataBlockSAXFunc) cdata_block_callback,
297
+ (externalSubsetSAXFunc) external_subset_callback,
298
+ XML_SAX2_MAGIC, /* force SAX2 */
299
+ 0, /* _private */
300
+ (startElementNsSAX2Func) start_element_ns_callback,
301
+ (endElementNsSAX2Func) end_element_ns_callback,
302
+ (xmlStructuredErrorFunc) structured_error_callback
303
+ };
304
+
305
+ void rxml_init_sax2_handler(void)
306
+ {
307
+
308
+ /* SaxCallbacks */
309
+ cbidOnCdataBlock = rb_intern("on_cdata_block");
310
+ cbidOnCharacters = rb_intern("on_characters");
311
+ cbidOnComment = rb_intern("on_comment");
312
+ cbidOnEndDocument = rb_intern("on_end_document");
313
+ cbidOnEndElement = rb_intern("on_end_element");
314
+ cbidOnEndElementNs = rb_intern("on_end_element_ns");
315
+ cbidOnError = rb_intern("on_error");
316
+ cbidOnExternalSubset = rb_intern("on_external_subset");
317
+ cbidOnHasExternalSubset = rb_intern("on_has_external_subset");
318
+ cbidOnHasInternalSubset = rb_intern("on_has_internal_subset");
319
+ cbidOnInternalSubset = rb_intern("on_internal_subset");
320
+ cbidOnIsStandalone = rb_intern("on_is_standalone");
321
+ cbidOnProcessingInstruction = rb_intern("on_processing_instruction");
322
+ cbidOnReference = rb_intern("on_reference");
323
+ cbidOnStartElement = rb_intern("on_start_element");
324
+ cbidOnStartElementNs = rb_intern("on_start_element_ns");
325
+ cbidOnStartDocument = rb_intern("on_start_document");
326
+ }
@@ -1,10 +1,10 @@
1
- /* Please see the LICENSE file for copyright and distribution information */
2
-
3
- #ifndef __RXML_SAX2_HANDLER__
4
- #define __RXML_SAX2_HANDLER__
5
-
6
- extern xmlSAXHandler rxml_sax_handler;
7
-
8
- void rxml_init_sax2_handler(void);
9
-
10
- #endif
1
+ /* Please see the LICENSE file for copyright and distribution information */
2
+
3
+ #ifndef __RXML_SAX2_HANDLER__
4
+ #define __RXML_SAX2_HANDLER__
5
+
6
+ extern xmlSAXHandler rxml_sax_handler;
7
+
8
+ void rxml_init_sax2_handler(void);
9
+
10
+ #endif