--- parser3/src/classes/xdoc.C 2004/02/18 11:47:04 1.138 +++ parser3/src/classes/xdoc.C 2004/09/13 08:12:57 1.145 @@ -9,7 +9,7 @@ #ifdef XML -static const char * const IDENT_XDOC_C="$Date: 2004/02/18 11:47:04 $"; +static const char * const IDENT_XDOC_C="$Date: 2004/09/13 08:12:57 $"; #include "gdome.h" #include "libxml/tree.h" @@ -157,13 +157,13 @@ private: // methods -static void writeNode(Request& r, GdomeNode *node, +static void writeNode(Request& r, VXdoc& xdoc, GdomeNode *node, GdomeException exc) { if(!node || exc) throw XmlException(0, exc); // write out result - r.write_no_lang(*new VXnode(&r.charsets, node)); + r.write_no_lang(*new VXnode(&r.charsets, xdoc, node)); } // Element createElement(in DOMString tagName) raises(DOMException); @@ -177,7 +177,7 @@ static void _createElement(Request& r, M (GdomeNode *)gdome_doc_createElement(vdoc.get_document(), r.transcode(tagName).use(), &exc); - writeNode(r, node, exc); + writeNode(r, vdoc, node, exc); } // Element createElementNS(in DOMString namespaceURI, in DOMString qualifiedName) raises(DOMException); @@ -194,7 +194,7 @@ static void _createElementNS(Request& r, r.transcode(namespaceURI).use(), r.transcode(qualifiedName).use(), &exc); - writeNode(r, node, exc); + writeNode(r, vdoc, node, exc); } // DocumentFragment createDocumentFragment() @@ -206,7 +206,7 @@ static void _createDocumentFragment(Requ (GdomeNode *)gdome_doc_createDocumentFragment( vdoc.get_document(), &exc); - writeNode(r, node, exc); + writeNode(r, vdoc, node, exc); } // Text createTextNode(in DOMString data); @@ -220,7 +220,7 @@ static void _createTextNode(Request& r, vdoc.get_document(), r.transcode(data).use(), &exc); - writeNode(r, node, exc); + writeNode(r, vdoc, node, exc); } // Comment createComment(in DOMString data) @@ -234,7 +234,7 @@ static void _createComment(Request& r, M vdoc.get_document(), r.transcode(data).use(), &exc); - writeNode(r, node, exc); + writeNode(r, vdoc, node, exc); } // CDATASection createCDATASection(in DOMString data) raises(DOMException); @@ -248,7 +248,7 @@ static void _createCDATASection(Request& vdoc.get_document(), r.transcode(data).use(), &exc); - writeNode(r, node, exc); + writeNode(r, vdoc, node, exc); } // ProcessingInstruction createProcessingInstruction(in DOMString target,in DOMString data) raises(DOMException); @@ -264,7 +264,7 @@ static void _createProcessingInstruction r.transcode(target).use(), r.transcode(data).use(), &exc); - writeNode(r, node, exc); + writeNode(r, vdoc, node, exc); } // Attr createAttribute(in DOMString name) raises(DOMException); @@ -278,7 +278,7 @@ static void _createAttribute(Request& r, vdoc.get_document(), r.transcode(name).use(), &exc); - writeNode(r, node, exc); + writeNode(r, vdoc, node, exc); } // Attr createAttributeNS(in DOMString namespaceURI, in DOMString qualifiedName) raises(DOMException); @@ -295,7 +295,7 @@ static void _createAttributeNS(Request& r.transcode(namespaceURI).use(), r.transcode(qualifiedName).use(), &exc); - writeNode(r, node, exc); + writeNode(r, vdoc, node, exc); } // EntityReference createEntityReference(in DOMString name) raises(DOMException); @@ -309,7 +309,7 @@ static void _createEntityReference(Reque vdoc.get_document(), r.transcode(name).use(), &exc); - writeNode(r, node, exc); + writeNode(r, vdoc, node, exc); } // NodeList getElementsByTagName(in DOMString name); @@ -329,7 +329,7 @@ static void _getElementsByTagName(Reques for(gulong i=0; ias_string(); if(s=="yes") - output_option=true; + output_option=1; else if(s=="no") - output_option=false; + output_option=0; else throw Exception("parser.runtime", &s, @@ -595,169 +595,6 @@ static void prepare_output_options(Reque } } -/// patching piecees from libxslt and libxml not to set meta encoding -static int -pa_xsltSaveResultTo(xmlOutputBufferPtr buf, xmlDocPtr result, - xsltStylesheetPtr style) { - const xmlChar *encoding; - int base; - const xmlChar *method; - int indent; - - if ((buf == NULL) || (result == NULL) || (style == NULL)) - return(-1); - if ((result->children == NULL) || - ((result->children->type == XML_DTD_NODE) && - (result->children->next == NULL))) - return(0); - - if ((style->methodURI != NULL) && - ((style->method == NULL) || - (!xmlStrEqual(style->method, (const xmlChar *) "xhtml")))) { - xsltGenericError(xsltGenericErrorContext, - "xsltSaveResultTo : unknown ouput method\n"); - return(-1); - } - - base = buf->written; - - XSLT_GET_IMPORT_PTR(method, style, method) - XSLT_GET_IMPORT_PTR(encoding, style, encoding) - XSLT_GET_IMPORT_INT(indent, style, indent); - - if ((method == NULL) && (result->type == XML_HTML_DOCUMENT_NODE)) - method = BAD_CAST "html"; - - if ((method != NULL) && - (xmlStrEqual(method, (const xmlChar *) "html"))) { - if (indent == -1) - indent = 1; - - int is_xhtml = 0; - xmlDtdPtr dtd = xmlGetIntSubset(result); - if (dtd != NULL) { - is_xhtml = xmlIsXHTML(dtd->SystemID, dtd->ExternalID); - if (is_xhtml < 0) - is_xhtml = 0; - } - xmlNodePtr cur=result->last; - if(!cur) { - is_xhtml=0; - } - - if(is_xhtml) { - // xhtmlNodeDumpOutput is static :( - if((cur->parent == (xmlNodePtr) result) && - (cur->type == XML_ELEMENT_NODE) && - (xmlStrEqual(cur->name, BAD_CAST "html"))) { - //cur->name=BAD_CAST "html "; - } - - method = BAD_CAST "xml"; - } else { - htmlDocContentDumpFormatOutput(buf, result, (const char *) encoding, - indent); - xmlOutputBufferFlush(buf); - goto finish; - } - } - - if ((method != NULL) && - (xmlStrEqual(method, (const xmlChar *) "text"))) { - xmlNodePtr cur; - - cur = result->children; - while (cur != NULL) { - if (cur->type == XML_TEXT_NODE) - xmlOutputBufferWriteString(buf, (const char *) cur->content); - - /* - * Skip to next node - */ - if (cur->children != NULL) { - if ((cur->children->type != XML_ENTITY_DECL) && - (cur->children->type != XML_ENTITY_REF_NODE) && - (cur->children->type != XML_ENTITY_NODE)) { - cur = cur->children; - continue; - } - } - if (cur->next != NULL) { - cur = cur->next; - continue; - } - - do { - cur = cur->parent; - if (cur == NULL) - break; - if (cur == (xmlNodePtr) style->doc) { - cur = NULL; - break; - } - if (cur->next != NULL) { - cur = cur->next; - break; - } - } while (cur != NULL); - } - xmlOutputBufferFlush(buf); - } else { - int omitXmlDecl; - int standalone; - - XSLT_GET_IMPORT_INT(omitXmlDecl, style, omitXmlDeclaration); - XSLT_GET_IMPORT_INT(standalone, style, standalone); - - if (omitXmlDecl != 1) { - xmlOutputBufferWriteString(buf, "version != NULL) - xmlBufferWriteQuotedString(buf->buffer, result->version); - else - xmlOutputBufferWriteString(buf, "\"1.0\""); - if (encoding == NULL) { - if (result->encoding != NULL) - encoding = result->encoding; - else if (result->charset != XML_CHAR_ENCODING_UTF8) - encoding = (const xmlChar *) - xmlGetCharEncodingName((xmlCharEncoding) - result->charset); - } - if (encoding != NULL) { - xmlOutputBufferWriteString(buf, " encoding="); - xmlBufferWriteQuotedString(buf->buffer, (xmlChar *) encoding); - } - switch (standalone) { - case 0: - xmlOutputBufferWriteString(buf, " standalone=\"no\""); - break; - case 1: - xmlOutputBufferWriteString(buf, " standalone=\"yes\""); - break; - default: - break; - } - xmlOutputBufferWriteString(buf, "?>\n"); - } - if (result->children != NULL) { - xmlNodePtr child = result->children; - - while (child != NULL) { - xmlNodeDumpOutput(buf, result, child, 0, (indent == 1), - (const char *) encoding); - if (child->type == XML_DTD_NODE) - xmlOutputBufferWriteString(buf, "\n"); - child = child->next; - } - xmlOutputBufferWriteString(buf, "\n"); - } - xmlOutputBufferFlush(buf); - } -finish: - return(buf->written - base); -} - - struct Xdoc2buf_result { char* str; size_t length; @@ -765,25 +602,33 @@ struct Xdoc2buf_result { static Xdoc2buf_result xdoc2buf(Request& r, VXdoc& vdoc, MethodParams& params, int index, VXdoc::Output_options& oo, - const String* file_spec) { + const String* file_spec, + bool use_source_charset_to_render_and_client_charset_to_write_to_header=false) { Xdoc2buf_result result; prepare_output_options(r, params, index, oo); - const char* encoding_cstr=oo.encoding->cstr(); - xmlCharEncodingHandler *encoder=xmlFindCharEncodingHandler(encoding_cstr); - if(!encoder) + const char* render_encoding; + const char* header_encoding; + if(use_source_charset_to_render_and_client_charset_to_write_to_header) { + render_encoding=r.charsets.source().NAME_CSTR(); + header_encoding=r.charsets.client().NAME_CSTR(); + } else { + header_encoding=render_encoding=oo.encoding->cstr(); + } + + xmlCharEncodingHandler *renderer=xmlFindCharEncodingHandler(render_encoding); + if(!renderer) throw Exception("parser.runtime", 0, - "encoding '%s' not supported", encoding_cstr); - // UTF-8 encoder contains empty input/output converters, + "encoding '%s' not supported", render_encoding); + // UTF-8 renderer contains empty input/output converters, // which is wrong for xmlOutputBufferCreateIO - // while zero encoder goes perfectly - const char* encoder_name=encoder->name; - if(strcmp(encoder_name, "UTF-8")==0) - encoder=0; + // while zero renderer goes perfectly + if(strcmp(render_encoding, "UTF-8")==0) + renderer=0; - xmlOutputBuffer_auto_ptr outputBuffer(xmlAllocOutputBuffer(encoder)); + xmlOutputBuffer_auto_ptr outputBuffer(xmlAllocOutputBuffer(renderer)); xsltStylesheet_auto_ptr stylesheet(xsltNewStylesheet()); if(!stylesheet.get()) @@ -791,24 +636,27 @@ static Xdoc2buf_result xdoc2buf(Request& 0, "xsltNewStylesheet failed"); - #define OOS2STYLE(name) \ + #define OOSTRING2STYLE(name) \ stylesheet->name=oo.name?BAD_CAST xmlMemStrdup(r.transcode(*oo.name)->str):0 - #define OOE2STYLE(name) \ - stylesheet->name=oo.name + #define OOBOOL2STYLE(name) \ + if(oo.name>=0) stylesheet->name=oo.name - OOS2STYLE(method); - OOS2STYLE(encoding); - OOS2STYLE(mediaType); -// OOS2STYLE(doctypeSystem); -// OOS2STYLE(doctypePublic); - OOE2STYLE(indent); - OOS2STYLE(version); - OOE2STYLE(standalone); - OOE2STYLE(omitXmlDeclaration); + OOSTRING2STYLE(method); + OOSTRING2STYLE(encoding); + OOSTRING2STYLE(mediaType); +// OOSTRING2STYLE(doctypeSystem); +// OOSTRING2STYLE(doctypePublic); + OOBOOL2STYLE(indent); + OOSTRING2STYLE(version); + OOBOOL2STYLE(standalone); + OOBOOL2STYLE(omitXmlDeclaration); xmlDoc *document=gdome_xml_doc_get_xmlDoc(vdoc.get_document()); - document->encoding=BAD_CAST xmlMemStrdup(encoder_name); - if(pa_xsltSaveResultTo(outputBuffer.get(), document, stylesheet.get())<0) { + document->encoding=BAD_CAST xmlMemStrdup(render_encoding); + if(header_encoding) + stylesheet->encoding=BAD_CAST xmlMemStrdup(header_encoding); + if(xsltSaveResultTo(outputBuffer.get(), document, stylesheet.get())<0 + || xmlHaveGenericErrors()) { GdomeException exc=0; throw XmlException(0, exc); } @@ -876,9 +724,10 @@ static void _string(Request& r, MethodPa VXdoc::Output_options oo(vdoc.output_options); Xdoc2buf_result buf=xdoc2buf(r, vdoc, params, 0, oo, - 0/*not to file, to memory*/); + 0/*not to file, to memory*/, + true/*use source charset to render, client charset to put to header*/); // write out result - r.write_no_lang(String(buf.str, buf.length)); + r.write_no_lang(String(String::Body(buf.str), String::L_AS_IS)); } #ifndef DOXYGEN @@ -949,10 +798,10 @@ static VXdoc& _transform(Request& r, con oo.method=stylesheet->method?&r.transcode(stylesheet->method):0; oo.encoding=stylesheet->encoding?&r.transcode(stylesheet->encoding):0; oo.mediaType=stylesheet->mediaType?&r.transcode(stylesheet->mediaType):0; - oo.indent=stylesheet->indent!=0; + oo.indent=stylesheet->indent; oo.version=stylesheet->version?&r.transcode(stylesheet->version):0; - oo.standalone=stylesheet->standalone!=0; - oo.omitXmlDeclaration=stylesheet->omitXmlDeclaration!=0; + oo.standalone=stylesheet->standalone; + oo.omitXmlDeclaration=stylesheet->omitXmlDeclaration; // return return result;