superfeedr-nokogiri 1.4.0.20091116183308

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 (270) hide show
  1. data/.autotest +27 -0
  2. data/CHANGELOG.ja.rdoc +330 -0
  3. data/CHANGELOG.rdoc +314 -0
  4. data/Manifest.txt +269 -0
  5. data/README.ja.rdoc +105 -0
  6. data/README.rdoc +118 -0
  7. data/Rakefile +244 -0
  8. data/bin/nokogiri +49 -0
  9. data/ext/nokogiri/extconf.rb +145 -0
  10. data/ext/nokogiri/html_document.c +145 -0
  11. data/ext/nokogiri/html_document.h +10 -0
  12. data/ext/nokogiri/html_element_description.c +272 -0
  13. data/ext/nokogiri/html_element_description.h +10 -0
  14. data/ext/nokogiri/html_entity_lookup.c +32 -0
  15. data/ext/nokogiri/html_entity_lookup.h +8 -0
  16. data/ext/nokogiri/html_sax_parser_context.c +92 -0
  17. data/ext/nokogiri/html_sax_parser_context.h +11 -0
  18. data/ext/nokogiri/nokogiri.c +89 -0
  19. data/ext/nokogiri/nokogiri.h +145 -0
  20. data/ext/nokogiri/xml_attr.c +92 -0
  21. data/ext/nokogiri/xml_attr.h +9 -0
  22. data/ext/nokogiri/xml_attribute_decl.c +67 -0
  23. data/ext/nokogiri/xml_attribute_decl.h +9 -0
  24. data/ext/nokogiri/xml_cdata.c +54 -0
  25. data/ext/nokogiri/xml_cdata.h +9 -0
  26. data/ext/nokogiri/xml_comment.c +52 -0
  27. data/ext/nokogiri/xml_comment.h +9 -0
  28. data/ext/nokogiri/xml_document.c +388 -0
  29. data/ext/nokogiri/xml_document.h +24 -0
  30. data/ext/nokogiri/xml_document_fragment.c +46 -0
  31. data/ext/nokogiri/xml_document_fragment.h +10 -0
  32. data/ext/nokogiri/xml_dtd.c +192 -0
  33. data/ext/nokogiri/xml_dtd.h +10 -0
  34. data/ext/nokogiri/xml_element_content.c +123 -0
  35. data/ext/nokogiri/xml_element_content.h +10 -0
  36. data/ext/nokogiri/xml_element_decl.c +69 -0
  37. data/ext/nokogiri/xml_element_decl.h +9 -0
  38. data/ext/nokogiri/xml_entity_decl.c +97 -0
  39. data/ext/nokogiri/xml_entity_decl.h +10 -0
  40. data/ext/nokogiri/xml_entity_reference.c +50 -0
  41. data/ext/nokogiri/xml_entity_reference.h +9 -0
  42. data/ext/nokogiri/xml_io.c +31 -0
  43. data/ext/nokogiri/xml_io.h +11 -0
  44. data/ext/nokogiri/xml_namespace.c +74 -0
  45. data/ext/nokogiri/xml_namespace.h +12 -0
  46. data/ext/nokogiri/xml_node.c +1060 -0
  47. data/ext/nokogiri/xml_node.h +13 -0
  48. data/ext/nokogiri/xml_node_set.c +397 -0
  49. data/ext/nokogiri/xml_node_set.h +9 -0
  50. data/ext/nokogiri/xml_processing_instruction.c +54 -0
  51. data/ext/nokogiri/xml_processing_instruction.h +9 -0
  52. data/ext/nokogiri/xml_reader.c +593 -0
  53. data/ext/nokogiri/xml_reader.h +10 -0
  54. data/ext/nokogiri/xml_relax_ng.c +159 -0
  55. data/ext/nokogiri/xml_relax_ng.h +9 -0
  56. data/ext/nokogiri/xml_sax_parser.c +286 -0
  57. data/ext/nokogiri/xml_sax_parser.h +43 -0
  58. data/ext/nokogiri/xml_sax_parser_context.c +155 -0
  59. data/ext/nokogiri/xml_sax_parser_context.h +10 -0
  60. data/ext/nokogiri/xml_sax_push_parser.c +114 -0
  61. data/ext/nokogiri/xml_sax_push_parser.h +9 -0
  62. data/ext/nokogiri/xml_schema.c +156 -0
  63. data/ext/nokogiri/xml_schema.h +9 -0
  64. data/ext/nokogiri/xml_syntax_error.c +261 -0
  65. data/ext/nokogiri/xml_syntax_error.h +13 -0
  66. data/ext/nokogiri/xml_text.c +48 -0
  67. data/ext/nokogiri/xml_text.h +9 -0
  68. data/ext/nokogiri/xml_xpath.c +53 -0
  69. data/ext/nokogiri/xml_xpath.h +11 -0
  70. data/ext/nokogiri/xml_xpath_context.c +239 -0
  71. data/ext/nokogiri/xml_xpath_context.h +9 -0
  72. data/ext/nokogiri/xslt_stylesheet.c +131 -0
  73. data/ext/nokogiri/xslt_stylesheet.h +9 -0
  74. data/lib/nokogiri.rb +116 -0
  75. data/lib/nokogiri/css.rb +25 -0
  76. data/lib/nokogiri/css/generated_parser.rb +646 -0
  77. data/lib/nokogiri/css/generated_tokenizer.rb +142 -0
  78. data/lib/nokogiri/css/node.rb +99 -0
  79. data/lib/nokogiri/css/parser.rb +82 -0
  80. data/lib/nokogiri/css/parser.y +227 -0
  81. data/lib/nokogiri/css/syntax_error.rb +7 -0
  82. data/lib/nokogiri/css/tokenizer.rb +7 -0
  83. data/lib/nokogiri/css/tokenizer.rex +54 -0
  84. data/lib/nokogiri/css/xpath_visitor.rb +162 -0
  85. data/lib/nokogiri/decorators/slop.rb +33 -0
  86. data/lib/nokogiri/ffi/html/document.rb +28 -0
  87. data/lib/nokogiri/ffi/html/element_description.rb +85 -0
  88. data/lib/nokogiri/ffi/html/entity_lookup.rb +16 -0
  89. data/lib/nokogiri/ffi/html/sax/parser_context.rb +38 -0
  90. data/lib/nokogiri/ffi/io_callbacks.rb +42 -0
  91. data/lib/nokogiri/ffi/libxml.rb +356 -0
  92. data/lib/nokogiri/ffi/structs/common_node.rb +26 -0
  93. data/lib/nokogiri/ffi/structs/html_elem_desc.rb +24 -0
  94. data/lib/nokogiri/ffi/structs/html_entity_desc.rb +13 -0
  95. data/lib/nokogiri/ffi/structs/xml_alloc.rb +16 -0
  96. data/lib/nokogiri/ffi/structs/xml_attr.rb +19 -0
  97. data/lib/nokogiri/ffi/structs/xml_attribute.rb +27 -0
  98. data/lib/nokogiri/ffi/structs/xml_buffer.rb +16 -0
  99. data/lib/nokogiri/ffi/structs/xml_document.rb +108 -0
  100. data/lib/nokogiri/ffi/structs/xml_dtd.rb +28 -0
  101. data/lib/nokogiri/ffi/structs/xml_element.rb +26 -0
  102. data/lib/nokogiri/ffi/structs/xml_element_content.rb +17 -0
  103. data/lib/nokogiri/ffi/structs/xml_entity.rb +32 -0
  104. data/lib/nokogiri/ffi/structs/xml_enumeration.rb +12 -0
  105. data/lib/nokogiri/ffi/structs/xml_node.rb +28 -0
  106. data/lib/nokogiri/ffi/structs/xml_node_set.rb +53 -0
  107. data/lib/nokogiri/ffi/structs/xml_notation.rb +11 -0
  108. data/lib/nokogiri/ffi/structs/xml_ns.rb +15 -0
  109. data/lib/nokogiri/ffi/structs/xml_parser_context.rb +19 -0
  110. data/lib/nokogiri/ffi/structs/xml_relax_ng.rb +14 -0
  111. data/lib/nokogiri/ffi/structs/xml_sax_handler.rb +51 -0
  112. data/lib/nokogiri/ffi/structs/xml_sax_push_parser_context.rb +15 -0
  113. data/lib/nokogiri/ffi/structs/xml_schema.rb +13 -0
  114. data/lib/nokogiri/ffi/structs/xml_syntax_error.rb +31 -0
  115. data/lib/nokogiri/ffi/structs/xml_text_reader.rb +12 -0
  116. data/lib/nokogiri/ffi/structs/xml_xpath_context.rb +37 -0
  117. data/lib/nokogiri/ffi/structs/xml_xpath_object.rb +35 -0
  118. data/lib/nokogiri/ffi/structs/xml_xpath_parser_context.rb +20 -0
  119. data/lib/nokogiri/ffi/structs/xslt_stylesheet.rb +13 -0
  120. data/lib/nokogiri/ffi/xml/attr.rb +41 -0
  121. data/lib/nokogiri/ffi/xml/attribute_decl.rb +27 -0
  122. data/lib/nokogiri/ffi/xml/cdata.rb +19 -0
  123. data/lib/nokogiri/ffi/xml/comment.rb +18 -0
  124. data/lib/nokogiri/ffi/xml/document.rb +135 -0
  125. data/lib/nokogiri/ffi/xml/document_fragment.rb +21 -0
  126. data/lib/nokogiri/ffi/xml/dtd.rb +69 -0
  127. data/lib/nokogiri/ffi/xml/element_content.rb +43 -0
  128. data/lib/nokogiri/ffi/xml/element_decl.rb +19 -0
  129. data/lib/nokogiri/ffi/xml/entity_decl.rb +27 -0
  130. data/lib/nokogiri/ffi/xml/entity_reference.rb +19 -0
  131. data/lib/nokogiri/ffi/xml/namespace.rb +44 -0
  132. data/lib/nokogiri/ffi/xml/node.rb +444 -0
  133. data/lib/nokogiri/ffi/xml/node_set.rb +133 -0
  134. data/lib/nokogiri/ffi/xml/processing_instruction.rb +20 -0
  135. data/lib/nokogiri/ffi/xml/reader.rb +227 -0
  136. data/lib/nokogiri/ffi/xml/relax_ng.rb +85 -0
  137. data/lib/nokogiri/ffi/xml/sax/parser.rb +142 -0
  138. data/lib/nokogiri/ffi/xml/sax/parser_context.rb +67 -0
  139. data/lib/nokogiri/ffi/xml/sax/push_parser.rb +39 -0
  140. data/lib/nokogiri/ffi/xml/schema.rb +92 -0
  141. data/lib/nokogiri/ffi/xml/syntax_error.rb +91 -0
  142. data/lib/nokogiri/ffi/xml/text.rb +18 -0
  143. data/lib/nokogiri/ffi/xml/xpath.rb +19 -0
  144. data/lib/nokogiri/ffi/xml/xpath_context.rb +135 -0
  145. data/lib/nokogiri/ffi/xslt/stylesheet.rb +47 -0
  146. data/lib/nokogiri/html.rb +35 -0
  147. data/lib/nokogiri/html/builder.rb +35 -0
  148. data/lib/nokogiri/html/document.rb +88 -0
  149. data/lib/nokogiri/html/document_fragment.rb +15 -0
  150. data/lib/nokogiri/html/element_description.rb +23 -0
  151. data/lib/nokogiri/html/entity_lookup.rb +13 -0
  152. data/lib/nokogiri/html/sax/parser.rb +48 -0
  153. data/lib/nokogiri/html/sax/parser_context.rb +16 -0
  154. data/lib/nokogiri/syntax_error.rb +4 -0
  155. data/lib/nokogiri/version.rb +33 -0
  156. data/lib/nokogiri/version_warning.rb +11 -0
  157. data/lib/nokogiri/xml.rb +67 -0
  158. data/lib/nokogiri/xml/attr.rb +14 -0
  159. data/lib/nokogiri/xml/attribute_decl.rb +18 -0
  160. data/lib/nokogiri/xml/builder.rb +405 -0
  161. data/lib/nokogiri/xml/cdata.rb +11 -0
  162. data/lib/nokogiri/xml/character_data.rb +7 -0
  163. data/lib/nokogiri/xml/document.rb +131 -0
  164. data/lib/nokogiri/xml/document_fragment.rb +69 -0
  165. data/lib/nokogiri/xml/dtd.rb +11 -0
  166. data/lib/nokogiri/xml/element_content.rb +36 -0
  167. data/lib/nokogiri/xml/element_decl.rb +13 -0
  168. data/lib/nokogiri/xml/entity_decl.rb +15 -0
  169. data/lib/nokogiri/xml/fragment_handler.rb +71 -0
  170. data/lib/nokogiri/xml/namespace.rb +13 -0
  171. data/lib/nokogiri/xml/node.rb +665 -0
  172. data/lib/nokogiri/xml/node/save_options.rb +42 -0
  173. data/lib/nokogiri/xml/node_set.rb +307 -0
  174. data/lib/nokogiri/xml/notation.rb +6 -0
  175. data/lib/nokogiri/xml/parse_options.rb +85 -0
  176. data/lib/nokogiri/xml/pp.rb +2 -0
  177. data/lib/nokogiri/xml/pp/character_data.rb +18 -0
  178. data/lib/nokogiri/xml/pp/node.rb +56 -0
  179. data/lib/nokogiri/xml/processing_instruction.rb +8 -0
  180. data/lib/nokogiri/xml/reader.rb +74 -0
  181. data/lib/nokogiri/xml/relax_ng.rb +32 -0
  182. data/lib/nokogiri/xml/sax.rb +4 -0
  183. data/lib/nokogiri/xml/sax/document.rb +160 -0
  184. data/lib/nokogiri/xml/sax/parser.rb +115 -0
  185. data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
  186. data/lib/nokogiri/xml/sax/push_parser.rb +60 -0
  187. data/lib/nokogiri/xml/schema.rb +61 -0
  188. data/lib/nokogiri/xml/syntax_error.rb +38 -0
  189. data/lib/nokogiri/xml/xpath.rb +10 -0
  190. data/lib/nokogiri/xml/xpath/syntax_error.rb +8 -0
  191. data/lib/nokogiri/xml/xpath_context.rb +16 -0
  192. data/lib/nokogiri/xslt.rb +48 -0
  193. data/lib/nokogiri/xslt/stylesheet.rb +25 -0
  194. data/lib/xsd/xmlparser/nokogiri.rb +71 -0
  195. data/tasks/test.rb +100 -0
  196. data/test/css/test_nthiness.rb +159 -0
  197. data/test/css/test_parser.rb +277 -0
  198. data/test/css/test_tokenizer.rb +183 -0
  199. data/test/css/test_xpath_visitor.rb +76 -0
  200. data/test/ffi/test_document.rb +35 -0
  201. data/test/files/2ch.html +108 -0
  202. data/test/files/address_book.rlx +12 -0
  203. data/test/files/address_book.xml +10 -0
  204. data/test/files/bar/bar.xsd +4 -0
  205. data/test/files/dont_hurt_em_why.xml +422 -0
  206. data/test/files/exslt.xml +8 -0
  207. data/test/files/exslt.xslt +35 -0
  208. data/test/files/foo/foo.xsd +4 -0
  209. data/test/files/po.xml +32 -0
  210. data/test/files/po.xsd +66 -0
  211. data/test/files/shift_jis.html +10 -0
  212. data/test/files/shift_jis.xml +5 -0
  213. data/test/files/snuggles.xml +3 -0
  214. data/test/files/staff.dtd +10 -0
  215. data/test/files/staff.xml +59 -0
  216. data/test/files/staff.xslt +32 -0
  217. data/test/files/tlm.html +850 -0
  218. data/test/files/valid_bar.xml +2 -0
  219. data/test/helper.rb +136 -0
  220. data/test/html/sax/test_parser.rb +64 -0
  221. data/test/html/sax/test_parser_context.rb +48 -0
  222. data/test/html/test_builder.rb +164 -0
  223. data/test/html/test_document.rb +390 -0
  224. data/test/html/test_document_encoding.rb +77 -0
  225. data/test/html/test_document_fragment.rb +132 -0
  226. data/test/html/test_element_description.rb +94 -0
  227. data/test/html/test_named_characters.rb +14 -0
  228. data/test/html/test_node.rb +228 -0
  229. data/test/html/test_node_encoding.rb +27 -0
  230. data/test/test_convert_xpath.rb +135 -0
  231. data/test/test_css_cache.rb +45 -0
  232. data/test/test_gc.rb +15 -0
  233. data/test/test_memory_leak.rb +77 -0
  234. data/test/test_nokogiri.rb +134 -0
  235. data/test/test_reader.rb +358 -0
  236. data/test/test_xslt_transforms.rb +131 -0
  237. data/test/xml/node/test_save_options.rb +20 -0
  238. data/test/xml/node/test_subclass.rb +44 -0
  239. data/test/xml/sax/test_parser.rb +307 -0
  240. data/test/xml/sax/test_parser_context.rb +56 -0
  241. data/test/xml/sax/test_push_parser.rb +131 -0
  242. data/test/xml/test_attr.rb +38 -0
  243. data/test/xml/test_attribute_decl.rb +82 -0
  244. data/test/xml/test_builder.rb +167 -0
  245. data/test/xml/test_cdata.rb +38 -0
  246. data/test/xml/test_comment.rb +29 -0
  247. data/test/xml/test_document.rb +607 -0
  248. data/test/xml/test_document_encoding.rb +26 -0
  249. data/test/xml/test_document_fragment.rb +138 -0
  250. data/test/xml/test_dtd.rb +82 -0
  251. data/test/xml/test_dtd_encoding.rb +33 -0
  252. data/test/xml/test_element_content.rb +56 -0
  253. data/test/xml/test_element_decl.rb +73 -0
  254. data/test/xml/test_entity_decl.rb +83 -0
  255. data/test/xml/test_entity_reference.rb +21 -0
  256. data/test/xml/test_namespace.rb +68 -0
  257. data/test/xml/test_node.rb +889 -0
  258. data/test/xml/test_node_attributes.rb +34 -0
  259. data/test/xml/test_node_encoding.rb +107 -0
  260. data/test/xml/test_node_set.rb +531 -0
  261. data/test/xml/test_parse_options.rb +52 -0
  262. data/test/xml/test_processing_instruction.rb +30 -0
  263. data/test/xml/test_reader_encoding.rb +126 -0
  264. data/test/xml/test_relax_ng.rb +60 -0
  265. data/test/xml/test_schema.rb +89 -0
  266. data/test/xml/test_syntax_error.rb +27 -0
  267. data/test/xml/test_text.rb +30 -0
  268. data/test/xml/test_unparented_node.rb +381 -0
  269. data/test/xml/test_xpath.rb +106 -0
  270. metadata +430 -0
