nokogiri 1.2.3 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of nokogiri might be problematic. Click here for more details.

Files changed (200) hide show
  1. data/.autotest +14 -2
  2. data/CHANGELOG.ja.rdoc +38 -0
  3. data/CHANGELOG.rdoc +43 -0
  4. data/Manifest.txt +80 -5
  5. data/README.ja.rdoc +12 -11
  6. data/README.rdoc +4 -2
  7. data/Rakefile +103 -173
  8. data/bin/nokogiri +47 -0
  9. data/ext/nokogiri/extconf.rb +19 -13
  10. data/ext/nokogiri/html_document.c +39 -3
  11. data/ext/nokogiri/html_document.h +1 -1
  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.h +1 -1
  15. data/ext/nokogiri/html_sax_parser.h +1 -1
  16. data/ext/nokogiri/{native.c → nokogiri.c} +11 -3
  17. data/ext/nokogiri/{native.h → nokogiri.h} +18 -4
  18. data/ext/nokogiri/xml_attr.c +14 -5
  19. data/ext/nokogiri/xml_attr.h +1 -1
  20. data/ext/nokogiri/xml_cdata.c +15 -6
  21. data/ext/nokogiri/xml_cdata.h +1 -1
  22. data/ext/nokogiri/xml_comment.c +13 -4
  23. data/ext/nokogiri/xml_comment.h +1 -1
  24. data/ext/nokogiri/xml_document.c +50 -41
  25. data/ext/nokogiri/xml_document.h +1 -1
  26. data/ext/nokogiri/xml_document_fragment.c +12 -4
  27. data/ext/nokogiri/xml_document_fragment.h +1 -1
  28. data/ext/nokogiri/xml_dtd.c +1 -1
  29. data/ext/nokogiri/xml_dtd.h +1 -1
  30. data/ext/nokogiri/xml_entity_reference.c +13 -4
  31. data/ext/nokogiri/xml_entity_reference.h +1 -1
  32. data/ext/nokogiri/xml_io.h +1 -1
  33. data/ext/nokogiri/xml_namespace.c +69 -0
  34. data/ext/nokogiri/xml_namespace.h +12 -0
  35. data/ext/nokogiri/xml_node.c +232 -124
  36. data/ext/nokogiri/xml_node.h +3 -4
  37. data/ext/nokogiri/xml_node_set.c +206 -19
  38. data/ext/nokogiri/xml_node_set.h +1 -1
  39. data/ext/nokogiri/xml_processing_instruction.c +14 -4
  40. data/ext/nokogiri/xml_processing_instruction.h +1 -1
  41. data/ext/nokogiri/xml_reader.c +87 -7
  42. data/ext/nokogiri/xml_reader.h +1 -1
  43. data/ext/nokogiri/xml_relax_ng.c +106 -0
  44. data/ext/nokogiri/xml_relax_ng.h +9 -0
  45. data/ext/nokogiri/xml_sax_parser.c +122 -2
  46. data/ext/nokogiri/xml_sax_parser.h +1 -1
  47. data/ext/nokogiri/xml_sax_push_parser.c +1 -0
  48. data/ext/nokogiri/xml_sax_push_parser.h +1 -1
  49. data/ext/nokogiri/xml_schema.c +107 -0
  50. data/ext/nokogiri/xml_schema.h +9 -0
  51. data/ext/nokogiri/xml_syntax_error.h +1 -1
  52. data/ext/nokogiri/xml_text.c +10 -3
  53. data/ext/nokogiri/xml_text.h +1 -1
  54. data/ext/nokogiri/xml_xpath.h +1 -1
  55. data/ext/nokogiri/xml_xpath_context.h +1 -1
  56. data/ext/nokogiri/xslt_stylesheet.c +29 -16
  57. data/ext/nokogiri/xslt_stylesheet.h +1 -1
  58. data/lib/action-nokogiri.rb +7 -1
  59. data/lib/nokogiri.rb +21 -5
  60. data/lib/nokogiri/css/generated_parser.rb +49 -14
  61. data/lib/nokogiri/css/generated_tokenizer.rb +2 -2
  62. data/lib/nokogiri/css/node.rb +13 -3
  63. data/lib/nokogiri/css/parser.rb +8 -0
  64. data/lib/nokogiri/css/parser.y +7 -7
  65. data/lib/nokogiri/css/tokenizer.rb +2 -0
  66. data/lib/nokogiri/css/xpath_visitor.rb +10 -6
  67. data/lib/nokogiri/decorators/hpricot/node.rb +1 -1
  68. data/lib/nokogiri/decorators/hpricot/node_set.rb +2 -2
  69. data/lib/nokogiri/decorators/hpricot/xpath_visitor.rb +2 -0
  70. data/lib/nokogiri/decorators/slop.rb +3 -1
  71. data/lib/nokogiri/ffi/html/document.rb +37 -0
  72. data/lib/nokogiri/ffi/html/element_description.rb +85 -0
  73. data/lib/nokogiri/ffi/html/entity_lookup.rb +16 -0
  74. data/lib/nokogiri/ffi/html/sax/parser.rb +21 -0
  75. data/lib/nokogiri/ffi/io_callbacks.rb +32 -0
  76. data/lib/nokogiri/ffi/libxml.rb +314 -0
  77. data/lib/nokogiri/ffi/structs/common_node.rb +26 -0
  78. data/lib/nokogiri/ffi/structs/html_elem_desc.rb +24 -0
  79. data/lib/nokogiri/ffi/structs/html_entity_desc.rb +13 -0
  80. data/lib/nokogiri/ffi/structs/xml_alloc.rb +16 -0
  81. data/lib/nokogiri/ffi/structs/xml_attr.rb +19 -0
  82. data/lib/nokogiri/ffi/structs/xml_buffer.rb +16 -0
  83. data/lib/nokogiri/ffi/structs/xml_document.rb +108 -0
  84. data/lib/nokogiri/ffi/structs/xml_dtd.rb +26 -0
  85. data/lib/nokogiri/ffi/structs/xml_node.rb +28 -0
  86. data/lib/nokogiri/ffi/structs/xml_node_set.rb +53 -0
  87. data/lib/nokogiri/ffi/structs/xml_notation.rb +11 -0
  88. data/lib/nokogiri/ffi/structs/xml_ns.rb +15 -0
  89. data/lib/nokogiri/ffi/structs/xml_relax_ng.rb +14 -0
  90. data/lib/nokogiri/ffi/structs/xml_sax_handler.rb +51 -0
  91. data/lib/nokogiri/ffi/structs/xml_sax_push_parser_context.rb +14 -0
  92. data/lib/nokogiri/ffi/structs/xml_schema.rb +13 -0
  93. data/lib/nokogiri/ffi/structs/xml_syntax_error.rb +31 -0
  94. data/lib/nokogiri/ffi/structs/xml_text_reader.rb +12 -0
  95. data/lib/nokogiri/ffi/structs/xml_xpath_context.rb +37 -0
  96. data/lib/nokogiri/ffi/structs/xml_xpath_object.rb +35 -0
  97. data/lib/nokogiri/ffi/structs/xml_xpath_parser_context.rb +20 -0
  98. data/lib/nokogiri/ffi/structs/xslt_stylesheet.rb +13 -0
  99. data/lib/nokogiri/ffi/xml/attr.rb +41 -0
  100. data/lib/nokogiri/ffi/xml/cdata.rb +19 -0
  101. data/lib/nokogiri/ffi/xml/comment.rb +18 -0
  102. data/lib/nokogiri/ffi/xml/document.rb +107 -0
  103. data/lib/nokogiri/ffi/xml/document_fragment.rb +26 -0
  104. data/lib/nokogiri/ffi/xml/dtd.rb +42 -0
  105. data/lib/nokogiri/ffi/xml/entity_reference.rb +19 -0
  106. data/lib/nokogiri/ffi/xml/namespace.rb +38 -0
  107. data/lib/nokogiri/ffi/xml/node.rb +380 -0
  108. data/lib/nokogiri/ffi/xml/node_set.rb +130 -0
  109. data/lib/nokogiri/ffi/xml/processing_instruction.rb +20 -0
  110. data/lib/nokogiri/ffi/xml/reader.rb +217 -0
  111. data/lib/nokogiri/ffi/xml/relax_ng.rb +51 -0
  112. data/lib/nokogiri/ffi/xml/sax/parser.rb +148 -0
  113. data/lib/nokogiri/ffi/xml/sax/push_parser.rb +38 -0
  114. data/lib/nokogiri/ffi/xml/schema.rb +55 -0
  115. data/lib/nokogiri/ffi/xml/syntax_error.rb +76 -0
  116. data/lib/nokogiri/ffi/xml/text.rb +18 -0
  117. data/lib/nokogiri/ffi/xml/xpath.rb +19 -0
  118. data/lib/nokogiri/ffi/xml/xpath_context.rb +135 -0
  119. data/lib/nokogiri/ffi/xslt/stylesheet.rb +47 -0
  120. data/lib/nokogiri/hpricot.rb +14 -3
  121. data/lib/nokogiri/html.rb +11 -46
  122. data/lib/nokogiri/html/builder.rb +27 -1
  123. data/lib/nokogiri/html/document.rb +62 -6
  124. data/lib/nokogiri/html/document_fragment.rb +15 -0
  125. data/lib/nokogiri/html/element_description.rb +23 -0
  126. data/lib/nokogiri/html/entity_lookup.rb +2 -0
  127. data/lib/nokogiri/html/sax/parser.rb +27 -1
  128. data/lib/nokogiri/version.rb +26 -1
  129. data/lib/nokogiri/version_warning.rb +11 -0
  130. data/lib/nokogiri/xml.rb +25 -51
  131. data/lib/nokogiri/xml/builder.rb +166 -10
  132. data/lib/nokogiri/xml/cdata.rb +3 -1
  133. data/lib/nokogiri/xml/document.rb +39 -6
  134. data/lib/nokogiri/xml/document_fragment.rb +41 -1
  135. data/lib/nokogiri/xml/dtd.rb +3 -1
  136. data/lib/nokogiri/xml/entity_declaration.rb +3 -1
  137. data/lib/nokogiri/xml/fragment_handler.rb +24 -3
  138. data/lib/nokogiri/xml/namespace.rb +7 -0
  139. data/lib/nokogiri/xml/node.rb +314 -65
  140. data/lib/nokogiri/xml/node/save_options.rb +12 -2
  141. data/lib/nokogiri/xml/node_set.rb +58 -8
  142. data/lib/nokogiri/xml/parse_options.rb +80 -0
  143. data/lib/nokogiri/xml/processing_instruction.rb +2 -0
  144. data/lib/nokogiri/xml/reader.rb +42 -3
  145. data/lib/nokogiri/xml/relax_ng.rb +32 -0
  146. data/lib/nokogiri/xml/sax.rb +0 -7
  147. data/lib/nokogiri/xml/sax/document.rb +84 -0
  148. data/lib/nokogiri/xml/sax/parser.rb +38 -2
  149. data/lib/nokogiri/xml/sax/push_parser.rb +12 -0
  150. data/lib/nokogiri/xml/schema.rb +65 -0
  151. data/lib/nokogiri/xml/syntax_error.rb +11 -0
  152. data/lib/nokogiri/xml/xpath.rb +1 -1
  153. data/lib/nokogiri/xml/xpath_context.rb +2 -0
  154. data/lib/nokogiri/xslt.rb +21 -1
  155. data/lib/nokogiri/xslt/stylesheet.rb +19 -0
  156. data/lib/xsd/xmlparser/nokogiri.rb +12 -2
  157. data/tasks/test.rb +42 -19
  158. data/test/css/test_parser.rb +29 -0
  159. data/test/ffi/test_document.rb +35 -0
  160. data/test/files/address_book.rlx +12 -0
  161. data/test/files/address_book.xml +10 -0
  162. data/test/files/po.xml +32 -0
  163. data/test/files/po.xsd +66 -0
  164. data/test/helper.rb +38 -8
  165. data/test/html/sax/test_parser.rb +12 -0
  166. data/test/html/test_builder.rb +25 -2
  167. data/test/html/test_document.rb +91 -20
  168. data/test/html/test_document_fragment.rb +97 -0
  169. data/test/html/test_element_description.rb +95 -0
  170. data/test/html/test_node.rb +66 -3
  171. data/test/test_convert_xpath.rb +1 -1
  172. data/test/test_memory_leak.rb +57 -18
  173. data/test/test_nokogiri.rb +24 -2
  174. data/test/test_reader.rb +77 -0
  175. data/test/test_xslt_transforms.rb +120 -82
  176. data/test/xml/node/test_subclass.rb +44 -0
  177. data/test/xml/sax/test_parser.rb +9 -0
  178. data/test/xml/sax/test_push_parser.rb +24 -0
  179. data/test/xml/test_attr.rb +7 -0
  180. data/test/xml/test_builder.rb +48 -0
  181. data/test/xml/test_cdata.rb +19 -0
  182. data/test/xml/test_comment.rb +6 -0
  183. data/test/xml/test_document.rb +101 -2
  184. data/test/xml/test_document_fragment.rb +55 -3
  185. data/test/xml/test_entity_reference.rb +4 -0
  186. data/test/xml/test_namespace.rb +43 -0
  187. data/test/xml/test_node.rb +255 -8
  188. data/test/xml/test_node_attributes.rb +34 -0
  189. data/test/xml/test_node_encoding.rb +9 -2
  190. data/test/xml/test_node_set.rb +197 -1
  191. data/test/xml/test_parse_options.rb +52 -0
  192. data/test/xml/test_processing_instruction.rb +5 -0
  193. data/test/xml/test_relax_ng.rb +60 -0
  194. data/test/xml/test_schema.rb +65 -0
  195. data/test/xml/test_text.rb +5 -0
  196. data/test/xml/test_unparented_node.rb +3 -3
  197. metadata +128 -12
  198. data/lib/nokogiri/xml/comment.rb +0 -6
  199. data/lib/nokogiri/xml/element.rb +0 -6
  200. data/lib/nokogiri/xml/text.rb +0 -6
