nokogiri 1.10.7 → 1.16.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 (224) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +42 -0
  3. data/LICENSE-DEPENDENCIES.md +1632 -1022
  4. data/LICENSE.md +1 -1
  5. data/README.md +188 -96
  6. data/bin/nokogiri +63 -50
  7. data/dependencies.yml +34 -66
  8. data/ext/nokogiri/depend +38 -358
  9. data/ext/nokogiri/extconf.rb +862 -421
  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 +222 -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 +39 -31
  23. data/ext/nokogiri/xml_comment.c +20 -27
  24. data/ext/nokogiri/xml_document.c +408 -243
  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 +131 -61
  33. data/ext/nokogiri/xml_node.c +1343 -674
  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 +305 -213
  37. data/ext/nokogiri/xml_relax_ng.c +87 -78
  38. data/ext/nokogiri/xml_sax_parser.c +149 -124
  39. data/ext/nokogiri/xml_sax_parser_context.c +149 -103
  40. data/ext/nokogiri/xml_sax_push_parser.c +65 -37
  41. data/ext/nokogiri/xml_schema.c +138 -82
  42. data/ext/nokogiri/xml_syntax_error.c +42 -21
  43. data/ext/nokogiri/xml_text.c +35 -26
  44. data/ext/nokogiri/xml_xpath_context.c +363 -178
  45. data/ext/nokogiri/xslt_stylesheet.c +335 -189
  46. data/gumbo-parser/CHANGES.md +63 -0
  47. data/gumbo-parser/Makefile +126 -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 +3464 -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 +5 -3
  98. data/lib/nokogiri/css/tokenizer.rex +3 -2
  99. data/lib/nokogiri/css/xpath_visitor.rb +205 -96
  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 +326 -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 +224 -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 +75 -34
  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 -127
  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 +44 -0
  140. data/lib/nokogiri/xml/node/save_options.rb +23 -8
  141. data/lib/nokogiri/xml/node.rb +1096 -419
  142. data/lib/nokogiri/xml/node_set.rb +137 -61
  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 +7 -5
  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 +39 -38
  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/{0004-libxml2.la-is-in-top_builddir.patch → 0003-libxml2.la-is-in-top_builddir.patch} +1 -1
  169. data/patches/libxml2/0009-allow-wildcard-namespaces.patch +77 -0
  170. data/patches/libxml2/0010-update-config.guess-and-config.sub-for-libxml2.patch +224 -0
  171. data/patches/libxml2/0011-rip-out-libxml2-s-libc_single_threaded-support.patch +30 -0
  172. data/patches/libxslt/0001-update-config.guess-and-config.sub-for-libxslt.patch +224 -0
  173. data/ports/archives/libxml2-2.12.3.tar.xz +0 -0
  174. data/ports/archives/libxslt-1.1.39.tar.xz +0 -0
  175. metadata +121 -291
  176. data/ext/nokogiri/html_document.c +0 -170
  177. data/ext/nokogiri/html_document.h +0 -10
  178. data/ext/nokogiri/html_element_description.c +0 -279
  179. data/ext/nokogiri/html_element_description.h +0 -10
  180. data/ext/nokogiri/html_entity_lookup.c +0 -32
  181. data/ext/nokogiri/html_entity_lookup.h +0 -8
  182. data/ext/nokogiri/html_sax_parser_context.c +0 -116
  183. data/ext/nokogiri/html_sax_parser_context.h +0 -11
  184. data/ext/nokogiri/html_sax_push_parser.c +0 -87
  185. data/ext/nokogiri/html_sax_push_parser.h +0 -9
  186. data/ext/nokogiri/xml_attr.h +0 -9
  187. data/ext/nokogiri/xml_attribute_decl.h +0 -9
  188. data/ext/nokogiri/xml_cdata.h +0 -9
  189. data/ext/nokogiri/xml_comment.h +0 -9
  190. data/ext/nokogiri/xml_document.h +0 -23
  191. data/ext/nokogiri/xml_document_fragment.h +0 -10
  192. data/ext/nokogiri/xml_dtd.h +0 -10
  193. data/ext/nokogiri/xml_element_content.h +0 -10
  194. data/ext/nokogiri/xml_element_decl.h +0 -9
  195. data/ext/nokogiri/xml_encoding_handler.h +0 -8
  196. data/ext/nokogiri/xml_entity_decl.h +0 -10
  197. data/ext/nokogiri/xml_entity_reference.h +0 -9
  198. data/ext/nokogiri/xml_io.c +0 -61
  199. data/ext/nokogiri/xml_io.h +0 -11
  200. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  201. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  202. data/ext/nokogiri/xml_namespace.h +0 -14
  203. data/ext/nokogiri/xml_node.h +0 -13
  204. data/ext/nokogiri/xml_node_set.h +0 -12
  205. data/ext/nokogiri/xml_processing_instruction.h +0 -9
  206. data/ext/nokogiri/xml_reader.h +0 -10
  207. data/ext/nokogiri/xml_relax_ng.h +0 -9
  208. data/ext/nokogiri/xml_sax_parser.h +0 -39
  209. data/ext/nokogiri/xml_sax_parser_context.h +0 -10
  210. data/ext/nokogiri/xml_sax_push_parser.h +0 -9
  211. data/ext/nokogiri/xml_schema.h +0 -9
  212. data/ext/nokogiri/xml_syntax_error.h +0 -13
  213. data/ext/nokogiri/xml_text.h +0 -9
  214. data/ext/nokogiri/xml_xpath_context.h +0 -10
  215. data/ext/nokogiri/xslt_stylesheet.h +0 -14
  216. data/lib/nokogiri/html/document.rb +0 -335
  217. data/lib/nokogiri/html/document_fragment.rb +0 -49
  218. data/lib/nokogiri/html/element_description_defaults.rb +0 -671
  219. data/lib/nokogiri/html/sax/parser_context.rb +0 -16
  220. data/patches/libxml2/0001-Revert-Do-not-URI-escape-in-server-side-includes.patch +0 -78
  221. data/ports/archives/libxml2-2.9.10.tar.gz +0 -0
  222. data/ports/archives/libxslt-1.1.34.tar.gz +0 -0
  223. /data/patches/libxml2/{0002-Remove-script-macro-support.patch → 0001-Remove-script-macro-support.patch} +0 -0
  224. /data/patches/libxml2/{0003-Update-entities-to-remove-handling-of-ssi.patch → 0002-Update-entities-to-remove-handling-of-ssi.patch} +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,163 @@ 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) {
121
- xmlErrorPtr error = xmlGetLastError();
122
- if(error)
148
+ if (NULL == c_schema) {
149
+ xmlErrorConstPtr error = xmlGetLastError();
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
169
+ *
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
139
174
  *
140
- * Create a new Schema from the Nokogiri::XML::Document +doc+
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;
149
-
150
- Data_Get_Struct(document, xmlDoc, doc);
180
+ VALUE rb_content;
181
+ VALUE rb_parse_options;
182
+ xmlSchemaParserCtxtPtr c_parser_context;
151
183
 
152
- /* In case someone passes us a node. ugh. */
153
- doc = doc->doc;
184
+ rb_scan_args(argc, argv, "11", &rb_content, &rb_parse_options);
154
185
 
155
- ctx = xmlSchemaNewDocParserCtxt(doc);
186
+ c_parser_context = xmlSchemaNewMemParserCtxt(
187
+ (const char *)StringValuePtr(rb_content),
188
+ (int)RSTRING_LEN(rb_content)
189
+ );
156
190
 
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
+ 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 Nokogiri v1.17.0."); // TODO: deprecated in v1.15.3, remove in v1.17.0
226
+ Noko_Node_Get_Struct(rb_document, xmlNode, deprecated_node_type_arg);
227
+ c_document = deprecated_node_type_arg->doc;
228
+ } else {
229
+ c_document = noko_xml_document_unwrap(rb_document);
230
+ }
179
231
 
180
- return Qnil;
232
+ if (noko_xml_document_has_wrapped_blank_nodes_p(c_document)) {
233
+ // see https://github.com/sparklemotion/nokogiri/pull/2001
234
+ c_document = xmlCopyDoc(c_document, 1);
235
+ defensive_copy_p = 1;
181
236
  }
182
237
 
183
- rb_schema = Data_Wrap_Struct(klass, 0, dealloc, schema);
184
- rb_iv_set(rb_schema, "@errors", errors);
238
+ c_parser_context = xmlSchemaNewDocParserCtxt(c_document);
239
+ rb_schema = xml_schema_parse_schema(klass, c_parser_context, rb_parse_options);
185
240
 
186
- return rb_schema;
241
+ if (defensive_copy_p) {
242
+ xmlFreeDoc(c_document);
243
+ c_document = NULL;
244
+ }
187
245
 
188
- return Qnil;
246
+ return rb_schema;
189
247
  }
