nokogiri 1.16.3 → 1.18.1

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 (95) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +14 -22
  3. data/LICENSE-DEPENDENCIES.md +6 -6
  4. data/README.md +8 -5
  5. data/dependencies.yml +9 -9
  6. data/ext/nokogiri/extconf.rb +188 -142
  7. data/ext/nokogiri/gumbo.c +69 -53
  8. data/ext/nokogiri/html4_document.c +10 -4
  9. data/ext/nokogiri/html4_element_description.c +18 -18
  10. data/ext/nokogiri/html4_sax_parser.c +40 -0
  11. data/ext/nokogiri/html4_sax_parser_context.c +48 -58
  12. data/ext/nokogiri/html4_sax_push_parser.c +25 -24
  13. data/ext/nokogiri/libxml2_polyfill.c +114 -0
  14. data/ext/nokogiri/nokogiri.c +9 -2
  15. data/ext/nokogiri/nokogiri.h +18 -33
  16. data/ext/nokogiri/xml_attr.c +1 -1
  17. data/ext/nokogiri/xml_cdata.c +2 -10
  18. data/ext/nokogiri/xml_comment.c +3 -8
  19. data/ext/nokogiri/xml_document.c +163 -156
  20. data/ext/nokogiri/xml_document_fragment.c +10 -25
  21. data/ext/nokogiri/xml_dtd.c +1 -1
  22. data/ext/nokogiri/xml_element_content.c +9 -9
  23. data/ext/nokogiri/xml_encoding_handler.c +4 -4
  24. data/ext/nokogiri/xml_namespace.c +6 -6
  25. data/ext/nokogiri/xml_node.c +141 -104
  26. data/ext/nokogiri/xml_node_set.c +46 -44
  27. data/ext/nokogiri/xml_reader.c +54 -58
  28. data/ext/nokogiri/xml_relax_ng.c +35 -56
  29. data/ext/nokogiri/xml_sax_parser.c +156 -88
  30. data/ext/nokogiri/xml_sax_parser_context.c +219 -131
  31. data/ext/nokogiri/xml_sax_push_parser.c +68 -49
  32. data/ext/nokogiri/xml_schema.c +50 -85
  33. data/ext/nokogiri/xml_syntax_error.c +19 -11
  34. data/ext/nokogiri/xml_text.c +2 -4
  35. data/ext/nokogiri/xml_xpath_context.c +103 -100
  36. data/ext/nokogiri/xslt_stylesheet.c +8 -8
  37. data/gumbo-parser/src/ascii.c +2 -2
  38. data/gumbo-parser/src/error.c +76 -48
  39. data/gumbo-parser/src/error.h +5 -1
  40. data/gumbo-parser/src/nokogiri_gumbo.h +11 -2
  41. data/gumbo-parser/src/parser.c +63 -25
  42. data/gumbo-parser/src/tokenizer.c +6 -6
  43. data/lib/nokogiri/class_resolver.rb +1 -1
  44. data/lib/nokogiri/css/node.rb +6 -2
  45. data/lib/nokogiri/css/parser.rb +6 -4
  46. data/lib/nokogiri/css/parser.y +2 -2
  47. data/lib/nokogiri/css/parser_extras.rb +6 -66
  48. data/lib/nokogiri/css/selector_cache.rb +38 -0
  49. data/lib/nokogiri/css/tokenizer.rb +4 -4
  50. data/lib/nokogiri/css/tokenizer.rex +9 -8
  51. data/lib/nokogiri/css/xpath_visitor.rb +42 -6
  52. data/lib/nokogiri/css.rb +86 -20
  53. data/lib/nokogiri/decorators/slop.rb +3 -5
  54. data/lib/nokogiri/encoding_handler.rb +2 -2
  55. data/lib/nokogiri/html4/document.rb +44 -23
  56. data/lib/nokogiri/html4/document_fragment.rb +124 -12
  57. data/lib/nokogiri/html4/encoding_reader.rb +1 -1
  58. data/lib/nokogiri/html4/sax/parser.rb +23 -38
  59. data/lib/nokogiri/html4/sax/parser_context.rb +4 -9
  60. data/lib/nokogiri/html4.rb +9 -14
  61. data/lib/nokogiri/html5/builder.rb +40 -0
  62. data/lib/nokogiri/html5/document.rb +61 -30
  63. data/lib/nokogiri/html5/document_fragment.rb +130 -20
  64. data/lib/nokogiri/html5/node.rb +4 -4
  65. data/lib/nokogiri/html5.rb +114 -72
  66. data/lib/nokogiri/version/constant.rb +1 -1
  67. data/lib/nokogiri/xml/builder.rb +8 -1
  68. data/lib/nokogiri/xml/document.rb +70 -26
  69. data/lib/nokogiri/xml/document_fragment.rb +84 -13
  70. data/lib/nokogiri/xml/node.rb +82 -11
  71. data/lib/nokogiri/xml/node_set.rb +9 -7
  72. data/lib/nokogiri/xml/parse_options.rb +1 -1
  73. data/lib/nokogiri/xml/pp/node.rb +6 -1
  74. data/lib/nokogiri/xml/reader.rb +46 -13
  75. data/lib/nokogiri/xml/relax_ng.rb +57 -20
  76. data/lib/nokogiri/xml/sax/document.rb +174 -83
  77. data/lib/nokogiri/xml/sax/parser.rb +115 -41
  78. data/lib/nokogiri/xml/sax/parser_context.rb +116 -8
  79. data/lib/nokogiri/xml/sax/push_parser.rb +3 -0
  80. data/lib/nokogiri/xml/sax.rb +48 -0
  81. data/lib/nokogiri/xml/schema.rb +112 -45
  82. data/lib/nokogiri/xml/searchable.rb +38 -42
  83. data/lib/nokogiri/xml/syntax_error.rb +22 -0
  84. data/lib/nokogiri/xml/xpath_context.rb +14 -3
  85. data/lib/nokogiri/xml.rb +13 -24
  86. data/lib/nokogiri/xslt.rb +3 -9
  87. data/lib/xsd/xmlparser/nokogiri.rb +3 -4
  88. data/patches/libxml2/0019-xpath-Use-separate-static-hash-table-for-standard-fu.patch +244 -0
  89. data/ports/archives/libxml2-2.13.5.tar.xz +0 -0
  90. data/ports/archives/libxslt-1.1.42.tar.xz +0 -0
  91. metadata +13 -14
  92. data/ext/nokogiri/libxml2_backwards_compat.c +0 -121
  93. data/patches/libxml2/0003-libxml2.la-is-in-top_builddir.patch +0 -25
  94. data/ports/archives/libxml2-2.12.6.tar.xz +0 -0
  95. data/ports/archives/libxslt-1.1.39.tar.xz +0 -0
