mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-10-31 21:50:33 +03:00
html: Call lower-level escaping functions
Removes the need to pass a document around.
This commit is contained in:
56
HTMLtree.c
56
HTMLtree.c
@@ -24,10 +24,12 @@
|
|||||||
#include <libxml/uri.h>
|
#include <libxml/uri.h>
|
||||||
|
|
||||||
#include "private/buf.h"
|
#include "private/buf.h"
|
||||||
|
#include "private/entities.h"
|
||||||
#include "private/error.h"
|
#include "private/error.h"
|
||||||
#include "private/html.h"
|
#include "private/html.h"
|
||||||
#include "private/io.h"
|
#include "private/io.h"
|
||||||
#include "private/save.h"
|
#include "private/save.h"
|
||||||
|
#include "private/tree.h"
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* *
|
* *
|
||||||
@@ -404,14 +406,14 @@ htmlFindOutputEncoder(const char *encoding, xmlCharEncodingHandler **out) {
|
|||||||
* Serialize an HTML document to an xmlBuf.
|
* Serialize an HTML document to an xmlBuf.
|
||||||
*
|
*
|
||||||
* @param buf the xmlBufPtr output
|
* @param buf the xmlBufPtr output
|
||||||
* @param doc the document
|
* @param doc the document (unused)
|
||||||
* @param cur the current node
|
* @param cur the current node
|
||||||
* @param format should formatting newlines been added
|
* @param format should formatting newlines been added
|
||||||
* @returns the number of bytes written or -1 in case of error
|
* @returns the number of bytes written or -1 in case of error
|
||||||
*/
|
*/
|
||||||
static size_t
|
static size_t
|
||||||
htmlBufNodeDumpFormat(xmlBufPtr buf, xmlDocPtr doc, xmlNodePtr cur,
|
htmlBufNodeDumpFormat(xmlBufPtr buf, xmlDocPtr doc ATTRIBUTE_UNUSED,
|
||||||
int format) {
|
xmlNodePtr cur, int format) {
|
||||||
size_t use;
|
size_t use;
|
||||||
size_t ret;
|
size_t ret;
|
||||||
xmlOutputBufferPtr outbuf;
|
xmlOutputBufferPtr outbuf;
|
||||||
@@ -434,7 +436,7 @@ htmlBufNodeDumpFormat(xmlBufPtr buf, xmlDocPtr doc, xmlNodePtr cur,
|
|||||||
outbuf->written = 0;
|
outbuf->written = 0;
|
||||||
|
|
||||||
use = xmlBufUse(buf);
|
use = xmlBufUse(buf);
|
||||||
htmlNodeDumpInternal(outbuf, doc, cur, NULL, format);
|
htmlNodeDumpInternal(outbuf, cur, NULL, format);
|
||||||
if (outbuf->error)
|
if (outbuf->error)
|
||||||
ret = (size_t) -1;
|
ret = (size_t) -1;
|
||||||
else
|
else
|
||||||
@@ -482,14 +484,14 @@ htmlNodeDump(xmlBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur) {
|
|||||||
* changed in a future version.
|
* changed in a future version.
|
||||||
*
|
*
|
||||||
* @param out the FILE pointer
|
* @param out the FILE pointer
|
||||||
* @param doc the document
|
* @param doc the document (unused)
|
||||||
* @param cur the current node
|
* @param cur the current node
|
||||||
* @param encoding the document encoding (optional)
|
* @param encoding the document encoding (optional)
|
||||||
* @param format should formatting newlines been added
|
* @param format should formatting newlines been added
|
||||||
* @returns the number of bytes written or -1 in case of failure.
|
* @returns the number of bytes written or -1 in case of failure.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
htmlNodeDumpFileFormat(FILE *out, xmlDocPtr doc,
|
htmlNodeDumpFileFormat(FILE *out, xmlDocPtr doc ATTRIBUTE_UNUSED,
|
||||||
xmlNodePtr cur, const char *encoding, int format) {
|
xmlNodePtr cur, const char *encoding, int format) {
|
||||||
xmlOutputBufferPtr buf;
|
xmlOutputBufferPtr buf;
|
||||||
xmlCharEncodingHandlerPtr handler;
|
xmlCharEncodingHandlerPtr handler;
|
||||||
@@ -506,7 +508,7 @@ htmlNodeDumpFileFormat(FILE *out, xmlDocPtr doc,
|
|||||||
if (buf == NULL)
|
if (buf == NULL)
|
||||||
return(-1);
|
return(-1);
|
||||||
|
|
||||||
htmlNodeDumpInternal(buf, doc, cur, NULL, format);
|
htmlNodeDumpInternal(buf, cur, NULL, format);
|
||||||
|
|
||||||
ret = xmlOutputBufferClose(buf);
|
ret = xmlOutputBufferClose(buf);
|
||||||
return(ret);
|
return(ret);
|
||||||
@@ -636,18 +638,17 @@ htmlDtdDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc,
|
|||||||
* Serialize an HTML attribute.
|
* Serialize an HTML attribute.
|
||||||
*
|
*
|
||||||
* @param buf the HTML buffer output
|
* @param buf the HTML buffer output
|
||||||
* @param doc the document
|
|
||||||
* @param cur the attribute pointer
|
* @param cur the attribute pointer
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
htmlAttrDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlAttrPtr cur) {
|
htmlAttrDumpOutput(xmlOutputBufferPtr buf, xmlAttrPtr cur) {
|
||||||
xmlChar *value;
|
xmlChar *value;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The html output method should not escape a & character
|
* The html output method should not escape a & character
|
||||||
* occurring in an attribute value immediately followed by
|
* occurring in an attribute value immediately followed by
|
||||||
* a { character (see Section B.7.1 of the HTML 4.0 Recommendation).
|
* a { character (see Section B.7.1 of the HTML 4.0 Recommendation).
|
||||||
* This is implemented in xmlEncodeEntitiesReentrant
|
* This is implemented in xmlEscapeText.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (cur == NULL) {
|
if (cur == NULL) {
|
||||||
@@ -660,7 +661,10 @@ htmlAttrDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlAttrPtr cur) {
|
|||||||
}
|
}
|
||||||
xmlOutputBufferWriteString(buf, (const char *)cur->name);
|
xmlOutputBufferWriteString(buf, (const char *)cur->name);
|
||||||
if ((cur->children != NULL) && (!htmlIsBooleanAttr(cur->name))) {
|
if ((cur->children != NULL) && (!htmlIsBooleanAttr(cur->name))) {
|
||||||
value = xmlNodeListGetString(doc, cur->children, 0);
|
int flags = XML_ESCAPE_HTML | XML_ESCAPE_ATTR;
|
||||||
|
|
||||||
|
value = xmlNodeListGetStringInternal(cur->children, /* escape */ 1,
|
||||||
|
flags);
|
||||||
if (value) {
|
if (value) {
|
||||||
xmlOutputBufferWriteString(buf, "=");
|
xmlOutputBufferWriteString(buf, "=");
|
||||||
if ((cur->ns == NULL) && (cur->parent != NULL) &&
|
if ((cur->ns == NULL) && (cur->parent != NULL) &&
|
||||||
@@ -708,13 +712,12 @@ htmlAttrDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlAttrPtr cur) {
|
|||||||
* tags containing the character encoding.
|
* tags containing the character encoding.
|
||||||
*
|
*
|
||||||
* @param buf the HTML buffer output
|
* @param buf the HTML buffer output
|
||||||
* @param doc the document
|
|
||||||
* @param cur the current node
|
* @param cur the current node
|
||||||
* @param encoding the encoding string (optional)
|
* @param encoding the encoding string (optional)
|
||||||
* @param format should formatting newlines been added
|
* @param format should formatting newlines been added
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
htmlNodeDumpInternal(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur,
|
htmlNodeDumpInternal(xmlOutputBufferPtr buf, xmlNodePtr cur,
|
||||||
const char *encoding, int format) {
|
const char *encoding, int format) {
|
||||||
xmlNodePtr root, parent, metaHead = NULL;
|
xmlNodePtr root, parent, metaHead = NULL;
|
||||||
xmlAttrPtr attr;
|
xmlAttrPtr attr;
|
||||||
@@ -758,7 +761,7 @@ htmlNodeDumpInternal(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur,
|
|||||||
* case.
|
* case.
|
||||||
*/
|
*/
|
||||||
if ((cur->parent != parent) && (cur->children != NULL)) {
|
if ((cur->parent != parent) && (cur->children != NULL)) {
|
||||||
htmlNodeDumpInternal(buf, doc, cur, encoding, format);
|
htmlNodeDumpInternal(buf, cur, encoding, format);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -814,7 +817,7 @@ htmlNodeDumpInternal(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur,
|
|||||||
attr = cur->properties;
|
attr = cur->properties;
|
||||||
while (attr != NULL) {
|
while (attr != NULL) {
|
||||||
if ((!isMeta) || (attr != menc.attr)) {
|
if ((!isMeta) || (attr != menc.attr)) {
|
||||||
htmlAttrDumpOutput(buf, doc, attr);
|
htmlAttrDumpOutput(buf, attr);
|
||||||
} else {
|
} else {
|
||||||
xmlChar *newVal;
|
xmlChar *newVal;
|
||||||
|
|
||||||
@@ -897,7 +900,7 @@ htmlNodeDumpInternal(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur,
|
|||||||
}
|
}
|
||||||
|
|
||||||
case XML_ATTRIBUTE_NODE:
|
case XML_ATTRIBUTE_NODE:
|
||||||
htmlAttrDumpOutput(buf, doc, (xmlAttrPtr) cur);
|
htmlAttrDumpOutput(buf, (xmlAttrPtr) cur);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTML_TEXT_NODE:
|
case HTML_TEXT_NODE:
|
||||||
@@ -910,7 +913,7 @@ htmlNodeDumpInternal(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur,
|
|||||||
(xmlStrcasecmp(parent->name, BAD_CAST "style"))))) {
|
(xmlStrcasecmp(parent->name, BAD_CAST "style"))))) {
|
||||||
xmlChar *buffer;
|
xmlChar *buffer;
|
||||||
|
|
||||||
buffer = xmlEncodeEntitiesReentrant(doc, cur->content);
|
buffer = xmlEscapeText(cur->content, XML_ESCAPE_HTML);
|
||||||
if (buffer == NULL) {
|
if (buffer == NULL) {
|
||||||
buf->error = XML_ERR_NO_MEMORY;
|
buf->error = XML_ERR_NO_MEMORY;
|
||||||
return;
|
return;
|
||||||
@@ -1017,15 +1020,16 @@ htmlNodeDumpInternal(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur,
|
|||||||
* Serialize an HTML node to an output buffer.
|
* Serialize an HTML node to an output buffer.
|
||||||
*
|
*
|
||||||
* @param buf the HTML buffer output
|
* @param buf the HTML buffer output
|
||||||
* @param doc the document
|
* @param doc the document (unused)
|
||||||
* @param cur the current node
|
* @param cur the current node
|
||||||
* @param encoding the encoding string (unused)
|
* @param encoding the encoding string (unused)
|
||||||
* @param format should formatting newlines been added
|
* @param format should formatting newlines been added
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
htmlNodeDumpFormatOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur,
|
htmlNodeDumpFormatOutput(xmlOutputBufferPtr buf,
|
||||||
|
xmlDocPtr doc ATTRIBUTE_UNUSED, xmlNodePtr cur,
|
||||||
const char *encoding ATTRIBUTE_UNUSED, int format) {
|
const char *encoding ATTRIBUTE_UNUSED, int format) {
|
||||||
htmlNodeDumpInternal(buf, doc, cur, NULL, format);
|
htmlNodeDumpInternal(buf, cur, NULL, format);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1034,14 +1038,14 @@ htmlNodeDumpFormatOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur,
|
|||||||
* of htmlNodeDumpFormatOutput().
|
* of htmlNodeDumpFormatOutput().
|
||||||
*
|
*
|
||||||
* @param buf the HTML buffer output
|
* @param buf the HTML buffer output
|
||||||
* @param doc the document
|
* @param doc the document (unused)
|
||||||
* @param cur the current node
|
* @param cur the current node
|
||||||
* @param encoding the encoding string (unused)
|
* @param encoding the encoding string (unused)
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
htmlNodeDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur,
|
htmlNodeDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc ATTRIBUTE_UNUSED,
|
||||||
const char *encoding ATTRIBUTE_UNUSED) {
|
xmlNodePtr cur, const char *encoding ATTRIBUTE_UNUSED) {
|
||||||
htmlNodeDumpInternal(buf, doc, cur, NULL, 1);
|
htmlNodeDumpInternal(buf, cur, NULL, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1056,7 +1060,7 @@ void
|
|||||||
htmlDocContentDumpFormatOutput(xmlOutputBufferPtr buf, xmlDocPtr cur,
|
htmlDocContentDumpFormatOutput(xmlOutputBufferPtr buf, xmlDocPtr cur,
|
||||||
const char *encoding ATTRIBUTE_UNUSED,
|
const char *encoding ATTRIBUTE_UNUSED,
|
||||||
int format) {
|
int format) {
|
||||||
htmlNodeDumpInternal(buf, cur, (xmlNodePtr) cur, NULL, format);
|
htmlNodeDumpInternal(buf, (xmlNodePtr) cur, NULL, format);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1071,7 +1075,7 @@ htmlDocContentDumpFormatOutput(xmlOutputBufferPtr buf, xmlDocPtr cur,
|
|||||||
void
|
void
|
||||||
htmlDocContentDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr cur,
|
htmlDocContentDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr cur,
|
||||||
const char *encoding ATTRIBUTE_UNUSED) {
|
const char *encoding ATTRIBUTE_UNUSED) {
|
||||||
htmlNodeDumpInternal(buf, cur, (xmlNodePtr) cur, NULL, 1);
|
htmlNodeDumpInternal(buf, (xmlNodePtr) cur, NULL, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ XML_HIDDEN int
|
|||||||
htmlParseContentType(const xmlChar *val, htmlMetaEncodingOffsets *off);
|
htmlParseContentType(const xmlChar *val, htmlMetaEncodingOffsets *off);
|
||||||
|
|
||||||
XML_HIDDEN void
|
XML_HIDDEN void
|
||||||
htmlNodeDumpInternal(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur,
|
htmlNodeDumpInternal(xmlOutputBufferPtr buf, xmlNodePtr cur,
|
||||||
const char *encoding, int format);
|
const char *encoding, int format);
|
||||||
|
|
||||||
#endif /* LIBXML_HTML_ENABLED */
|
#endif /* LIBXML_HTML_ENABLED */
|
||||||
|
|||||||
@@ -19,4 +19,7 @@ xmlStaticCopyNodeList(xmlNodePtr node, xmlDocPtr doc, xmlNodePtr parent);
|
|||||||
XML_HIDDEN const xmlChar *
|
XML_HIDDEN const xmlChar *
|
||||||
xmlSplitQName4(const xmlChar *name, xmlChar **prefixPtr);
|
xmlSplitQName4(const xmlChar *name, xmlChar **prefixPtr);
|
||||||
|
|
||||||
|
XML_HIDDEN xmlChar *
|
||||||
|
xmlNodeListGetStringInternal(const xmlNode *node, int escape, int flags);
|
||||||
|
|
||||||
#endif /* XML_TREE_H_PRIVATE__ */
|
#endif /* XML_TREE_H_PRIVATE__ */
|
||||||
|
|||||||
2
tree.c
2
tree.c
@@ -1444,7 +1444,7 @@ xmlStringGetNodeList(const xmlDoc *doc, const xmlChar *value) {
|
|||||||
* @param flags escape flags
|
* @param flags escape flags
|
||||||
* @returns a pointer to the string.
|
* @returns a pointer to the string.
|
||||||
*/
|
*/
|
||||||
static xmlChar *
|
xmlChar *
|
||||||
xmlNodeListGetStringInternal(const xmlNode *node, int escape, int flags) {
|
xmlNodeListGetStringInternal(const xmlNode *node, int escape, int flags) {
|
||||||
xmlBufPtr buf;
|
xmlBufPtr buf;
|
||||||
xmlChar *ret;
|
xmlChar *ret;
|
||||||
|
|||||||
13
xmlsave.c
13
xmlsave.c
@@ -1025,17 +1025,14 @@ static int
|
|||||||
htmlNodeDumpOutputInternal(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) {
|
htmlNodeDumpOutputInternal(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) {
|
||||||
int switched_encoding = 0;
|
int switched_encoding = 0;
|
||||||
int format = 0;
|
int format = 0;
|
||||||
xmlDocPtr doc;
|
|
||||||
|
|
||||||
xmlInitParser();
|
xmlInitParser();
|
||||||
|
|
||||||
doc = cur->doc;
|
|
||||||
|
|
||||||
if (ctxt->encoding == NULL) {
|
if (ctxt->encoding == NULL) {
|
||||||
const char *encoding = NULL;
|
const char *encoding = NULL;
|
||||||
|
|
||||||
if (doc != NULL)
|
if (cur->doc != NULL)
|
||||||
encoding = (char *) doc->encoding;
|
encoding = (char *) cur->doc->encoding;
|
||||||
|
|
||||||
if (encoding == NULL)
|
if (encoding == NULL)
|
||||||
encoding = "HTML";
|
encoding = "HTML";
|
||||||
@@ -1048,7 +1045,7 @@ htmlNodeDumpOutputInternal(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) {
|
|||||||
if (ctxt->options & XML_SAVE_FORMAT)
|
if (ctxt->options & XML_SAVE_FORMAT)
|
||||||
format = 1;
|
format = 1;
|
||||||
|
|
||||||
htmlNodeDumpInternal(ctxt->buf, doc, cur, (char *) ctxt->encoding, format);
|
htmlNodeDumpInternal(ctxt->buf, cur, (char *) ctxt->encoding, format);
|
||||||
|
|
||||||
if (switched_encoding) {
|
if (switched_encoding) {
|
||||||
xmlSaveClearEncoding(ctxt);
|
xmlSaveClearEncoding(ctxt);
|
||||||
@@ -1366,8 +1363,8 @@ xmlSaveDocInternal(xmlSaveCtxtPtr ctxt, xmlDocPtr cur,
|
|||||||
|
|
||||||
if (ctxt->options & XML_SAVE_FORMAT)
|
if (ctxt->options & XML_SAVE_FORMAT)
|
||||||
format = 1;
|
format = 1;
|
||||||
htmlNodeDumpInternal(buf, cur, (htmlNodePtr) cur,
|
htmlNodeDumpInternal(buf, (htmlNodePtr) cur, (char *) ctxt->encoding,
|
||||||
(char *) ctxt->encoding, format);
|
format);
|
||||||
#else
|
#else
|
||||||
return(-1);
|
return(-1);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user