38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * HTMLtree.c : implementation of access function for an HTML tree.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * See Copyright for the status of this software.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * daniel@veillard.com
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Getting/Setting encoding meta tags *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * htmlGetMetaEncoding:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @doc: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Encoding definition lookup in the Meta tags
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the current encoding as flagged in the HTML source
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Search the html
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur->type == XML_ELEMENT_NODE) && (cur->name != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Search the head
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur->type == XML_ELEMENT_NODE) && (cur->name != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Search the meta elements
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur->type == XML_ELEMENT_NODE) && (cur->name != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((!xmlStrcasecmp(attr->name, BAD_CAST"http-equiv"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync && (!xmlStrcasecmp(value, BAD_CAST"Content-Type")))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync && (!xmlStrcasecmp(attr->name, BAD_CAST"content")))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync encoding = xmlStrstr(content, BAD_CAST"charset =");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync encoding = xmlStrstr(content, BAD_CAST"Charset =");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync encoding = xmlStrstr(content, BAD_CAST"CHARSET =");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while ((*encoding == ' ') || (*encoding == '\t')) encoding++;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * htmlSetMetaEncoding:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @doc: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoding: the encoding string
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Sets the current encoding in the Meta tags
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * NOTE: this will not change the document content encoding, just
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * the META flag associated.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 in case of success and -1 in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynchtmlSetMetaEncoding(htmlDocPtr doc, const xmlChar *encoding) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync snprintf(newcontent, sizeof(newcontent), "text/html; charset=%s",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Search the html
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur->type == XML_ELEMENT_NODE) && (cur->name != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Search the head
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur->type == XML_ELEMENT_NODE) && (cur->name != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync meta = xmlNewDocNode(doc, NULL, BAD_CAST"meta", NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlNewProp(meta, BAD_CAST"http-equiv", BAD_CAST"Content-Type");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlNewProp(meta, BAD_CAST"content", BAD_CAST newcontent);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Create a new Meta element with the right attributes
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync meta = xmlNewDocNode(doc, NULL, BAD_CAST"meta", NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlNewProp(meta, BAD_CAST"http-equiv", BAD_CAST"Content-Type");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlNewProp(meta, BAD_CAST"content", BAD_CAST newcontent);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Search and destroy all the remaining the meta elements carrying
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * encoding informations
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur->type == XML_ELEMENT_NODE) && (cur->name != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlStrcasecmp(cur->name, BAD_CAST"meta") == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((!xmlStrcasecmp(attr->name, BAD_CAST"http-equiv"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync && (!xmlStrcasecmp(value, BAD_CAST"Content-Type")))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * booleanHTMLAttrs:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * These are the HTML attributes which will be output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * in minimized form, i.e. <option selected="selected"> will be
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * output as <option selected>, as per XSLT 1.0 16.2 "HTML Output Method"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "checked", "compact", "declare", "defer", "disabled", "ismap",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "multiple", "nohref", "noresize", "noshade", "nowrap", "readonly",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * htmlIsBooleanAttr:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @name: the name of the attribute to check
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Determine if a given attribute is a boolean attribute.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * returns: false if the attribute is not boolean, true otherwise.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlStrcasecmp((const xmlChar *)htmlBooleanAttrs[i], name) == 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Output error handlers *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * htmlSaveErrMemory:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @extra: extra informations
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Handle an out of memory condition
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync __xmlSimpleError(XML_FROM_OUTPUT, XML_ERR_NO_MEMORY, NULL, NULL, extra);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * htmlSaveErr:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @code: the error number
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @node: the location of the error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @extra: extra informations
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Handle an out of memory condition
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynchtmlSaveErr(int code, xmlNodePtr node, const char *extra)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync __xmlSimpleError(XML_FROM_OUTPUT, code, node, msg, extra);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dumping HTML tree content to a simple buffer *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynchtmlNodeDumpFormat(xmlBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * htmlNodeDumpFormat:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buf: the HTML buffer output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @doc: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the current node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @format: should formatting spaces been added
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an HTML node, recursive behaviour,children are printed too.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of byte written or -1 in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynchtmlNodeDumpFormat(xmlBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync outbuf = (xmlOutputBufferPtr) xmlMalloc(sizeof(xmlOutputBuffer));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync htmlSaveErrMemory("allocating HTML output buffer");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync memset(outbuf, 0, (size_t) sizeof(xmlOutputBuffer));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync htmlNodeDumpFormatOutput(outbuf, doc, cur, NULL, format);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * htmlNodeDump:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buf: the HTML buffer output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @doc: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the current node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an HTML node, recursive behaviour,children are printed too,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * and formatting returns are added.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of byte written or -1 in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynchtmlNodeDump(xmlBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * htmlNodeDumpFileFormat:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @out: the FILE pointer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @doc: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the current node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoding: the document encoding
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @format: should formatting spaces been added
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an HTML node, recursive behaviour,children are printed too.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * TODO: if encoding == NULL try to save in the doc encoding
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * returns: the number of byte written or -1 in case of failure.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlNodePtr cur, const char *encoding, int format) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Fallback to HTML or ASCII when the encoding is unspecified
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * save the content to a temp buffer.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync htmlNodeDumpFormatOutput(buf, doc, cur, encoding, format);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * htmlNodeDumpFile:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @out: the FILE pointer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @doc: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the current node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an HTML node, recursive behaviour,children are printed too,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * and formatting returns are added.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynchtmlNodeDumpFile(FILE *out, xmlDocPtr doc, xmlNodePtr cur) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * htmlDocDumpMemoryFormat:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @mem: OUT: the memory pointer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @size: OUT: the memory length
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @format: should formatting spaces been added
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an HTML document in memory and return the xmlChar * and it's size.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * It's up to the caller to free the memory.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynchtmlDocDumpMemoryFormat(xmlDocPtr cur, xmlChar**mem, int *size, int format) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync encoding = (const char *) htmlGetMetaEncoding(cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Not supported yet
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Fallback to HTML or ASCII when the encoding is unspecified
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync htmlDocContentDumpFormatOutput(buf, cur, NULL, format);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * htmlDocDumpMemory:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @mem: OUT: the memory pointer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @size: OUT: the memory length
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an HTML document in memory and return the xmlChar * and it's size.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * It's up to the caller to free the memory.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynchtmlDocDumpMemory(xmlDocPtr cur, xmlChar**mem, int *size) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dumping HTML tree content to an I/O output buffer *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid xmlNsListDumpOutput(xmlOutputBufferPtr buf, xmlNsPtr cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * htmlDtdDumpOutput:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buf: the HTML buffer output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @doc: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoding: the encoding string
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * TODO: check whether encoding is needed
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump the HTML document DTD, if any.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynchtmlDtdDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync htmlSaveErr(XML_SAVE_NO_DOCTYPE, (xmlNodePtr) doc, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferWriteQuotedString(buf->buffer, cur->ExternalID);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferWriteQuotedString(buf->buffer, cur->SystemID);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferWriteQuotedString(buf->buffer, cur->SystemID);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * htmlAttrDumpOutput:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buf: the HTML buffer output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @doc: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the attribute pointer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoding: the encoding string
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an HTML attribute
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynchtmlAttrDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlAttrPtr cur,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * TODO: The html output method should not escape a & character
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * occurring in an attribute value immediately followed by
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * a { character (see Section B.7.1 of the HTML 4.0 Recommendation).
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur->children != NULL) && (!htmlIsBooleanAttr(cur->name))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync value = xmlNodeListGetString(doc, cur->children, 0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (!xmlStrcasecmp(cur->parent->name, BAD_CAST "a"))))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync escaped = xmlURIEscapeStr(tmp, BAD_CAST"@/:=?;#%&,+");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * htmlAttrListDumpOutput:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buf: the HTML buffer output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @doc: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the first attribute pointer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoding: the encoding string
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump a list of HTML attributes
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynchtmlAttrListDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlAttrPtr cur, const char *encoding) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * htmlNodeListDumpOutput:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buf: the HTML buffer output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @doc: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the first node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoding: the encoding string
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @format: should formatting spaces been added
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an HTML node list, recursive behaviour,children are printed too.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynchtmlNodeListDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlNodePtr cur, const char *encoding, int format) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync htmlNodeDumpFormatOutput(buf, doc, cur, encoding, format);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * htmlNodeDumpFormatOutput:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buf: the HTML buffer output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @doc: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the current node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoding: the encoding string
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @format: should formatting spaces been added
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an HTML node, recursive behaviour,children are printed too.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynchtmlNodeDumpFormatOutput(xmlOutputBufferPtr buf, xmlDocPtr doc,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlNodePtr cur, const char *encoding, int format) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Special cases.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync htmlDocContentDumpOutput(buf, (xmlDocPtr) cur, encoding);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync htmlAttrDumpOutput(buf, doc, (xmlAttrPtr) cur, encoding);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (((cur->name == (const xmlChar *)xmlStringText) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (cur->name != (const xmlChar *)xmlStringTextNoenc)) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ((xmlStrcasecmp(cur->parent->name, BAD_CAST "script")) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlStrcasecmp(cur->parent->name, BAD_CAST "style"))))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buffer = xmlEncodeEntitiesReentrant(doc, cur->content);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)buffer);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->content);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->content);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->content);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->content);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Get specific HTML info for that node.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync htmlAttrListDumpOutput(buf, doc, cur->properties, encoding);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((format) && (!info->isinline) && (cur->next != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (((cur->type == XML_ELEMENT_NODE) || (cur->content == NULL)) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlStrcmp(BAD_CAST info->name, BAD_CAST "html")) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlStrcmp(BAD_CAST info->name, BAD_CAST "body"))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Uses the OutputBuffer property to automatically convert
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * invalids to charrefs
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *) cur->content);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((format) && (info != NULL) && (!info->isinline) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync htmlNodeListDumpOutput(buf, doc, cur->children, encoding, format);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((format) && (info != NULL) && (!info->isinline) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((format) && (info != NULL) && (!info->isinline) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * htmlNodeDumpOutput:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buf: the HTML buffer output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @doc: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the current node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoding: the encoding string
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an HTML node, recursive behaviour,children are printed too,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * and formatting returns/spaces are added.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynchtmlNodeDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync htmlNodeDumpFormatOutput(buf, doc, cur, encoding, 1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * htmlDocContentDumpFormatOutput:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buf: the HTML buffer output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoding: the encoding string
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @format: should formatting spaces been added
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an HTML document.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynchtmlDocContentDumpFormatOutput(xmlOutputBufferPtr buf, xmlDocPtr cur,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * force to output the stuff as HTML, especially for entities
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync htmlNodeListDumpOutput(buf, cur, cur->children, encoding, format);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * htmlDocContentDumpOutput:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buf: the HTML buffer output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoding: the encoding string
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an HTML document. Formating return/spaces are added.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynchtmlDocContentDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr cur,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync const char *encoding) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync htmlDocContentDumpFormatOutput(buf, cur, encoding, 1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Saving functions front-ends *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * htmlDocDump:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @f: the FILE*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an HTML document to an open FILE.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * returns: the number of byte written or -1 in case of failure.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync encoding = (const char *) htmlGetMetaEncoding(cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Not supported yet
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Fallback to HTML or ASCII when the encoding is unspecified
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * htmlSaveFile:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the filename (or URL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an HTML document to a file. If @filename is "-" the stdout file is
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * returns: the number of byte written or -1 in case of failure.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync encoding = (const char *) htmlGetMetaEncoding(cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Not supported yet
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Fallback to HTML or ASCII when the encoding is unspecified
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * save the content to a temp buffer.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buf = xmlOutputBufferCreateFilename(filename, handler, cur->compression);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * htmlSaveFileFormat:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the filename
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @format: should formatting spaces been added
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoding: the document encoding
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an HTML document to a file using a given encoding.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * returns: the number of byte written or -1 in case of failure.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynchtmlSaveFileFormat(const char *filename, xmlDocPtr cur,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Not supported yet
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync htmlSetMetaEncoding(cur, (const xmlChar *) encoding);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync htmlSetMetaEncoding(cur, (const xmlChar *) "UTF-8");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Fallback to HTML or ASCII when the encoding is unspecified
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * save the content to a temp buffer.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buf = xmlOutputBufferCreateFilename(filename, handler, 0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync htmlDocContentDumpFormatOutput(buf, cur, encoding, format);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * htmlSaveFileEnc:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the filename
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoding: the document encoding
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an HTML document to a file using a given encoding
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * and formatting returns/spaces are added.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * returns: the number of byte written or -1 in case of failure.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynchtmlSaveFileEnc(const char *filename, xmlDocPtr cur, const char *encoding) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(htmlSaveFileFormat(filename, cur, encoding, 1));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_HTML_ENABLED */