@@ -17,6 +17,8 @@ dealloc_node_i2(xmlNodePtr key, xmlNodePtr node, xmlDocPtr doc)
17
17
  break;
18
18
  default:
19
19
  if (node->parent == NULL) {
20
+ node->next = NULL;
21
+ node->prev = NULL;
20
22
  xmlAddChild((xmlNodePtr)doc, node);
21
23
  }
22
24
  }
@@ -107,7 +109,7 @@ memsize_node(const xmlNodePtr node)
107
109
  xmlAttrPtr property;
108
110
  size_t memsize = 0;
109
111
 
110
- memsize += xmlStrlen(node->name);
112
+ memsize += (size_t)xmlStrlen(node->name);
111
113
 
112
114
  if (node->type == XML_ELEMENT_NODE) {
113
115
  for (property = node->properties; property; property = property->next) {
@@ -115,7 +117,7 @@ memsize_node(const xmlNodePtr node)
115
117
  }
116
118
  }
117
119
  if (node->type == XML_TEXT_NODE) {
118
- memsize += xmlStrlen(node->content);
120
+ memsize += (size_t)xmlStrlen(node->content);
119
121
  }
120
122
  for (child = node->children; child; child = child->next) {
121
123
  memsize += sizeof(xmlNode) + memsize_node(child);
@@ -133,8 +135,8 @@ memsize(const void *data)
133
135
  return memsize;
134
136
  }
135
137
 
