/* TODO: DOCUMENT ME */ static VALUE in_context(VALUE self, VALUE _str, VALUE _options) { xmlNodePtr node; xmlNodePtr list; xmlNodeSetPtr set; VALUE doc, err; Data_Get_Struct(self, xmlNode, node); if(!node->parent) rb_raise(rb_eRuntimeError, "no contextual parsing on unlinked nodes"); doc = DOC_RUBY_OBJECT(node->doc); err = rb_iv_get(doc, "@errors"); xmlSetStructuredErrorFunc((void *)err, Nokogiri_error_array_pusher); /* Twiddle global variable because of a bug in libxml2. * http://git.gnome.org/browse/libxml2/commit/?id=e20fb5a72c83cbfc8e4a8aa3943c6be8febadab7 */ #ifndef HTML_PARSE_NOIMPLIED htmlHandleOmittedElem(0); #endif xmlParseInNodeContext( node, StringValuePtr(_str), (int)RSTRING_LEN(_str), (int)NUM2INT(_options), &list); #ifndef HTML_PARSE_NOIMPLIED htmlHandleOmittedElem(1); #endif xmlSetStructuredErrorFunc(NULL, NULL); set = xmlXPathNodeSetCreate(NULL); while(list) { xmlXPathNodeSetAddUnique(set, list); list = list->next; } return Nokogiri_wrap_xml_node_set(set, doc); }