nokogiri 1.16.8-x86-mingw32 → 1.17.0-x86-mingw32

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 (113) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +11 -21
  3. data/README.md +4 -0
  4. data/dependencies.yml +6 -6
  5. data/ext/nokogiri/extconf.rb +191 -137
  6. data/ext/nokogiri/gumbo.c +69 -53
  7. data/ext/nokogiri/html4_document.c +10 -4
  8. data/ext/nokogiri/html4_element_description.c +18 -18
  9. data/ext/nokogiri/html4_sax_parser.c +40 -0
  10. data/ext/nokogiri/html4_sax_parser_context.c +48 -58
  11. data/ext/nokogiri/html4_sax_push_parser.c +25 -24
  12. data/ext/nokogiri/include/libexslt/exsltconfig.h +3 -3
  13. data/ext/nokogiri/include/libxml2/libxml/HTMLparser.h +12 -19
  14. data/ext/nokogiri/include/libxml2/libxml/c14n.h +1 -12
  15. data/ext/nokogiri/include/libxml2/libxml/debugXML.h +1 -1
  16. data/ext/nokogiri/include/libxml2/libxml/encoding.h +9 -0
  17. data/ext/nokogiri/include/libxml2/libxml/entities.h +12 -1
  18. data/ext/nokogiri/include/libxml2/libxml/hash.h +19 -0
  19. data/ext/nokogiri/include/libxml2/libxml/list.h +2 -2
  20. data/ext/nokogiri/include/libxml2/libxml/nanohttp.h +17 -0
  21. data/ext/nokogiri/include/libxml2/libxml/parser.h +60 -54
  22. data/ext/nokogiri/include/libxml2/libxml/parserInternals.h +9 -1
  23. data/ext/nokogiri/include/libxml2/libxml/pattern.h +6 -0
  24. data/ext/nokogiri/include/libxml2/libxml/tree.h +32 -12
  25. data/ext/nokogiri/include/libxml2/libxml/uri.h +11 -0
  26. data/ext/nokogiri/include/libxml2/libxml/valid.h +29 -2
  27. data/ext/nokogiri/include/libxml2/libxml/xinclude.h +7 -0
  28. data/ext/nokogiri/include/libxml2/libxml/xmlIO.h +21 -4
  29. data/ext/nokogiri/include/libxml2/libxml/xmlerror.h +14 -0
  30. data/ext/nokogiri/include/libxml2/libxml/xmlexports.h +111 -15
  31. data/ext/nokogiri/include/libxml2/libxml/xmlmemory.h +8 -45
  32. data/ext/nokogiri/include/libxml2/libxml/xmlreader.h +2 -0
  33. data/ext/nokogiri/include/libxml2/libxml/xmlsave.h +5 -0
  34. data/ext/nokogiri/include/libxml2/libxml/xmlunicode.h +165 -1
  35. data/ext/nokogiri/include/libxml2/libxml/xmlversion.h +7 -171
  36. data/ext/nokogiri/include/libxml2/libxml/xmlwriter.h +1 -0
  37. data/ext/nokogiri/include/libxml2/libxml/xpath.h +4 -0
  38. data/ext/nokogiri/include/libxslt/xsltInternals.h +3 -0
  39. data/ext/nokogiri/include/libxslt/xsltconfig.h +4 -37
  40. data/ext/nokogiri/libxml2_polyfill.c +114 -0
  41. data/ext/nokogiri/nokogiri.c +9 -2
  42. data/ext/nokogiri/nokogiri.h +18 -33
  43. data/ext/nokogiri/xml_attr.c +1 -1
  44. data/ext/nokogiri/xml_cdata.c +2 -10
  45. data/ext/nokogiri/xml_comment.c +3 -8
  46. data/ext/nokogiri/xml_document.c +163 -156
  47. data/ext/nokogiri/xml_document_fragment.c +10 -25
  48. data/ext/nokogiri/xml_dtd.c +1 -1
  49. data/ext/nokogiri/xml_element_content.c +9 -9
  50. data/ext/nokogiri/xml_encoding_handler.c +4 -4
  51. data/ext/nokogiri/xml_namespace.c +6 -6
  52. data/ext/nokogiri/xml_node.c +130 -104
  53. data/ext/nokogiri/xml_node_set.c +46 -44
  54. data/ext/nokogiri/xml_reader.c +54 -58
  55. data/ext/nokogiri/xml_relax_ng.c +35 -56
  56. data/ext/nokogiri/xml_sax_parser.c +156 -88
  57. data/ext/nokogiri/xml_sax_parser_context.c +213 -131
  58. data/ext/nokogiri/xml_sax_push_parser.c +68 -49
  59. data/ext/nokogiri/xml_schema.c +50 -85
  60. data/ext/nokogiri/xml_syntax_error.c +19 -11
  61. data/ext/nokogiri/xml_text.c +2 -4
  62. data/ext/nokogiri/xml_xpath_context.c +2 -2
  63. data/ext/nokogiri/xslt_stylesheet.c +8 -8
  64. data/lib/nokogiri/3.0/nokogiri.so +0 -0
  65. data/lib/nokogiri/3.1/nokogiri.so +0 -0
  66. data/lib/nokogiri/3.2/nokogiri.so +0 -0
  67. data/lib/nokogiri/3.3/nokogiri.so +0 -0
  68. data/lib/nokogiri/class_resolver.rb +1 -1
  69. data/lib/nokogiri/css/node.rb +6 -2
  70. data/lib/nokogiri/css/parser.rb +6 -4
  71. data/lib/nokogiri/css/parser.y +2 -2
  72. data/lib/nokogiri/css/parser_extras.rb +6 -66
  73. data/lib/nokogiri/css/selector_cache.rb +38 -0
  74. data/lib/nokogiri/css/tokenizer.rb +4 -4
  75. data/lib/nokogiri/css/tokenizer.rex +9 -8
  76. data/lib/nokogiri/css/xpath_visitor.rb +42 -6
  77. data/lib/nokogiri/css.rb +86 -20
  78. data/lib/nokogiri/decorators/slop.rb +3 -5
  79. data/lib/nokogiri/encoding_handler.rb +2 -2
  80. data/lib/nokogiri/html4/document.rb +44 -23
  81. data/lib/nokogiri/html4/document_fragment.rb +124 -12
  82. data/lib/nokogiri/html4/encoding_reader.rb +1 -1
  83. data/lib/nokogiri/html4/sax/parser.rb +23 -38
  84. data/lib/nokogiri/html4/sax/parser_context.rb +4 -9
  85. data/lib/nokogiri/html4.rb +9 -14
  86. data/lib/nokogiri/html5/builder.rb +40 -0
  87. data/lib/nokogiri/html5/document.rb +61 -30
  88. data/lib/nokogiri/html5/document_fragment.rb +130 -20
  89. data/lib/nokogiri/html5/node.rb +4 -4
  90. data/lib/nokogiri/html5.rb +114 -72
  91. data/lib/nokogiri/version/constant.rb +1 -1
  92. data/lib/nokogiri/xml/builder.rb +8 -1
  93. data/lib/nokogiri/xml/document.rb +70 -26
  94. data/lib/nokogiri/xml/document_fragment.rb +84 -13
  95. data/lib/nokogiri/xml/node.rb +82 -11
  96. data/lib/nokogiri/xml/node_set.rb +9 -7
  97. data/lib/nokogiri/xml/parse_options.rb +1 -1
  98. data/lib/nokogiri/xml/pp/node.rb +6 -1
  99. data/lib/nokogiri/xml/reader.rb +46 -13
  100. data/lib/nokogiri/xml/relax_ng.rb +57 -20
  101. data/lib/nokogiri/xml/sax/document.rb +174 -83
  102. data/lib/nokogiri/xml/sax/parser.rb +115 -41
  103. data/lib/nokogiri/xml/sax/parser_context.rb +116 -8
  104. data/lib/nokogiri/xml/sax/push_parser.rb +3 -0
  105. data/lib/nokogiri/xml/sax.rb +48 -0
  106. data/lib/nokogiri/xml/schema.rb +112 -45
  107. data/lib/nokogiri/xml/searchable.rb +6 -8
  108. data/lib/nokogiri/xml/syntax_error.rb +22 -0
  109. data/lib/nokogiri/xml.rb +13 -24
  110. data/lib/nokogiri/xslt.rb +3 -9
  111. data/lib/xsd/xmlparser/nokogiri.rb +3 -4
  112. metadata +8 -4
  113. data/ext/nokogiri/libxml2_backwards_compat.c +0 -121
