nokogiri 1.12.5 → 1.14.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.
- checksums.yaml +4 -4
- data/Gemfile +41 -0
- data/LICENSE-DEPENDENCIES.md +830 -509
- data/LICENSE.md +1 -1
- data/README.md +23 -14
- data/bin/nokogiri +63 -50
- data/dependencies.yml +33 -66
- data/ext/nokogiri/extconf.rb +159 -63
- data/ext/nokogiri/gumbo.c +21 -11
- data/ext/nokogiri/html4_document.c +2 -2
- data/ext/nokogiri/html4_element_description.c +1 -1
- data/ext/nokogiri/html4_entity_lookup.c +2 -2
- data/ext/nokogiri/html4_sax_parser_context.c +3 -9
- data/ext/nokogiri/html4_sax_push_parser.c +1 -1
- data/ext/nokogiri/nokogiri.c +38 -51
- data/ext/nokogiri/nokogiri.h +26 -14
- data/ext/nokogiri/test_global_handlers.c +1 -1
- data/ext/nokogiri/xml_attr.c +3 -3
- data/ext/nokogiri/xml_attribute_decl.c +5 -5
- data/ext/nokogiri/xml_cdata.c +3 -3
- data/ext/nokogiri/xml_comment.c +1 -1
- data/ext/nokogiri/xml_document.c +53 -44
- data/ext/nokogiri/xml_document_fragment.c +1 -3
- data/ext/nokogiri/xml_dtd.c +11 -11
- data/ext/nokogiri/xml_element_content.c +3 -3
- data/ext/nokogiri/xml_element_decl.c +5 -5
- data/ext/nokogiri/xml_encoding_handler.c +28 -14
- data/ext/nokogiri/xml_entity_decl.c +6 -6
- data/ext/nokogiri/xml_entity_reference.c +1 -1
- data/ext/nokogiri/xml_namespace.c +80 -14
- data/ext/nokogiri/xml_node.c +982 -396
- data/ext/nokogiri/xml_node_set.c +4 -6
- data/ext/nokogiri/xml_processing_instruction.c +1 -1
- data/ext/nokogiri/xml_reader.c +133 -32
- data/ext/nokogiri/xml_relax_ng.c +1 -3
- data/ext/nokogiri/xml_sax_parser.c +23 -17
- data/ext/nokogiri/xml_sax_parser_context.c +11 -9
- data/ext/nokogiri/xml_sax_push_parser.c +1 -3
- data/ext/nokogiri/xml_schema.c +4 -6
- data/ext/nokogiri/xml_syntax_error.c +1 -1
- data/ext/nokogiri/xml_text.c +2 -2
- data/ext/nokogiri/xml_xpath_context.c +144 -114
- data/ext/nokogiri/xslt_stylesheet.c +122 -23
- data/gumbo-parser/Makefile +10 -0
- data/gumbo-parser/src/attribute.h +1 -1
- data/gumbo-parser/src/error.c +2 -2
- data/gumbo-parser/src/error.h +1 -1
- data/gumbo-parser/src/foreign_attrs.c +2 -2
- data/gumbo-parser/src/{gumbo.h → nokogiri_gumbo.h} +1 -0
- data/gumbo-parser/src/parser.c +8 -16
- data/gumbo-parser/src/replacement.h +1 -1
- data/gumbo-parser/src/string_buffer.h +1 -1
- data/gumbo-parser/src/string_piece.c +1 -1
- data/gumbo-parser/src/svg_attrs.c +2 -2
- data/gumbo-parser/src/svg_tags.c +2 -2
- data/gumbo-parser/src/tag.c +2 -1
- data/gumbo-parser/src/tag_lookup.c +7 -7
- data/gumbo-parser/src/tag_lookup.gperf +1 -0
- data/gumbo-parser/src/tag_lookup.h +1 -1
- data/gumbo-parser/src/token_buffer.h +1 -1
- data/gumbo-parser/src/tokenizer.c +1 -1
- data/gumbo-parser/src/tokenizer.h +1 -1
- data/gumbo-parser/src/utf8.c +1 -1
- data/gumbo-parser/src/utf8.h +1 -1
- data/gumbo-parser/src/util.c +1 -3
- data/gumbo-parser/src/util.h +4 -0
- data/gumbo-parser/src/vector.h +1 -1
- data/lib/nokogiri/class_resolver.rb +67 -0
- data/lib/nokogiri/css/node.rb +9 -8
- data/lib/nokogiri/css/parser.rb +360 -341
- data/lib/nokogiri/css/parser.y +249 -244
- data/lib/nokogiri/css/parser_extras.rb +22 -20
- data/lib/nokogiri/css/syntax_error.rb +1 -0
- data/lib/nokogiri/css/tokenizer.rb +4 -3
- data/lib/nokogiri/css/tokenizer.rex +3 -2
- data/lib/nokogiri/css/xpath_visitor.rb +184 -85
- data/lib/nokogiri/css.rb +44 -6
- data/lib/nokogiri/decorators/slop.rb +8 -7
- data/lib/nokogiri/encoding_handler.rb +57 -0
- data/lib/nokogiri/extension.rb +4 -3
- data/lib/nokogiri/gumbo.rb +1 -0
- data/lib/nokogiri/html.rb +16 -10
- data/lib/nokogiri/html4/builder.rb +1 -0
- data/lib/nokogiri/html4/document.rb +56 -164
- data/lib/nokogiri/html4/document_fragment.rb +11 -7
- data/lib/nokogiri/html4/element_description.rb +1 -0
- data/lib/nokogiri/html4/element_description_defaults.rb +432 -532
- data/lib/nokogiri/html4/encoding_reader.rb +121 -0
- data/lib/nokogiri/html4/entity_lookup.rb +2 -1
- data/lib/nokogiri/html4/sax/parser.rb +5 -2
- data/lib/nokogiri/html4/sax/parser_context.rb +1 -0
- data/lib/nokogiri/html4/sax/push_parser.rb +7 -7
- data/lib/nokogiri/html4.rb +12 -5
- data/lib/nokogiri/html5/document.rb +126 -32
- data/lib/nokogiri/html5/document_fragment.rb +14 -4
- data/lib/nokogiri/html5/node.rb +12 -7
- data/lib/nokogiri/html5.rb +138 -222
- data/lib/nokogiri/jruby/dependencies.rb +2 -19
- data/lib/nokogiri/jruby/nokogiri_jars.rb +43 -0
- data/lib/nokogiri/syntax_error.rb +1 -0
- data/lib/nokogiri/version/constant.rb +2 -1
- data/lib/nokogiri/version/info.rb +32 -24
- data/lib/nokogiri/version.rb +1 -0
- data/lib/nokogiri/xml/attr.rb +54 -3
- data/lib/nokogiri/xml/attribute_decl.rb +2 -1
- data/lib/nokogiri/xml/builder.rb +35 -33
- data/lib/nokogiri/xml/cdata.rb +2 -1
- data/lib/nokogiri/xml/character_data.rb +1 -0
- data/lib/nokogiri/xml/document.rb +232 -143
- data/lib/nokogiri/xml/document_fragment.rb +88 -42
- data/lib/nokogiri/xml/dtd.rb +3 -2
- data/lib/nokogiri/xml/element_content.rb +1 -0
- data/lib/nokogiri/xml/element_decl.rb +2 -1
- data/lib/nokogiri/xml/entity_decl.rb +3 -2
- data/lib/nokogiri/xml/entity_reference.rb +1 -0
- data/lib/nokogiri/xml/namespace.rb +44 -0
- data/lib/nokogiri/xml/node/save_options.rb +14 -8
- data/lib/nokogiri/xml/node.rb +708 -383
- data/lib/nokogiri/xml/node_set.rb +134 -59
- data/lib/nokogiri/xml/notation.rb +12 -0
- data/lib/nokogiri/xml/parse_options.rb +140 -56
- data/lib/nokogiri/xml/pp/character_data.rb +8 -6
- data/lib/nokogiri/xml/pp/node.rb +26 -26
- data/lib/nokogiri/xml/pp.rb +1 -0
- data/lib/nokogiri/xml/processing_instruction.rb +3 -1
- data/lib/nokogiri/xml/reader.rb +20 -24
- data/lib/nokogiri/xml/relax_ng.rb +1 -0
- data/lib/nokogiri/xml/sax/document.rb +20 -19
- data/lib/nokogiri/xml/sax/parser.rb +38 -36
- data/lib/nokogiri/xml/sax/parser_context.rb +7 -3
- data/lib/nokogiri/xml/sax/push_parser.rb +5 -5
- data/lib/nokogiri/xml/sax.rb +1 -0
- data/lib/nokogiri/xml/schema.rb +7 -6
- data/lib/nokogiri/xml/searchable.rb +93 -62
- data/lib/nokogiri/xml/syntax_error.rb +5 -4
- data/lib/nokogiri/xml/text.rb +1 -0
- data/lib/nokogiri/xml/xpath/syntax_error.rb +2 -1
- data/lib/nokogiri/xml/xpath.rb +12 -0
- data/lib/nokogiri/xml/xpath_context.rb +2 -3
- data/lib/nokogiri/xml.rb +4 -3
- data/lib/nokogiri/xslt/stylesheet.rb +1 -0
- data/lib/nokogiri/xslt.rb +21 -13
- data/lib/nokogiri.rb +22 -27
- data/lib/xsd/xmlparser/nokogiri.rb +28 -25
- data/patches/libxml2/0009-allow-wildcard-namespaces.patch +77 -0
- data/patches/libxslt/0001-update-automake-files-for-arm64.patch +2445 -1919
- data/ports/archives/libxml2-2.10.4.tar.xz +0 -0
- data/ports/archives/libxslt-1.1.37.tar.xz +0 -0
- metadata +20 -171
- data/patches/libxml2/0004-use-glibc-strlen.patch +0 -53
- data/patches/libxml2/0005-avoid-isnan-isinf.patch +0 -81
- data/patches/libxml2/0006-update-automake-files-for-arm64.patch +0 -2511
- data/patches/libxml2/0007-Fix-XPath-recursion-limit.patch +0 -31
- data/patches/libxslt/0002-Fix-xml2-config-check-in-configure-script.patch +0 -19
- data/ports/archives/libxml2-2.9.12.tar.gz +0 -0
- data/ports/archives/libxslt-1.1.34.tar.gz +0 -0
data/ext/nokogiri/xml_node_set.c
CHANGED
@@ -88,13 +88,11 @@ deallocate(xmlNodeSetPtr node_set)
|
|
88
88
|
* For reasons outlined in xml_namespace.c, here we reproduce xmlXPathFreeNodeSet() except for the
|
89
89
|
* offending call to xmlXPathNodeSetFreeNs().
|
90
90
|
*/
|
91
|
-
NOKOGIRI_DEBUG_START(node_set) ;
|
92
91
|
if (node_set->nodeTab != NULL) {
|
93
92
|
xmlFree(node_set->nodeTab);
|
94
93
|
}
|
95
94
|
|
96
95
|
xmlFree(node_set);
|
97
|
-
NOKOGIRI_DEBUG_END(node_set) ;
|
98
96
|
}
|
99
97
|
|
100
98
|
|
@@ -156,7 +154,7 @@ push(VALUE self, VALUE rb_node)
|
|
156
154
|
Check_Node_Set_Node_Type(rb_node);
|
157
155
|
|
158
156
|
Data_Get_Struct(self, xmlNodeSet, node_set);
|
159
|
-
|
157
|
+
Noko_Node_Get_Struct(rb_node, xmlNode, node);
|
160
158
|
|
161
159
|
xmlXPathNodeSetAdd(node_set, node);
|
162
160
|
|
@@ -179,7 +177,7 @@ delete (VALUE self, VALUE rb_node)
|
|
179
177
|
Check_Node_Set_Node_Type(rb_node);
|
180
178
|
|
181
179
|
Data_Get_Struct(self, xmlNodeSet, node_set);
|
182
|
-
|
180
|
+
Noko_Node_Get_Struct(rb_node, xmlNode, node);
|
183
181
|
|
184
182
|
if (xmlXPathNodeSetContains(node_set, node)) {
|
185
183
|
xpath_node_set_del(node_set, node);
|
@@ -228,7 +226,7 @@ include_eh(VALUE self, VALUE rb_node)
|
|
228
226
|
Check_Node_Set_Node_Type(rb_node);
|
229
227
|
|
230
228
|
Data_Get_Struct(self, xmlNodeSet, node_set);
|
231
|
-
|
229
|
+
Noko_Node_Get_Struct(rb_node, xmlNode, node);
|
232
230
|
|
233
231
|
return (xmlXPathNodeSetContains(node_set, node) ? Qtrue : Qfalse);
|
234
232
|
}
|
@@ -430,7 +428,7 @@ unlink_nodeset(VALUE self)
|
|
430
428
|
xmlNodePtr node_ptr;
|
431
429
|
node = noko_xml_node_wrap(Qnil, node_set->nodeTab[j]);
|
432
430
|
rb_funcall(node, rb_intern("unlink"), 0); /* modifies the C struct out from under the object */
|
433
|
-
|
431
|
+
Noko_Node_Get_Struct(node, xmlNode, node_ptr);
|
434
432
|
node_set->nodeTab[j] = node_ptr ;
|
435
433
|
}
|
436
434
|
}
|
data/ext/nokogiri/xml_reader.c
CHANGED
@@ -5,9 +5,7 @@ VALUE cNokogiriXmlReader;
|
|
5
5
|
static void
|
6
6
|
dealloc(xmlTextReaderPtr reader)
|
7
7
|
{
|
8
|
-
NOKOGIRI_DEBUG_START(reader);
|
9
8
|
xmlFreeTextReader(reader);
|
10
|
-
NOKOGIRI_DEBUG_END(reader);
|
11
9
|
}
|
12
10
|
|
13
11
|
static int
|
@@ -31,6 +29,7 @@ has_attributes(xmlTextReaderPtr reader)
|
|
31
29
|
return (0);
|
32
30
|
}
|
33
31
|
|
32
|
+
// TODO: merge this function into the `namespaces` method implementation
|
34
33
|
static void
|
35
34
|
Nokogiri_xml_node_namespaces(xmlNodePtr node, VALUE attr_hash)
|
36
35
|
{
|
@@ -125,32 +124,47 @@ attributes_eh(VALUE self)
|
|
125
124
|
* Get a hash of namespaces for this Node
|
126
125
|
*/
|
127
126
|
static VALUE
|
128
|
-
|
127
|
+
rb_xml_reader_namespaces(VALUE rb_reader)
|
129
128
|
{
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
Data_Get_Struct(self, xmlTextReader, reader);
|
129
|
+
VALUE rb_namespaces = rb_hash_new() ;
|
130
|
+
xmlTextReaderPtr c_reader;
|
131
|
+
xmlNodePtr c_node;
|
132
|
+
VALUE rb_errors;
|
135
133
|
|
136
|
-
|
134
|
+
Data_Get_Struct(rb_reader, xmlTextReader, c_reader);
|
137
135
|
|
138
|
-
if (! has_attributes(
|
139
|
-
return
|
136
|
+
if (! has_attributes(c_reader)) {
|
137
|
+
return rb_namespaces ;
|
140
138
|
}
|
141
139
|
|
142
|
-
|
143
|
-
if (ptr == NULL) { return Qnil; }
|
140
|
+
rb_errors = rb_funcall(rb_reader, rb_intern("errors"), 0);
|
144
141
|
|
145
|
-
|
142
|
+
xmlSetStructuredErrorFunc((void *)rb_errors, Nokogiri_error_array_pusher);
|
143
|
+
c_node = xmlTextReaderExpand(c_reader);
|
144
|
+
xmlSetStructuredErrorFunc(NULL, NULL);
|
146
145
|
|
147
|
-
|
146
|
+
if (c_node == NULL) {
|
147
|
+
if (RARRAY_LEN(rb_errors) > 0) {
|
148
|
+
VALUE rb_error = rb_ary_entry(rb_errors, 0);
|
149
|
+
VALUE exception_message = rb_funcall(rb_error, rb_intern("to_s"), 0);
|
150
|
+
rb_exc_raise(rb_class_new_instance(1, &exception_message, cNokogiriXmlSyntaxError));
|
151
|
+
}
|
152
|
+
return Qnil;
|
153
|
+
}
|
154
|
+
|
155
|
+
Nokogiri_xml_node_namespaces(c_node, rb_namespaces);
|
156
|
+
|
157
|
+
return rb_namespaces ;
|
148
158
|
}
|
149
159
|
|
150
160
|
/*
|
151
|
-
|
152
|
-
|
153
|
-
|
161
|
+
:call-seq: attribute_nodes() → Array<Nokogiri::XML::Attr>
|
162
|
+
|
163
|
+
Get the attributes of the current node as an Array of XML:Attr
|
164
|
+
|
165
|
+
⚠ This method is deprecated and unsafe to use. It will be removed in a future version of Nokogiri.
|
166
|
+
|
167
|
+
See related: #attribute_hash, #attributes
|
154
168
|
*/
|
155
169
|
static VALUE
|
156
170
|
rb_xml_reader_attribute_nodes(VALUE rb_reader)
|
@@ -160,6 +174,10 @@ rb_xml_reader_attribute_nodes(VALUE rb_reader)
|
|
160
174
|
VALUE attr_nodes;
|
161
175
|
int j;
|
162
176
|
|
177
|
+
// TODO: deprecated, remove in Nokogiri v1.15, see https://github.com/sparklemotion/nokogiri/issues/2598
|
178
|
+
// After removal, we can also remove all the "node_has_a_document" special handling from xml_node.c
|
179
|
+
NOKO_WARN_DEPRECATION("Reader#attribute_nodes is deprecated and will be removed in a future version of Nokogiri. Please use Reader#attribute_hash instead.");
|
180
|
+
|
163
181
|
Data_Get_Struct(rb_reader, xmlTextReader, c_reader);
|
164
182
|
|
165
183
|
if (! has_attributes(c_reader)) {
|
@@ -181,6 +199,62 @@ rb_xml_reader_attribute_nodes(VALUE rb_reader)
|
|
181
199
|
return attr_nodes;
|
182
200
|
}
|
183
201
|
|
202
|
+
/*
|
203
|
+
:call-seq: attribute_hash() → Hash<String ⇒ String>
|
204
|
+
|
205
|
+
Get the attributes of the current node as a Hash of names and values.
|
206
|
+
|
207
|
+
See related: #attributes and #namespaces
|
208
|
+
*/
|
209
|
+
static VALUE
|
210
|
+
rb_xml_reader_attribute_hash(VALUE rb_reader)
|
211
|
+
{
|
212
|
+
VALUE rb_attributes = rb_hash_new();
|
213
|
+
xmlTextReaderPtr c_reader;
|
214
|
+
xmlNodePtr c_node;
|
215
|
+
xmlAttrPtr c_property;
|
216
|
+
VALUE rb_errors;
|
217
|
+
|
218
|
+
Data_Get_Struct(rb_reader, xmlTextReader, c_reader);
|
219
|
+
|
220
|
+
if (!has_attributes(c_reader)) {
|
221
|
+
return rb_attributes;
|
222
|
+
}
|
223
|
+
|
224
|
+
rb_errors = rb_funcall(rb_reader, rb_intern("errors"), 0);
|
225
|
+
|
226
|
+
xmlSetStructuredErrorFunc((void *)rb_errors, Nokogiri_error_array_pusher);
|
227
|
+
c_node = xmlTextReaderExpand(c_reader);
|
228
|
+
xmlSetStructuredErrorFunc(NULL, NULL);
|
229
|
+
|
230
|
+
if (c_node == NULL) {
|
231
|
+
if (RARRAY_LEN(rb_errors) > 0) {
|
232
|
+
VALUE rb_error = rb_ary_entry(rb_errors, 0);
|
233
|
+
VALUE exception_message = rb_funcall(rb_error, rb_intern("to_s"), 0);
|
234
|
+
rb_exc_raise(rb_class_new_instance(1, &exception_message, cNokogiriXmlSyntaxError));
|
235
|
+
}
|
236
|
+
return Qnil;
|
237
|
+
}
|
238
|
+
|
239
|
+
c_property = c_node->properties;
|
240
|
+
while (c_property != NULL) {
|
241
|
+
VALUE rb_name = NOKOGIRI_STR_NEW2(c_property->name);
|
242
|
+
VALUE rb_value = Qnil;
|
243
|
+
xmlChar *c_value = xmlNodeGetContent((xmlNode *)c_property);
|
244
|
+
|
245
|
+
if (c_value) {
|
246
|
+
rb_value = NOKOGIRI_STR_NEW2(c_value);
|
247
|
+
xmlFree(c_value);
|
248
|
+
}
|
249
|
+
|
250
|
+
rb_hash_aset(rb_attributes, rb_name, rb_value);
|
251
|
+
|
252
|
+
c_property = c_property->next;
|
253
|
+
}
|
254
|
+
|
255
|
+
return rb_attributes;
|
256
|
+
}
|
257
|
+
|
184
258
|
/*
|
185
259
|
* call-seq:
|
186
260
|
* attribute_at(index)
|
@@ -252,7 +326,7 @@ attribute_count(VALUE self)
|
|
252
326
|
count = xmlTextReaderAttributeCount(reader);
|
253
327
|
if (count == -1) { return Qnil; }
|
254
328
|
|
255
|
-
return INT2NUM(
|
329
|
+
return INT2NUM(count);
|
256
330
|
}
|
257
331
|
|
258
332
|
/*
|
@@ -271,7 +345,7 @@ depth(VALUE self)
|
|
271
345
|
depth = xmlTextReaderDepth(reader);
|
272
346
|
if (depth == -1) { return Qnil; }
|
273
347
|
|
274
|
-
return INT2NUM(
|
348
|
+
return INT2NUM(depth);
|
275
349
|
}
|
276
350
|
|
277
351
|
/*
|
@@ -414,16 +488,23 @@ name(VALUE self)
|
|
414
488
|
* Get the xml:base of the node
|
415
489
|
*/
|
416
490
|
static VALUE
|
417
|
-
|
491
|
+
rb_xml_reader_base_uri(VALUE rb_reader)
|
418
492
|
{
|
419
|
-
|
420
|
-
|
493
|
+
VALUE rb_base_uri;
|
494
|
+
xmlTextReaderPtr c_reader;
|
495
|
+
xmlChar *c_base_uri;
|
421
496
|
|
422
|
-
Data_Get_Struct(
|
423
|
-
|
424
|
-
|
497
|
+
Data_Get_Struct(rb_reader, xmlTextReader, c_reader);
|
498
|
+
|
499
|
+
c_base_uri = xmlTextReaderBaseUri(c_reader);
|
500
|
+
if (c_base_uri == NULL) {
|
501
|
+
return Qnil;
|
502
|
+
}
|
425
503
|
|
426
|
-
|
504
|
+
rb_base_uri = NOKOGIRI_STR_NEW2(c_base_uri);
|
505
|
+
xmlFree(c_base_uri);
|
506
|
+
|
507
|
+
return rb_base_uri;
|
427
508
|
}
|
428
509
|
|
429
510
|
/*
|
@@ -437,7 +518,7 @@ state(VALUE self)
|
|
437
518
|
{
|
438
519
|
xmlTextReaderPtr reader;
|
439
520
|
Data_Get_Struct(self, xmlTextReader, reader);
|
440
|
-
return INT2NUM(
|
521
|
+
return INT2NUM(xmlTextReaderReadState(reader));
|
441
522
|
}
|
442
523
|
|
443
524
|
/*
|
@@ -451,7 +532,7 @@ node_type(VALUE self)
|
|
451
532
|
{
|
452
533
|
xmlTextReaderPtr reader;
|
453
534
|
Data_Get_Struct(self, xmlTextReader, reader);
|
454
|
-
return INT2NUM(
|
535
|
+
return INT2NUM(xmlTextReaderNodeType(reader));
|
455
536
|
}
|
456
537
|
|
457
538
|
/*
|
@@ -652,8 +733,26 @@ empty_element_p(VALUE self)
|
|
652
733
|
return Qfalse;
|
653
734
|
}
|
654
735
|
|
736
|
+
static VALUE
|
737
|
+
rb_xml_reader_encoding(VALUE rb_reader)
|
738
|
+
{
|
739
|
+
xmlTextReaderPtr c_reader;
|
740
|
+
const char *parser_encoding;
|
741
|
+
VALUE constructor_encoding;
|
742
|
+
|
743
|
+
constructor_encoding = rb_iv_get(rb_reader, "@encoding");
|
744
|
+
if (RTEST(constructor_encoding)) {
|
745
|
+
return constructor_encoding;
|
746
|
+
}
|
747
|
+
|
748
|
+
Data_Get_Struct(rb_reader, xmlTextReader, c_reader);
|
749
|
+
parser_encoding = (const char *)xmlTextReaderConstEncoding(c_reader);
|
750
|
+
if (parser_encoding == NULL) { return Qnil; }
|
751
|
+
return NOKOGIRI_STR_NEW2(parser_encoding);
|
752
|
+
}
|
753
|
+
|
655
754
|
void
|
656
|
-
noko_init_xml_reader()
|
755
|
+
noko_init_xml_reader(void)
|
657
756
|
{
|
658
757
|
/*
|
659
758
|
* The Reader parser allows you to effectively pull parse an XML document.
|
@@ -671,17 +770,19 @@ noko_init_xml_reader()
|
|
671
770
|
rb_define_method(cNokogiriXmlReader, "attribute_at", attribute_at, 1);
|
672
771
|
rb_define_method(cNokogiriXmlReader, "attribute_count", attribute_count, 0);
|
673
772
|
rb_define_method(cNokogiriXmlReader, "attribute_nodes", rb_xml_reader_attribute_nodes, 0);
|
773
|
+
rb_define_method(cNokogiriXmlReader, "attribute_hash", rb_xml_reader_attribute_hash, 0);
|
674
774
|
rb_define_method(cNokogiriXmlReader, "attributes?", attributes_eh, 0);
|
675
|
-
rb_define_method(cNokogiriXmlReader, "base_uri",
|
775
|
+
rb_define_method(cNokogiriXmlReader, "base_uri", rb_xml_reader_base_uri, 0);
|
676
776
|
rb_define_method(cNokogiriXmlReader, "default?", default_eh, 0);
|
677
777
|
rb_define_method(cNokogiriXmlReader, "depth", depth, 0);
|
678
778
|
rb_define_method(cNokogiriXmlReader, "empty_element?", empty_element_p, 0);
|
779
|
+
rb_define_method(cNokogiriXmlReader, "encoding", rb_xml_reader_encoding, 0);
|
679
780
|
rb_define_method(cNokogiriXmlReader, "inner_xml", inner_xml, 0);
|
680
781
|
rb_define_method(cNokogiriXmlReader, "lang", lang, 0);
|
681
782
|
rb_define_method(cNokogiriXmlReader, "local_name", local_name, 0);
|
682
783
|
rb_define_method(cNokogiriXmlReader, "name", name, 0);
|
683
784
|
rb_define_method(cNokogiriXmlReader, "namespace_uri", namespace_uri, 0);
|
684
|
-
rb_define_method(cNokogiriXmlReader, "namespaces",
|
785
|
+
rb_define_method(cNokogiriXmlReader, "namespaces", rb_xml_reader_namespaces, 0);
|
685
786
|
rb_define_method(cNokogiriXmlReader, "node_type", node_type, 0);
|
686
787
|
rb_define_method(cNokogiriXmlReader, "outer_xml", outer_xml, 0);
|
687
788
|
rb_define_method(cNokogiriXmlReader, "prefix", prefix, 0);
|
data/ext/nokogiri/xml_relax_ng.c
CHANGED
@@ -5,9 +5,7 @@ VALUE cNokogiriXmlRelaxNG;
|
|
5
5
|
static void
|
6
6
|
dealloc(xmlRelaxNGPtr schema)
|
7
7
|
{
|
8
|
-
NOKOGIRI_DEBUG_START(schema);
|
9
8
|
xmlRelaxNGFree(schema);
|
10
|
-
NOKOGIRI_DEBUG_END(schema);
|
11
9
|
}
|
12
10
|
|
13
11
|
/*
|
@@ -173,7 +171,7 @@ from_document(int argc, VALUE *argv, VALUE klass)
|
|
173
171
|
}
|
174
172
|
|
175
173
|
void
|
176
|
-
noko_init_xml_relax_ng()
|
174
|
+
noko_init_xml_relax_ng(void)
|
177
175
|
{
|
178
176
|
assert(cNokogiriXmlSchema);
|
179
177
|
cNokogiriXmlRelaxNG = rb_define_class_under(mNokogiriXml, "RelaxNG", cNokogiriXmlSchema);
|
@@ -195,40 +195,48 @@ comment_func(void *ctx, const xmlChar *value)
|
|
195
195
|
rb_funcall(doc, id_comment, 1, str);
|
196
196
|
}
|
197
197
|
|
198
|
+
PRINTFLIKE_DECL(2, 3)
|
198
199
|
static void
|
199
200
|
warning_func(void *ctx, const char *msg, ...)
|
200
201
|
{
|
201
202
|
VALUE self = NOKOGIRI_SAX_SELF(ctx);
|
202
203
|
VALUE doc = rb_iv_get(self, "@document");
|
203
|
-
|
204
|
-
VALUE ruby_message;
|
204
|
+
VALUE rb_message;
|
205
205
|
|
206
|
+
#ifdef TRUFFLERUBY_NOKOGIRI_SYSTEM_LIBRARIES
|
207
|
+
/* It is not currently possible to pass var args from native
|
208
|
+
functions to sulong, so we work around the issue here. */
|
209
|
+
rb_message = rb_sprintf("warning_func: %s", msg);
|
210
|
+
#else
|
206
211
|
va_list args;
|
207
212
|
va_start(args, msg);
|
208
|
-
|
213
|
+
rb_message = rb_vsprintf(msg, args);
|
209
214
|
va_end(args);
|
215
|
+
#endif
|
210
216
|
|
211
|
-
|
212
|
-
free(message);
|
213
|
-
rb_funcall(doc, id_warning, 1, ruby_message);
|
217
|
+
rb_funcall(doc, id_warning, 1, rb_message);
|
214
218
|
}
|
215
219
|
|
220
|
+
PRINTFLIKE_DECL(2, 3)
|
216
221
|
static void
|
217
222
|
error_func(void *ctx, const char *msg, ...)
|
218
223
|
{
|
219
224
|
VALUE self = NOKOGIRI_SAX_SELF(ctx);
|
220
225
|
VALUE doc = rb_iv_get(self, "@document");
|
221
|
-
|
222
|
-
VALUE ruby_message;
|
226
|
+
VALUE rb_message;
|
223
227
|
|
228
|
+
#ifdef TRUFFLERUBY_NOKOGIRI_SYSTEM_LIBRARIES
|
229
|
+
/* It is not currently possible to pass var args from native
|
230
|
+
functions to sulong, so we work around the issue here. */
|
231
|
+
rb_message = rb_sprintf("error_func: %s", msg);
|
232
|
+
#else
|
224
233
|
va_list args;
|
225
234
|
va_start(args, msg);
|
226
|
-
|
235
|
+
rb_message = rb_vsprintf(msg, args);
|
227
236
|
va_end(args);
|
237
|
+
#endif
|
228
238
|
|
229
|
-
|
230
|
-
free(message);
|
231
|
-
rb_funcall(doc, id_error, 1, ruby_message);
|
239
|
+
rb_funcall(doc, id_error, 1, rb_message);
|
232
240
|
}
|
233
241
|
|
234
242
|
static void
|
@@ -260,15 +268,13 @@ processing_instruction(void *ctx, const xmlChar *name, const xmlChar *content)
|
|
260
268
|
static void
|
261
269
|
deallocate(xmlSAXHandlerPtr handler)
|
262
270
|
{
|
263
|
-
|
264
|
-
free(handler);
|
265
|
-
NOKOGIRI_DEBUG_END(handler);
|
271
|
+
ruby_xfree(handler);
|
266
272
|
}
|
267
273
|
|
268
274
|
static VALUE
|
269
275
|
allocate(VALUE klass)
|
270
276
|
{
|
271
|
-
xmlSAXHandlerPtr handler =
|
277
|
+
xmlSAXHandlerPtr handler = ruby_xcalloc((size_t)1, sizeof(xmlSAXHandler));
|
272
278
|
|
273
279
|
handler->startDocument = start_document;
|
274
280
|
handler->endDocument = end_document;
|
@@ -288,7 +294,7 @@ allocate(VALUE klass)
|
|
288
294
|
}
|
289
295
|
|
290
296
|
void
|
291
|
-
noko_init_xml_sax_parser()
|
297
|
+
noko_init_xml_sax_parser(void)
|
292
298
|
{
|
293
299
|
cNokogiriXmlSaxParser = rb_define_class_under(mNokogiriXmlSax, "Parser", rb_cObject);
|
294
300
|
|
@@ -2,16 +2,13 @@
|
|
2
2
|
|
3
3
|
VALUE cNokogiriXmlSaxParserContext ;
|
4
4
|
|
5
|
+
static ID id_read;
|
6
|
+
|
5
7
|
static void
|
6
8
|
deallocate(xmlParserCtxtPtr ctxt)
|
7
9
|
{
|
8
|
-
NOKOGIRI_DEBUG_START(ctxt);
|
9
|
-
|
10
10
|
ctxt->sax = NULL;
|
11
|
-
|
12
11
|
xmlFreeParserCtxt(ctxt);
|
13
|
-
|
14
|
-
NOKOGIRI_DEBUG_END(ctxt);
|
15
12
|
}
|
16
13
|
|
17
14
|
/*
|
@@ -26,6 +23,10 @@ parse_io(VALUE klass, VALUE io, VALUE encoding)
|
|
26
23
|
xmlParserCtxtPtr ctxt;
|
27
24
|
xmlCharEncoding enc = (xmlCharEncoding)NUM2INT(encoding);
|
28
25
|
|
26
|
+
if (!rb_respond_to(io, id_read)) {
|
27
|
+
rb_raise(rb_eTypeError, "argument expected to respond to :read");
|
28
|
+
}
|
29
|
+
|
29
30
|
ctxt = xmlCreateIOParserCtxt(NULL, NULL,
|
30
31
|
(xmlInputReadCallback)noko_io_read,
|
31
32
|
(xmlInputCloseCallback)noko_io_close,
|
@@ -62,9 +63,8 @@ parse_memory(VALUE klass, VALUE data)
|
|
62
63
|
{
|
63
64
|
xmlParserCtxtPtr ctxt;
|
64
65
|
|
65
|
-
|
66
|
-
|
67
|
-
}
|
66
|
+
Check_Type(data, T_STRING);
|
67
|
+
|
68
68
|
if (!(int)RSTRING_LEN(data)) {
|
69
69
|
rb_raise(rb_eRuntimeError, "data cannot be empty");
|
70
70
|
}
|
@@ -261,7 +261,7 @@ get_recovery(VALUE self)
|
|
261
261
|
}
|
262
262
|
|
263
263
|
void
|
264
|
-
noko_init_xml_sax_parser_context()
|
264
|
+
noko_init_xml_sax_parser_context(void)
|
265
265
|
{
|
266
266
|
cNokogiriXmlSaxParserContext = rb_define_class_under(mNokogiriXmlSax, "ParserContext", rb_cObject);
|
267
267
|
|
@@ -278,4 +278,6 @@ noko_init_xml_sax_parser_context()
|
|
278
278
|
rb_define_method(cNokogiriXmlSaxParserContext, "recovery", get_recovery, 0);
|
279
279
|
rb_define_method(cNokogiriXmlSaxParserContext, "line", line, 0);
|
280
280
|
rb_define_method(cNokogiriXmlSaxParserContext, "column", column, 0);
|
281
|
+
|
282
|
+
id_read = rb_intern("read");
|
281
283
|
}
|
@@ -5,12 +5,10 @@ VALUE cNokogiriXmlSaxPushParser ;
|
|
5
5
|
static void
|
6
6
|
deallocate(xmlParserCtxtPtr ctx)
|
7
7
|
{
|
8
|
-
NOKOGIRI_DEBUG_START(ctx);
|
9
8
|
if (ctx != NULL) {
|
10
9
|
NOKOGIRI_SAX_TUPLE_DESTROY(ctx->userData);
|
11
10
|
xmlFreeParserCtxt(ctx);
|
12
11
|
}
|
13
|
-
NOKOGIRI_DEBUG_END(ctx);
|
14
12
|
}
|
15
13
|
|
16
14
|
static VALUE
|
@@ -152,7 +150,7 @@ set_replace_entities(VALUE self, VALUE value)
|
|
152
150
|
}
|
153
151
|
|
154
152
|
void
|
155
|
-
noko_init_xml_sax_push_parser()
|
153
|
+
noko_init_xml_sax_push_parser(void)
|
156
154
|
{
|
157
155
|
cNokogiriXmlSaxPushParser = rb_define_class_under(mNokogiriXmlSax, "PushParser", rb_cObject);
|
158
156
|
|
data/ext/nokogiri/xml_schema.c
CHANGED
@@ -5,9 +5,7 @@ VALUE cNokogiriXmlSchema;
|
|
5
5
|
static void
|
6
6
|
dealloc(xmlSchemaPtr schema)
|
7
7
|
{
|
8
|
-
NOKOGIRI_DEBUG_START(schema);
|
9
8
|
xmlSchemaFree(schema);
|
10
|
-
NOKOGIRI_DEBUG_END(schema);
|
11
9
|
}
|
12
10
|
|
13
11
|
/*
|
@@ -25,7 +23,7 @@ validate_document(VALUE self, VALUE document)
|
|
25
23
|
VALUE errors;
|
26
24
|
|
27
25
|
Data_Get_Struct(self, xmlSchema, schema);
|
28
|
-
|
26
|
+
Noko_Node_Get_Struct(document, xmlDoc, doc);
|
29
27
|
|
30
28
|
errors = rb_ary_new();
|
31
29
|
|
@@ -179,7 +177,7 @@ has_blank_nodes_p(VALUE cache)
|
|
179
177
|
for (i = 0; i < RARRAY_LEN(cache); i++) {
|
180
178
|
xmlNodePtr node;
|
181
179
|
VALUE element = rb_ary_entry(cache, i);
|
182
|
-
|
180
|
+
Noko_Node_Get_Struct(element, xmlNode, node);
|
183
181
|
if (xmlIsBlankNode(node)) {
|
184
182
|
return 1;
|
185
183
|
}
|
@@ -210,7 +208,7 @@ from_document(int argc, VALUE *argv, VALUE klass)
|
|
210
208
|
|
211
209
|
scanned_args = rb_scan_args(argc, argv, "11", &document, &parse_options);
|
212
210
|
|
213
|
-
|
211
|
+
Noko_Node_Get_Struct(document, xmlDoc, doc);
|
214
212
|
doc = doc->doc; /* In case someone passes us a node. ugh. */
|
215
213
|
|
216
214
|
if (scanned_args == 1) {
|
@@ -270,7 +268,7 @@ from_document(int argc, VALUE *argv, VALUE klass)
|
|
270
268
|
}
|
271
269
|
|
272
270
|
void
|
273
|
-
noko_init_xml_schema()
|
271
|
+
noko_init_xml_schema(void)
|
274
272
|
{
|
275
273
|
cNokogiriXmlSchema = rb_define_class_under(mNokogiriXml, "Schema", rb_cObject);
|
276
274
|
|
data/ext/nokogiri/xml_text.c
CHANGED
@@ -20,7 +20,7 @@ new (int argc, VALUE *argv, VALUE klass)
|
|
20
20
|
|
21
21
|
rb_scan_args(argc, argv, "2*", &string, &document, &rest);
|
22
22
|
|
23
|
-
|
23
|
+
Noko_Node_Get_Struct(document, xmlDoc, doc);
|
24
24
|
|
25
25
|
node = xmlNewText((xmlChar *)StringValueCStr(string));
|
26
26
|
node->doc = doc->doc;
|
@@ -36,7 +36,7 @@ new (int argc, VALUE *argv, VALUE klass)
|
|
36
36
|
}
|
37
37
|
|
38
38
|
void
|
39
|
-
noko_init_xml_text()
|
39
|
+
noko_init_xml_text(void)
|
40
40
|
{
|
41
41
|
assert(cNokogiriXmlCharacterData);
|
42
42
|
/*
|