diff options
author | Rob Richards <rrichard@src.gnome.org> | 2005-08-26 15:33:26 +0000 |
---|---|---|
committer | Rob Richards <rrichard@src.gnome.org> | 2005-08-26 15:33:26 +0000 |
commit | 31f73028a24faade0fc3ab8102b48bb57beea709 (patch) | |
tree | 77ee3b0b2b9ddc63340596c2fbc986374745e20d /xmlsave.c | |
parent | baad7887d34861b6269a1a36ad18775130307fa8 (diff) | |
download | libxml2-31f73028a24faade0fc3ab8102b48bb57beea709.tar.gz |
move handling of meta element for http-equiv in XHTML docs to
* xmlsave.c: move handling of meta element for http-equiv in XHTML docs to
serialization and no longer modify internal tree.
Diffstat (limited to 'xmlsave.c')
-rw-r--r-- | xmlsave.c | 64 |
1 files changed, 47 insertions, 17 deletions
@@ -860,12 +860,6 @@ xmlDocContentDumpOutput(xmlSaveCtxtPtr ctxt, xmlDocPtr cur) { is_xhtml = xmlIsXHTML(dtd->SystemID, dtd->ExternalID); if (is_xhtml < 0) is_xhtml = 0; } - if (is_xhtml) { - if (encoding != NULL) - htmlSetMetaEncoding(cur, (const xmlChar *) ctxt->encoding); - else - htmlSetMetaEncoding(cur, BAD_CAST "UTF-8"); - } #endif if (cur->children != NULL) { xmlNodePtr child = cur->children; @@ -1086,7 +1080,7 @@ xhtmlNodeListDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) { */ static void xhtmlNodeDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) { - int format; + int format, addmeta = 0; xmlNodePtr tmp; xmlChar *start, *end; xmlOutputBufferPtr buf; @@ -1210,14 +1204,49 @@ xhtmlNodeDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) { if (cur->properties != NULL) xhtmlAttrListDumpOutput(ctxt, cur->properties); + if ((cur->type == XML_ELEMENT_NODE) && + (cur->parent != NULL) && + (cur->parent->parent == (xmlNodePtr) cur->doc) && + xmlStrEqual(cur->name, BAD_CAST"head") && + xmlStrEqual(cur->parent->name, BAD_CAST"html")) { + + tmp = cur->children; + while (tmp != NULL) { + if (xmlStrEqual(tmp->name, BAD_CAST"meta")) { + xmlChar *httpequiv; + + httpequiv = xmlGetProp(tmp, BAD_CAST"http-equiv"); + if (xmlStrcasecmp(httpequiv, BAD_CAST"Content-Type") == 0) { + xmlFree(httpequiv); + break; + } + xmlFree(httpequiv); + } + tmp = tmp->next; + } + if (tmp == NULL) + addmeta = 1; + } + if ((cur->type == XML_ELEMENT_NODE) && (cur->children == NULL)) { if (((cur->ns == NULL) || (cur->ns->prefix == NULL)) && - (xhtmlIsEmpty(cur) == 1)) { + ((xhtmlIsEmpty(cur) == 1) && (addmeta == 0))) { /* * C.2. Empty Elements */ xmlOutputBufferWrite(buf, 3, " />"); } else { + if (addmeta == 1) { + xmlOutputBufferWrite(buf, 1, ">"); + xmlOutputBufferWriteString(buf, + "<meta http-equiv=\"Content-Type\" content=\"text/html; charset="); + if (ctxt->encoding) { + xmlOutputBufferWriteString(buf, (const char *)ctxt->encoding); + } else { + xmlOutputBufferWrite(buf, 5, "UTF-8"); + } + xmlOutputBufferWrite(buf, 3, "\" /"); + } /* * C.3. Element Minimization and Empty Element Content */ @@ -1232,6 +1261,16 @@ xhtmlNodeDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) { return; } xmlOutputBufferWrite(buf, 1, ">"); + if (addmeta == 1) { + xmlOutputBufferWriteString(buf, + "<meta http-equiv=\"Content-Type\" content=\"text/html; charset="); + if (ctxt->encoding) { + xmlOutputBufferWriteString(buf, (const char *)ctxt->encoding); + } else { + xmlOutputBufferWrite(buf, 5, "UTF-8"); + } + xmlOutputBufferWrite(buf, 4, "\" />"); + } if ((cur->type != XML_ELEMENT_NODE) && (cur->content != NULL)) { xmlOutputBufferWriteEscape(buf, cur->content, ctxt->escape); } @@ -1832,15 +1871,6 @@ xmlNodeDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur, is_xhtml = xmlIsXHTML(dtd->SystemID, dtd->ExternalID); if (is_xhtml < 0) is_xhtml = 0; - if ((is_xhtml) && (cur->parent == (xmlNodePtr) doc) && - (cur->type == XML_ELEMENT_NODE) && - (xmlStrEqual(cur->name, BAD_CAST "html"))) { - if (encoding != NULL) - htmlSetMetaEncoding((htmlDocPtr) doc, - (const xmlChar *) encoding); - else - htmlSetMetaEncoding((htmlDocPtr) doc, BAD_CAST "UTF-8"); - } } if (is_xhtml) |