@@ -15,8 +15,8 @@ xml_reader_deallocate(void *data)
15
15
  }
16
16
  }
17
17
 
18
- static const rb_data_type_t xml_reader_type = {
19
- .wrap_struct_name = "Nokogiri::XML::Reader",
18
+ static const rb_data_type_t xml_text_reader_type = {
19
+ .wrap_struct_name = "xmlTextReader",
20
20
  .function = {
21
21
  .dfree = xml_reader_deallocate,
22
22
  },
@@ -84,7 +84,7 @@ default_eh(VALUE self)
84
84
  xmlTextReaderPtr reader;
85
85
  int eh;
86
86
 
87
- TypedData_Get_Struct(self, xmlTextReader, &xml_reader_type, reader);
87
+ TypedData_Get_Struct(self, xmlTextReader, &xml_text_reader_type, reader);
88
88
  eh = xmlTextReaderIsDefault(reader);
89
89
  if (eh == 0) { return Qfalse; }
90
90
  if (eh == 1) { return Qtrue; }
@@ -104,7 +104,7 @@ value_eh(VALUE self)
104
104
  xmlTextReaderPtr reader;
105
105
  int eh;
106
106
 
107
- TypedData_Get_Struct(self, xmlTextReader, &xml_reader_type, reader);
107
+ TypedData_Get_Struct(self, xmlTextReader, &xml_text_reader_type, reader);
108
108
  eh = xmlTextReaderHasValue(reader);
109
109
  if (eh == 0) { return Qfalse; }
110
110
  if (eh == 1) { return Qtrue; }
@@ -124,7 +124,7 @@ attributes_eh(VALUE self)
124
124
  xmlTextReaderPtr reader;
125
125
  int eh;
126
126
 
127
- TypedData_Get_Struct(self, xmlTextReader, &xml_reader_type, reader);
127
+ TypedData_Get_Struct(self, xmlTextReader, &xml_text_reader_type, reader);
128
128
  eh = has_attributes(reader);
129
129
  if (eh == 0) { return Qfalse; }
130
130
  if (eh == 1) { return Qtrue; }
@@ -146,7 +146,7 @@ rb_xml_reader_namespaces(VALUE rb_reader)
146
146
  xmlNodePtr c_node;
147
147
  VALUE rb_errors;
148
148
 
149
- TypedData_Get_Struct(rb_reader, xmlTextReader, &xml_reader_type, c_reader);
149
+ TypedData_Get_Struct(rb_reader, xmlTextReader, &xml_text_reader_type, c_reader);
150
150
 
151
151
  if (! has_attributes(c_reader)) {
152
152
  return rb_namespaces ;
@@ -154,7 +154,7 @@ rb_xml_reader_namespaces(VALUE rb_reader)
154
154
 
155
155
  rb_errors = rb_funcall(rb_reader, rb_intern("errors"), 0);
156
156
 
157
- xmlSetStructuredErrorFunc((void *)rb_errors, Nokogiri_error_array_pusher);
157
+ xmlSetStructuredErrorFunc((void *)rb_errors, noko__error_array_pusher);
158
158
  c_node = xmlTextReaderExpand(c_reader);
159
159
  xmlSetStructuredErrorFunc(NULL, NULL);
160
160
 
@@ -188,7 +188,7 @@ rb_xml_reader_attribute_hash(VALUE rb_reader)
188
188
  xmlAttrPtr c_property;
189
189
  VALUE rb_errors;
190
190
 
191
- TypedData_Get_Struct(rb_reader, xmlTextReader, &xml_reader_type, c_reader);
191
+ TypedData_Get_Struct(rb_reader, xmlTextReader, &xml_text_reader_type, c_reader);
192
192
 
193
193
  if (!has_attributes(c_reader)) {
194
194
  return rb_attributes;
@@ -196,7 +196,7 @@ rb_xml_reader_attribute_hash(VALUE rb_reader)
196
196
 
197
197
  rb_errors = rb_funcall(rb_reader, rb_intern("errors"), 0);
198
198
 
199
- xmlSetStructuredErrorFunc((void *)rb_errors, Nokogiri_error_array_pusher);
199
+ xmlSetStructuredErrorFunc((void *)rb_errors, noko__error_array_pusher);
200
200
  c_node = xmlTextReaderExpand(c_reader);
201
201
  xmlSetStructuredErrorFunc(NULL, NULL);
202
202
 
@@ -241,7 +241,7 @@ attribute_at(VALUE self, VALUE index)
241
241
  xmlChar *value;
242
242
  VALUE rb_value;
243
243
 
244
- TypedData_Get_Struct(self, xmlTextReader, &xml_reader_type, reader);
244
+ TypedData_Get_Struct(self, xmlTextReader, &xml_text_reader_type, reader);
245
245
 
246
246
  if (NIL_P(index)) { return Qnil; }
247
247
  index = rb_Integer(index);
@@ -270,7 +270,7 @@ reader_attribute(VALUE self, VALUE name)
270
270
  xmlChar *value ;
271
271
  VALUE rb_value;
272
272
 
273
- TypedData_Get_Struct(self, xmlTextReader, &xml_reader_type, reader);
273
+ TypedData_Get_Struct(self, xmlTextReader, &xml_text_reader_type, reader);
274
274
 
275
275
  if (NIL_P(name)) { return Qnil; }
276
276
  name = StringValue(name) ;
@@ -295,7 +295,7 @@ attribute_count(VALUE self)
295
295
  xmlTextReaderPtr reader;
296
296
  int count;
297
297
 
298
- TypedData_Get_Struct(self, xmlTextReader, &xml_reader_type, reader);
298
+ TypedData_Get_Struct(self, xmlTextReader, &xml_text_reader_type, reader);
299
299
  count = xmlTextReaderAttributeCount(reader);
300
300
  if (count == -1) { return Qnil; }
301
301
 
@@ -314,7 +314,7 @@ depth(VALUE self)
314
314
  xmlTextReaderPtr reader;
315
315
  int depth;
316
316
 
317
- TypedData_Get_Struct(self, xmlTextReader, &xml_reader_type, reader);
317
+ TypedData_Get_Struct(self, xmlTextReader, &xml_text_reader_type, reader);
318
318
  depth = xmlTextReaderDepth(reader);
319
319
  if (depth == -1) { return Qnil; }
320
320
 
@@ -333,7 +333,7 @@ xml_version(VALUE self)
333
333
  xmlTextReaderPtr reader;
334
334
  const char *version;
335
335
 
336
- TypedData_Get_Struct(self, xmlTextReader, &xml_reader_type, reader);
336
+ TypedData_Get_Struct(self, xmlTextReader, &xml_text_reader_type, reader);
337
337
  version = (const char *)xmlTextReaderConstXmlVersion(reader);
338
338
  if (version == NULL) { return Qnil; }
339
339
 
@@ -352,7 +352,7 @@ lang(VALUE self)
352
352
  xmlTextReaderPtr reader;
353
353
  const char *lang;
354
354
 
355
- TypedData_Get_Struct(self, xmlTextReader, &xml_reader_type, reader);
355
+ TypedData_Get_Struct(self, xmlTextReader, &xml_text_reader_type, reader);
356
356
  lang = (const char *)xmlTextReaderConstXmlLang(reader);
357
357
  if (lang == NULL) { return Qnil; }
358
358
 
@@ -371,7 +371,7 @@ value(VALUE self)
371
371
  xmlTextReaderPtr reader;
372
372
  const char *value;
373
373
 
374
- TypedData_Get_Struct(self, xmlTextReader, &xml_reader_type, reader);
374
+ TypedData_Get_Struct(self, xmlTextReader, &xml_text_reader_type, reader);
375
375
  value = (const char *)xmlTextReaderConstValue(reader);
376
376
  if (value == NULL) { return Qnil; }
377
377
 
@@ -390,7 +390,7 @@ prefix(VALUE self)
390
390
  xmlTextReaderPtr reader;
391
391
  const char *prefix;
392
392
 
393
- TypedData_Get_Struct(self, xmlTextReader, &xml_reader_type, reader);
393
+ TypedData_Get_Struct(self, xmlTextReader, &xml_text_reader_type, reader);
394
394
  prefix = (const char *)xmlTextReaderConstPrefix(reader);
395
395
  if (prefix == NULL) { return Qnil; }
396
396
 
@@ -409,7 +409,7 @@ namespace_uri(VALUE self)
409
409
  xmlTextReaderPtr reader;
410
410
  const char *uri;
411
411
 
412
- TypedData_Get_Struct(self, xmlTextReader, &xml_reader_type, reader);
412
+ TypedData_Get_Struct(self, xmlTextReader, &xml_text_reader_type, reader);
413
413
  uri = (const char *)xmlTextReaderConstNamespaceUri(reader);
414
414
  if (uri == NULL) { return Qnil; }
415
415
 
@@ -428,7 +428,7 @@ local_name(VALUE self)
428
428
  xmlTextReaderPtr reader;
429
429
  const char *name;
430
430
 
431
- TypedData_Get_Struct(self, xmlTextReader, &xml_reader_type, reader);
431
+ TypedData_Get_Struct(self, xmlTextReader, &xml_text_reader_type, reader);
432
432
  name = (const char *)xmlTextReaderConstLocalName(reader);
433
433
  if (name == NULL) { return Qnil; }
434
434
 
@@ -447,7 +447,7 @@ name(VALUE self)
447
447
  xmlTextReaderPtr reader;
448
448
  const char *name;
449
449
 
450
- TypedData_Get_Struct(self, xmlTextReader, &xml_reader_type, reader);
450
+ TypedData_Get_Struct(self, xmlTextReader, &xml_text_reader_type, reader);
451
451
  name = (const char *)xmlTextReaderConstName(reader);
452
452
  if (name == NULL) { return Qnil; }
453
453
 
@@ -467,7 +467,7 @@ rb_xml_reader_base_uri(VALUE rb_reader)
467
467
  xmlTextReaderPtr c_reader;
468
468
  xmlChar *c_base_uri;
469
469
 
470
- TypedData_Get_Struct(rb_reader, xmlTextReader, &xml_reader_type, c_reader);
470
+ TypedData_Get_Struct(rb_reader, xmlTextReader, &xml_text_reader_type, c_reader);
471
471
 
472
472
  c_base_uri = xmlTextReaderBaseUri(c_reader);
473
473
  if (c_base_uri == NULL) {
@@ -490,7 +490,7 @@ static VALUE
490
490
  state(VALUE self)
491
491
  {
492
492
  xmlTextReaderPtr reader;
493
- TypedData_Get_Struct(self, xmlTextReader, &xml_reader_type, reader);
493
+ TypedData_Get_Struct(self, xmlTextReader, &xml_text_reader_type, reader);
494
494
  return INT2NUM(xmlTextReaderReadState(reader));
495
495
  }
496
496
 
@@ -504,7 +504,7 @@ static VALUE
504
504
  node_type(VALUE self)
505
505
  {
506
506
  xmlTextReaderPtr reader;
507
- TypedData_Get_Struct(self, xmlTextReader, &xml_reader_type, reader);
507
+ TypedData_Get_Struct(self, xmlTextReader, &xml_text_reader_type, reader);
508
508
  return INT2NUM(xmlTextReaderNodeType(reader));
509
509
  }
510
510
 
@@ -515,44 +515,41 @@ node_type(VALUE self)
515
515
  * Move the Reader forward through the XML document.
516
516
  */
517
517
  static VALUE
518
- read_more(VALUE self)
518
+ read_more(VALUE rb_reader)
519
519
  {
520
- xmlTextReaderPtr reader;
521
- xmlErrorConstPtr error;
522
- VALUE error_list;
523
- int ret;
524
- xmlDocPtr c_document;
520
+ xmlTextReaderPtr c_reader;
521
+ libxmlStructuredErrorHandlerState handler_state;
525
522
 
526
- TypedData_Get_Struct(self, xmlTextReader, &xml_reader_type, reader);
523
+ TypedData_Get_Struct(rb_reader, xmlTextReader, &xml_text_reader_type, c_reader);
527
524
 
528
- error_list = rb_funcall(self, rb_intern("errors"), 0);
525
+ VALUE rb_errors = rb_funcall(rb_reader, rb_intern("errors"), 0);
526
+ noko__structured_error_func_save_and_set(&handler_state, (void *)rb_errors, noko__error_array_pusher);
529
527
 
530
- xmlSetStructuredErrorFunc((void *)error_list, Nokogiri_error_array_pusher);
531
- ret = xmlTextReaderRead(reader);
532
- xmlSetStructuredErrorFunc(NULL, NULL);
528
+ int status = xmlTextReaderRead(c_reader);
529
+
530
+ noko__structured_error_func_restore(&handler_state);
533
531
 
534
- c_document = xmlTextReaderCurrentDoc(reader);
532
+ xmlDocPtr c_document = xmlTextReaderCurrentDoc(c_reader);
535
533
  if (c_document && c_document->encoding == NULL) {
536
- VALUE constructor_encoding = rb_iv_get(self, "@encoding");
534
+ VALUE constructor_encoding = rb_iv_get(rb_reader, "@encoding");
537
535
  if (RTEST(constructor_encoding)) {
538
536
  c_document->encoding = xmlStrdup(BAD_CAST StringValueCStr(constructor_encoding));
539
537
  } else {
540
- rb_iv_set(self, "@encoding", NOKOGIRI_STR_NEW2("UTF-8"));
538
+ rb_iv_set(rb_reader, "@encoding", NOKOGIRI_STR_NEW2("UTF-8"));
541
539
  c_document->encoding = xmlStrdup(BAD_CAST "UTF-8");
542
540
  }
543
541
  }
544
542
 
545
- if (ret == 1) { return self; }
546
- if (ret == 0) { return Qnil; }
543
+ if (status == 1) { return rb_reader; }
544
+ if (status == 0) { return Qnil; }
547
545
 
548
- error = xmlGetLastError();
549
- if (error) {
550
- rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error));
546
+ /* if we're here, there was an error */
547
+ VALUE exception = rb_funcall(cNokogiriXmlSyntaxError, rb_intern("aggregate"), 1, rb_errors);
548
+ if (RB_TEST(exception)) {
549
+ rb_exc_raise(exception);
551
550
  } else {
552
- rb_raise(rb_eRuntimeError, "Error pulling: %d", ret);
551
+ rb_raise(rb_eRuntimeError, "Error pulling: %d", status);
553
552
  }
554
-
555
- return Qnil;
556
553
  }
557
554
 
558
555
  /*
@@ -569,7 +566,7 @@ inner_xml(VALUE self)
569
566
  xmlChar *value;
570
567
  VALUE str;
571
568
 
572
- TypedData_Get_Struct(self, xmlTextReader, &xml_reader_type, reader);
569
+ TypedData_Get_Struct(self, xmlTextReader, &xml_text_reader_type, reader);
573
570
 
574
571
  value = xmlTextReaderReadInnerXml(reader);
575
572
 
@@ -596,7 +593,7 @@ outer_xml(VALUE self)
596
593
  xmlChar *value;
597
594
  VALUE str = Qnil;
598
595
 
599
- TypedData_Get_Struct(self, xmlTextReader, &xml_reader_type, reader);
596
+ TypedData_Get_Struct(self, xmlTextReader, &xml_text_reader_type, reader);
600
597
 
601
598
  value = xmlTextReaderReadOuterXml(reader);
602
599
 
@@ -611,11 +608,13 @@ outer_xml(VALUE self)
611
608
  * call-seq:
612
609
  * from_memory(string, url = nil, encoding = nil, options = 0)
613
610
  *
614
- * Create a new reader that parses +string+
611
+ * Create a new Reader to parse a String.
615
612
  */
616
613
  static VALUE
617
614
  from_memory(int argc, VALUE *argv, VALUE klass)
618
615
  {
616
+ /* TODO: deprecate this method, since Reader.new can handle both memory and IO. It can then
617
+ * become private. */
619
618
  VALUE rb_buffer, rb_url, encoding, rb_options;
620
619
  xmlTextReaderPtr reader;
621
620
  const char *c_url = NULL;
@@ -643,7 +642,7 @@ from_memory(int argc, VALUE *argv, VALUE klass)
643
642
  rb_raise(rb_eRuntimeError, "couldn't create a parser");
644
643
  }
645
644
 
646
- rb_reader = TypedData_Wrap_Struct(klass, &xml_reader_type, reader);
645
+ rb_reader = TypedData_Wrap_Struct(klass, &xml_text_reader_type, reader);
647
646
  args[0] = rb_buffer;
648
647
  args[1] = rb_url;
649
648
  args[2] = encoding;
@@ -656,11 +655,13 @@ from_memory(int argc, VALUE *argv, VALUE klass)
656
655
  * call-seq:
657
656
  * from_io(io, url = nil, encoding = nil, options = 0)
658
657
  *
659
- * Create a new reader that parses +io+
658
+ * Create a new Reader to parse an IO stream.
660
659
  */
661
660
  static VALUE
662
661
  from_io(int argc, VALUE *argv, VALUE klass)
663
662
  {
663
+ /* TODO: deprecate this method, since Reader.new can handle both memory and IO. It can then
664
+ * become private. */
664
665
  VALUE rb_io, rb_url, encoding, rb_options;
665
666
  xmlTextReaderPtr reader;
666
667
  const char *c_url = NULL;
@@ -689,7 +690,7 @@ from_io(int argc, VALUE *argv, VALUE klass)
689
690
  rb_raise(rb_eRuntimeError, "couldn't create a parser");
690
691
  }
691
692
 
692
- rb_reader = TypedData_Wrap_Struct(klass, &xml_reader_type, reader);
693
+ rb_reader = TypedData_Wrap_Struct(klass, &xml_text_reader_type, reader);
693
694
  args[0] = rb_io;
694
695
  args[1] = rb_url;
695
696
  args[2] = encoding;
@@ -709,7 +710,7 @@ empty_element_p(VALUE self)
709
710
  {
710
711
  xmlTextReaderPtr reader;
711
712
 
712
- TypedData_Get_Struct(self, xmlTextReader, &xml_reader_type, reader);
713
+ TypedData_Get_Struct(self, xmlTextReader, &xml_text_reader_type, reader);
713
714
 
714
715
  if (xmlTextReaderIsEmptyElement(reader)) {
715
716
  return Qtrue;
@@ -725,7 +726,7 @@ rb_xml_reader_encoding(VALUE rb_reader)
725
726
  const char *parser_encoding;
726
727
  VALUE constructor_encoding;
727
728
 
728
- TypedData_Get_Struct(rb_reader, xmlTextReader, &xml_reader_type, c_reader);
729
+ TypedData_Get_Struct(rb_reader, xmlTextReader, &xml_text_reader_type, c_reader);
729
730
  parser_encoding = (const char *)xmlTextReaderConstEncoding(c_reader);
730
731
  if (parser_encoding) {
731
732
  return NOKOGIRI_STR_NEW2(parser_encoding);
@@ -742,11 +743,6 @@ rb_xml_reader_encoding(VALUE rb_reader)
742
743
  void
743
744
  noko_init_xml_reader(void)
744
745
  {
745
- /*
746
- * The Reader parser allows you to effectively pull parse an XML document.
747
- * Once instantiated, call Nokogiri::XML::Reader#each to iterate over each
748
- * node. Note that you may only iterate over the document once!
749
- */
750
746
  cNokogiriXmlReader = rb_define_class_under(mNokogiriXml, "Reader", rb_cObject);
751
747
 
752
748
  rb_undef_alloc_func(cNokogiriXmlReader);
@@ -3,28 +3,22 @@
3
3
  VALUE cNokogiriXmlRelaxNG;
4
4
 
5
5
  static void
6
- xml_relax_ng_deallocate(void *data)
6
+ _noko_xml_relax_ng_deallocate(void *data)
7
7
  {
8
8
  xmlRelaxNGPtr schema = data;
9
9
  xmlRelaxNGFree(schema);
10
10
  }
11
11
 
12
12
  static const rb_data_type_t xml_relax_ng_type = {
13
- .wrap_struct_name = "Nokogiri::XML::RelaxNG",
13
+ .wrap_struct_name = "xmlRelaxNG",
14
14
  .function = {
15
- .dfree = xml_relax_ng_deallocate,
15
+ .dfree = _noko_xml_relax_ng_deallocate,
16
16
  },
17
17
  .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
18
18
  };
19
19
 
20
- /*
21
- * call-seq:
22
- * validate_document(document)
23
- *
24
- * Validate a Nokogiri::XML::Document against this RelaxNG schema.
25
- */
26
20
  static VALUE
27
- validate_document(VALUE self, VALUE document)
21
+ noko_xml_relax_ng__validate_document(VALUE self, VALUE document)
28
22
  {
29
23
  xmlDocPtr doc;
30
24
  xmlRelaxNGPtr schema;
@@ -43,13 +37,11 @@ validate_document(VALUE self, VALUE document)
43
37
  rb_raise(rb_eRuntimeError, "Could not create a validation context");
44
38
  }
45
39
 
46
- #ifdef HAVE_XMLRELAXNGSETVALIDSTRUCTUREDERRORS
47
40
  xmlRelaxNGSetValidStructuredErrors(
48
41
  valid_ctxt,
49
- Nokogiri_error_array_pusher,
42
+ noko__error_array_pusher,
50
43
  (void *)errors
51
44
  );
52
- #endif
53
45
 
54
46
  xmlRelaxNGValidateDoc(valid_ctxt, doc);
55
47
 
@@ -59,8 +51,8 @@ validate_document(VALUE self, VALUE document)
59
51
  }
60
52
 
61
53
  static VALUE
62
- xml_relax_ng_parse_schema(
63
- VALUE klass,
54
+ _noko_xml_relax_ng_parse_schema(
55
+ VALUE rb_class,
64
56
  xmlRelaxNGParserCtxtPtr c_parser_context,
65
57
  VALUE rb_parse_options
66
58
  )
@@ -68,6 +60,7 @@ xml_relax_ng_parse_schema(
68
60
  VALUE rb_errors;
69
61
  VALUE rb_schema;
70
62
  xmlRelaxNGPtr c_schema;
63
+ libxmlStructuredErrorHandlerState handler_state;
71
64
 
72
65
  if (NIL_P(rb_parse_options)) {
73
66
  rb_parse_options = rb_const_get_at(
@@ -77,33 +70,30 @@ xml_relax_ng_parse_schema(
77
70
  }
78
71
 
79
72
  rb_errors = rb_ary_new();
80
- xmlSetStructuredErrorFunc((void *)rb_errors, Nokogiri_error_array_pusher);
81
73
 
82
- #ifdef HAVE_XMLRELAXNGSETPARSERSTRUCTUREDERRORS
74
+ noko__structured_error_func_save_and_set(&handler_state, (void *)rb_errors, noko__error_array_pusher);
83
75
  xmlRelaxNGSetParserStructuredErrors(
84
76
  c_parser_context,
85
- Nokogiri_error_array_pusher,
77
+ noko__error_array_pusher,
86
78
  (void *)rb_errors
87
79
  );
88
- #endif
89
80
 
90
81
  c_schema = xmlRelaxNGParse(c_parser_context);
91
82
 
92
- xmlSetStructuredErrorFunc(NULL, NULL);
93
83
  xmlRelaxNGFreeParserCtxt(c_parser_context);
84
+ noko__structured_error_func_restore(&handler_state);
94
85
 
95
86
  if (NULL == c_schema) {
96
- xmlErrorConstPtr error = xmlGetLastError();
97
- if (error) {
98
- Nokogiri_error_raise(NULL, error);
87
+ VALUE exception = rb_funcall(cNokogiriXmlSyntaxError, rb_intern("aggregate"), 1, rb_errors);
88
+
89
+ if (RB_TEST(exception)) {
90
+ rb_exc_raise(exception);
99
91
  } else {
100
92
  rb_raise(rb_eRuntimeError, "Could not parse document");
101
93
  }
102
-
103
- return Qnil;
104
94
  }
105
95
 
106
- rb_schema = TypedData_Wrap_Struct(klass, &xml_relax_ng_type, c_schema);
96
+ rb_schema = TypedData_Wrap_Struct(rb_class, &xml_relax_ng_type, c_schema);
107
97
  rb_iv_set(rb_schema, "@errors", rb_errors);
108
98
  rb_iv_set(rb_schema, "@parse_options", rb_parse_options);
109
99
 
@@ -111,37 +101,27 @@ xml_relax_ng_parse_schema(
111
101
  }
112
102
 
113
103
  /*
114
- * call-seq:
115
- * read_memory(string)
104
+ * :call-seq:
105
+ * from_document(document) → Nokogiri::XML::RelaxNG
106
+ * from_document(document, parse_options) → Nokogiri::XML::RelaxNG
116
107
  *
117
- * Create a new RelaxNG from the contents of +string+
118
- */
119
- static VALUE
120
- read_memory(int argc, VALUE *argv, VALUE klass)
121
- {
122
- VALUE rb_content;
123
- VALUE rb_parse_options;
124
- xmlRelaxNGParserCtxtPtr c_parser_context;
125
-
126
- rb_scan_args(argc, argv, "11", &rb_content, &rb_parse_options);
127
-
128
- c_parser_context = xmlRelaxNGNewMemParserCtxt(
129
- (const char *)StringValuePtr(rb_content),
130
- (int)RSTRING_LEN(rb_content)
131
- );
132
-
133
- return xml_relax_ng_parse_schema(klass, c_parser_context, rb_parse_options);
134
- }
135
-
136
- /*
137
- * call-seq:
138
- * from_document(doc)
108
+ * Parse a RELAX NG schema definition from a Document to create a new Nokogiri::XML::RelaxNG.
109
+ *
110
+ * [Parameters]
111
+ * - +document+ (XML::Document) A document containing the RELAX NG schema definition
112
+ * - +parse_options+ (Nokogiri::XML::ParseOptions)
113
+ * Defaults to ParseOptions::DEFAULT_SCHEMA ⚠ Unused
114
+ *
115
+ * [Returns] Nokogiri::XML::RelaxNG
139
116
  *
140
- * Create a new RelaxNG schema from the Nokogiri::XML::Document +doc+
117
+ * +parse_options+ is currently unused by this method and is present only as a placeholder for
118
+ * future functionality.
141
119
  */
142
120
  static VALUE
143
- from_document(int argc, VALUE *argv, VALUE klass)
121
+ noko_xml_relax_ng_s_from_document(int argc, VALUE *argv, VALUE rb_class)
144
122
  {
123
+ /* TODO: deprecate this method and put file-or-string logic into .new so that becomes the
124
+ * preferred entry point, and this can become a private method */
145
125
  VALUE rb_document;
146
126
  VALUE rb_parse_options;
147
127
  xmlDocPtr c_document;
@@ -154,7 +134,7 @@ from_document(int argc, VALUE *argv, VALUE klass)
154
134
 
155
135
  c_parser_context = xmlRelaxNGNewDocParserCtxt(c_document);
156
136
 
157
- return xml_relax_ng_parse_schema(klass, c_parser_context, rb_parse_options);
137
+ return _noko_xml_relax_ng_parse_schema(rb_class, c_parser_context, rb_parse_options);
158
138
  }
159
139
 
160
140
  void
@@ -163,8 +143,7 @@ noko_init_xml_relax_ng(void)
163
143
  assert(cNokogiriXmlSchema);
164
144
  cNokogiriXmlRelaxNG = rb_define_class_under(mNokogiriXml, "RelaxNG", cNokogiriXmlSchema);
165
145
 
166
- rb_define_singleton_method(cNokogiriXmlRelaxNG, "read_memory", read_memory, -1);
167
- rb_define_singleton_method(cNokogiriXmlRelaxNG, "from_document", from_document, -1);
146
+ rb_define_singleton_method(cNokogiriXmlRelaxNG, "from_document", noko_xml_relax_ng_s_from_document, -1);
168
147
 
169
- rb_define_private_method(cNokogiriXmlRelaxNG, "validate_document", validate_document, 1);
148
+ rb_define_private_method(cNokogiriXmlRelaxNG, "validate_document", noko_xml_relax_ng__validate_document, 1);
170
149
  }