Skip to content

Commit 9e3a236

Browse files
committed
wip
1 parent 0db6e6a commit 9e3a236

File tree

4 files changed

+164
-153
lines changed

4 files changed

+164
-153
lines changed

ext/nokogiri/xml_node_set.c

Lines changed: 45 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
VALUE cNokogiriXmlNodeSet ;
44

5-
static ID decorate ;
5+
/* static ID decorate ; */
66

77
static void
88
Check_Node_Set_Node_Type(VALUE node)
@@ -415,27 +415,27 @@ to_array(VALUE self)
415415
*
416416
* Unlink this NodeSet and all Node objects it contains from their current context.
417417
*/
418-
static VALUE
419-
unlink_nodeset(VALUE self)
420-
{
421-
xmlNodeSetPtr node_set;
422-
int j, nodeNr ;
423-
424-
Data_Get_Struct(self, xmlNodeSet, node_set);
425-
426-
nodeNr = node_set->nodeNr ;
427-
for (j = 0 ; j < nodeNr ; j++) {
428-
if (! NOKOGIRI_NAMESPACE_EH(node_set->nodeTab[j])) {
429-
VALUE node ;
430-
xmlNodePtr node_ptr;
431-
node = noko_xml_node_wrap(Qnil, node_set->nodeTab[j]);
432-
rb_funcall(node, rb_intern("unlink"), 0); /* modifies the C struct out from under the object */
433-
Noko_Node_Get_Struct(node, xmlNode, node_ptr);
434-
node_set->nodeTab[j] = node_ptr ;
435-
}
436-
}
437-
return self ;
438-
}
418+
/* static VALUE */
419+
/* unlink_nodeset(VALUE self) */
420+
/* { */
421+
/* xmlNodeSetPtr node_set; */
422+
/* int j, nodeNr ; */
423+
424+
/* Data_Get_Struct(self, xmlNodeSet, node_set); */
425+
426+
/* nodeNr = node_set->nodeNr ; */
427+
/* for (j = 0 ; j < nodeNr ; j++) { */
428+
/* if (! NOKOGIRI_NAMESPACE_EH(node_set->nodeTab[j])) { */
429+
/* VALUE node ; */
430+
/* xmlNodePtr node_ptr; */
431+
/* node = noko_xml_node_wrap(Qnil, node_set->nodeTab[j]); */
432+
/* rb_funcall(node, rb_intern("unlink"), 0); /\* modifies the C struct out from under the object *\/ */
433+
/* Noko_Node_Get_Struct(node, xmlNode, node_ptr); */
434+
/* node_set->nodeTab[j] = node_ptr ; */
435+
/* } */
436+
/* } */
437+
/* return self ; */
438+
/* } */
439439

440440

441441
VALUE
@@ -444,20 +444,13 @@ noko_xml_node_set_wrap(xmlNodeSetPtr c_node_set, VALUE document)
444444
int j;
445445
VALUE rb_node_set ;
446446

447-
if (c_node_set == NULL) {
448-
c_node_set = xmlXPathNodeSetCreate(NULL);
449-
}
450-
451-
rb_node_set = Data_Wrap_Struct(cNokogiriXmlNodeSet, mark, deallocate, c_node_set);
452-
453-
if (!NIL_P(document)) {
454-
rb_iv_set(rb_node_set, "@document", document);
455-
rb_funcall(document, decorate, 1, rb_node_set);
456-
}
447+
rb_node_set = rb_class_new_instance(1, &document, cNokogiriXmlNodeSet);
457448