136
- static const rb_data_type_t noko_xml_document_data_type = {
137
- .wrap_struct_name = "Nokogiri::XML::Document",
138
+ static const rb_data_type_t xml_doc_type = {
139
+ .wrap_struct_name = "xmlDoc",
138
140
  .function = {
139
141
  .dmark = mark,
140
142
  .dfree = dealloc,
@@ -143,6 +145,53 @@ static const rb_data_type_t noko_xml_document_data_type = {
143
145
  // .flags = RUBY_TYPED_FREE_IMMEDIATELY, // TODO see https://github.com/sparklemotion/nokogiri/issues/2822
144
146
  };
145
147
 
148
+ static VALUE
149
+ _xml_document_alloc(VALUE klass)
150
+ {
151
+ return TypedData_Wrap_Struct(klass, &xml_doc_type, NULL);
152
+ }
153
+
154
+ static void
155
+ _xml_document_data_ptr_set(VALUE rb_document, xmlDocPtr c_document)
156
+ {
157
+ nokogiriTuplePtr tuple;
158
+
159
+ assert(DATA_PTR(rb_document) == NULL);
160
+ assert(c_document->_private == NULL);
161
+
162
+ DATA_PTR(rb_document) = c_document;
163
+
164
+ tuple = (nokogiriTuplePtr)ruby_xmalloc(sizeof(nokogiriTuple));
165
+ tuple->doc = rb_document;
166
+ tuple->unlinkedNodes = st_init_numtable_with_size(128);
167
+ tuple->node_cache = rb_ary_new();
168
+
169
+ c_document->_private = tuple ;
170
+
171
+ rb_iv_set(rb_document, "@node_cache", tuple->node_cache);
172
+
173
+ return;
174
+ }
175
+
176
+ /* :nodoc: */
177
+ static VALUE
178
+ rb_xml_document_initialize_copy_with_args(VALUE rb_self, VALUE rb_other, VALUE rb_level)
179
+ {
180
+ xmlDocPtr c_other, c_self;
181
+ int c_level;
182
+
183
+ c_other = noko_xml_document_unwrap(rb_other);
184
+ c_level = (int)NUM2INT(rb_level);
185
+
186
+ c_self = xmlCopyDoc(c_other, c_level);
187
+ if (c_self == NULL) { return Qnil; }
188
+
189
+ c_self->type = c_other->type;
190
+ _xml_document_data_ptr_set(rb_self, c_self);
191
+
192
+ return rb_self ;
193
+ }
194
+
146
195
  static void
147
196
  recursively_remove_namespaces_from_node(xmlNodePtr node)
148
197
  {
@@ -315,49 +364,46 @@ version(VALUE self)
315
364
  * Create a new document from an IO object
316
365
  */
317
366
  static VALUE
318
- read_io(VALUE klass,
319
- VALUE io,
320
- VALUE url,
321
- VALUE encoding,
322
- VALUE options)
323
- {
324
- const char *c_url = NIL_P(url) ? NULL : StringValueCStr(url);
325
- const char *c_enc = NIL_P(encoding) ? NULL : StringValueCStr(encoding);
326
- VALUE error_list = rb_ary_new();
327
- VALUE document;
328
- xmlDocPtr doc;
329
-
330
- xmlResetLastError();
331
- xmlSetStructuredErrorFunc((void *)error_list, Nokogiri_error_array_pusher);
332
-
333
- doc = xmlReadIO(
334
- (xmlInputReadCallback)noko_io_read,
335
- (xmlInputCloseCallback)noko_io_close,
336
- (void *)io,
337
- c_url,
338
- c_enc,
339
- (int)NUM2INT(options)
340
- );
341
- xmlSetStructuredErrorFunc(NULL, NULL);
342
-
343
- if (doc == NULL) {
344
- xmlErrorConstPtr error;
345
-
346
- xmlFreeDoc(doc);
347
-
348
- error = xmlGetLastError();
349
- if (error) {
350
- rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error));
367
+ noko_xml_document_s_read_io(VALUE rb_class,
368
+ VALUE rb_io,
369
+ VALUE rb_url,
370
+ VALUE rb_encoding,
371
+ VALUE rb_options)
372
+ {
373
+ /* TODO: deprecate this method, parse should be the preferred entry point. then we can make this
374
+ private. */
375
+ libxmlStructuredErrorHandlerState handler_state;
376
+ VALUE rb_errors = rb_ary_new();
377
+
378
+ noko__structured_error_func_save_and_set(&handler_state, (void *)rb_errors, noko__error_array_pusher);
379
+
380
+ const char *c_url = NIL_P(rb_url) ? NULL : StringValueCStr(rb_url);
381
+ const char *c_enc = NIL_P(rb_encoding) ? NULL : StringValueCStr(rb_encoding);
382
+ xmlDocPtr c_document = xmlReadIO(
383
+ (xmlInputReadCallback)noko_io_read,
384
+ (xmlInputCloseCallback)noko_io_close,
385
+ (void *)rb_io,
386
+ c_url,
387
+ c_enc,
388
+ (int)NUM2INT(rb_options)
389
+ );
390
+
391
+ noko__structured_error_func_restore(&handler_state);
392
+
393
+ if (c_document == NULL) {
394
+ xmlFreeDoc(c_document);
395
+
396
+ VALUE exception = rb_funcall(cNokogiriXmlSyntaxError, rb_intern("aggregate"), 1, rb_errors);
397
+ if (RB_TEST(exception)) {
398
+ rb_exc_raise(exception);
351
399
  } else {
352
400
  rb_raise(rb_eRuntimeError, "Could not parse document");
353
401
  }
354
-
355
- return Qnil;
356
402
  }
357
403
 
358
- document = noko_xml_document_wrap(klass, doc);
359
- rb_iv_set(document, "@errors", error_list);
360
- return document;
404
+ VALUE rb_document = noko_xml_document_wrap(rb_class, c_document);
405
+ rb_iv_set(rb_document, "@errors", rb_errors);
406
+ return rb_document;
361
407
  }
362
408
 
363
409
  /*
@@ -367,80 +413,44 @@ read_io(VALUE klass,
367
413
  * Create a new document from a String
368
414
  */
369
415
  static VALUE
370
- read_memory(VALUE klass,
371
- VALUE string,
372
- VALUE url,
373
- VALUE encoding,
374
- VALUE options)
375
- {
376
- const char *c_buffer = StringValuePtr(string);
377
- const char *c_url = NIL_P(url) ? NULL : StringValueCStr(url);
378
- const char *c_enc = NIL_P(encoding) ? NULL : StringValueCStr(encoding);
379
- int len = (int)RSTRING_LEN(string);
380
- VALUE error_list = rb_ary_new();
381
- VALUE document;
382
- xmlDocPtr doc;
383
-
384
- xmlResetLastError();
385
- xmlSetStructuredErrorFunc((void *)error_list, Nokogiri_error_array_pusher);
386
- doc = xmlReadMemory(c_buffer, len, c_url, c_enc, (int)NUM2INT(options));
387
- xmlSetStructuredErrorFunc(NULL, NULL);
416
+ noko_xml_document_s_read_memory(VALUE rb_class,
417
+ VALUE rb_input,
418
+ VALUE rb_url,
419
+ VALUE rb_encoding,
420
+ VALUE rb_options)
421
+ {
422
+ /* TODO: deprecate this method, parse should be the preferred entry point. then we can make this
423
+ private. */
424
+ VALUE rb_errors = rb_ary_new();
425
+ xmlSetStructuredErrorFunc((void *)rb_errors, noko__error_array_pusher);
388
426
 
389
- if (doc == NULL) {
390
- xmlErrorConstPtr error;
427
+ const char *c_buffer = StringValuePtr(rb_input);
428
+ const char *c_url = NIL_P(rb_url) ? NULL : StringValueCStr(rb_url);
429
+ const char *c_enc = NIL_P(rb_encoding) ? NULL : StringValueCStr(rb_encoding);
430
+ int c_buffer_len = (int)RSTRING_LEN(rb_input);
431
+ xmlDocPtr c_document = xmlReadMemory(c_buffer, c_buffer_len, c_url, c_enc, (int)NUM2INT(rb_options));
391
432
 
392
- xmlFreeDoc(doc);
433
+ xmlSetStructuredErrorFunc(NULL, NULL);
393
434
 
394
- error = xmlGetLastError();
395
- if (error) {
396
- rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error));
435
+ if (c_document == NULL) {
436
+ VALUE exception = rb_funcall(cNokogiriXmlSyntaxError, rb_intern("aggregate"), 1, rb_errors);
437
+ if (RB_TEST(exception)) {
438
+ rb_exc_raise(exception);
397
439
  } else {
398
440
  rb_raise(rb_eRuntimeError, "Could not parse document");
399
441
  }
400
-
401
- return Qnil;
402
442
  }
403
443
 
404
- document = noko_xml_document_wrap(klass, doc);
405
- rb_iv_set(document, "@errors", error_list);
444
+ VALUE document = noko_xml_document_wrap(rb_class, c_document);
445
+ rb_iv_set(document, "@errors", rb_errors);
406
446
  return document;
407
447
  }
408
448
 
409
449
  /*
410
450
  * call-seq:
411
- * dup
451
+ * new(version = "1.0")
412
452
  *
413
- * Copy this Document. An optional depth may be passed in, but it defaults
414
- * to a deep copy. 0 is a shallow copy, 1 is a deep copy.
415
- */
416
- static VALUE
417
- duplicate_document(int argc, VALUE *argv, VALUE self)
418
- {
419
- xmlDocPtr doc, dup;
420
- VALUE copy;
421
- VALUE level;
422
-
423
- if (rb_scan_args(argc, argv, "01", &level) == 0) {
424
- level = INT2NUM((long)1);
425
- }
426
-
427
- doc = noko_xml_document_unwrap(self);
428
-
429
- dup = xmlCopyDoc(doc, (int)NUM2INT(level));
430
-
431
- if (dup == NULL) { return Qnil; }
432
-
433
- dup->type = doc->type;
434
- copy = noko_xml_document_wrap(rb_obj_class(self), dup);
435
- rb_iv_set(copy, "@errors", rb_iv_get(self, "@errors"));
436
- return copy ;
437
- }
438
-
439
- /*
440
- * call-seq:
441
- * new(version = default)
442
- *
443
- * Create a new document with +version+ (defaults to "1.0")
453
+ * Create a new empty document declaring XML version +version+.
444
454
  */
445
455
  static VALUE
446
456
  new (int argc, VALUE *argv, VALUE klass)
@@ -503,55 +513,58 @@ remove_namespaces_bang(VALUE self)
503
513
  return self;
504
514
  }
505
515
 
506
- /* call-seq: doc.create_entity(name, type, external_id, system_id, content)
516
+ /* call-seq:
517
+ * doc.create_entity(name, type, external_id, system_id, content)
507
518
  *
508
519
  * Create a new entity named +name+.
509
520
  *
510
- * +type+ is an integer representing the type of entity to be created, and it
511
- * defaults to Nokogiri::XML::EntityDecl::INTERNAL_GENERAL. See
512
- * the constants on Nokogiri::XML::EntityDecl for more information.
521
+ * +type+ is an integer representing the type of entity to be created, and it defaults to
522
+ * +Nokogiri::XML::EntityDecl::INTERNAL_GENERAL+. See the constants on Nokogiri::XML::EntityDecl for
523
+ * more information.
513
524
  *
514
525
  * +external_id+, +system_id+, and +content+ set the External ID, System ID,
515
526
  * and content respectively. All of these parameters are optional.
516
527
  */
517
528
  static VALUE
518
- create_entity(int argc, VALUE *argv, VALUE self)
519
- {
520
- VALUE name;
521
- VALUE type;
522
- VALUE external_id;
523
- VALUE system_id;
524
- VALUE content;
525
- xmlEntityPtr ptr;
526
- xmlDocPtr doc ;
527
-
528
- doc = noko_xml_document_unwrap(self);
529
-
530
- rb_scan_args(argc, argv, "14", &name, &type, &external_id, &system_id,
531
- &content);
532
-
533
- xmlResetLastError();
534
- ptr = xmlAddDocEntity(
535
- doc,
536
- (xmlChar *)(NIL_P(name) ? NULL : StringValueCStr(name)),
537
- (int)(NIL_P(type) ? XML_INTERNAL_GENERAL_ENTITY : NUM2INT(type)),
538
- (xmlChar *)(NIL_P(external_id) ? NULL : StringValueCStr(external_id)),
539
- (xmlChar *)(NIL_P(system_id) ? NULL : StringValueCStr(system_id)),
540
- (xmlChar *)(NIL_P(content) ? NULL : StringValueCStr(content))
541
- );
542
-
543
- if (NULL == ptr) {
544
- xmlErrorConstPtr error = xmlGetLastError();
545
- if (error) {
546
- rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error));
529
+ noko_xml_document__create_entity(int argc, VALUE *argv, VALUE rb_document)
530
+ {
531
+ VALUE rb_name;
532
+ VALUE rb_type;
533
+ VALUE rb_ext_id;
534
+ VALUE rb_sys_id;
535
+ VALUE rb_content;
536
+
537
+ rb_scan_args(argc, argv, "14",
538
+ &rb_name,
539
+ &rb_type, &rb_ext_id, &rb_sys_id, &rb_content);
540
+
541
+ xmlDocPtr c_document = noko_xml_document_unwrap(rb_document);
542
+
543
+ libxmlStructuredErrorHandlerState handler_state;
544
+ VALUE rb_errors = rb_ary_new();
545
+ noko__structured_error_func_save_and_set(&handler_state, (void *)rb_errors, noko__error_array_pusher);
546
+
547
+ xmlEntityPtr c_entity = xmlAddDocEntity(
548
+ c_document,
549
+ (xmlChar *)(NIL_P(rb_name) ? NULL : StringValueCStr(rb_name)),
550
+ (int)(NIL_P(rb_type) ? XML_INTERNAL_GENERAL_ENTITY : NUM2INT(rb_type)),
551
+ (xmlChar *)(NIL_P(rb_ext_id) ? NULL : StringValueCStr(rb_ext_id)),
552
+ (xmlChar *)(NIL_P(rb_sys_id) ? NULL : StringValueCStr(rb_sys_id)),
553
+ (xmlChar *)(NIL_P(rb_content) ? NULL : StringValueCStr(rb_content))
554
+ );
555
+
556
+ noko__structured_error_func_restore(&handler_state);
557
+
558
+ if (NULL == c_entity) {
559
+ VALUE exception = rb_funcall(cNokogiriXmlSyntaxError, rb_intern("aggregate"), 1, rb_errors);
560
+ if (RB_TEST(exception)) {
561
+ rb_exc_raise(exception);
547
562
  } else {
548
563
  rb_raise(rb_eRuntimeError, "Could not create entity");
549
564
  }
550
-
551
- return Qnil;
552
565
  }
553
566
 
554
- return noko_xml_node_wrap(cNokogiriXmlEntityDecl, (xmlNodePtr)ptr);
567
+ return noko_xml_node_wrap(cNokogiriXmlEntityDecl, (xmlNodePtr)c_entity);
555
568
  }
556
569
 
557
570
  static int
@@ -655,24 +668,16 @@ VALUE
655
668
  noko_xml_document_wrap_with_init_args(VALUE klass, xmlDocPtr c_document, int argc, VALUE *argv)
656
669
  {
657
670
  VALUE rb_document;
658
- nokogiriTuplePtr tuple;
659
671
 
660
672
  if (!klass) {
661
673
  klass = cNokogiriXmlDocument;
662
674
  }
663
675
 
664
- rb_document = TypedData_Wrap_Struct(klass, &noko_xml_document_data_type, c_document);
665
-
666
- tuple = (nokogiriTuplePtr)ruby_xmalloc(sizeof(nokogiriTuple));
667
- tuple->doc = rb_document;
668
- tuple->unlinkedNodes = st_init_numtable_with_size(128);
669
- tuple->node_cache = rb_ary_new();
670
-
671
- c_document->_private = tuple ;
676
+ rb_document = _xml_document_alloc(klass);
677
+ _xml_document_data_ptr_set(rb_document, c_document);
672
678
 
673
679
  rb_iv_set(rb_document, "@decorators", Qnil);
674
680
  rb_iv_set(rb_document, "@errors", Qnil);
675
- rb_iv_set(rb_document, "@node_cache", tuple->node_cache);
676
681
 
677
682
  rb_obj_call_init(rb_document, argc, argv);
678
683
 
@@ -698,7 +703,7 @@ xmlDocPtr
698
703
  noko_xml_document_unwrap(VALUE rb_document)
699
704
  {
700
705
  xmlDocPtr c_document;
701
- TypedData_Get_Struct(rb_document, xmlDoc, &noko_xml_document_data_type, c_document);
706
+ TypedData_Get_Struct(rb_document, xmlDoc, &xml_doc_type, c_document);
702
707
  return c_document;
703
708
  }
704
709
 
@@ -755,13 +760,13 @@ void
755
760
  noko_init_xml_document(void)
756
761
  {
757
762
  assert(cNokogiriXmlNode);
758
- /*
759
- * Nokogiri::XML::Document wraps an xml document.
760
- */
763
+
761
764
  cNokogiriXmlDocument = rb_define_class_under(mNokogiriXml, "Document", cNokogiriXmlNode);
762
765
 
763
- rb_define_singleton_method(cNokogiriXmlDocument, "read_memory", read_memory, 4);
764
- rb_define_singleton_method(cNokogiriXmlDocument, "read_io", read_io, 4);
766
+ rb_define_alloc_func(cNokogiriXmlDocument, _xml_document_alloc);
767
+
768
+ rb_define_singleton_method(cNokogiriXmlDocument, "read_memory", noko_xml_document_s_read_memory, 4);
769
+ rb_define_singleton_method(cNokogiriXmlDocument, "read_io", noko_xml_document_s_read_io, 4);
765
770
  rb_define_singleton_method(cNokogiriXmlDocument, "new", new, -1);
766
771
 
767
772
  rb_define_method(cNokogiriXmlDocument, "root", rb_xml_document_root, 0);
@@ -770,8 +775,10 @@ noko_init_xml_document(void)
770
775
  rb_define_method(cNokogiriXmlDocument, "encoding=", set_encoding, 1);
771
776
  rb_define_method(cNokogiriXmlDocument, "version", version, 0);
772
777
  rb_define_method(cNokogiriXmlDocument, "canonicalize", rb_xml_document_canonicalize, -1);
773
- rb_define_method(cNokogiriXmlDocument, "dup", duplicate_document, -1);
774
778
  rb_define_method(cNokogiriXmlDocument, "url", url, 0);
775
- rb_define_method(cNokogiriXmlDocument, "create_entity", create_entity, -1);
779
+ rb_define_method(cNokogiriXmlDocument, "create_entity", noko_xml_document__create_entity, -1);
776
780
  rb_define_method(cNokogiriXmlDocument, "remove_namespaces!", remove_namespaces_bang, 0);
781
+
782
+ rb_define_protected_method(cNokogiriXmlDocument, "initialize_copy_with_args", rb_xml_document_initialize_copy_with_args,
783
+ 2);
777
784
  }
@@ -2,31 +2,18 @@
2
2
 
3
3
  VALUE cNokogiriXmlDocumentFragment;
4
4
 
5
- /*
6
- * call-seq:
7
- * new(document)
8
- *
9
- * Create a new DocumentFragment element on the +document+
10
- */
5
+ /* :nodoc: */
11
6
  static VALUE
12
- new (int argc, VALUE *argv, VALUE klass)
7
+ noko_xml_document_fragment_s_native_new(VALUE klass, VALUE rb_doc)
13
8
  {
14
- xmlDocPtr xml_doc;
15
- xmlNodePtr node;
16
- VALUE document;
17
- VALUE rest;
9
+ xmlDocPtr c_doc;
10
+ xmlNodePtr c_node;
18
11
  VALUE rb_node;
19
12
 
20
- rb_scan_args(argc, argv, "1*", &document, &rest);
21
-
22
- xml_doc = noko_xml_document_unwrap(document);
23
-
24
- node = xmlNewDocFragment(xml_doc->doc);
25
-
26
- noko_xml_document_pin_node(node);
27
-
28
- rb_node = noko_xml_node_wrap(klass, node);
29
- rb_obj_call_init(rb_node, argc, argv);
13
+ c_doc = noko_xml_document_unwrap(rb_doc);
14
+ c_node = xmlNewDocFragment(c_doc->doc);
15
+ noko_xml_document_pin_node(c_node);
16
+ rb_node = noko_xml_node_wrap(klass, c_node);
30
17
 
31
18
  return rb_node;
32
19
  }
@@ -35,10 +22,8 @@ void
35
22
  noko_init_xml_document_fragment(void)
36
23
  {
37
24
  assert(cNokogiriXmlNode);
38
- /*
39
- * DocumentFragment represents a DocumentFragment node in an xml document.
40
- */
25
+
41
26
  cNokogiriXmlDocumentFragment = rb_define_class_under(mNokogiriXml, "DocumentFragment", cNokogiriXmlNode);
42
27
 
43
- rb_define_singleton_method(cNokogiriXmlDocumentFragment, "new", new, -1);
28
+ rb_define_singleton_method(cNokogiriXmlDocumentFragment, "native_new", noko_xml_document_fragment_s_native_new, 1);
44
29
  }
@@ -144,7 +144,7 @@ validate(VALUE self, VALUE document)
144
144
 
145
145
  ctxt = xmlNewValidCtxt();
146
146
 
147
- xmlSetStructuredErrorFunc((void *)error_list, Nokogiri_error_array_pusher);
147
+ xmlSetStructuredErrorFunc((void *)error_list, noko__error_array_pusher);
148
148
 
149
149
  xmlValidateDtd(ctxt, doc, dtd);
150
150
 
@@ -2,8 +2,8 @@
2
2
 
3
3
  VALUE cNokogiriXmlElementContent;
4
4
 
5
- static const rb_data_type_t element_content_data_type = {
6
- .wrap_struct_name = "Nokogiri::XML::ElementContent",
5
+ static const rb_data_type_t xml_element_content_type = {
6
+ .wrap_struct_name = "xmlElementContent",
7
7
  .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
8
8
  };
9
9
 
@@ -17,7 +17,7 @@ static VALUE
17
17
  get_name(VALUE self)
18
18
  {
19
19
  xmlElementContentPtr elem;
20
- TypedData_Get_Struct(self, xmlElementContent, &element_content_data_type, elem);
20
+ TypedData_Get_Struct(self, xmlElementContent, &xml_element_content_type, elem);
21
21
 
22
22
  if (!elem->name) { return Qnil; }
23
23
  return NOKOGIRI_STR_NEW2(elem->name);
@@ -33,7 +33,7 @@ static VALUE
33
33
  get_type(VALUE self)
34
34
  {
35
35
  xmlElementContentPtr elem;
36
- TypedData_Get_Struct(self, xmlElementContent, &element_content_data_type, elem);
36
+ TypedData_Get_Struct(self, xmlElementContent, &xml_element_content_type, elem);
37
37
 
38
38
  return INT2NUM(elem->type);
39
39
  }
@@ -45,7 +45,7 @@ static VALUE
45
45
  get_c1(VALUE self)
46
46
  {
47
47
  xmlElementContentPtr elem;
48
- TypedData_Get_Struct(self, xmlElementContent, &element_content_data_type, elem);
48
+ TypedData_Get_Struct(self, xmlElementContent, &xml_element_content_type, elem);
49
49
 
50
50
  if (!elem->c1) { return Qnil; }
51
51
  return noko_xml_element_content_wrap(rb_iv_get(self, "@document"), elem->c1);
@@ -58,7 +58,7 @@ static VALUE
58
58
  get_c2(VALUE self)
59
59
  {
60
60
  xmlElementContentPtr elem;
61
- TypedData_Get_Struct(self, xmlElementContent, &element_content_data_type, elem);
61
+ TypedData_Get_Struct(self, xmlElementContent, &xml_element_content_type, elem);
62
62
 
63
63
  if (!elem->c2) { return Qnil; }
64
64
  return noko_xml_element_content_wrap(rb_iv_get(self, "@document"), elem->c2);
@@ -74,7 +74,7 @@ static VALUE
74
74
  get_occur(VALUE self)
75
75
  {
76
76
  xmlElementContentPtr elem;
77
- TypedData_Get_Struct(self, xmlElementContent, &element_content_data_type, elem);
77
+ TypedData_Get_Struct(self, xmlElementContent, &xml_element_content_type, elem);
78
78
 
79
79
  return INT2NUM(elem->ocur);
80
80
  }
@@ -89,7 +89,7 @@ static VALUE
89
89
  get_prefix(VALUE self)
90
90
  {
91
91
  xmlElementContentPtr elem;
92
- TypedData_Get_Struct(self, xmlElementContent, &element_content_data_type, elem);
92
+ TypedData_Get_Struct(self, xmlElementContent, &xml_element_content_type, elem);
93
93
 
94
94
  if (!elem->prefix) { return Qnil; }
95
95
 
@@ -104,7 +104,7 @@ noko_xml_element_content_wrap(VALUE rb_document, xmlElementContentPtr c_element_
104
104
  {
105
105
  VALUE elem = TypedData_Wrap_Struct(
106
106
  cNokogiriXmlElementContent,
107
- &element_content_data_type,
107
+ &xml_element_content_type,
108
108
  c_element_content
109
109
  );
110
110
 
@@ -10,8 +10,8 @@ xml_encoding_handler_dealloc(void *data)
10
10
  xmlCharEncCloseFunc(c_handler);
11
11
  }
12
12
 
13
- static const rb_data_type_t xml_encoding_handler_type = {
14
- .wrap_struct_name = "Nokogiri::EncodingHandler",
13
+ static const rb_data_type_t xml_char_encoding_handler_type = {
14
+ .wrap_struct_name = "xmlCharEncodingHandler",
15
15
  .function = {
16
16
  .dfree = xml_encoding_handler_dealloc,
17
17
  },
@@ -31,7 +31,7 @@ rb_xml_encoding_handler_s_get(VALUE klass, VALUE key)
31
31
 
32
32
  handler = xmlFindCharEncodingHandler(StringValueCStr(key));
33
33
  if (handler) {
34
- return TypedData_Wrap_Struct(klass, &xml_encoding_handler_type, handler);
34
+ return TypedData_Wrap_Struct(klass, &xml_char_encoding_handler_type, handler);
35
35
  }
36
36
 
37
37
  return Qnil;
@@ -90,7 +90,7 @@ rb_xml_encoding_handler_name(VALUE self)
90
90
  {
91
91
  xmlCharEncodingHandlerPtr handler;
92
92
 
93
- TypedData_Get_Struct(self, xmlCharEncodingHandler, &xml_encoding_handler_type, handler);
93
+ TypedData_Get_Struct(self, xmlCharEncodingHandler, &xml_char_encoding_handler_type, handler);
94
94
 
95
95
  return NOKOGIRI_STR_NEW2(handler->name);
96
96
  }
@@ -51,8 +51,8 @@ _xml_namespace_update_references(void *ptr)
51
51
  }
52
52
  }
53
53
 
54
- static const rb_data_type_t nokogiri_xml_namespace_type_with_dealloc = {
55
- .wrap_struct_name = "Nokogiri::XML::Namespace#with_dealloc",
54
+ static const rb_data_type_t xml_ns_type_with_free = {
55
+ .wrap_struct_name = "xmlNs (with free)",
56
56
  .function = {
57
57
  .dfree = _xml_namespace_dealloc,
58
58
  .dcompact = _xml_namespace_update_references,
@@ -60,8 +60,8 @@ static const rb_data_type_t nokogiri_xml_namespace_type_with_dealloc = {
60
60
  .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
61
61
  };
62
62
 
63
- static const rb_data_type_t nokogiri_xml_namespace_type_without_dealloc = {
64
- .wrap_struct_name = "Nokogiri::XML::Namespace#without_dealloc",
63
+ static const rb_data_type_t xml_ns_type_without_free = {
64
+ .wrap_struct_name = "xmlNs (without free)",
65
65
  .function = {
66
66
  .dcompact = _xml_namespace_update_references,
67
67
  },
@@ -145,7 +145,7 @@ noko_xml_namespace_wrap(xmlNsPtr c_namespace, xmlDocPtr c_document)
145
145
 
146
146
  if (c_document) {
147
147
  rb_namespace = TypedData_Wrap_Struct(cNokogiriXmlNamespace,
148
- &nokogiri_xml_namespace_type_without_dealloc,
148
+ &xml_ns_type_without_free,
149
149
  c_namespace);
150
150
 
151
151
  if (DOC_RUBY_OBJECT_TEST(c_document)) {
@@ -154,7 +154,7 @@ noko_xml_namespace_wrap(xmlNsPtr c_namespace, xmlDocPtr c_document)
154
154
  }
155
155
  } else {
156
156
  rb_namespace = TypedData_Wrap_Struct(cNokogiriXmlNamespace,
157
- &nokogiri_xml_namespace_type_with_dealloc,
157
+ &xml_ns_type_with_free,
158
158
  c_namespace);
159
159
  }
160
160