nokogiri 1.16.8-x86_64-linux → 1.17.0-x86_64-linux

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -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