nokogiri 1.9.1 → 1.15.3

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 (226) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +45 -0
  3. data/LICENSE-DEPENDENCIES.md +1636 -1024
  4. data/LICENSE.md +5 -28
  5. data/README.md +203 -89
  6. data/bin/nokogiri +63 -50
  7. data/dependencies.yml +33 -61
  8. data/ext/nokogiri/depend +38 -358
  9. data/ext/nokogiri/extconf.rb +864 -418
  10. data/ext/nokogiri/gumbo.c +594 -0
  11. data/ext/nokogiri/html4_document.c +165 -0
  12. data/ext/nokogiri/html4_element_description.c +299 -0
  13. data/ext/nokogiri/html4_entity_lookup.c +37 -0
  14. data/ext/nokogiri/html4_sax_parser_context.c +108 -0
  15. data/ext/nokogiri/html4_sax_push_parser.c +95 -0
  16. data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
  17. data/ext/nokogiri/nokogiri.c +251 -105
  18. data/ext/nokogiri/nokogiri.h +215 -90
  19. data/ext/nokogiri/test_global_handlers.c +40 -0
  20. data/ext/nokogiri/xml_attr.c +17 -17
  21. data/ext/nokogiri/xml_attribute_decl.c +22 -22
  22. data/ext/nokogiri/xml_cdata.c +40 -31
  23. data/ext/nokogiri/xml_comment.c +20 -27
  24. data/ext/nokogiri/xml_document.c +401 -240
  25. data/ext/nokogiri/xml_document_fragment.c +13 -17
  26. data/ext/nokogiri/xml_dtd.c +64 -58
  27. data/ext/nokogiri/xml_element_content.c +63 -55
  28. data/ext/nokogiri/xml_element_decl.c +31 -31
  29. data/ext/nokogiri/xml_encoding_handler.c +54 -21
  30. data/ext/nokogiri/xml_entity_decl.c +37 -35
  31. data/ext/nokogiri/xml_entity_reference.c +17 -19
  32. data/ext/nokogiri/xml_namespace.c +135 -61
  33. data/ext/nokogiri/xml_node.c +1346 -677
  34. data/ext/nokogiri/xml_node_set.c +246 -216
  35. data/ext/nokogiri/xml_processing_instruction.c +18 -20
  36. data/ext/nokogiri/xml_reader.c +347 -212
  37. data/ext/nokogiri/xml_relax_ng.c +86 -77
  38. data/ext/nokogiri/xml_sax_parser.c +149 -124
  39. data/ext/nokogiri/xml_sax_parser_context.c +145 -103
  40. data/ext/nokogiri/xml_sax_push_parser.c +64 -36
  41. data/ext/nokogiri/xml_schema.c +138 -81
  42. data/ext/nokogiri/xml_syntax_error.c +42 -21
  43. data/ext/nokogiri/xml_text.c +36 -26
  44. data/ext/nokogiri/xml_xpath_context.c +366 -178
  45. data/ext/nokogiri/xslt_stylesheet.c +335 -189
  46. data/gumbo-parser/CHANGES.md +63 -0
  47. data/gumbo-parser/Makefile +111 -0
  48. data/gumbo-parser/THANKS +27 -0
  49. data/gumbo-parser/src/Makefile +34 -0
  50. data/gumbo-parser/src/README.md +41 -0
  51. data/gumbo-parser/src/ascii.c +75 -0
  52. data/gumbo-parser/src/ascii.h +115 -0
  53. data/gumbo-parser/src/attribute.c +42 -0
  54. data/gumbo-parser/src/attribute.h +17 -0
  55. data/gumbo-parser/src/char_ref.c +22225 -0
  56. data/gumbo-parser/src/char_ref.h +29 -0
  57. data/gumbo-parser/src/char_ref.rl +2154 -0
  58. data/gumbo-parser/src/error.c +630 -0
  59. data/gumbo-parser/src/error.h +148 -0
  60. data/gumbo-parser/src/foreign_attrs.c +103 -0
  61. data/gumbo-parser/src/foreign_attrs.gperf +27 -0
  62. data/gumbo-parser/src/insertion_mode.h +33 -0
  63. data/gumbo-parser/src/macros.h +91 -0
  64. data/gumbo-parser/src/nokogiri_gumbo.h +944 -0
  65. data/gumbo-parser/src/parser.c +4891 -0
  66. data/gumbo-parser/src/parser.h +41 -0
  67. data/gumbo-parser/src/replacement.h +33 -0
  68. data/gumbo-parser/src/string_buffer.c +103 -0
  69. data/gumbo-parser/src/string_buffer.h +68 -0
  70. data/gumbo-parser/src/string_piece.c +48 -0
  71. data/gumbo-parser/src/svg_attrs.c +174 -0
  72. data/gumbo-parser/src/svg_attrs.gperf +77 -0
  73. data/gumbo-parser/src/svg_tags.c +137 -0
  74. data/gumbo-parser/src/svg_tags.gperf +55 -0
  75. data/gumbo-parser/src/tag.c +223 -0
  76. data/gumbo-parser/src/tag_lookup.c +382 -0
  77. data/gumbo-parser/src/tag_lookup.gperf +170 -0
  78. data/gumbo-parser/src/tag_lookup.h +13 -0
  79. data/gumbo-parser/src/token_buffer.c +79 -0
  80. data/gumbo-parser/src/token_buffer.h +71 -0
  81. data/gumbo-parser/src/token_type.h +17 -0
  82. data/gumbo-parser/src/tokenizer.c +3463 -0
  83. data/gumbo-parser/src/tokenizer.h +112 -0
  84. data/gumbo-parser/src/tokenizer_states.h +339 -0
  85. data/gumbo-parser/src/utf8.c +245 -0
  86. data/gumbo-parser/src/utf8.h +164 -0
  87. data/gumbo-parser/src/util.c +66 -0
  88. data/gumbo-parser/src/util.h +34 -0
  89. data/gumbo-parser/src/vector.c +111 -0
  90. data/gumbo-parser/src/vector.h +45 -0
  91. data/lib/nokogiri/class_resolver.rb +67 -0
  92. data/lib/nokogiri/css/node.rb +10 -8
  93. data/lib/nokogiri/css/parser.rb +397 -377
  94. data/lib/nokogiri/css/parser.y +250 -245
  95. data/lib/nokogiri/css/parser_extras.rb +54 -49
  96. data/lib/nokogiri/css/syntax_error.rb +3 -1
  97. data/lib/nokogiri/css/tokenizer.rb +107 -104
  98. data/lib/nokogiri/css/tokenizer.rex +3 -2
  99. data/lib/nokogiri/css/xpath_visitor.rb +224 -95
  100. data/lib/nokogiri/css.rb +56 -17
  101. data/lib/nokogiri/decorators/slop.rb +9 -7
  102. data/lib/nokogiri/encoding_handler.rb +57 -0
  103. data/lib/nokogiri/extension.rb +32 -0
  104. data/lib/nokogiri/gumbo.rb +15 -0
  105. data/lib/nokogiri/html.rb +38 -27
  106. data/lib/nokogiri/{html → html4}/builder.rb +4 -2
  107. data/lib/nokogiri/html4/document.rb +214 -0
  108. data/lib/nokogiri/html4/document_fragment.rb +54 -0
  109. data/lib/nokogiri/{html → html4}/element_description.rb +3 -1
  110. data/lib/nokogiri/html4/element_description_defaults.rb +2040 -0
  111. data/lib/nokogiri/html4/encoding_reader.rb +121 -0
  112. data/lib/nokogiri/{html → html4}/entity_lookup.rb +4 -2
  113. data/lib/nokogiri/{html → html4}/sax/parser.rb +17 -16
  114. data/lib/nokogiri/html4/sax/parser_context.rb +20 -0
  115. data/lib/nokogiri/{html → html4}/sax/push_parser.rb +12 -11
  116. data/lib/nokogiri/html4.rb +47 -0
  117. data/lib/nokogiri/html5/document.rb +168 -0
  118. data/lib/nokogiri/html5/document_fragment.rb +90 -0
  119. data/lib/nokogiri/html5/node.rb +103 -0
  120. data/lib/nokogiri/html5.rb +392 -0
  121. data/lib/nokogiri/jruby/dependencies.rb +3 -0
  122. data/lib/nokogiri/jruby/nokogiri_jars.rb +43 -0
  123. data/lib/nokogiri/syntax_error.rb +2 -0
  124. data/lib/nokogiri/version/constant.rb +6 -0
  125. data/lib/nokogiri/version/info.rb +223 -0
  126. data/lib/nokogiri/version.rb +3 -108
  127. data/lib/nokogiri/xml/attr.rb +55 -3
  128. data/lib/nokogiri/xml/attribute_decl.rb +6 -2
  129. data/lib/nokogiri/xml/builder.rb +98 -54
  130. data/lib/nokogiri/xml/cdata.rb +3 -1
  131. data/lib/nokogiri/xml/character_data.rb +2 -0
  132. data/lib/nokogiri/xml/document.rb +312 -126
  133. data/lib/nokogiri/xml/document_fragment.rb +93 -48
  134. data/lib/nokogiri/xml/dtd.rb +4 -2
  135. data/lib/nokogiri/xml/element_content.rb +12 -2
  136. data/lib/nokogiri/xml/element_decl.rb +6 -2
  137. data/lib/nokogiri/xml/entity_decl.rb +7 -3
  138. data/lib/nokogiri/xml/entity_reference.rb +2 -0
  139. data/lib/nokogiri/xml/namespace.rb +45 -0
  140. data/lib/nokogiri/xml/node/save_options.rb +23 -8
  141. data/lib/nokogiri/xml/node.rb +1088 -418
  142. data/lib/nokogiri/xml/node_set.rb +173 -63
  143. data/lib/nokogiri/xml/notation.rb +13 -0
  144. data/lib/nokogiri/xml/parse_options.rb +145 -52
  145. data/lib/nokogiri/xml/pp/character_data.rb +9 -6
  146. data/lib/nokogiri/xml/pp/node.rb +42 -30
  147. data/lib/nokogiri/xml/pp.rb +4 -2
  148. data/lib/nokogiri/xml/processing_instruction.rb +4 -1
  149. data/lib/nokogiri/xml/reader.rb +21 -28
  150. data/lib/nokogiri/xml/relax_ng.rb +8 -2
  151. data/lib/nokogiri/xml/sax/document.rb +45 -49
  152. data/lib/nokogiri/xml/sax/parser.rb +39 -36
  153. data/lib/nokogiri/xml/sax/parser_context.rb +8 -3
  154. data/lib/nokogiri/xml/sax/push_parser.rb +6 -5
  155. data/lib/nokogiri/xml/sax.rb +6 -4
  156. data/lib/nokogiri/xml/schema.rb +19 -9
  157. data/lib/nokogiri/xml/searchable.rb +120 -72
  158. data/lib/nokogiri/xml/syntax_error.rb +6 -4
  159. data/lib/nokogiri/xml/text.rb +2 -0
  160. data/lib/nokogiri/xml/xpath/syntax_error.rb +4 -2
  161. data/lib/nokogiri/xml/xpath.rb +15 -4
  162. data/lib/nokogiri/xml/xpath_context.rb +3 -3
  163. data/lib/nokogiri/xml.rb +38 -37
  164. data/lib/nokogiri/xslt/stylesheet.rb +3 -1
  165. data/lib/nokogiri/xslt.rb +101 -22
  166. data/lib/nokogiri.rb +59 -75
  167. data/lib/xsd/xmlparser/nokogiri.rb +29 -25
  168. data/patches/libxml2/0001-Remove-script-macro-support.patch +40 -0
  169. data/patches/libxml2/0002-Update-entities-to-remove-handling-of-ssi.patch +44 -0
  170. data/patches/libxml2/0003-libxml2.la-is-in-top_builddir.patch +25 -0
  171. data/patches/libxml2/0009-allow-wildcard-namespaces.patch +77 -0
  172. data/patches/libxml2/0010-update-config.guess-and-config.sub-for-libxml2.patch +224 -0
  173. data/patches/libxml2/0011-rip-out-libxml2-s-libc_single_threaded-support.patch +30 -0
  174. data/patches/libxslt/0001-update-config.guess-and-config.sub-for-libxslt.patch +224 -0
  175. data/ports/archives/libxml2-2.11.4.tar.xz +0 -0
  176. data/ports/archives/libxslt-1.1.38.tar.xz +0 -0
  177. metadata +128 -265
  178. data/ext/nokogiri/html_document.c +0 -170
  179. data/ext/nokogiri/html_document.h +0 -10
  180. data/ext/nokogiri/html_element_description.c +0 -279
  181. data/ext/nokogiri/html_element_description.h +0 -10
  182. data/ext/nokogiri/html_entity_lookup.c +0 -32
  183. data/ext/nokogiri/html_entity_lookup.h +0 -8
  184. data/ext/nokogiri/html_sax_parser_context.c +0 -116
  185. data/ext/nokogiri/html_sax_parser_context.h +0 -11
  186. data/ext/nokogiri/html_sax_push_parser.c +0 -87
  187. data/ext/nokogiri/html_sax_push_parser.h +0 -9
  188. data/ext/nokogiri/xml_attr.h +0 -9
  189. data/ext/nokogiri/xml_attribute_decl.h +0 -9
  190. data/ext/nokogiri/xml_cdata.h +0 -9
  191. data/ext/nokogiri/xml_comment.h +0 -9
  192. data/ext/nokogiri/xml_document.h +0 -23
  193. data/ext/nokogiri/xml_document_fragment.h +0 -10
  194. data/ext/nokogiri/xml_dtd.h +0 -10
  195. data/ext/nokogiri/xml_element_content.h +0 -10
  196. data/ext/nokogiri/xml_element_decl.h +0 -9
  197. data/ext/nokogiri/xml_encoding_handler.h +0 -8
  198. data/ext/nokogiri/xml_entity_decl.h +0 -10
  199. data/ext/nokogiri/xml_entity_reference.h +0 -9
  200. data/ext/nokogiri/xml_io.c +0 -61
  201. data/ext/nokogiri/xml_io.h +0 -11
  202. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  203. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  204. data/ext/nokogiri/xml_namespace.h +0 -14
  205. data/ext/nokogiri/xml_node.h +0 -13
  206. data/ext/nokogiri/xml_node_set.h +0 -12
  207. data/ext/nokogiri/xml_processing_instruction.h +0 -9
  208. data/ext/nokogiri/xml_reader.h +0 -10
  209. data/ext/nokogiri/xml_relax_ng.h +0 -9
  210. data/ext/nokogiri/xml_sax_parser.h +0 -39
  211. data/ext/nokogiri/xml_sax_parser_context.h +0 -10
  212. data/ext/nokogiri/xml_sax_push_parser.h +0 -9
  213. data/ext/nokogiri/xml_schema.h +0 -9
  214. data/ext/nokogiri/xml_syntax_error.h +0 -13
  215. data/ext/nokogiri/xml_text.h +0 -9
  216. data/ext/nokogiri/xml_xpath_context.h +0 -10
  217. data/ext/nokogiri/xslt_stylesheet.h +0 -14
  218. data/lib/nokogiri/html/document.rb +0 -335
  219. data/lib/nokogiri/html/document_fragment.rb +0 -49
  220. data/lib/nokogiri/html/element_description_defaults.rb +0 -671
  221. data/lib/nokogiri/html/sax/parser_context.rb +0 -16
  222. data/patches/libxml2/0001-Revert-Do-not-URI-escape-in-server-side-includes.patch +0 -78
  223. data/patches/libxml2/0002-Fix-nullptr-deref-with-XPath-logic-ops.patch +0 -54
  224. data/patches/libxml2/0003-Fix-infinite-loop-in-LZMA-decompression.patch +0 -50
  225. data/ports/archives/libxml2-2.9.8.tar.gz +0 -0
  226. data/ports/archives/libxslt-1.1.32.tar.gz +0 -0
