summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Stocker <chregu@php.net>2003-04-05 19:56:41 +0000
committerChristian Stocker <chregu@php.net>2003-04-05 19:56:41 +0000
commit5dc852e734b492c1549a054661dd6b4fd1379f21 (patch)
tree0fb1b685e99d8414dcf5b63e31e3baad45138c18
parentb0f630470bd5a41ee5c807c935bf884d875b1d2d (diff)
downloadphp-git-5dc852e734b492c1549a054661dd6b4fd1379f21.tar.gz
@- Added domxml_doc_create_document_fragment() and
@ domxml_document_fragment_open_mem(string) method (Christian) Useful for adding and parsing (well-balanced) document fragments. - Bumped up API version number
-rw-r--r--ext/domxml/php_domxml.c111
-rw-r--r--ext/domxml/php_domxml.h8
2 files changed, 107 insertions, 12 deletions
diff --git a/ext/domxml/php_domxml.c b/ext/domxml/php_domxml.c
index d08e3a4cd4..e665c15fb9 100644
--- a/ext/domxml/php_domxml.c
+++ b/ext/domxml/php_domxml.c
@@ -152,6 +152,7 @@ static int le_domxmlattrp;
static int le_domxmlcdatap;
static int le_domxmltextp;
static int le_domxmlpip;
+static int le_domxmldocumentfragmentp;
static int le_domxmlcommentp;
static int le_domxmlnotationp;
static int le_domxmlparserp;
@@ -182,6 +183,7 @@ zend_class_entry *domxmlattr_class_entry;
zend_class_entry *domxmlcdata_class_entry;
zend_class_entry *domxmltext_class_entry;
zend_class_entry *domxmlpi_class_entry;
+zend_class_entry *domxmldocumentfragment_class_entry;
zend_class_entry *domxmlcomment_class_entry;
zend_class_entry *domxmlnotation_class_entry;
zend_class_entry *domxmlentity_class_entry;
@@ -312,6 +314,7 @@ static function_entry php_domxmldoc_class_functions[] = {
PHP_FALIAS(create_cdata_section, domxml_doc_create_cdata_section, NULL)
PHP_FALIAS(create_entity_reference, domxml_doc_create_entity_reference, NULL)
PHP_FALIAS(create_processing_instruction, domxml_doc_create_processing_instruction, NULL)
+ PHP_FALIAS(create_document_fragment, domxml_doc_create_document_fragment, NULL)
PHP_FALIAS(get_elements_by_tagname, domxml_doc_get_elements_by_tagname, NULL)
PHP_FALIAS(get_element_by_id, domxml_doc_get_element_by_id, NULL)
/* Everything below this comment is none DOM compliant */
@@ -480,6 +483,11 @@ static zend_function_entry php_domxmlpi_class_functions[] = {
{NULL, NULL, NULL}
};
+static zend_function_entry php_domxmldocumentfragment_class_functions[] = {
+ PHP_FALIAS(open_mem, domxml_document_fragment_open_mem, NULL)
+ {NULL, NULL, NULL}
+};
+
#if defined(LIBXML_XPATH_ENABLED)
static zend_function_entry php_xpathctx_class_functions[] = {
PHP_FALIAS(xpath_eval, xpath_eval, NULL)
@@ -1241,6 +1249,17 @@ PHPAPI zval *php_domobject_new(xmlNodePtr obj, int *found, zval *wrapper_in TSR
break;
}
+ case XML_DOCUMENT_FRAG_NODE:
+ {
+ xmlNodePtr nodep = obj;
+ if(!wrapper_in)
+ object_init_ex(wrapper, domxmldocumentfragment_class_entry);
+ add_property_stringl(wrapper, "name", "#document-fragment", 18, 1);
+ rsrc_type = le_domxmldocumentfragmentp;
+ add_property_long(wrapper, "type", Z_TYPE_P(nodep));
+ break;
+ }
+
/* FIXME: nodes of type XML_DTD_NODE used to be domxmldtd_class_entry.
* but the DOM Standard doesn't have a DomDtd class. The DocumentType
* class seems to be want we need and the libxml dtd functions are
@@ -1461,7 +1480,7 @@ xmlDocPtr php_dom_xmlSAXParse(xmlSAXHandlerPtr sax, const char *buffer, int size
}
xmlFreeParserCtxt(ctxt);
-
+
return(ret);
}
@@ -1485,6 +1504,7 @@ PHP_MINIT_FUNCTION(domxml)
le_domxmlcdatap = zend_register_list_destructors_ex(php_free_xml_node, NULL, "domcdata", module_number);
le_domxmlentityrefp = zend_register_list_destructors_ex(php_free_xml_node, NULL, "domentityref", module_number);
le_domxmlpip = zend_register_list_destructors_ex(php_free_xml_node, NULL, "dompi", module_number);
+ le_domxmldocumentfragmentp = zend_register_list_destructors_ex(php_free_xml_node, NULL, "domdocumentfragment", module_number);
le_domxmlparserp = zend_register_list_destructors_ex(php_free_xml_parser, NULL, "domparser", module_number);
le_domxmldoctypep = zend_register_list_destructors_ex(php_free_xml_node, NULL, "domdocumenttype", module_number);
le_domxmldocp = zend_register_list_destructors_ex(php_free_xml_doc, NULL, "domdocument", module_number);
@@ -1539,6 +1559,9 @@ PHP_MINIT_FUNCTION(domxml)
INIT_OVERLOADED_CLASS_ENTRY(ce, "domprocessinginstruction", php_domxmlpi_class_functions, NULL, NULL, NULL);
domxmlpi_class_entry = zend_register_internal_class_ex(&ce, domxmlnode_class_entry, NULL TSRMLS_CC);
+ INIT_OVERLOADED_CLASS_ENTRY(ce, "domdocumentfragment", php_domxmldocumentfragment_class_functions, NULL, NULL, NULL);
+ domxmldocumentfragment_class_entry = zend_register_internal_class_ex(&ce, domxmlnode_class_entry, NULL TSRMLS_CC);
+
INIT_OVERLOADED_CLASS_ENTRY(ce, "domnotation", php_domxmlnotation_class_functions, NULL, NULL, NULL);
domxmlnotation_class_entry = zend_register_internal_class_ex(&ce, domxmlnode_class_entry, NULL TSRMLS_CC);
@@ -2360,15 +2383,21 @@ PHP_FUNCTION(domxml_node_append_child)
}
}
/* end libxml2 code */
-
- if (NULL == new_child) {
+ if (child->type == XML_DOCUMENT_FRAG_NODE) {
+ new_child = xmlAddChildList(parent, child->children);
+ if (NULL != new_child) {
+ /* the children are copied, not moved, but domstandard wants to move it
+ therefore we delete the reference here */
+ child->children = NULL;
+ }
+ } else if (NULL == new_child) {
new_child = xmlAddChild(parent, child);
}
if (NULL == new_child) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't append node");
RETURN_FALSE;
- }
+ }
DOMXML_RET_OBJ(rv, new_child, &ret);
}
@@ -2460,13 +2489,27 @@ PHP_FUNCTION(domxml_node_insert_before)
new_child = xmlAddPrevSibling(refp, child);
}
} else {
- /* first unlink node, if child is already a child of parent
- for some strange reason, this is needed
- */
- if (child->parent == parent){
- xmlUnlinkNode(child);
+
+ if (child->type == XML_DOCUMENT_FRAG_NODE) {
+ new_child = xmlAddChildList(parent, child->children);
+ if (NULL != new_child) {
+ /* the children are copied, not moved, but domstandard wants to move it
+ therefore we delete the reference here */
+
+ child->children = NULL;
+ }
+ } else {
+
+ /* first unlink node, if child is already a child of parent
+ for some strange reason, this is needed
+ */
+
+ if (child->parent == parent){
+ xmlUnlinkNode(child);
+ }
+
+ new_child = xmlAddChild(parent, child);
}
- new_child = xmlAddChild(parent, child);
}
@@ -3612,6 +3655,54 @@ PHP_FUNCTION(domxml_doc_create_processing_instruction)
}
/* }}} */
+/* {{{ proto object domxml_doc_create_document_fragement()
+ Creates new document fragement node */
+PHP_FUNCTION(domxml_doc_create_document_fragment)
+{
+ zval *id, *rv = NULL;
+ xmlNode *node;
+ xmlDocPtr docp = NULL;
+ int ret;
+
+ DOMXML_PARAM_NONE(docp, id, le_domxmldocumentfragmentp);
+
+
+ node = xmlNewDocFragment (docp);
+ if (!node) {
+ RETURN_FALSE;
+ }
+ DOMXML_RET_OBJ(rv, node, &ret);
+}
+/* }}} */
+
+/* {{{ proto bool domxml_document_framgent_open_mem(string buf)
+ Parses a string with a well-balanced XML-Fragment and appends it to the document-fragment */
+PHP_FUNCTION(domxml_document_fragment_open_mem)
+{
+ zval *id;
+ xmlNodePtr dfp = NULL, last = NULL;
+ char *buf;
+ int ret, buf_len;
+ xmlNodePtr lst;
+
+ DOMXML_PARAM_TWO(dfp, id, le_domxmldocumentfragmentp,"s",&buf, &buf_len);
+
+ ret = xmlParseBalancedChunkMemory(dfp->doc, NULL, NULL, 0, (xmlChar *) buf, &lst);
+ if (ret != 0) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Input string is not balanced (well-formed)");
+ RETURN_FALSE;
+ }
+
+ last = xmlAddChildList(dfp, lst);
+
+ if (last == NULL) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not add child list");
+ RETURN_FALSE;
+ }
+
+ RETURN_TRUE;
+}
+
/* {{{ proto object domxml_doc_imported_node(object node, bool recursive)
Creates new element node */
PHP_FUNCTION(domxml_doc_imported_node)
diff --git a/ext/domxml/php_domxml.h b/ext/domxml/php_domxml.h
index 7f2977a59c..0053a54cff 100644
--- a/ext/domxml/php_domxml.h
+++ b/ext/domxml/php_domxml.h
@@ -53,7 +53,7 @@
therefore it's easier for the script-programmers to check, what's working how
Can be checked with phpversion("domxml");
*/
-#define DOMXML_API_VERSION "20020814"
+#define DOMXML_API_VERSION "20030405"
extern zend_module_entry domxml_module_entry;
#define domxml_module_ptr &domxml_module_entry
@@ -94,6 +94,7 @@ PHP_FUNCTION(domxml_doc_create_element_ns);
PHP_FUNCTION(domxml_doc_create_text_node);
PHP_FUNCTION(domxml_doc_create_comment);
PHP_FUNCTION(domxml_doc_create_processing_instruction);
+PHP_FUNCTION(domxml_doc_create_document_fragment);
PHP_FUNCTION(domxml_doc_create_attribute);
PHP_FUNCTION(domxml_doc_create_cdata_section);
PHP_FUNCTION(domxml_doc_create_entity_reference);
@@ -185,10 +186,13 @@ PHP_FUNCTION(domxml_entity_public_id);
PHP_FUNCTION(domxml_entity_system_id);
PHP_FUNCTION(domxml_entity_notation_name);
-/* Class ProcessingInstructions */
+/* Class ProcessingInstructions methods*/
PHP_FUNCTION(domxml_pi_target);
PHP_FUNCTION(domxml_pi_data);
+/* Class DocumentFragment methods */
+PHP_FUNCTION(domxml_document_fragment_open_mem);
+
/* Class Parser methods */
PHP_FUNCTION(domxml_parser);
PHP_FUNCTION(domxml_parser_add_chunk);