Fixed probles in some HTML tag autoclose, XML output bug on mixed-content
and fixed the related output for tests, Daniel.
diff --git a/tree.c b/tree.c
index eb465d6..d1caae9 100644
--- a/tree.c
+++ b/tree.c
@@ -2663,6 +2663,20 @@
}
/**
+ * xmlBufferLastChar:
+ * @buf: the buffer to dump
+ *
+ * Get the last char of the buffer
+ *
+ * Returns the last char from the buffer or 0 if empty
+ */
+xmlChar
+xmlBufferLastChar(xmlBufferPtr buf) {
+ if ((buf == NULL) || (buf->use <= 0)) return(0);
+ return(buf->content[buf->use - 1]);
+}
+
+/**
* xmlBufferWriteCHAR:
* @buf: the XML buffer
* @string: the string to add
@@ -2899,38 +2913,38 @@
static void
-xmlNodeDump(xmlBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur, int level);
+xmlNodeDump(xmlBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur, int level,
+ int format);
/**
* xmlNodeListDump:
* @buf: the XML buffer output
* @doc: the document
* @cur: the first node
* @level: the imbrication level for indenting
+ * @format: is formatting allowed
*
* Dump an XML node list, recursive behaviour,children are printed too.
*/
static void
-xmlNodeListDump(xmlBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur, int level) {
- int needIndent = 0, i;
+xmlNodeListDump(xmlBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur, int level,
+ int format) {
+ int i;
if (cur == NULL) {
fprintf(stderr, "xmlNodeListDump : node == NULL\n");
return;
}
while (cur != NULL) {
- if ((cur->type != XML_TEXT_NODE) &&
- (cur->type != XML_ENTITY_REF_NODE)) {
- if (!needIndent) {
- needIndent = 1;
- xmlBufferWriteChar(buf, "\n");
- }
+ if ((format) && (xmlIndentTreeOutput) &&
+ (cur->type == XML_ELEMENT_NODE))
+ for (i = 0;i < level;i++)
+ xmlBufferWriteChar(buf, " ");
+ xmlNodeDump(buf, doc, cur, level, format);
+ if (format) {
+ xmlBufferWriteChar(buf, "\n");
}
- xmlNodeDump(buf, doc, cur, level);
cur = cur->next;
}
- if ((xmlIndentTreeOutput) && (needIndent))
- for (i = 1;i < level;i++)
- xmlBufferWriteChar(buf, " ");
}
/**
@@ -2939,12 +2953,15 @@
* @doc: the document
* @cur: the current node
* @level: the imbrication level for indenting
+ * @format: is formatting allowed
*
* Dump an XML node, recursive behaviour,children are printed too.
*/
static void
-xmlNodeDump(xmlBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur, int level) {
+xmlNodeDump(xmlBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur, int level,
+ int format) {
int i;
+ xmlNodePtr tmp;
if (cur == NULL) {
fprintf(stderr, "xmlNodeDump : node == NULL\n");
@@ -2970,7 +2987,7 @@
xmlBufferWriteChar(buf, " ");
xmlBufferWriteCHAR(buf, cur->content);
}
- xmlBufferWriteChar(buf, "?>\n");
+ xmlBufferWriteChar(buf, "?>");
}
return;
}
@@ -2978,7 +2995,7 @@
if (cur->content != NULL) {
xmlBufferWriteChar(buf, "<!--");
xmlBufferWriteCHAR(buf, cur->content);
- xmlBufferWriteChar(buf, "-->\n");
+ xmlBufferWriteChar(buf, "-->");
}
return;
}
@@ -2995,10 +3012,18 @@
xmlBufferWriteChar(buf, "]]>");
return;
}
- if (xmlIndentTreeOutput)
- for (i = 0;i < level;i++)
- xmlBufferWriteChar(buf, " ");
+ if (format == 1) {
+ tmp = cur->childs;
+ while (tmp != NULL) {
+ if ((tmp->type == XML_TEXT_NODE) ||
+ (tmp->type == XML_ENTITY_REF_NODE)) {
+ format = 0;
+ break;
+ }
+ tmp = tmp->next;
+ }
+ }
xmlBufferWriteChar(buf, "<");
if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) {
xmlBufferWriteCHAR(buf, cur->ns->prefix);
@@ -3012,7 +3037,7 @@
xmlAttrListDump(buf, doc, cur->properties);
if ((cur->content == NULL) && (cur->childs == NULL)) {
- xmlBufferWriteChar(buf, "/>\n");
+ xmlBufferWriteChar(buf, "/>");
return;
}
xmlBufferWriteChar(buf, ">");
@@ -3026,7 +3051,11 @@
}
}
if (cur->childs != NULL) {
- xmlNodeListDump(buf, doc, cur->childs, level + 1);
+ if (format) xmlBufferWriteChar(buf, "\n");
+ xmlNodeListDump(buf, doc, cur->childs, level + 1, format);
+ if ((xmlIndentTreeOutput) && (format))
+ for (i = 0;i < level;i++)
+ xmlBufferWriteChar(buf, " ");
}
xmlBufferWriteChar(buf, "</");
if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) {
@@ -3035,7 +3064,7 @@
}
xmlBufferWriteCHAR(buf, cur->name);
- xmlBufferWriteChar(buf, ">\n");
+ xmlBufferWriteChar(buf, ">");
}
/**
@@ -3077,7 +3106,8 @@
xmlUpgradeOldNs(cur);
while (child != NULL) {
- xmlNodeDump(buf, cur, child, 0);
+ xmlNodeDump(buf, cur, child, 0, 1);
+ xmlBufferWriteChar(buf, "\n");
child = child->next;
}
}