@@ -1,7 +1,7 @@
1
1
  #ifndef NOKOGIRI_XML_READER
2
2
  #define NOKOGIRI_XML_READER
3
3
 
4
- #include <native.h>
4
+ #include <nokogiri.h>
5
5
 
6
6
  void init_xml_reader();
7
7
 
@@ -0,0 +1,106 @@
1
+ #include <xml_relax_ng.h>
2
+
3
+ static void dealloc(xmlRelaxNGPtr schema)
4
+ {
5
+ NOKOGIRI_DEBUG_START(schema);
6
+ xmlRelaxNGFree(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 RelaxNG schema.
15
+ */
16
+ static VALUE validate_document(VALUE self, VALUE document)
17
+ {
18
+ xmlDocPtr doc;
19
+ xmlRelaxNGPtr schema;
20
+
21
+ Data_Get_Struct(self, xmlRelaxNG, schema);
22
+ Data_Get_Struct(document, xmlDoc, doc);
23
+
24
+ VALUE errors = rb_ary_new();
25
+
26
+ xmlRelaxNGValidCtxtPtr valid_ctxt = xmlRelaxNGNewValidCtxt(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
+ if (! is_2_6_16()) {
34
+ xmlRelaxNGSetValidStructuredErrors(
35
+ valid_ctxt,
36
+ Nokogiri_error_array_pusher,
37
+ (void *)errors
38
+ );
39
+ }
40
+
41
+ xmlRelaxNGValidateDoc(valid_ctxt, doc);
42
+
43
+ xmlRelaxNGFreeValidCtxt(valid_ctxt);
44
+
45
+ return errors;
46
+ }
47
+
48
+ /*
49
+ * call-seq:
50
+ * read_memory(string)
51
+ *
52
+ * Create a new RelaxNG from the contents of +string+
53
+ */
54
+ static VALUE read_memory(VALUE klass, VALUE content)
55
+ {
56
+ xmlRelaxNGParserCtxtPtr ctx = xmlRelaxNGNewMemParserCtxt(
57
+ (const char *)StringValuePtr(content),
58
+ RSTRING_LEN(content)
59
+ );
60
+
61
+ VALUE errors = rb_ary_new();
62
+ xmlSetStructuredErrorFunc((void *)errors, Nokogiri_error_array_pusher);
63
+
64
+ if (! is_2_6_16()) {
65
+ xmlRelaxNGSetParserStructuredErrors(
66
+ ctx,
67
+ Nokogiri_error_array_pusher,
68
+ (void *)errors
69
+ );
70
+ }
71
+
72
+ xmlRelaxNGPtr schema = xmlRelaxNGParse(ctx);
73
+
74
+ xmlSetStructuredErrorFunc(NULL, NULL);
75
+ xmlRelaxNGFreeParserCtxt(ctx);
76
+
77
+ if(NULL == schema) {
78
+ xmlErrorPtr error = xmlGetLastError();
79
+ if(error)
80
+ rb_funcall(rb_mKernel, rb_intern("raise"), 1,
81
+ Nokogiri_wrap_xml_syntax_error((VALUE)NULL, error)
82
+ );
83
+ else
84
+ rb_raise(rb_eRuntimeError, "Could not parse document");
85
+
86
+ return Qnil;
87
+ }
88
+
89
+ VALUE rb_schema = Data_Wrap_Struct(klass, 0, dealloc, schema);
90
+ rb_iv_set(rb_schema, "@errors", errors);
91
+
92
+ return rb_schema;
93
+ }
94
+
95
+ VALUE cNokogiriXmlRelaxNG;
96
+ void init_xml_relax_ng()
97
+ {
98
+ VALUE nokogiri = rb_define_module("Nokogiri");
99
+ VALUE xml = rb_define_module_under(nokogiri, "XML");
100
+ VALUE klass = rb_define_class_under(xml, "RelaxNG", cNokogiriXmlSchema);
101
+
102
+ cNokogiriXmlRelaxNG = klass;
103
+
104
+ rb_define_singleton_method(klass, "read_memory", read_memory, 1);
105
+ rb_define_private_method(klass, "validate_document", validate_document, 1);
106
+ }
@@ -0,0 +1,9 @@
1
+ #ifndef NOKOGIRI_XML_RELAX_NG
2
+ #define NOKOGIRI_XML_RELAX_NG
3
+
4
+ #include <nokogiri.h>
5
+
6
+ void init_xml_relax_ng();
7
+
8
+ extern VALUE cNokogiriXmlRelaxNG;
9
+ #endif
@@ -1,5 +1,4 @@
1
- #include <stdio.h>
2
- #include <xml_sax_parser.h>
1
+ #include <nokogiri.h>
3
2
 
4
3
  /*
5
4
  * call-seq:
@@ -11,6 +10,9 @@ static VALUE parse_memory(VALUE self, VALUE data)
11
10
  {
12
11
  xmlSAXHandlerPtr handler;
13
12
  Data_Get_Struct(self, xmlSAXHandler, handler);
13
+
14
+ if(Qnil == data) rb_raise(rb_eArgError, "data cannot be nil");
15
+
14
16
  xmlSAXUserParseMemory( handler,
15
17
  (void *)self,
16
18
  StringValuePtr(data),
@@ -111,6 +113,121 @@ static void end_element(void * ctx, const xmlChar *name)
111
113
  );
112
114
  }
113
115
 
116
+ /**
117
+ * start_element_ns was borrowed heavily from libxml-ruby.
118
+ */
119
+ static void
120
+ start_element_ns (
121
+ void * ctx,
122
+ const xmlChar * localname,
123
+ const xmlChar * prefix,
124
+ const xmlChar * URI,
125
+ int nb_namespaces,
126
+ const xmlChar ** namespaces,
127
+ int nb_attributes,
128
+ int nb_defaulted,
129
+ const xmlChar ** attributes)
130
+ {
131
+ VALUE self = (VALUE)ctx;
132
+ VALUE doc = rb_funcall(self, rb_intern("document"), 0);
133
+ VALUE MAYBE_UNUSED(enc) = rb_iv_get(self, "@encoding");
134
+
135
+ VALUE attrHash = rb_hash_new();
136
+ VALUE nsHash = rb_hash_new();
137
+
138
+ if (attributes)
139
+ {
140
+ /* Each attribute is an array of [localname, prefix, URI, value, end] */
141
+ int i;
142
+ for (i = 0; i < nb_attributes * 5; i += 5)
143
+ {
144
+ rb_hash_aset( attrHash,
145
+ NOKOGIRI_STR_NEW2((const char*)attributes[i+0], RTEST(enc) ? StringValuePtr(enc) : NULL),
146
+ NOKOGIRI_STR_NEW((const char*)attributes[i+3], (attributes[i+4] - attributes[i+3]), RTEST(enc) ? StringValuePtr(enc) : NULL));
147
+ }
148
+ }
149
+
150
+ if (namespaces)
151
+ {
152
+ int i;
153
+ for (i = 0; i < nb_namespaces * 2; i += 2)
154
+ {
155
+ rb_hash_aset( nsHash,
156
+ namespaces[i+0] ? NOKOGIRI_STR_NEW2((const char*)namespaces[i+0], RTEST(enc) ? StringValuePtr(enc) : NULL) : Qnil,
157
+ namespaces[i+1] ? NOKOGIRI_STR_NEW2((const char*)namespaces[i+1], RTEST(enc) ? StringValuePtr(enc) : NULL) : Qnil);
158
+ }
159
+ }
160
+
161
+ rb_funcall( doc,
162
+ rb_intern("start_element_ns"),
163
+ 5,
164
+ NOKOGIRI_STR_NEW2(localname, RTEST(enc) ? StringValuePtr(enc) : NULL),
165
+ attrHash,
166
+ prefix ? NOKOGIRI_STR_NEW2(prefix, RTEST(enc) ? StringValuePtr(enc) : NULL) : Qnil,
167
+ URI ? NOKOGIRI_STR_NEW2(URI, RTEST(enc) ? StringValuePtr(enc) : NULL) : Qnil,
168
+ nsHash
169
+ );
170
+
171
+ /* Call start element if it's there' */
172
+ if (rb_respond_to(doc, rb_intern("start_element")))
173
+ {
174
+ VALUE name;
175
+ if (prefix)
176
+ {
177
+ name = NOKOGIRI_STR_NEW2(prefix, RTEST(enc) ? StringValuePtr(enc) : NULL);
178
+ rb_funcall(name, rb_intern("<<"), 1, NOKOGIRI_STR_NEW2(":", RTEST(enc) ? StringValuePtr(enc) : NULL));
179
+ rb_funcall(name, rb_intern("<<"), 1, NOKOGIRI_STR_NEW2(localname, RTEST(enc) ? StringValuePtr(enc) : NULL));
180
+ }
181
+ else
182
+ {
183
+ name = NOKOGIRI_STR_NEW2(localname, RTEST(enc) ? StringValuePtr(enc) : NULL);
184
+ }
185
+ VALUE attrArray = rb_funcall(attrHash, rb_intern("to_a"), 0);
186
+ attrArray = rb_funcall(attrArray, rb_intern("flatten"), 0);
187
+ rb_funcall(doc, rb_intern("start_element"), 2, name, attrArray);
188
+ }
189
+
190
+ }
191
+
192
+ /**
193
+ * end_element_ns was borrowed heavily from libxml-ruby.
194
+ */
195
+ static void
196
+ end_element_ns (
197
+ void * ctx,
198
+ const xmlChar * localname,
199
+ const xmlChar * prefix,
200
+ const xmlChar * URI)
201
+ {
202
+ VALUE self = (VALUE)ctx;
203
+ VALUE doc = rb_funcall(self, rb_intern("document"), 0);
204
+ VALUE MAYBE_UNUSED(enc) = rb_iv_get(self, "@encoding");
205
+
206
+ rb_funcall(doc, rb_intern("end_element_ns"), 3,
207
+ NOKOGIRI_STR_NEW2(localname, RTEST(enc) ? StringValuePtr(enc) : NULL),
208
+ prefix ? NOKOGIRI_STR_NEW2(prefix, RTEST(enc) ? StringValuePtr(enc) : NULL) : Qnil,
209
+ URI ? NOKOGIRI_STR_NEW2(URI, RTEST(enc) ? StringValuePtr(enc) : NULL) : Qnil
210
+ );
211
+
212
+ /* Call end element for old-times sake */
213
+ if (rb_respond_to(doc, rb_intern("end_element")))
214
+ {
215
+ VALUE name;
216
+ if (prefix)
217
+ {
218
+ name = NOKOGIRI_STR_NEW2(prefix, RTEST(enc) ? StringValuePtr(enc) : NULL);
219
+ rb_funcall(name, rb_intern("<<"), 1, NOKOGIRI_STR_NEW2(":", RTEST(enc) ? StringValuePtr(enc) : NULL));
220
+ rb_funcall(name, rb_intern("<<"), 1, NOKOGIRI_STR_NEW2(localname, RTEST(enc) ? StringValuePtr(enc) : NULL));
221
+ }
222
+ else
223
+ {
224
+ name = NOKOGIRI_STR_NEW2(localname, RTEST(enc) ? StringValuePtr(enc) : NULL);
225
+ }
226
+ rb_funcall(doc, rb_intern("end_element"), 1, name);
227
+ }
228
+
229
+ }
230
+
114
231
  static void characters_func(void * ctx, const xmlChar * ch, int len)
115
232
  {
116
233
  VALUE self = (VALUE)ctx;
@@ -190,11 +307,14 @@ static VALUE allocate(VALUE klass)
190
307
  handler->endDocument = end_document;
191
308
  handler->startElement = start_element;
192
309
  handler->endElement = end_element;
310
+ handler->startElementNs = start_element_ns;
311
+ handler->endElementNs = end_element_ns;
193
312
  handler->characters = characters_func;
194
313
  handler->comment = comment_func;
195
314
  handler->warning = warning_func;
196
315
  handler->error = error_func;
197
316
  handler->cdataBlock = cdata_block;
317
+ handler->initialized = XML_SAX2_MAGIC;
198
318
 
199
319
  return Data_Wrap_Struct(klass, NULL, deallocate, handler);
200
320
  }
@@ -1,7 +1,7 @@
1
1
  #ifndef NOKOGIRI_XML_SAX_PARSER
2
2
  #define NOKOGIRI_XML_SAX_PARSER
3
3
 
4
- #include <native.h>
4
+ #include <nokogiri.h>
5
5
 
6
6
  void init_xml_sax_parser();
7
7
 
@@ -65,6 +65,7 @@ static VALUE initialize_native(VALUE self, VALUE _xml_sax, VALUE _filename)
65
65
  if(ctx == NULL)
66
66
  rb_raise(rb_eRuntimeError, "Could not create a parser context");
67
67
 
68
+ ctx->sax2 = 1;
68
69
  DATA_PTR(self) = ctx;
69
70
  return self;
70
71
  }
@@ -1,7 +1,7 @@
1
1
  #ifndef NOKOGIRI_XML_SAX_PUSH_PARSER
2
2
  #define NOKOGIRI_XML_SAX_PUSH_PARSER
3
3
 
4
- #include <native.h>
4
+ #include <nokogiri.h>
5
5
 
6
6
  void init_xml_sax_push_parser();
7
7
 
@@ -0,0 +1,107 @@
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
+ if (! is_2_6_16()) {
34
+ xmlSchemaSetValidStructuredErrors(
35
+ valid_ctxt,
36
+ Nokogiri_error_array_pusher,
37
+ (void *)errors
38
+ );
39
+ }
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
+ if (! is_2_6_16()) {
66
+ xmlSchemaSetParserStructuredErrors(
67
+ ctx,
68
+ Nokogiri_error_array_pusher,
69
+ (void *)errors
70
+ );
71
+ }
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
+ rb_funcall(rb_mKernel, rb_intern("raise"), 1,
82
+ Nokogiri_wrap_xml_syntax_error((VALUE)NULL, error)
83
+ );
84
+ else
85
+ rb_raise(rb_eRuntimeError, "Could not parse document");
86
+
87
+ return Qnil;
88
+ }
89
+
90
+ VALUE rb_schema = Data_Wrap_Struct(klass, 0, dealloc, schema);
91
+ rb_iv_set(rb_schema, "@errors", errors);
92
+
93
+ return rb_schema;
94
+ }
95
+
96
+ VALUE cNokogiriXmlSchema;
97
+ void init_xml_schema()
98
+ {
99
+ VALUE nokogiri = rb_define_module("Nokogiri");
100
+ VALUE xml = rb_define_module_under(nokogiri, "XML");
101
+ VALUE klass = rb_define_class_under(xml, "Schema", rb_cObject);
102
+
103
+ cNokogiriXmlSchema = klass;
104
+
105
+ rb_define_singleton_method(klass, "read_memory", read_memory, 1);
106
+ rb_define_private_method(klass, "validate_document", validate_document, 1);
107
+ }
@@ -0,0 +1,9 @@
1
+ #ifndef NOKOGIRI_XML_SCHEMA
2
+ #define NOKOGIRI_XML_SCHEMA
3
+
4
+ #include <nokogiri.h>
5
+
6
+ void init_xml_schema();
7
+
8
+ extern VALUE cNokogiriXmlSchema;
9
+ #endif
@@ -1,7 +1,7 @@
1
1
  #ifndef NOKOGIRI_XML_SYNTAX_ERROR
