peiyongz 2004/01/20 15:23:57 Modified: c/src/xercesc/dom/impl DOMWriterImpl.cpp Log: patch to Bug#25751 Revision Changes Path 1.50 +70 -7 xml-xerces/c/src/xercesc/dom/impl/DOMWriterImpl.cpp Index: DOMWriterImpl.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/dom/impl/DOMWriterImpl.cpp,v retrieving revision 1.49 retrieving revision 1.50 diff -u -r1.49 -r1.50 --- DOMWriterImpl.cpp 13 Jan 2004 20:47:42 -0000 1.49 +++ DOMWriterImpl.cpp 20 Jan 2004 23:23:57 -0000 1.50 @@ -57,6 +57,9 @@ /* * $Id$ * $Log$ + * Revision 1.50 2004/01/20 23:23:57 peiyongz + * patch to Bug#25751 + * * Revision 1.49 2004/01/13 20:47:42 knoaman * Remove unnecessary local static data * @@ -444,6 +447,8 @@ static const XMLByte BOM_ucs4be[] = {(XMLByte)0x00, (XMLByte)0x00, (XMLByte)0xFE, (XMLByte)0xFF, (XMLByte) 0}; static const XMLByte BOM_ucs4le[] = {(XMLByte)0xFF, (XMLByte)0xFE, (XMLByte)0x00, (XMLByte)0x00, (XMLByte) 0}; +static bool lineFeedInTextNodePrinted = false; +static int lastWhiteSpaceInTextNode = 0; // // Notification of the error though error handler @@ -855,11 +860,45 @@ if (checkFilter(nodeToWrite) != DOMNodeFilter::FILTER_ACCEPT) break; - // Pretty-print skips whitespace-only text nodes unless whitespace-in-element is set. - if (getFeature(FORMAT_PRETTY_PRINT_ID) && !getFeature(WHITESPACE_IN_ELEMENT_CONTENT_ID)) + if (getFeature(FORMAT_PRETTY_PRINT_ID)) { + lineFeedInTextNodePrinted = false; + lastWhiteSpaceInTextNode = 0; + if(XMLString::isAllWhiteSpace(nodeValue)) - break; + { + // skips whitespace-only text nodes unless whitespace-in-element is set. + if (!getFeature(WHITESPACE_IN_ELEMENT_CONTENT_ID)) + { + break; + } + else + { + // + // we need to trace if newline(s) have been printed out + // to avoid generate extra newline for pretty printing, + // as well as the number of whitespaces after the last + // newline character to do indentation properly. + // + int pos = XMLString::lastIndexOf(nodeValue, chLF); + if (-1 != pos) + { + lineFeedInTextNodePrinted = true; + lastWhiteSpaceInTextNode = lent - pos; + } + else + { + // for those platforms using chCR alone as + // a newline character + pos = XMLString::lastIndexOf(nodeValue, chCR); + if (-1 != pos) + { + lineFeedInTextNodePrinted = true; + lastWhiteSpaceInTextNode = lent - pos; + } + } + } + } } setURCharRef(); // character data @@ -951,10 +990,18 @@ if ( filterAction == DOMNodeFilter::FILTER_REJECT) break; - if(level == 1) + if (!lineFeedInTextNodePrinted) + { + if(level == 1) + printNewLine(); + printNewLine(); + } + else + { + lineFeedInTextNodePrinted = false; + } - printNewLine(); printIndent(level); //track the line number the current node begins on @@ -1133,7 +1180,14 @@ //this node then print a new line and indent if(nodeLine != fCurrentLine) { - printNewLine(); + if (!lineFeedInTextNodePrinted) + { + printNewLine(); + } + else + { + lineFeedInTextNodePrinted = false; + } if(nodeLine != fCurrentLine && level == 0) printNewLine(); @@ -1729,6 +1783,15 @@ { if (getFeature(FORMAT_PRETTY_PRINT_ID)) { + if (lastWhiteSpaceInTextNode) + { + level -= lastWhiteSpaceInTextNode/2; // two chSpaces equals one indent level + lastWhiteSpaceInTextNode = 0; + // if lastWhiteSpaceInTextNode/2 is greater than level, then + // it means too many spaces have been written to the + // output stream and we can no longer indent properly + } + for(int i = 0; i < level; i++) *fFormatter << chSpace << chSpace; }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]