@@ -1,33 +1,44 @@
1
- #include <xml_schema.h>
1
+ #include <nokogiri.h>
2
2
 
3
- static void dealloc(xmlSchemaPtr schema)
3
+ VALUE cNokogiriXmlSchema;
4
+
5
+ static void
6
+ xml_schema_deallocate(void *data)
4
7
  {
5
- NOKOGIRI_DEBUG_START(schema);
8
+ xmlSchemaPtr schema = data;
6
9
  xmlSchemaFree(schema);
7
- NOKOGIRI_DEBUG_END(schema);
8
10
  }
9
11
 
12
+ static const rb_data_type_t xml_schema_type = {
13
+ .wrap_struct_name = "Nokogiri::XML::Schema",
14
+ .function = {
15
+ .dfree = xml_schema_deallocate,
16
+ },
17
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
18
+ };
19
+
10
20
  /*
11
21
  * call-seq:
12
22
  * validate_document(document)
13
23
  *
14
24
  * Validate a Nokogiri::XML::Document against this Schema.
15
25
  */
16
- static VALUE validate_document(VALUE self, VALUE document)
26
+ static VALUE
27
+ validate_document(VALUE self, VALUE document)
17
28
  {
18
29
  xmlDocPtr doc;
19
30
  xmlSchemaPtr schema;
20
31
  xmlSchemaValidCtxtPtr valid_ctxt;
21
32
  VALUE errors;
22
33
 
23
- Data_Get_Struct(self, xmlSchema, schema);
24
- Data_Get_Struct(document, xmlDoc, doc);
34
+ TypedData_Get_Struct(self, xmlSchema, &xml_schema_type, schema);
35
+ doc = noko_xml_document_unwrap(document);
25
36
 
26
37
  errors = rb_ary_new();
27
38
 
28
39
  valid_ctxt = xmlSchemaNewValidCtxt(schema);
29
40
 
30
- if(NULL == valid_ctxt) {
41
+ if (NULL == valid_ctxt) {
31
42
  /* we have a problem */
32
43
  rb_raise(rb_eRuntimeError, "Could not create a validation context");
33
44
  }
@@ -53,21 +64,22 @@ static VALUE validate_document(VALUE self, VALUE document)
53
64
  *
54
65
  * Validate a file against this Schema.
55
66
  */
56
- static VALUE validate_file(VALUE self, VALUE rb_filename)
67
+ static VALUE
68
+ validate_file(VALUE self, VALUE rb_filename)
57
69
  {
58
70
  xmlSchemaPtr schema;
59
71
  xmlSchemaValidCtxtPtr valid_ctxt;
60
72
  const char *filename ;
61
73
  VALUE errors;
62
74
 
63
- Data_Get_Struct(self, xmlSchema, schema);
64
- filename = (const char*)StringValueCStr(rb_filename) ;
75
+ TypedData_Get_Struct(self, xmlSchema, &xml_schema_type, schema);
76
+ filename = (const char *)StringValueCStr(rb_filename) ;
65
77
 
66
78
  errors = rb_ary_new();
67
79
 
68
80
  valid_ctxt = xmlSchemaNewValidCtxt(schema);
69
81
 
70
- if(NULL == valid_ctxt) {
82
+ if (NULL == valid_ctxt) {
71
83
  /* we have a problem */
72
84
  rb_raise(rb_eRuntimeError, "Could not create a validation context");
73
85
  }
@@ -87,119 +99,164 @@ static VALUE validate_file(VALUE self, VALUE rb_filename)
87
99
  return errors;
88
100
  }
89
101
 
90
- /*
91
- * call-seq:
92
- * read_memory(string)
93
- *
94
- * Create a new Schema from the contents of +string+
95
- */
96
- static VALUE read_memory(VALUE klass, VALUE content)
102
+ static VALUE
103
+ xml_schema_parse_schema(
104
+ VALUE klass,
105
+ xmlSchemaParserCtxtPtr c_parser_context,
106
+ VALUE rb_parse_options
107
+ )
97
108
  {
98
- xmlSchemaPtr schema;
99
- xmlSchemaParserCtxtPtr ctx = xmlSchemaNewMemParserCtxt(
100
- (const char *)StringValuePtr(content),
101
- (int)RSTRING_LEN(content)
102
- );
109
+ VALUE rb_errors;
110
+ int parse_options_int;
111
+ xmlSchemaPtr c_schema;
112
+ xmlExternalEntityLoader old_loader = 0;
103
113
  VALUE rb_schema;
104
- VALUE errors = rb_ary_new();
105
- xmlSetStructuredErrorFunc((void *)errors, Nokogiri_error_array_pusher);
114
+
115
+ if (NIL_P(rb_parse_options)) {
116
+ rb_parse_options = rb_const_get_at(
117
+ rb_const_get_at(mNokogiriXml, rb_intern("ParseOptions")),
118
+ rb_intern("DEFAULT_SCHEMA")
119
+ );
120
+ }
121
+
122
+ rb_errors = rb_ary_new();
123
+ xmlSetStructuredErrorFunc((void *)rb_errors, Nokogiri_error_array_pusher);
106
124
 
107
125
  #ifdef HAVE_XMLSCHEMASETPARSERSTRUCTUREDERRORS
108
126
  xmlSchemaSetParserStructuredErrors(
109
- ctx,
127
+ c_parser_context,
110
128
  Nokogiri_error_array_pusher,
111
- (void *)errors
129
+ (void *)rb_errors
112
130
  );
113
131
  #endif
114
132
 
115
- schema = xmlSchemaParse(ctx);
133
+ parse_options_int = (int)NUM2INT(rb_funcall(rb_parse_options, rb_intern("to_i"), 0));
134
+ if (parse_options_int & XML_PARSE_NONET) {
135
+ old_loader = xmlGetExternalEntityLoader();
136
+ xmlSetExternalEntityLoader(xmlNoNetExternalEntityLoader);
137
+ }
138
+
139
+ c_schema = xmlSchemaParse(c_parser_context);
140
+
141
+ if (old_loader) {
142
+ xmlSetExternalEntityLoader(old_loader);
143
+ }
116
144
 
117
145
  xmlSetStructuredErrorFunc(NULL, NULL);
118
- xmlSchemaFreeParserCtxt(ctx);
146
+ xmlSchemaFreeParserCtxt(c_parser_context);
119
147
 
120
- if(NULL == schema) {
148
+ if (NULL == c_schema) {
121
149
  xmlErrorPtr error = xmlGetLastError();
122
- if(error)
150
+ if (error) {
123
151
  Nokogiri_error_raise(NULL, error);
124
- else
152
+ } else {
125
153
  rb_raise(rb_eRuntimeError, "Could not parse document");
154
+ }
126
155
 
127
156
  return Qnil;
128
157
  }
129
158
 
130
- rb_schema = Data_Wrap_Struct(klass, 0, dealloc, schema);
131
- rb_iv_set(rb_schema, "@errors", errors);
159
+ rb_schema = TypedData_Wrap_Struct(klass, &xml_schema_type, c_schema);
160
+ rb_iv_set(rb_schema, "@errors", rb_errors);
161
+ rb_iv_set(rb_schema, "@parse_options", rb_parse_options);
132
162
 
133
163
  return rb_schema;
134
164
  }
135
165
 
136
166
  /*
137
167
  * call-seq:
138
- * from_document(doc)
168
+ * read_memory(string) → Nokogiri::XML::Schema
139
169
  *
140
- * Create a new Schema from the Nokogiri::XML::Document +doc+
170
+ * Create a new schema parsed from the contents of +string+
171
+ *
172
+ * [Parameters]
173
+ * - +string+: String containing XML to be parsed as a schema
174
+ *
175
+ * [Returns] Nokogiri::XML::Schema
141
176
  */
142
- static VALUE from_document(VALUE klass, VALUE document)
177
+ static VALUE
178
+ read_memory(int argc, VALUE *argv, VALUE klass)
143
179
  {
144
- xmlDocPtr doc;
145
- xmlSchemaParserCtxtPtr ctx;
146
- xmlSchemaPtr schema;
147
- VALUE errors;
148
- VALUE rb_schema;
180
+ VALUE rb_content;
181
+ VALUE rb_parse_options;
182
+ xmlSchemaParserCtxtPtr c_parser_context;
149
183
 
150
- Data_Get_Struct(document, xmlDoc, doc);
184
+ rb_scan_args(argc, argv, "11", &rb_content, &rb_parse_options);
151
185
 
152
- /* In case someone passes us a node. ugh. */
153
- doc = doc->doc;
186
+ c_parser_context = xmlSchemaNewMemParserCtxt(
187
+ (const char *)StringValuePtr(rb_content),
188
+ (int)RSTRING_LEN(rb_content)
189
+ );
154
190
 
155
- ctx = xmlSchemaNewDocParserCtxt(doc);
156
-
157
- errors = rb_ary_new();
158
- xmlSetStructuredErrorFunc((void *)errors, Nokogiri_error_array_pusher);
191
+ return xml_schema_parse_schema(klass, c_parser_context, rb_parse_options);
192
+ }
159
193
 
160
- #ifdef HAVE_XMLSCHEMASETPARSERSTRUCTUREDERRORS
161
- xmlSchemaSetParserStructuredErrors(
162
- ctx,
163
- Nokogiri_error_array_pusher,
164
- (void *)errors
165
- );
166
- #endif
194
+ /*
195
+ * call-seq:
196
+ * from_document(document) → Nokogiri::XML::Schema
197
+ *
198
+ * Create a new schema parsed from the +document+.
199
+ *
200
+ * [Parameters]
201
+ * - +document+: Nokogiri::XML::Document to be parsed
202
+ *
203
+ * [Returns] Nokogiri::XML::Schema
204
+ */
205
+ static VALUE
206
+ rb_xml_schema_s_from_document(int argc, VALUE *argv, VALUE klass)
207
+ {
208
+ VALUE rb_document;
209
+ VALUE rb_parse_options;
210
+ VALUE rb_schema;
211
+ xmlDocPtr c_document;
212
+ xmlSchemaParserCtxtPtr c_parser_context;
213
+ int defensive_copy_p = 0;
167
214
 
168
- schema = xmlSchemaParse(ctx);
215
+ rb_scan_args(argc, argv, "11", &rb_document, &rb_parse_options);
169
216
 
170
- xmlSetStructuredErrorFunc(NULL, NULL);
171
- xmlSchemaFreeParserCtxt(ctx);
217
+ if (!rb_obj_is_kind_of(rb_document, cNokogiriXmlNode)) {
218
+ rb_raise(rb_eTypeError,
219
+ "expected parameter to be a Nokogiri::XML::Document, received %"PRIsVALUE,
220
+ rb_obj_class(rb_document));
221
+ }
172
222
 
173
- if(NULL == schema) {
174
- xmlErrorPtr error = xmlGetLastError();
175
- if(error)
176
- Nokogiri_error_raise(NULL, error);
177
- else
178
- rb_raise(rb_eRuntimeError, "Could not parse document");
223
+ if (!rb_obj_is_kind_of(rb_document, cNokogiriXmlDocument)) {
224
+ xmlNodePtr deprecated_node_type_arg;
225
+ // TODO: deprecate allowing Node
226
+ NOKO_WARN_DEPRECATION("Passing a Node as the first parameter to Schema.from_document is deprecated. Please pass a Document instead. This will become an error in a future release of Nokogiri.");
227
+ Noko_Node_Get_Struct(rb_document, xmlNode, deprecated_node_type_arg);
228
+ c_document = deprecated_node_type_arg->doc;
229
+ } else {
230
+ c_document = noko_xml_document_unwrap(rb_document);
231
+ }
179
232
 
180
- return Qnil;
233
+ if (noko_xml_document_has_wrapped_blank_nodes_p(c_document)) {
234
+ // see https://github.com/sparklemotion/nokogiri/pull/2001
235
+ c_document = xmlCopyDoc(c_document, 1);
236
+ defensive_copy_p = 1;
181
237
  }
182
238
 
183
- rb_schema = Data_Wrap_Struct(klass, 0, dealloc, schema);
184
- rb_iv_set(rb_schema, "@errors", errors);
239
+ c_parser_context = xmlSchemaNewDocParserCtxt(c_document);
240
+ rb_schema = xml_schema_parse_schema(klass, c_parser_context, rb_parse_options);
185
241
 
186
- return rb_schema;
242
+ if (defensive_copy_p) {
243
+ xmlFreeDoc(c_document);
244
+ c_document = NULL;
245
+ }
187
246
 
188
- return Qnil;
247
+ return rb_schema;
189
248
  }
190
249
 
191
- VALUE cNokogiriXmlSchema;
192
- void init_xml_schema()
250
+ void
251
+ noko_init_xml_schema(void)
193
252
  {
194
- VALUE nokogiri = rb_define_module("Nokogiri");
195
- VALUE xml = rb_define_module_under(nokogiri, "XML");
196
- VALUE klass = rb_define_class_under(xml, "Schema", rb_cObject);
253
+ cNokogiriXmlSchema = rb_define_class_under(mNokogiriXml, "Schema", rb_cObject);
197
254
 
198
- cNokogiriXmlSchema = klass;
255
+ rb_undef_alloc_func(cNokogiriXmlSchema);
199
256
 
200
- rb_define_singleton_method(klass, "read_memory", read_memory, 1);
201
- rb_define_singleton_method(klass, "from_document", from_document, 1);
257
+ rb_define_singleton_method(cNokogiriXmlSchema, "read_memory", read_memory, -1);
258
+ rb_define_singleton_method(cNokogiriXmlSchema, "from_document", rb_xml_schema_s_from_document, -1);
202
259
 
203
- rb_define_private_method(klass, "validate_document", validate_document, 1);
204
- rb_define_private_method(klass, "validate_file", validate_file, 1);
260
+ rb_define_private_method(cNokogiriXmlSchema, "validate_document", validate_document, 1);
261
+ rb_define_private_method(cNokogiriXmlSchema, "validate_file", validate_file, 1);
205
262
  }
@@ -1,38 +1,64 @@
1
- #include <xml_syntax_error.h>
1
+ #include <nokogiri.h>
2
2
 
3
- void Nokogiri_error_array_pusher(void * ctx, xmlErrorPtr error)
3
+ VALUE cNokogiriXmlSyntaxError;
4
+
5
+ void
6
+ Nokogiri_structured_error_func_save(libxmlStructuredErrorHandlerState *handler_state)
7
+ {
8
+ /* this method is tightly coupled to the implementation of xmlSetStructuredErrorFunc */
9
+ handler_state->user_data = xmlStructuredErrorContext;
10
+ handler_state->handler = xmlStructuredError;
11
+ }
12
+
13
+ void
14
+ Nokogiri_structured_error_func_save_and_set(libxmlStructuredErrorHandlerState *handler_state,
15
+ void *user_data,
16
+ xmlStructuredErrorFunc handler)
17
+ {
18
+ Nokogiri_structured_error_func_save(handler_state);
19
+ xmlSetStructuredErrorFunc(user_data, handler);
20
+ }
21
+
22
+ void
23
+ Nokogiri_structured_error_func_restore(libxmlStructuredErrorHandlerState *handler_state)
24
+ {
25
+ xmlSetStructuredErrorFunc(handler_state->user_data, handler_state->handler);
26
+ }
27
+
28
+ void
29
+ Nokogiri_error_array_pusher(void *ctx, xmlErrorPtr error)
4
30
  {
5
31
  VALUE list = (VALUE)ctx;
6
32
  Check_Type(list, T_ARRAY);
7
33
  rb_ary_push(list, Nokogiri_wrap_xml_syntax_error(error));
8
34
  }
9
35
 
10
- void Nokogiri_error_raise(void * ctx, xmlErrorPtr error)
36
+ void
37
+ Nokogiri_error_raise(void *ctx, xmlErrorPtr error)
11
38
  {
12
39
  rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error));
13
40
  }
14
41
 
15
- VALUE Nokogiri_wrap_xml_syntax_error(xmlErrorPtr error)
42
+ VALUE
43
+ Nokogiri_wrap_xml_syntax_error(xmlErrorPtr error)
16
44
  {
17
45
  VALUE msg, e, klass;
18
46
 
19
47
  klass = cNokogiriXmlSyntaxError;
20
48
 
21
49
  if (error && error->domain == XML_FROM_XPATH) {
22
- VALUE xpath = rb_const_get(mNokogiriXml, rb_intern("XPath"));
23
- klass = rb_const_get(xpath, rb_intern("SyntaxError"));
50
+ klass = cNokogiriXmlXpathSyntaxError;
24
51
  }
25
52
 
26
53
  msg = (error && error->message) ? NOKOGIRI_STR_NEW2(error->message) : Qnil;
27
54
 
28
55
  e = rb_class_new_instance(
29
- 1,
30
- &msg,
31
- klass
32
- );
56
+ 1,
57
+ &msg,
58
+ klass
59
+ );
33
60
 
34
- if (error)
35
- {
61
+ if (error) {
36
62
  rb_iv_set(e, "@domain", INT2NUM(error->domain));
37
63
  rb_iv_set(e, "@code", INT2NUM(error->code));
38
64
  rb_iv_set(e, "@level", INT2NUM((short)error->level));
@@ -48,17 +74,12 @@ VALUE Nokogiri_wrap_xml_syntax_error(xmlErrorPtr error)
48
74
  return e;
49
75
  }
50
76
 
51
- VALUE cNokogiriXmlSyntaxError;
52
- void init_xml_syntax_error()
77
+ void
78
+ noko_init_xml_syntax_error(void)
53
79
  {
54
- VALUE nokogiri = rb_define_module("Nokogiri");
55
- VALUE xml = rb_define_module_under(nokogiri, "XML");
56
-
80
+ assert(cNokogiriSyntaxError);
57
81
  /*
58
82
  * The XML::SyntaxError is raised on parse errors
59
83
  */
60
- VALUE syntax_error_mommy = rb_define_class_under(nokogiri, "SyntaxError", rb_eStandardError);
61
- VALUE klass = rb_define_class_under(xml, "SyntaxError", syntax_error_mommy);
62
- cNokogiriXmlSyntaxError = klass;
63
-
84
+ cNokogiriXmlSyntaxError = rb_define_class_under(mNokogiriXml, "SyntaxError", cNokogiriSyntaxError);
64
85
  }
@@ -1,4 +1,6 @@
1
- #include <xml_text.h>
1
+ #include <nokogiri.h>
2
+
3
+ VALUE cNokogiriXmlText ;
2
4
 
3
5
  /*
4
6
  * call-seq:
@@ -6,47 +8,55 @@
6
8
  *
7
9
  * Create a new Text element on the +document+ with +content+
8
10
  */
9
- static VALUE new(int argc, VALUE *argv, VALUE klass)
11
+ static VALUE
12
+ rb_xml_text_s_new(int argc, VALUE *argv, VALUE klass)
10
13
  {
11
- xmlDocPtr doc;
12
- xmlNodePtr node;
13
- VALUE string;
14
- VALUE document;
15
- VALUE rest;
14
+ xmlDocPtr c_document;
15
+ xmlNodePtr c_node;
16
+ VALUE rb_string;
17
+ VALUE rb_document;
18
+ VALUE rb_rest;
16
19
  VALUE rb_node;
17
20
 
18
- rb_scan_args(argc, argv, "2*", &string, &document, &rest);
21
+ rb_scan_args(argc, argv, "2*", &rb_string, &rb_document, &rb_rest);
22
+
23
+ if (!rb_obj_is_kind_of(rb_document, cNokogiriXmlNode)) {
24
+ rb_raise(rb_eTypeError,
25
+ "expected second parameter to be a Nokogiri::XML::Document, received %"PRIsVALUE,
26
+ rb_obj_class(rb_document));
27
+ }
19
28
 
20
- Data_Get_Struct(document, xmlDoc, doc);
29
+ if (!rb_obj_is_kind_of(rb_document, cNokogiriXmlDocument)) {
30
+ xmlNodePtr deprecated_node_type_arg;
31
+ // TODO: deprecate allowing Node
32
+ NOKO_WARN_DEPRECATION("Passing a Node as the second parameter to Text.new is deprecated. Please pass a Document instead. This will become an error in a future release of Nokogiri.");
33
+ Noko_Node_Get_Struct(rb_document, xmlNode, deprecated_node_type_arg);
34
+ c_document = deprecated_node_type_arg->doc;
35
+ } else {
36
+ c_document = noko_xml_document_unwrap(rb_document);
37
+ }
21
38
 
22
- node = xmlNewText((xmlChar *)StringValueCStr(string));
23
- node->doc = doc->doc;
39
+ c_node = xmlNewText((xmlChar *)StringValueCStr(rb_string));
40
+ c_node->doc = c_document;
24
41
 
25
- nokogiri_root_node(node);
42
+ noko_xml_document_pin_node(c_node);
26
43
 
27
- rb_node = Nokogiri_wrap_xml_node(klass, node) ;
44
+ rb_node = noko_xml_node_wrap(klass, c_node) ;
28
45
  rb_obj_call_init(rb_node, argc, argv);
29
46
 
30
- if(rb_block_given_p()) rb_yield(rb_node);
47
+ if (rb_block_given_p()) { rb_yield(rb_node); }
31
48
 
32
49
  return rb_node;
33
50
  }
34
51
 
35
- VALUE cNokogiriXmlText ;
36
- void init_xml_text()
52
+ void
53
+ noko_init_xml_text(void)
37
54
  {
38
- VALUE nokogiri = rb_define_module("Nokogiri");
39
- VALUE xml = rb_define_module_under(nokogiri, "XML");
40
- /* */
41
- VALUE node = rb_define_class_under(xml, "Node", rb_cObject);
42
- VALUE char_data = rb_define_class_under(xml, "CharacterData", node);
43
-
55
+ assert(cNokogiriXmlCharacterData);
44
56
  /*
45
57
  * Wraps Text nodes.
46
58
  */
47
- VALUE klass = rb_define_class_under(xml, "Text", char_data);
48
-
49
- cNokogiriXmlText = klass;
59
+ cNokogiriXmlText = rb_define_class_under(mNokogiriXml, "Text", cNokogiriXmlCharacterData);
50
60
 
51
- rb_define_singleton_method(klass, "new", new, -1);
61
+ rb_define_singleton_method(cNokogiriXmlText, "new", rb_xml_text_s_new, -1);
52
62
  }