optimize indentation based on the new context Daniel
* xmlsave.c: optimize indentation based on the new context
Daniel
diff --git a/xmlsave.c b/xmlsave.c
index 2f8afcf..583fb58 100644
--- a/xmlsave.c
+++ b/xmlsave.c
@@ -17,6 +17,8 @@
#ifdef LIBXML_HTML_ENABLED
#include <libxml/HTMLtree.h>
+#define MAX_INDENT 60
+
/************************************************************************
* *
* XHTML detection *
@@ -83,6 +85,9 @@
int options;
int level;
int format;
+ char indent[MAX_INDENT + 1];
+ int indent_nr;
+ int indent_size;
};
/************************************************************************
@@ -139,6 +144,29 @@
* Allocation and deallocation *
* *
************************************************************************/
+/**
+ * xmlSaveCtxtInit:
+ * @ctxt: the saving context
+ *
+ * Initialize a saving context
+ */
+static void
+xmlSaveCtxtInit(xmlSaveCtxtPtr ctxt)
+{
+ int i;
+
+ if (ctxt == NULL) return;
+ if (xmlTreeIndentString == NULL) {
+ memset(&ctxt->indent[0], 0, MAX_INDENT + 1);
+ } else {
+ ctxt->indent_size = xmlStrlen((const xmlChar *) xmlTreeIndentString);
+ ctxt->indent_nr = MAX_INDENT / ctxt->indent_size;
+ for (i = 0;i < ctxt->indent_nr;i++)
+ memcpy(&ctxt->indent[i * ctxt->indent_size], xmlTreeIndentString,
+ ctxt->indent_size);
+ ctxt->indent[ctxt->indent_nr * ctxt->indent_size] = 0;
+ }
+}
/**
* xmlFreeSaveCtxt:
@@ -182,6 +210,8 @@
}
ret->encoding = xmlStrdup((const xmlChar *)encoding);
}
+ xmlSaveCtxtInit(ret);
+
return(ret);
}
@@ -378,7 +408,6 @@
*/
static void
xmlNodeListDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) {
- int i;
xmlOutputBufferPtr buf;
if (cur == NULL) return;
@@ -386,8 +415,10 @@
while (cur != NULL) {
if ((ctxt->format) && (xmlIndentTreeOutput) &&
(cur->type == XML_ELEMENT_NODE))
- for (i = 0;i < ctxt->level;i++)
- xmlOutputBufferWriteString(buf, xmlTreeIndentString);
+ xmlOutputBufferWrite(buf, ctxt->indent_size *
+ (ctxt->level > ctxt->indent_nr ?
+ ctxt->indent_nr : ctxt->level),
+ ctxt->indent);
xmlNodeDumpOutputInternal(ctxt, cur);
if (ctxt->format) {
xmlOutputBufferWriteString(buf, "\n");
@@ -404,7 +435,7 @@
*/
static void
xmlNodeDumpOutputInternal(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) {
- int i, format;
+ int format;
xmlNodePtr tmp;
xmlChar *start, *end;
xmlOutputBufferPtr buf;
@@ -568,8 +599,10 @@
xmlNodeListDumpOutput(ctxt, cur->children);
if (ctxt->level > 0) ctxt->level--;
if ((xmlIndentTreeOutput) && (ctxt->format))
- for (i = 0;i < ctxt->level;i++)
- xmlOutputBufferWriteString(buf, xmlTreeIndentString);
+ xmlOutputBufferWrite(buf, ctxt->indent_size *
+ (ctxt->level > ctxt->indent_nr ?
+ ctxt->indent_nr : ctxt->level),
+ ctxt->indent);
}
xmlOutputBufferWriteString(buf, "</");
if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) {
@@ -830,7 +863,6 @@
*/
static void
xhtmlNodeListDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) {
- int i;
xmlOutputBufferPtr buf;
if (cur == NULL) return;
@@ -838,8 +870,10 @@
while (cur != NULL) {
if ((ctxt->format) && (xmlIndentTreeOutput) &&
(cur->type == XML_ELEMENT_NODE))
- for (i = 0;i < ctxt->level;i++)
- xmlOutputBufferWriteString(buf, xmlTreeIndentString);
+ xmlOutputBufferWrite(buf, ctxt->indent_size *
+ (ctxt->level > ctxt->indent_nr ?
+ ctxt->indent_nr : ctxt->level),
+ ctxt->indent);
xhtmlNodeDumpOutput(ctxt, cur);
if (ctxt->format) {
xmlOutputBufferWriteString(buf, "\n");
@@ -861,7 +895,7 @@
*/
static void
xhtmlNodeDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) {
- int i, format;
+ int format;
xmlNodePtr tmp;
xmlChar *start, *end;
xmlOutputBufferPtr buf;
@@ -1098,8 +1132,10 @@
xhtmlNodeListDumpOutput(ctxt, cur->children);
if (ctxt->level > 0) ctxt->level--;
if ((xmlIndentTreeOutput) && (format))
- for (i = 0;i < ctxt->level;i++)
- xmlOutputBufferWriteString(buf, xmlTreeIndentString);
+ xmlOutputBufferWrite(buf, ctxt->indent_size *
+ (ctxt->level > ctxt->indent_nr ?
+ ctxt->indent_nr : ctxt->level),
+ ctxt->indent);
}
xmlOutputBufferWriteString(buf, "</");
if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) {
@@ -1570,6 +1606,7 @@
ctxt.level = level;
ctxt.format = format;
ctxt.encoding = (const xmlChar *) encoding;
+ xmlSaveCtxtInit(&ctxt);
#ifdef LIBXML_HTML_ENABLED
dtd = xmlGetIntSubset(doc);
@@ -1663,6 +1700,7 @@
ctxt.level = 0;
ctxt.format = format;
ctxt.encoding = (const xmlChar *) txt_encoding;
+ xmlSaveCtxtInit(&ctxt);
xmlDocContentDumpOutput(&ctxt, out_doc);
xmlOutputBufferFlush(out_buff);
if (out_buff->conv != NULL) {
@@ -1779,6 +1817,7 @@
ctxt.level = 0;
ctxt.format = format;
ctxt.encoding = (const xmlChar *) encoding;
+ xmlSaveCtxtInit(&ctxt);
xmlDocContentDumpOutput(&ctxt, cur);
ret = xmlOutputBufferClose(buf);
@@ -1821,6 +1860,7 @@
ctxt.level = 0;
ctxt.format = 0;
ctxt.encoding = (const xmlChar *) encoding;
+ xmlSaveCtxtInit(&ctxt);
xmlDocContentDumpOutput(&ctxt, cur);
ret = xmlOutputBufferClose(buf);
return(ret);
@@ -1853,6 +1893,7 @@
ctxt.level = 0;
ctxt.format = format;
ctxt.encoding = (const xmlChar *) encoding;
+ xmlSaveCtxtInit(&ctxt);
xmlDocContentDumpOutput(&ctxt, cur);
ret = xmlOutputBufferClose(buf);
return (ret);
@@ -1906,6 +1947,7 @@
ctxt.level = 0;
ctxt.format = format;
ctxt.encoding = (const xmlChar *) encoding;
+ xmlSaveCtxtInit(&ctxt);
xmlDocContentDumpOutput(&ctxt, cur);