1ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 2ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * HTMLtree.c : implementation of access function for an HTML tree. 3ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * See Copyright for the status of this software. 5ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * daniel@veillard.com 7ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IN_LIBXML 11ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "libxml.h" 12ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_HTML_ENABLED 13ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <string.h> /* for memset() only ! */ 15ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 16ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_CTYPE_H 17ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <ctype.h> 18ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 19ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_STDLIB_H 20ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <stdlib.h> 21ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 22ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 23ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlmemory.h> 24ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/HTMLparser.h> 25ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/HTMLtree.h> 26ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/entities.h> 27ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/valid.h> 28ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlerror.h> 29ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parserInternals.h> 30ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/globals.h> 31ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/uri.h> 32ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#include "buf.h" 3494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 35ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 36ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 3794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Getting/Setting encoding meta tags * 38ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 39ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 40ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 41ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 42ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlGetMetaEncoding: 43ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document 4494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * 45ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Encoding definition lookup in the Meta tags 46ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 47ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the current encoding as flagged in the HTML source 48ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 49ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectconst xmlChar * 50ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlGetMetaEncoding(htmlDocPtr doc) { 51ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlNodePtr cur; 52ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *content; 53ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *encoding; 54ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) 56ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 57ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = doc->children; 58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 59ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search the html 61ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 62ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 63ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type == XML_ELEMENT_NODE) && (cur->name != NULL)) { 64ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(cur->name, BAD_CAST"html")) 65ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 66ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(cur->name, BAD_CAST"head")) 67ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto found_head; 68ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(cur->name, BAD_CAST"meta")) 69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto found_meta; 70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 71ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 75ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->children; 76ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 77ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 78ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search the head 79ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 80ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 81ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type == XML_ELEMENT_NODE) && (cur->name != NULL)) { 82ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(cur->name, BAD_CAST"head")) 83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(cur->name, BAD_CAST"meta")) 85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto found_meta; 86ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 87ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 88ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 89ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 91ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectfound_head: 92ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->children; 93ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search the meta elements 96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectfound_meta: 98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 99ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type == XML_ELEMENT_NODE) && (cur->name != NULL)) { 100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(cur->name, BAD_CAST"meta")) { 101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr attr = cur->properties; 102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int http; 103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *value; 104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = NULL; 106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project http = 0; 107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (attr != NULL) { 108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attr->children != NULL) && 109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (attr->children->type == XML_TEXT_NODE) && 110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (attr->children->next == NULL)) { 111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = attr->children->content; 112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!xmlStrcasecmp(attr->name, BAD_CAST"http-equiv")) 113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (!xmlStrcasecmp(value, BAD_CAST"Content-Type"))) 114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project http = 1; 115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if ((value != NULL) 116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (!xmlStrcasecmp(attr->name, BAD_CAST"content"))) 117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = value; 118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((http != 0) && (content != NULL)) 119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto found_content; 120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr = attr->next; 122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectfound_content: 130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project encoding = xmlStrstr(content, BAD_CAST"charset="); 13194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (encoding == NULL) 132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project encoding = xmlStrstr(content, BAD_CAST"Charset="); 13394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (encoding == NULL) 134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project encoding = xmlStrstr(content, BAD_CAST"CHARSET="); 135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (encoding != NULL) { 136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project encoding += 8; 137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project encoding = xmlStrstr(content, BAD_CAST"charset ="); 13994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (encoding == NULL) 140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project encoding = xmlStrstr(content, BAD_CAST"Charset ="); 14194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (encoding == NULL) 142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project encoding = xmlStrstr(content, BAD_CAST"CHARSET ="); 143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (encoding != NULL) 144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project encoding += 9; 145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (encoding != NULL) { 147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*encoding == ' ') || (*encoding == '\t')) encoding++; 148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(encoding); 150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlSetMetaEncoding: 154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document 155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding: the encoding string 15694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * 157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Sets the current encoding in the Meta tags 158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NOTE: this will not change the document content encoding, just 159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the META flag associated. 160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success and -1 in case of error 162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlSetMetaEncoding(htmlDocPtr doc, const xmlChar *encoding) { 165df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlNodePtr cur, meta = NULL, head = NULL; 166df143a5041f03a22808b59c76698770b74692815Selim Gurun const xmlChar *content = NULL; 167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char newcontent[100]; 168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 16994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun newcontent[0] = 0; 170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) 172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 174df143a5041f03a22808b59c76698770b74692815Selim Gurun /* html isn't a real encoding it's just libxml2 way to get entities */ 175df143a5041f03a22808b59c76698770b74692815Selim Gurun if (!xmlStrcasecmp(encoding, BAD_CAST "html")) 176df143a5041f03a22808b59c76698770b74692815Selim Gurun return(-1); 177df143a5041f03a22808b59c76698770b74692815Selim Gurun 178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (encoding != NULL) { 179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(newcontent, sizeof(newcontent), "text/html; charset=%s", 180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (char *)encoding); 181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newcontent[sizeof(newcontent) - 1] = 0; 182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = doc->children; 185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search the html 188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type == XML_ELEMENT_NODE) && (cur->name != NULL)) { 191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrcasecmp(cur->name, BAD_CAST"html") == 0) 192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrcasecmp(cur->name, BAD_CAST"head") == 0) 194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto found_head; 195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrcasecmp(cur->name, BAD_CAST"meta") == 0) 196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto found_meta; 197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->children; 203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search the head 206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type == XML_ELEMENT_NODE) && (cur->name != NULL)) { 209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrcasecmp(cur->name, BAD_CAST"head") == 0) 210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 211df143a5041f03a22808b59c76698770b74692815Selim Gurun if (xmlStrcasecmp(cur->name, BAD_CAST"meta") == 0) { 212df143a5041f03a22808b59c76698770b74692815Selim Gurun head = cur->parent; 213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto found_meta; 214df143a5041f03a22808b59c76698770b74692815Selim Gurun } 215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectfound_head: 221df143a5041f03a22808b59c76698770b74692815Selim Gurun head = cur; 222df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur->children == NULL) 223df143a5041f03a22808b59c76698770b74692815Selim Gurun goto create; 224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->children; 225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectfound_meta: 227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 228df143a5041f03a22808b59c76698770b74692815Selim Gurun * Search and update all the remaining the meta elements carrying 229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * encoding informations 230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type == XML_ELEMENT_NODE) && (cur->name != NULL)) { 233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrcasecmp(cur->name, BAD_CAST"meta") == 0) { 234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr attr = cur->properties; 235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int http; 236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *value; 237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = NULL; 239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project http = 0; 240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (attr != NULL) { 241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attr->children != NULL) && 242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (attr->children->type == XML_TEXT_NODE) && 243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (attr->children->next == NULL)) { 244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = attr->children->content; 245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!xmlStrcasecmp(attr->name, BAD_CAST"http-equiv")) 246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (!xmlStrcasecmp(value, BAD_CAST"Content-Type"))) 247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project http = 1; 248df143a5041f03a22808b59c76698770b74692815Selim Gurun else 249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 25094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if ((value != NULL) && 251df143a5041f03a22808b59c76698770b74692815Selim Gurun (!xmlStrcasecmp(attr->name, BAD_CAST"content"))) 252df143a5041f03a22808b59c76698770b74692815Selim Gurun content = value; 253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((http != 0) && (content != NULL)) 255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr = attr->next; 258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((http != 0) && (content != NULL)) { 260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project meta = cur; 261df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 268df143a5041f03a22808b59c76698770b74692815Selim Guruncreate: 269df143a5041f03a22808b59c76698770b74692815Selim Gurun if (meta == NULL) { 270df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((encoding != NULL) && (head != NULL)) { 271df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 272df143a5041f03a22808b59c76698770b74692815Selim Gurun * Create a new Meta element with the right attributes 273df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 274df143a5041f03a22808b59c76698770b74692815Selim Gurun 275df143a5041f03a22808b59c76698770b74692815Selim Gurun meta = xmlNewDocNode(doc, NULL, BAD_CAST"meta", NULL); 276df143a5041f03a22808b59c76698770b74692815Selim Gurun if (head->children == NULL) 277df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlAddChild(head, meta); 278df143a5041f03a22808b59c76698770b74692815Selim Gurun else 279df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlAddPrevSibling(head->children, meta); 280df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlNewProp(meta, BAD_CAST"http-equiv", BAD_CAST"Content-Type"); 281df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlNewProp(meta, BAD_CAST"content", BAD_CAST newcontent); 282df143a5041f03a22808b59c76698770b74692815Selim Gurun } 283df143a5041f03a22808b59c76698770b74692815Selim Gurun } else { 28494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun /* remove the meta tag if NULL is passed */ 28594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (encoding == NULL) { 28694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun xmlUnlinkNode(meta); 28794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun xmlFreeNode(meta); 28894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun } 289df143a5041f03a22808b59c76698770b74692815Selim Gurun /* change the document only if there is a real encoding change */ 29094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun else if (xmlStrcasestr(content, encoding) == NULL) { 291df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlSetProp(meta, BAD_CAST"content", BAD_CAST newcontent); 292df143a5041f03a22808b59c76698770b74692815Selim Gurun } 293df143a5041f03a22808b59c76698770b74692815Selim Gurun } 294df143a5041f03a22808b59c76698770b74692815Selim Gurun 295df143a5041f03a22808b59c76698770b74692815Selim Gurun 296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * booleanHTMLAttrs: 301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * These are the HTML attributes which will be output 303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in minimized form, i.e. <option selected="selected"> will be 304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * output as <option selected>, as per XSLT 1.0 16.2 "HTML Output Method" 305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* htmlBooleanAttrs[] = { 308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "checked", "compact", "declare", "defer", "disabled", "ismap", 309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "multiple", "nohref", "noresize", "noshade", "nowrap", "readonly", 310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "selected", NULL 311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlIsBooleanAttr: 316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the name of the attribute to check 317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Determine if a given attribute is a boolean attribute. 31994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * 320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns: false if the attribute is not boolean, true otherwise. 321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlIsBooleanAttr(const xmlChar *name) 324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i = 0; 326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (htmlBooleanAttrs[i] != NULL) { 328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrcasecmp((const xmlChar *)htmlBooleanAttrs[i], name) == 0) 329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return 1; 330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i++; 331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return 0; 333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED 33660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott/* 33760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * private routine exported from xmlIO.c 33860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */ 33960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlOutputBufferPtr 34060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlAllocOutputBufferInternal(xmlCharEncodingHandlerPtr encoder); 341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 34394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Output error handlers * 344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlSaveErrMemory: 348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra: extra informations 349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle an out of memory condition 351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlSaveErrMemory(const char *extra) 354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlSimpleError(XML_FROM_OUTPUT, XML_ERR_NO_MEMORY, NULL, NULL, extra); 356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlSaveErr: 360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @code: the error number 361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the location of the error. 362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra: extra informations 363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle an out of memory condition 365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlSaveErr(int code, xmlNodePtr node, const char *extra) 368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *msg = NULL; 370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch(code) { 372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_SAVE_NOT_UTF8: 373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project msg = "string is not in UTF-8\n"; 374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_SAVE_CHAR_INVALID: 376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project msg = "invalid character value\n"; 377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_SAVE_UNKNOWN_ENCODING: 379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project msg = "unknown encoding %s\n"; 380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_SAVE_NO_DOCTYPE: 382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project msg = "HTML has no DOCTYPE\n"; 383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project msg = "unexpected error number\n"; 386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlSimpleError(XML_FROM_OUTPUT, code, node, msg, extra); 388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 39294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Dumping HTML tree content to a simple buffer * 393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 39794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * htmlBufNodeDumpFormat: 39894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * @buf: the xmlBufPtr output 399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document 400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node 401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @format: should formatting spaces been added 402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump an HTML node, recursive behaviour,children are printed too. 404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of byte written or -1 in case of error 406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 40794442ad4107000e6d49f9b85a46a591495a57632Selim Gurunstatic size_t 40894442ad4107000e6d49f9b85a46a591495a57632Selim GurunhtmlBufNodeDumpFormat(xmlBufPtr buf, xmlDocPtr doc, xmlNodePtr cur, 409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int format) { 41094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun size_t use; 411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferPtr outbuf; 413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buf == NULL) { 418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outbuf = (xmlOutputBufferPtr) xmlMalloc(sizeof(xmlOutputBuffer)); 421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (outbuf == NULL) { 422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlSaveErrMemory("allocating HTML output buffer"); 423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(outbuf, 0, (size_t) sizeof(xmlOutputBuffer)); 426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outbuf->buffer = buf; 427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outbuf->encoder = NULL; 428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outbuf->writecallback = NULL; 429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outbuf->closecallback = NULL; 430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outbuf->context = NULL; 431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outbuf->written = 0; 432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 43394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun use = xmlBufUse(buf); 434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlNodeDumpFormatOutput(outbuf, doc, cur, NULL, format); 435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(outbuf); 43694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun ret = xmlBufUse(buf) - use; 437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlNodeDump: 442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: the HTML buffer output 443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document 444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node 445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump an HTML node, recursive behaviour,children are printed too, 447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and formatting returns are added. 448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of byte written or -1 in case of error 450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlNodeDump(xmlBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur) { 45394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun xmlBufPtr buffer; 45494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun size_t ret; 45594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 45694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if ((buf == NULL) || (cur == NULL)) 45794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun return(-1); 45894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlInitParser(); 46094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun buffer = xmlBufFromBuffer(buf); 46194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (buffer == NULL) 46294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun return(-1); 46394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 46494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun ret = htmlBufNodeDumpFormat(buffer, doc, cur, 1); 465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 46694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun xmlBufBackToBuffer(buffer); 46794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 46894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (ret > INT_MAX) 46994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun return(-1); 47094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun return((int) ret); 471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlNodeDumpFileFormat: 475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @out: the FILE pointer 476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document 477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node 478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding: the document encoding 479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @format: should formatting spaces been added 480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump an HTML node, recursive behaviour,children are printed too. 482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: if encoding == NULL try to save in the doc encoding 484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns: the number of byte written or -1 in case of failure. 486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlNodeDumpFileFormat(FILE *out, xmlDocPtr doc, 489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur, const char *encoding, int format) { 490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferPtr buf; 491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCharEncodingHandlerPtr handler = NULL; 492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlInitParser(); 495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (encoding != NULL) { 497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCharEncoding enc; 498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project enc = xmlParseCharEncoding(encoding); 500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (enc != XML_CHAR_ENCODING_UTF8) { 501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project handler = xmlFindCharEncodingHandler(encoding); 502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (handler == NULL) 503df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlSaveErr(XML_SAVE_UNKNOWN_ENCODING, NULL, encoding); 504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Fallback to HTML or ASCII when the encoding is unspecified 509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (handler == NULL) 511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project handler = xmlFindCharEncodingHandler("HTML"); 512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (handler == NULL) 513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project handler = xmlFindCharEncodingHandler("ascii"); 514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 51594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun /* 516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * save the content to a temp buffer. 517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buf = xmlOutputBufferCreateFile(out, handler); 519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buf == NULL) return(0); 520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlNodeDumpFormatOutput(buf, doc, cur, encoding, format); 522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlOutputBufferClose(buf); 524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlNodeDumpFile: 529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @out: the FILE pointer 530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document 531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node 532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump an HTML node, recursive behaviour,children are printed too, 534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and formatting returns are added. 535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlNodeDumpFile(FILE *out, xmlDocPtr doc, xmlNodePtr cur) { 538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlNodeDumpFileFormat(out, doc, cur, NULL, 1); 539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlDocDumpMemoryFormat: 543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the document 544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @mem: OUT: the memory pointer 545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size: OUT: the memory length 546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @format: should formatting spaces been added 547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump an HTML document in memory and return the xmlChar * and it's size. 549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * It's up to the caller to free the memory. 550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlDocDumpMemoryFormat(xmlDocPtr cur, xmlChar**mem, int *size, int format) { 553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferPtr buf; 554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCharEncodingHandlerPtr handler = NULL; 555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *encoding; 556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlInitParser(); 558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((mem == NULL) || (size == NULL)) 560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *mem = NULL; 563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *size = 0; 564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project encoding = (const char *) htmlGetMetaEncoding(cur); 568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (encoding != NULL) { 570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCharEncoding enc; 571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project enc = xmlParseCharEncoding(encoding); 573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (enc != cur->charset) { 574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->charset != XML_CHAR_ENCODING_UTF8) { 575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Not supported yet 577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *mem = NULL; 579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *size = 0; 580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project handler = xmlFindCharEncodingHandler(encoding); 584df143a5041f03a22808b59c76698770b74692815Selim Gurun if (handler == NULL) 585df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlSaveErr(XML_SAVE_UNKNOWN_ENCODING, NULL, encoding); 586df143a5041f03a22808b59c76698770b74692815Selim Gurun 587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project handler = xmlFindCharEncodingHandler(encoding); 589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Fallback to HTML or ASCII when the encoding is unspecified 594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (handler == NULL) 596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project handler = xmlFindCharEncodingHandler("HTML"); 597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (handler == NULL) 598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project handler = xmlFindCharEncodingHandler("ascii"); 599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 60060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott buf = xmlAllocOutputBufferInternal(handler); 601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buf == NULL) { 602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *mem = NULL; 603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *size = 0; 604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 607df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlDocContentDumpFormatOutput(buf, cur, NULL, format); 608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferFlush(buf); 610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buf->conv != NULL) { 61194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *size = xmlBufUse(buf->conv); 61294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *mem = xmlStrndup(xmlBufContent(buf->conv), *size); 613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 61494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *size = xmlBufUse(buf->buffer); 61594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *mem = xmlStrndup(xmlBufContent(buf->buffer), *size); 616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void)xmlOutputBufferClose(buf); 618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlDocDumpMemory: 622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the document 623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @mem: OUT: the memory pointer 624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size: OUT: the memory length 625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump an HTML document in memory and return the xmlChar * and it's size. 627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * It's up to the caller to free the memory. 628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlDocDumpMemory(xmlDocPtr cur, xmlChar**mem, int *size) { 631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlDocDumpMemoryFormat(cur, mem, size, 1); 632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 63794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Dumping HTML tree content to an I/O output buffer * 638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid xmlNsListDumpOutput(xmlOutputBufferPtr buf, xmlNsPtr cur); 642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlDtdDumpOutput: 645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: the HTML buffer output 646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document 647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding: the encoding string 64894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * 649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: check whether encoding is needed 650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump the HTML document DTD, if any. 652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlDtdDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, 655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *encoding ATTRIBUTE_UNUSED) { 656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDtdPtr cur = doc->intSubset; 657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlSaveErr(XML_SAVE_NO_DOCTYPE, (xmlNodePtr) doc, NULL); 660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, "<!DOCTYPE "); 663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, (const char *)cur->name); 664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->ExternalID != NULL) { 665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, " PUBLIC "); 66694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun xmlBufWriteQuotedString(buf->buffer, cur->ExternalID); 667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->SystemID != NULL) { 668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, " "); 66994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun xmlBufWriteQuotedString(buf->buffer, cur->SystemID); 67094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun } 671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->SystemID != NULL) { 672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, " SYSTEM "); 67394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun xmlBufWriteQuotedString(buf->buffer, cur->SystemID); 674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, ">\n"); 676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlAttrDumpOutput: 680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: the HTML buffer output 681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document 682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the attribute pointer 683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding: the encoding string 684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump an HTML attribute 686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlAttrDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlAttrPtr cur, 689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *encoding ATTRIBUTE_UNUSED) { 690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *value; 691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 69394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * The html output method should not escape a & character 69494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * occurring in an attribute value immediately followed by 69594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * a { character (see Section B.7.1 of the HTML 4.0 Recommendation). 69694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * This is implemented in xmlEncodeEntitiesReentrant 697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, " "); 703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) { 704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix); 705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, ":"); 706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, (const char *)cur->name); 708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->children != NULL) && (!htmlIsBooleanAttr(cur->name))) { 709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = xmlNodeListGetString(doc, cur->children, 0); 710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value) { 711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, "="); 712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->ns == NULL) && (cur->parent != NULL) && 713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->parent->ns == NULL) && 714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((!xmlStrcasecmp(cur->name, BAD_CAST "href")) || 715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrcasecmp(cur->name, BAD_CAST "action")) || 716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrcasecmp(cur->name, BAD_CAST "src")) || 717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((!xmlStrcasecmp(cur->name, BAD_CAST "name")) && 718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrcasecmp(cur->parent->name, BAD_CAST "a"))))) { 719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *escaped; 720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *tmp = value; 721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(*tmp)) tmp++; 723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 72494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun /* 72594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * the < and > have already been escaped at the entity level 72694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * And doing so here breaks server side includes 72794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun */ 72894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun escaped = xmlURIEscapeStr(tmp, BAD_CAST"@/:=?;#%&,+<>"); 729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (escaped != NULL) { 73094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun xmlBufWriteQuotedString(buf->buffer, escaped); 731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(escaped); 732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 73394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun xmlBufWriteQuotedString(buf->buffer, value); 734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 73694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun xmlBufWriteQuotedString(buf->buffer, value); 737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(value); 739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, "=\"\""); 741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlAttrListDumpOutput: 747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: the HTML buffer output 748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document 749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the first attribute pointer 750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding: the encoding string 751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump a list of HTML attributes 753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlAttrListDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlAttrPtr cur, const char *encoding) { 756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlAttrDumpOutput(buf, doc, cur, encoding); 761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlNodeListDumpOutput: 769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: the HTML buffer output 770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document 771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the first node 772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding: the encoding string 773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @format: should formatting spaces been added 774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump an HTML node list, recursive behaviour,children are printed too. 776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlNodeListDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, 779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur, const char *encoding, int format) { 780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlNodeDumpFormatOutput(buf, doc, cur, encoding, format); 785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlNodeDumpFormatOutput: 791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: the HTML buffer output 792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document 793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node 794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding: the encoding string 795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @format: should formatting spaces been added 796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump an HTML node, recursive behaviour,children are printed too. 798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlNodeDumpFormatOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, 801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur, const char *encoding, int format) { 802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const htmlElemDesc * info; 803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlInitParser(); 805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == NULL) || (buf == NULL)) { 807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Special cases. 811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == XML_DTD_NODE) 813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type == XML_HTML_DOCUMENT_NODE) || 815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_DOCUMENT_NODE)){ 816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlDocContentDumpOutput(buf, (xmlDocPtr) cur, encoding); 817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == XML_ATTRIBUTE_NODE) { 820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlAttrDumpOutput(buf, doc, (xmlAttrPtr) cur, encoding); 821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == HTML_TEXT_NODE) { 824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->content != NULL) { 825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((cur->name == (const xmlChar *)xmlStringText) || 826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->name != (const xmlChar *)xmlStringTextNoenc)) && 827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((cur->parent == NULL) || 828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((xmlStrcasecmp(cur->parent->name, BAD_CAST "script")) && 829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrcasecmp(cur->parent->name, BAD_CAST "style"))))) { 830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *buffer; 831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buffer = xmlEncodeEntitiesReentrant(doc, cur->content); 833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buffer != NULL) { 834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, (const char *)buffer); 835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(buffer); 836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, (const char *)cur->content); 839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == HTML_COMMENT_NODE) { 844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->content != NULL) { 845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, "<!--"); 846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, (const char *)cur->content); 847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, "-->"); 848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == HTML_PI_NODE) { 852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->name == NULL) 853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, "<?"); 855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, (const char *)cur->name); 856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->content != NULL) { 857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, " "); 858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, (const char *)cur->content); 859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, ">"); 861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == HTML_ENTITY_REF_NODE) { 864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, "&"); 865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, (const char *)cur->name); 866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, ";"); 867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == HTML_PRESERVE_NODE) { 870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->content != NULL) { 871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, (const char *)cur->content); 872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get specific HTML info for that node. 878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->ns == NULL) 880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project info = htmlTagLookup(cur->name); 881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project info = NULL; 883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, "<"); 885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) { 886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix); 887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, ":"); 888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, (const char *)cur->name); 890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nsDef) 891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsListDumpOutput(buf, cur->nsDef); 892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->properties != NULL) 893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlAttrListDumpOutput(buf, doc, cur->properties, encoding); 894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((info != NULL) && (info->empty)) { 896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, ">"); 897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((format) && (!info->isinline) && (cur->next != NULL)) { 898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->next->type != HTML_TEXT_NODE) && 899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->next->type != HTML_ENTITY_REF_NODE) && 900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->parent != NULL) && 901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->parent->name != NULL) && 902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->parent->name[0] != 'p')) /* p, pre, param */ 903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, "\n"); 904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((cur->type == XML_ELEMENT_NODE) || (cur->content == NULL)) && 908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->children == NULL)) { 909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((info != NULL) && (info->saveEndTag != 0) && 910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrcmp(BAD_CAST info->name, BAD_CAST "html")) && 911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrcmp(BAD_CAST info->name, BAD_CAST "body"))) { 912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, ">"); 913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, "></"); 915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) { 916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix); 917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, ":"); 918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, (const char *)cur->name); 920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, ">"); 921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((format) && (cur->next != NULL) && 923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (info != NULL) && (!info->isinline)) { 924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->next->type != HTML_TEXT_NODE) && 925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->next->type != HTML_ENTITY_REF_NODE) && 926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->parent != NULL) && 927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->parent->name != NULL) && 928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->parent->name[0] != 'p')) /* p, pre, param */ 929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, "\n"); 930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, ">"); 934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type != XML_ELEMENT_NODE) && 935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->content != NULL)) { 936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Uses the OutputBuffer property to automatically convert 938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * invalids to charrefs 939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, (const char *) cur->content); 942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->children != NULL) { 944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((format) && (info != NULL) && (!info->isinline) && 945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->children->type != HTML_TEXT_NODE) && 946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->children->type != HTML_ENTITY_REF_NODE) && 947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->children != cur->last) && 948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->name != NULL) && 949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->name[0] != 'p')) /* p, pre, param */ 950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, "\n"); 951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlNodeListDumpOutput(buf, doc, cur->children, encoding, format); 952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((format) && (info != NULL) && (!info->isinline) && 953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->last->type != HTML_TEXT_NODE) && 954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->last->type != HTML_ENTITY_REF_NODE) && 955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->children != cur->last) && 956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->name != NULL) && 957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->name[0] != 'p')) /* p, pre, param */ 958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, "\n"); 959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, "</"); 961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) { 962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix); 963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, ":"); 964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, (const char *)cur->name); 966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, ">"); 967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((format) && (info != NULL) && (!info->isinline) && 968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->next != NULL)) { 969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->next->type != HTML_TEXT_NODE) && 970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->next->type != HTML_ENTITY_REF_NODE) && 971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->parent != NULL) && 972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->parent->name != NULL) && 973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->parent->name[0] != 'p')) /* p, pre, param */ 974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, "\n"); 975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlNodeDumpOutput: 980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: the HTML buffer output 981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document 982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node 983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding: the encoding string 984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump an HTML node, recursive behaviour,children are printed too, 986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and formatting returns/spaces are added. 987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlNodeDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, 990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur, const char *encoding) { 991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlNodeDumpFormatOutput(buf, doc, cur, encoding, 1); 992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlDocContentDumpFormatOutput: 996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: the HTML buffer output 997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the document 998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding: the encoding string 999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @format: should formatting spaces been added 1000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump an HTML document. 1002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 1004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlDocContentDumpFormatOutput(xmlOutputBufferPtr buf, xmlDocPtr cur, 1005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *encoding, int format) { 1006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int type; 1007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlInitParser(); 1009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((buf == NULL) || (cur == NULL)) 1011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * force to output the stuff as HTML, especially for entities 1015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = cur->type; 1017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type = XML_HTML_DOCUMENT_NODE; 1018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->intSubset != NULL) { 1019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlDtdDumpOutput(buf, cur, NULL); 1020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->children != NULL) { 1022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlNodeListDumpOutput(buf, cur, cur->children, encoding, format); 1023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferWriteString(buf, "\n"); 1025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type = (xmlElementType) type; 1026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlDocContentDumpOutput: 1030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: the HTML buffer output 1031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the document 1032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding: the encoding string 1033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump an HTML document. Formating return/spaces are added. 1035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 1037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlDocContentDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr cur, 1038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *encoding) { 1039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlDocContentDumpFormatOutput(buf, cur, encoding, 1); 1040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 1043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Saving functions front-ends * 1045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 1047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlDocDump: 1050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f: the FILE* 1051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the document 1052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump an HTML document to an open FILE. 1054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns: the number of byte written or -1 in case of failure. 1056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 1058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlDocDump(FILE *f, xmlDocPtr cur) { 1059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferPtr buf; 1060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCharEncodingHandlerPtr handler = NULL; 1061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *encoding; 1062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 1063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlInitParser(); 1065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == NULL) || (f == NULL)) { 1067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project encoding = (const char *) htmlGetMetaEncoding(cur); 1071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (encoding != NULL) { 1073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCharEncoding enc; 1074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project enc = xmlParseCharEncoding(encoding); 1076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (enc != cur->charset) { 1077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->charset != XML_CHAR_ENCODING_UTF8) { 1078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Not supported yet 1080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project handler = xmlFindCharEncodingHandler(encoding); 1085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (handler == NULL) 1086df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlSaveErr(XML_SAVE_UNKNOWN_ENCODING, NULL, encoding); 1087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project handler = xmlFindCharEncodingHandler(encoding); 1089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Fallback to HTML or ASCII when the encoding is unspecified 1094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (handler == NULL) 1096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project handler = xmlFindCharEncodingHandler("HTML"); 1097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (handler == NULL) 1098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project handler = xmlFindCharEncodingHandler("ascii"); 1099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buf = xmlOutputBufferCreateFile(f, handler); 1101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buf == NULL) return(-1); 1102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlDocContentDumpOutput(buf, cur, NULL); 1103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlOutputBufferClose(buf); 1105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 1106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlSaveFile: 1110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filename: the filename (or URL) 1111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the document 1112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump an HTML document to a file. If @filename is "-" the stdout file is 1114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * used. 1115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns: the number of byte written or -1 in case of failure. 1116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 1118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlSaveFile(const char *filename, xmlDocPtr cur) { 1119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferPtr buf; 1120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCharEncodingHandlerPtr handler = NULL; 1121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *encoding; 1122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 1123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == NULL) || (filename == NULL)) 1125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 112694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 1127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlInitParser(); 1128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project encoding = (const char *) htmlGetMetaEncoding(cur); 1130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (encoding != NULL) { 1132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCharEncoding enc; 1133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project enc = xmlParseCharEncoding(encoding); 1135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (enc != cur->charset) { 1136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->charset != XML_CHAR_ENCODING_UTF8) { 1137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Not supported yet 1139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project handler = xmlFindCharEncodingHandler(encoding); 1144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (handler == NULL) 1145df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlSaveErr(XML_SAVE_UNKNOWN_ENCODING, NULL, encoding); 1146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Fallback to HTML or ASCII when the encoding is unspecified 1151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (handler == NULL) 1153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project handler = xmlFindCharEncodingHandler("HTML"); 1154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (handler == NULL) 1155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project handler = xmlFindCharEncodingHandler("ascii"); 1156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 115794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun /* 1158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * save the content to a temp buffer. 1159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buf = xmlOutputBufferCreateFilename(filename, handler, cur->compression); 1161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buf == NULL) return(0); 1162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlDocContentDumpOutput(buf, cur, NULL); 1164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlOutputBufferClose(buf); 1166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 1167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlSaveFileFormat: 1171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filename: the filename 1172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the document 1173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @format: should formatting spaces been added 1174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding: the document encoding 1175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump an HTML document to a file using a given encoding. 117794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * 1178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns: the number of byte written or -1 in case of failure. 1179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 1181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlSaveFileFormat(const char *filename, xmlDocPtr cur, 1182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *encoding, int format) { 1183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputBufferPtr buf; 1184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCharEncodingHandlerPtr handler = NULL; 1185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 1186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == NULL) || (filename == NULL)) 1188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1189df143a5041f03a22808b59c76698770b74692815Selim Gurun 1190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlInitParser(); 1191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (encoding != NULL) { 1193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCharEncoding enc; 1194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project enc = xmlParseCharEncoding(encoding); 1196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (enc != cur->charset) { 1197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->charset != XML_CHAR_ENCODING_UTF8) { 1198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Not supported yet 1200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project handler = xmlFindCharEncodingHandler(encoding); 1205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (handler == NULL) 1206df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlSaveErr(XML_SAVE_UNKNOWN_ENCODING, NULL, encoding); 1207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1208df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlSetMetaEncoding(cur, (const xmlChar *) encoding); 1209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlSetMetaEncoding(cur, (const xmlChar *) "UTF-8"); 1211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Fallback to HTML or ASCII when the encoding is unspecified 1215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (handler == NULL) 1217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project handler = xmlFindCharEncodingHandler("HTML"); 1218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (handler == NULL) 1219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project handler = xmlFindCharEncodingHandler("ascii"); 1220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 122194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun /* 1222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * save the content to a temp buffer. 1223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buf = xmlOutputBufferCreateFilename(filename, handler, 0); 1225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buf == NULL) return(0); 1226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlDocContentDumpFormatOutput(buf, cur, encoding, format); 1228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlOutputBufferClose(buf); 1230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 1231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlSaveFileEnc: 1235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filename: the filename 1236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the document 1237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding: the document encoding 1238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump an HTML document to a file using a given encoding 1240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and formatting returns/spaces are added. 124194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * 1242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns: the number of byte written or -1 in case of failure. 1243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 1245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlSaveFileEnc(const char *filename, xmlDocPtr cur, const char *encoding) { 1246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(htmlSaveFileFormat(filename, cur, encoding, 1)); 1247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */ 1250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define bottom_HTMLtree 1252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "elfgcchack.h" 1253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_HTML_ENABLED */ 1254