458449
/* make sure we create ruby objects for all the results, so they'll be marked during the GC mark phase */
459-
for (j = 0 ; j < c_node_set->nodeNr ; j++) {
460-
noko_xml_node_wrap_node_set_result(c_node_set->nodeTab[j], rb_node_set);
450+
if (c_node_set) {
451+
for (j = 0 ; j < c_node_set->nodeNr ; j++) {
452+
rb_ary_push(rb_node_set, noko_xml_node_wrap_node_set_result(c_node_set->nodeTab[j], rb_node_set));
453+
}
461454
}
462455

463456
return rb_node_set ;
@@ -477,22 +470,22 @@ noko_xml_node_wrap_node_set_result(xmlNodePtr node, VALUE node_set)
477470
void
478471
noko_init_xml_node_set(void)
479472
{
480-
cNokogiriXmlNodeSet = rb_define_class_under(mNokogiriXml, "NodeSet", rb_cObject);
481-
482-
rb_define_alloc_func(cNokogiriXmlNodeSet, allocate);
483-
484-
rb_define_method(cNokogiriXmlNodeSet, "length", length, 0);
485-
rb_define_method(cNokogiriXmlNodeSet, "[]", slice, -1);
486-
rb_define_method(cNokogiriXmlNodeSet, "slice", slice, -1);
487-
rb_define_method(cNokogiriXmlNodeSet, "push", push, 1);
488-
rb_define_method(cNokogiriXmlNodeSet, "|", rb_xml_node_set_union, 1);
489-
rb_define_method(cNokogiriXmlNodeSet, "-", minus, 1);
490-
rb_define_method(cNokogiriXmlNodeSet, "unlink", unlink_nodeset, 0);
491-
rb_define_method(cNokogiriXmlNodeSet, "to_a", to_array, 0);
492-
rb_define_method(cNokogiriXmlNodeSet, "dup", duplicate, 0);
493-
rb_define_method(cNokogiriXmlNodeSet, "delete", delete, 1);
494-
rb_define_method(cNokogiriXmlNodeSet, "&", intersection, 1);
495-
rb_define_method(cNokogiriXmlNodeSet, "include?", include_eh, 1);
496-
497-
decorate = rb_intern("decorate");
473+
cNokogiriXmlNodeSet = rb_define_class_under(mNokogiriXml, "NodeSet", rb_cArray);
474+
475+
/* rb_define_alloc_func(cNokogiriXmlNodeSet, allocate); */
476+
477+
/* rb_define_method(cNokogiriXmlNodeSet, "length", length, 0); */
478+
/* rb_define_method(cNokogiriXmlNodeSet, "[]", slice, -1); */
479+
/* rb_define_method(cNokogiriXmlNodeSet, "slice", slice, -1); */
480+
/* rb_define_method(cNokogiriXmlNodeSet, "push", push, 1); */
481+
/* rb_define_method(cNokogiriXmlNodeSet, "|", rb_xml_node_set_union, 1); */
482+
/* rb_define_method(cNokogiriXmlNodeSet, "-", minus, 1); */
483+
/* rb_define_method(cNokogiriXmlNodeSet, "unlink", unlink_nodeset, 0); */
484+
/* rb_define_method(cNokogiriXmlNodeSet, "to_a", to_array, 0); */
485+
/* rb_define_method(cNokogiriXmlNodeSet, "dup", duplicate, 0); */
486+
/* rb_define_method(cNokogiriXmlNodeSet, "delete", delete, 1); */
487+
/* rb_define_method(cNokogiriXmlNodeSet, "&", intersection, 1); */
488+
/* rb_define_method(cNokogiriXmlNodeSet, "include?", include_eh, 1); */
489+
490+
/* decorate = rb_intern("decorate"); */
498491
}

lib/nokogiri/xml/node.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1068,6 +1068,11 @@ def fragment?
10681068
type == DOCUMENT_FRAG_NODE
10691069
end
10701070

1071+
# Returns true if this is a Namespace
1072+
def namespace?
1073+
type == NAMESPACE_DECL
1074+
end
1075+
10711076
###
10721077
# Fetch the Nokogiri::HTML4::ElementDescription for this node. Returns
10731078
# nil on XML documents and on unknown tags.

0 commit comments

Comments
 (0)