2
2
  #define NOKOGIRI_XML_SYNTAX_ERROR
3
3
 
4
- #include <native.h>
4
+ #include <nokogiri.h>
5
5
 
6
6
  void init_xml_syntax_error();
7
7
  VALUE Nokogiri_wrap_xml_syntax_error(VALUE klass, xmlErrorPtr error);
@@ -6,15 +6,22 @@
6
6
  *
7
7
  * Create a new Text element on the +document+ with +content+
8
8
  */
9
- static VALUE new(VALUE klass, VALUE string, VALUE document)
9
+ static VALUE new(int argc, VALUE *argv, VALUE klass)
10
10
  {
11
11
  xmlDocPtr doc;
12
+ VALUE string;
13
+ VALUE document;
14
+ VALUE rest;
15
+
16
+ rb_scan_args(argc, argv, "2*", &string, &document, &rest);
17
+
12
18
  Data_Get_Struct(document, xmlDoc, doc);
13
19
 
14
20
  xmlNodePtr node = xmlNewText((xmlChar *)StringValuePtr(string));
15
21
  node->doc = doc;
16
22
 
17
- VALUE rb_node = Nokogiri_wrap_xml_node(node) ;
23
+ VALUE rb_node = Nokogiri_wrap_xml_node(klass, node) ;
24
+ rb_funcall2(rb_node, rb_intern("initialize"), argc, argv);
18
25
 
19
26
  if(rb_block_given_p()) rb_yield(rb_node);
20
27
 
@@ -36,5 +43,5 @@ void init_xml_text()
36
43
 
37
44
  cNokogiriXmlText = klass;
38
45
 
39
- rb_define_singleton_method(klass, "new", new, 2);
46
+ rb_define_singleton_method(klass, "new", new, -1);
40
47
  }