190
248
 
191
- VALUE cNokogiriXmlSchema;
192
- void init_xml_schema()
249
+ void
250
+ noko_init_xml_schema(void)
193
251
  {
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);
252
+ cNokogiriXmlSchema = rb_define_class_under(mNokogiriXml, "Schema", rb_cObject);
197
253
 
198
- cNokogiriXmlSchema = klass;
254
+ rb_undef_alloc_func(cNokogiriXmlSchema);
199
255
 
200
- rb_define_singleton_method(klass, "read_memory", read_memory, 1);
201
- rb_define_singleton_method(klass, "from_document", from_document, 1);
256
+ rb_define_singleton_method(cNokogiriXmlSchema, "read_memory", read_memory, -1);
257
+ rb_define_singleton_method(cNokogiriXmlSchema, "from_document", rb_xml_schema_s_from_document, -1);
202
258
 
203
- rb_define_private_method(klass, "validate_document", validate_document, 1);
204
- rb_define_private_method(klass, "validate_file", validate_file, 1);
259
+ rb_define_private_method(cNokogiriXmlSchema, "validate_document", validate_document, 1);
260
+ rb_define_private_method(cNokogiriXmlSchema, "validate_file", validate_file, 1);
205
261
  }
@@ -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, xmlErrorConstPtr 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, xmlErrorConstPtr 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(xmlErrorConstPtr 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,54 @@
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
+ 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 Nokogiri v1.17.0."); // TODO: deprecated in v1.15.3, remove in v1.17.0
32
+ Noko_Node_Get_Struct(rb_document, xmlNode, deprecated_node_type_arg);
33
+ c_document = deprecated_node_type_arg->doc;
34
+ } else {
35
+ c_document = noko_xml_document_unwrap(rb_document);
36
+ }
21
37
 