@@ -0,0 +1,43 @@
1
+ #ifndef NOKOGIRI_XML_SAX_PARSER
2
+ #define NOKOGIRI_XML_SAX_PARSER
3
+
4
+ #include <nokogiri.h>
5
+
6
+ void init_xml_sax_parser();
7
+
8
+ extern VALUE cNokogiriXmlSaxParser ;
9
+
10
+ typedef struct _nokogiriSAXTuple {
11
+ xmlParserCtxtPtr ctxt;
12
+ VALUE self;
13
+ } nokogiriSAXTuple;
14
+
15
+ typedef nokogiriSAXTuple * nokogiriSAXTuplePtr;
16
+
17
+ #define NOKOGIRI_SAX_SELF(_ctxt) \
18
+ ({ \
19
+ nokogiriSAXTuplePtr _tuple = (nokogiriSAXTuplePtr)(_ctxt); \
20
+ _tuple->self; \
21
+ })
22
+
23
+ #define NOKOGIRI_SAX_CTXT(_ctxt) \
24
+ ({ \
25
+ nokogiriSAXTuplePtr _tuple = (nokogiriSAXTuplePtr)(_ctxt); \
26
+ _tuple->ctxt; \
27
+ })
28
+
29
+ #define NOKOGIRI_SAX_TUPLE_NEW(_ctxt, _self) \
30
+ ({ \
31
+ nokogiriSAXTuplePtr _tuple = malloc(sizeof(nokogiriSAXTuple)); \
32
+ _tuple->self = _self; \
33
+ _tuple->ctxt = _ctxt; \
34
+ _tuple; \
35
+ })
36
+
37
+ #define NOKOGIRI_SAX_TUPLE_DESTROY(_tuple) \
38
+ ({ \
39
+ free(_tuple); \
40
+ })
41
+
42
+ #endif
43
+
@@ -0,0 +1,155 @@
1
+ #include <xml_sax_parser_context.h>
2
+
3
+ VALUE cNokogiriXmlSaxParserContext ;
4
+
5
+ static void deallocate(xmlParserCtxtPtr ctxt)
6
+ {
7
+ NOKOGIRI_DEBUG_START(handler);
8
+
9
+ ctxt->sax = NULL;
10
+
11
+ xmlFreeParserCtxt(ctxt);
12
+
13
+ NOKOGIRI_DEBUG_END(handler);
14
+ }
15
+
16
+ /*
17
+ * call-seq:
18
+ * parse_io(io, encoding)
19
+ *
20
+ * Parse +io+ object with +encoding+
21
+ */
22
+ static VALUE parse_io(VALUE klass, VALUE io, VALUE encoding)
23
+ {
24
+ xmlCharEncoding enc = (xmlCharEncoding)NUM2INT(encoding);
25
+
26
+ xmlParserCtxtPtr ctxt = xmlCreateIOParserCtxt(
27
+ NULL,
28
+ NULL,
29
+ (xmlInputReadCallback)io_read_callback,
30
+ (xmlInputCloseCallback)io_close_callback,
31
+ (void *)io,
32
+ enc
33
+ );
34
+
35
+ return Data_Wrap_Struct(klass, NULL, deallocate, ctxt);
36
+ }
37
+
38
+ /*
39
+ * call-seq:
40
+ * parse_file(filename)
41
+ *
42
+ * Parse file given +filename+
43
+ */
44
+ static VALUE parse_file(VALUE klass, VALUE filename)
45
+ {
46
+ xmlParserCtxtPtr ctxt = xmlCreateFileParserCtxt(StringValuePtr(filename));
47
+ return Data_Wrap_Struct(klass, NULL, deallocate, ctxt);
48
+ }
49
+
50
+ /*
51
+ * call-seq:
52
+ * parse_memory(data)
53
+ *
54
+ * Parse the XML stored in memory in +data+
55
+ */
56
+ static VALUE parse_memory(VALUE klass, VALUE data)
57
+ {
58
+ if(NIL_P(data)) rb_raise(rb_eArgError, "data cannot be nil");
59
+ if(!(int)RSTRING_LEN(data))
60
+ rb_raise(rb_eRuntimeError, "data cannot be empty");
61
+
62
+ xmlParserCtxtPtr ctxt = xmlCreateMemoryParserCtxt(
63
+ StringValuePtr(data),
64
+ (int)RSTRING_LEN(data)
65
+ );
66
+
67
+ return Data_Wrap_Struct(klass, NULL, deallocate, ctxt);
68
+ }
69
+
70
+ /*
71
+ * call-seq:
72
+ * parse_with(sax_handler)
73
+ *
74
+ * Use +sax_handler+ and parse the current document
75
+ */
76
+ static VALUE parse_with(VALUE self, VALUE sax_handler)
77
+ {
78
+ if(!rb_obj_is_kind_of(sax_handler, cNokogiriXmlSaxParser))
79
+ rb_raise(rb_eArgError, "argument must be a Nokogiri::XML::SAX::Parser");
80
+
81
+ xmlParserCtxtPtr ctxt;
82
+ Data_Get_Struct(self, xmlParserCtxt, ctxt);
83
+
84
+ xmlSAXHandlerPtr sax;
85
+ Data_Get_Struct(sax_handler, xmlSAXHandler, sax);
86
+
87
+ // Free the sax handler since we'll assign our own
88
+ if(ctxt->sax && ctxt->sax != (xmlSAXHandlerPtr)&xmlDefaultSAXHandler)
89
+ xmlFree(ctxt->sax);
90
+
91
+ ctxt->sax = sax;
92
+ ctxt->userData = (void *)NOKOGIRI_SAX_TUPLE_NEW(ctxt, sax_handler);
93
+
94
+ xmlParseDocument(ctxt);
95
+
96
+ if(NULL != ctxt->myDoc) xmlFreeDoc(ctxt->myDoc);
97
+
98
+ NOKOGIRI_SAX_TUPLE_DESTROY(ctxt->userData);
99
+ }
100
+
101
+ /*
102
+ * call-seq:
103
+ * replace_entities=(boolean)
104
+ *
105
+ * Should this parser replace entities? &amp; will get converted to '&' if
106
+ * set to true
107
+ */
108
+ static VALUE set_replace_entities(VALUE self, VALUE value)
109
+ {
110
+ xmlParserCtxtPtr ctxt;
111
+ Data_Get_Struct(self, xmlParserCtxt, ctxt);
112
+
113
+ if(Qfalse == value)
114
+ ctxt->replaceEntities = 0;
115
+ else
116
+ ctxt->replaceEntities = 1;
117
+
118
+ return value;
119
+ }
120
+
121
+ /*
122
+ * call-seq:
123
+ * replace_entities
124
+ *
125
+ * Should this parser replace entities? &amp; will get converted to '&' if
126
+ * set to true
127
+ */
128
+ static VALUE get_replace_entities(VALUE self)
129
+ {
130
+ xmlParserCtxtPtr ctxt;
131
+ Data_Get_Struct(self, xmlParserCtxt, ctxt);
132
+
133
+ if(0 == ctxt->replaceEntities)
134
+ return Qfalse;
135
+ else
136
+ return Qtrue;
137
+ }
138
+
139
+ void init_xml_sax_parser_context()
140
+ {
141
+ VALUE nokogiri = rb_define_module("Nokogiri");
142
+ VALUE xml = rb_define_module_under(nokogiri, "XML");
143
+ VALUE sax = rb_define_module_under(xml, "SAX");
144
+ VALUE klass = rb_define_class_under(sax, "ParserContext", rb_cObject);
145
+
146
+ cNokogiriXmlSaxParserContext = klass;
147
+
148
+ rb_define_singleton_method(klass, "io", parse_io, 2);
149
+ rb_define_singleton_method(klass, "memory", parse_memory, 1);
150
+ rb_define_singleton_method(klass, "file", parse_file, 1);
151
+
152
+ rb_define_method(klass, "parse_with", parse_with, 1);
153
+ rb_define_method(klass, "replace_entities=", set_replace_entities, 1);
154
+ rb_define_method(klass, "replace_entities", get_replace_entities, 0);
155
+ }
@@ -0,0 +1,10 @@
1
+ #ifndef NOKOGIRI_XML_SAX_PARSER_CONTEXT
2
+ #define NOKOGIRI_XML_SAX_PARSER_CONTEXT
3
+
4
+ #include <nokogiri.h>
5
+
6
+ extern VALUE cNokogiriXmlSaxParserContext;
7
+
8
+ void init_xml_sax_parser_context();
9
+
10
+ #endif
@@ -0,0 +1,114 @@
1
+ #include <xml_sax_push_parser.h>
2
+
3
+ static void deallocate(xmlParserCtxtPtr ctx)
4
+ {
5
+ NOKOGIRI_DEBUG_START(ctx);
6
+ if(ctx != NULL) {
7
+ NOKOGIRI_SAX_TUPLE_DESTROY(ctx->userData);
8
+ xmlFreeParserCtxt(ctx);
9
+ }
10
+ NOKOGIRI_DEBUG_END(ctx);
11
+ }
12
+
13
+ static VALUE allocate(VALUE klass)
14
+ {
15
+ return Data_Wrap_Struct(klass, NULL, deallocate, NULL);
16
+ }
17
+
18
+ /*
19
+ * call-seq:
20
+ * native_write(chunk, last_chunk)
21
+ *
22
+ * Write +chunk+ to PushParser. +last_chunk+ triggers the end_document handle
23
+ */
24
+ static VALUE native_write(VALUE self, VALUE _chunk, VALUE _last_chunk)
25
+ {
26
+ xmlParserCtxtPtr ctx;
27
+ Data_Get_Struct(self, xmlParserCtxt, ctx);
28
+
29
+ const char * chunk = NULL;
30
+ int size = 0;
31
+
32
+ if(Qnil != _chunk) {
33
+ chunk = StringValuePtr(_chunk);
34
+ size = RSTRING_LEN(_chunk);
35
+ }
36
+
37
+ if(xmlParseChunk(ctx, chunk, size, Qtrue == _last_chunk ? 1 : 0)) {
38
+ if (!(ctx->options & XML_PARSE_RECOVER)) {
39
+ xmlErrorPtr e = xmlCtxtGetLastError(ctx);
40
+ Nokogiri_error_raise(NULL, e);
41
+ }
42
+ }
43
+
44
+ return self;
45
+ }
46
+
47
+ /*
48
+ * call-seq:
49
+ * initialize_native(xml_sax, filename)
50
+ *
51
+ * Initialize the push parser with +xml_sax+ using +filename+
52
+ */
53
+ static VALUE initialize_native(VALUE self, VALUE _xml_sax, VALUE _filename)
54
+ {
55
+ xmlSAXHandlerPtr sax;
56
+
57
+ Data_Get_Struct(_xml_sax, xmlSAXHandler, sax);
58
+
59
+ const char * filename = NULL;
60
+
61
+ if(_filename != Qnil) filename = StringValuePtr(_filename);
62
+
63
+ xmlParserCtxtPtr ctx = xmlCreatePushParserCtxt(
64
+ sax,
65
+ NULL,
66
+ NULL,
67
+ 0,
68
+ filename
69
+ );
70
+ if(ctx == NULL)
71
+ rb_raise(rb_eRuntimeError, "Could not create a parser context");
72
+
73
+ ctx->userData = NOKOGIRI_SAX_TUPLE_NEW(ctx, self);
74
+
75
+ ctx->sax2 = 1;
76
+ DATA_PTR(self) = ctx;
77
+ return self;
78
+ }
79
+
80
+ static VALUE get_options(VALUE self)
81
+ {
82
+ xmlParserCtxtPtr ctx;
83
+ Data_Get_Struct(self, xmlParserCtxt, ctx);
84
+
85
+ return INT2NUM(ctx->options);
86
+ }
87
+
88
+ static VALUE set_options(VALUE self, VALUE options)
89
+ {
90
+ xmlParserCtxtPtr ctx;
91
+ Data_Get_Struct(self, xmlParserCtxt, ctx);
92
+
93
+ if (xmlCtxtUseOptions(ctx, (int)NUM2INT(options)) != 0)
94
+ rb_raise(rb_eRuntimeError, "Cannot set XML parser context options");
95
+
96
+ return Qnil;
97
+ }
98
+
99
+ VALUE cNokogiriXmlSaxPushParser ;
100
+ void init_xml_sax_push_parser()
101
+ {
102
+ VALUE nokogiri = rb_define_module("Nokogiri");
103
+ VALUE xml = rb_define_module_under(nokogiri, "XML");
104
+ VALUE sax = rb_define_module_under(xml, "SAX");
105
+ VALUE klass = rb_define_class_under(sax, "PushParser", rb_cObject);
106
+
107
+ cNokogiriXmlSaxPushParser = klass;
108
+
109
+ rb_define_alloc_func(klass, allocate);
110
+ rb_define_private_method(klass, "initialize_native", initialize_native, 2);
111
+ rb_define_private_method(klass, "native_write", native_write, 2);
112
+ rb_define_method(klass, "options", get_options, 0);
113
+ rb_define_method(klass, "options=", set_options, 1);
114
+ }
@@ -0,0 +1,9 @@
1
+ #ifndef NOKOGIRI_XML_SAX_PUSH_PARSER
2
+ #define NOKOGIRI_XML_SAX_PUSH_PARSER
3
+
4
+ #include <nokogiri.h>
5
+
6
+ void init_xml_sax_push_parser();
7
+
8
+ extern VALUE cNokogiriXmlSaxPushParser ;
9
+ #endif
@@ -0,0 +1,156 @@
1
+ #include <xml_schema.h>
2
+
3
+ static void dealloc(xmlSchemaPtr schema)
4
+ {
5
+ NOKOGIRI_DEBUG_START(schema);
6
+ xmlSchemaFree(schema);
7
+ NOKOGIRI_DEBUG_END(schema);
8
+ }
9
+
10
+ /*
11
+ * call-seq:
12
+ * validate_document(document)
13
+ *
14
+ * Validate a Nokogiri::XML::Document against this Schema.
15
+ */
16
+ static VALUE validate_document(VALUE self, VALUE document)
17
+ {
18
+ xmlDocPtr doc;
19
+ xmlSchemaPtr schema;
20
+
21
+ Data_Get_Struct(self, xmlSchema, schema);
22
+ Data_Get_Struct(document, xmlDoc, doc);
23
+
24
+ VALUE errors = rb_ary_new();
25
+
26
+ xmlSchemaValidCtxtPtr valid_ctxt = xmlSchemaNewValidCtxt(schema);
27
+
28
+ if(NULL == valid_ctxt) {
29
+ // we have a problem
30
+ rb_raise(rb_eRuntimeError, "Could not create a validation context");
31
+ }
32
+
33
+ #ifdef HAVE_XMLSCHEMASETVALIDSTRUCTUREDERRORS
34
+ xmlSchemaSetValidStructuredErrors(
35
+ valid_ctxt,
36
+ Nokogiri_error_array_pusher,
37
+ (void *)errors
38
+ );
39
+ #endif
40
+
41
+ xmlSchemaValidateDoc(valid_ctxt, doc);
42
+
43
+ xmlSchemaFreeValidCtxt(valid_ctxt);
44
+
45
+ return errors;
46
+ }
47
+
48
+ /*
49
+ * call-seq:
50
+ * read_memory(string)
51
+ *
52
+ * Create a new Schema from the contents of +string+
53
+ */
54
+ static VALUE read_memory(VALUE klass, VALUE content)
55
+ {
56
+
57
+ xmlSchemaParserCtxtPtr ctx = xmlSchemaNewMemParserCtxt(
58
+ (const char *)StringValuePtr(content),
59
+ RSTRING_LEN(content)
60
+ );
61
+
62
+ VALUE errors = rb_ary_new();
63
+ xmlSetStructuredErrorFunc((void *)errors, Nokogiri_error_array_pusher);
64
+
65
+ #ifdef HAVE_XMLSCHEMASETPARSERSTRUCTUREDERRORS
66
+ xmlSchemaSetParserStructuredErrors(
67
+ ctx,
68
+ Nokogiri_error_array_pusher,
69
+ (void *)errors
70
+ );
71
+ #endif
72
+
73
+ xmlSchemaPtr schema = xmlSchemaParse(ctx);
74
+
75
+ xmlSetStructuredErrorFunc(NULL, NULL);
76
+ xmlSchemaFreeParserCtxt(ctx);
77
+
78
+ if(NULL == schema) {
79
+ xmlErrorPtr error = xmlGetLastError();
80
+ if(error)
81
+ Nokogiri_error_raise(NULL, error);
82
+ else
83
+ rb_raise(rb_eRuntimeError, "Could not parse document");
84
+
85
+ return Qnil;
86
+ }
87
+
88
+ VALUE rb_schema = Data_Wrap_Struct(klass, 0, dealloc, schema);
89
+ rb_iv_set(rb_schema, "@errors", errors);
90
+
91
+ return rb_schema;
92
+ }
93
+
94
+ /*
95
+ * call-seq:
96
+ * from_document(doc)
97
+ *
98
+ * Create a new Schema from the Nokogiri::XML::Document +doc+
99
+ */
100
+ static VALUE from_document(VALUE klass, VALUE document)
101
+ {
102
+ xmlDocPtr doc;
103
+ Data_Get_Struct(document, xmlDoc, doc);
104
+
105
+ // In case someone passes us a node. ugh.
106
+ doc = doc->doc;
107
+
108
+ xmlSchemaParserCtxtPtr ctx = xmlSchemaNewDocParserCtxt(doc);
109
+
110
+ VALUE errors = rb_ary_new();
111
+ xmlSetStructuredErrorFunc((void *)errors, Nokogiri_error_array_pusher);
112
+
113
+ #ifdef HAVE_XMLSCHEMASETPARSERSTRUCTUREDERRORS
114
+ xmlSchemaSetParserStructuredErrors(
115
+ ctx,
116
+ Nokogiri_error_array_pusher,
117
+ (void *)errors
118
+ );
119
+ #endif
120
+
121
+ xmlSchemaPtr schema = xmlSchemaParse(ctx);
122
+
123
+ xmlSetStructuredErrorFunc(NULL, NULL);
124
+ xmlSchemaFreeParserCtxt(ctx);
125
+
126
+ if(NULL == schema) {
127
+ xmlErrorPtr error = xmlGetLastError();
128
+ if(error)
129
+ Nokogiri_error_raise(NULL, error);
130
+ else
131
+ rb_raise(rb_eRuntimeError, "Could not parse document");
132
+
133
+ return Qnil;
134
+ }
135
+
136
+ VALUE rb_schema = Data_Wrap_Struct(klass, 0, dealloc, schema);
137
+ rb_iv_set(rb_schema, "@errors", errors);
138
+
139
+ return rb_schema;
140
+
141
+ return Qnil;
142
+ }
143
+
144
+ VALUE cNokogiriXmlSchema;
145
+ void init_xml_schema()
146
+ {
147
+ VALUE nokogiri = rb_define_module("Nokogiri");
148
+ VALUE xml = rb_define_module_under(nokogiri, "XML");
149
+ VALUE klass = rb_define_class_under(xml, "Schema", rb_cObject);
150
+
151
+ cNokogiriXmlSchema = klass;
152
+
153
+ rb_define_singleton_method(klass, "read_memory", read_memory, 1);
154
+ rb_define_singleton_method(klass, "from_document", from_document, 1);
155
+ rb_define_private_method(klass, "validate_document", validate_document, 1);
156
+ }