/* TODO: DOCUMENT ME */
static VALUE in_context(VALUE self, VALUE _str, VALUE _options)
{
xmlNodePtr node;
xmlNodePtr list;
xmlNodePtr child_iter;
xmlNodeSetPtr set;
xmlParserErrors error;
VALUE doc, err;
Data_Get_Struct(self, xmlNode, node);
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
error = xmlParseInNodeContext(
node,
StringValuePtr(_str),
(int)RSTRING_LEN(_str),
(int)NUM2INT(_options),
&list);
/* make sure parent/child pointers are coherent so an unlink will work properly (#331) */
child_iter = node->doc->children ;
while (child_iter) {
if (child_iter->parent != (xmlNodePtr)node->doc)
child_iter->parent = (xmlNodePtr)node->doc ;
child_iter = child_iter->next ;
}
#ifndef HTML_PARSE_NOIMPLIED
htmlHandleOmittedElem(1);
#endif
xmlSetStructuredErrorFunc(NULL, NULL);
/* FIXME: This probably needs to handle more constants... */
switch(error) {
case XML_ERR_OK:
break;
case XML_ERR_INTERNAL_ERROR:
case XML_ERR_NO_MEMORY:
rb_raise(rb_eRuntimeError, "error parsing fragment (%d)", error);
break;
default:
break;
}
set = xmlXPathNodeSetCreate(NULL);
while(list) {
xmlXPathNodeSetAddUnique(set, list);
list = list->next;
}
return Nokogiri_wrap_xml_node_set(set, doc);
}