22
- node = xmlNewText((xmlChar *)StringValueCStr(string));
23
- node->doc = doc->doc;
38
+ c_node = xmlNewText((xmlChar *)StringValueCStr(rb_string));
39
+ c_node->doc = c_document;
24
40
 
25
- nokogiri_root_node(node);
41
+ noko_xml_document_pin_node(c_node);
26
42
 
27
- rb_node = Nokogiri_wrap_xml_node(klass, node) ;
43
+ rb_node = noko_xml_node_wrap(klass, c_node) ;
28
44
  rb_obj_call_init(rb_node, argc, argv);
29
45
 
30
- if(rb_block_given_p()) rb_yield(rb_node);
46
+ if (rb_block_given_p()) { rb_yield(rb_node); }
31
47
 
32
48
  return rb_node;
33
49
  }
34
50
 
35
- VALUE cNokogiriXmlText ;
36
- void init_xml_text()
51
+ void
52
+ noko_init_xml_text(void)
37
53
  {
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
-
54
+ assert(cNokogiriXmlCharacterData);
44
55
  /*
45
56
  * Wraps Text nodes.
46
57
  */
47
- VALUE klass = rb_define_class_under(xml, "Text", char_data);
48
-
49
- cNokogiriXmlText = klass;
58
+ cNokogiriXmlText = rb_define_class_under(mNokogiriXml, "Text", cNokogiriXmlCharacterData);
50
59
 
51
- rb_define_singleton_method(klass, "new", new, -1);
60
+ rb_define_singleton_method(cNokogiriXmlText, "new", rb_xml_text_s_new, -1);
52
61
  }