tng         2002/12/10 05:34:07

  Modified:    c/src/xercesc/dom/impl DOMWriterImpl.cpp
  Log:
  Pretty-format print: also indent PI/comment that appear inside the root element.
  
  Revision  Changes    Path
  1.23      +394 -390  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.22
  retrieving revision 1.23
  diff -u -r1.22 -r1.23
  --- DOMWriterImpl.cpp 9 Dec 2002 11:46:08 -0000       1.22
  +++ DOMWriterImpl.cpp 10 Dec 2002 13:34:07 -0000      1.23
  @@ -57,6 +57,9 @@
   /*
    * $Id$
    * $Log$
  + * Revision 1.23  2002/12/10 13:34:07  tng
  + * Pretty-format print: also indent PI/comment that appear inside the root element.
  + *
    * Revision 1.22  2002/12/09 11:46:08  gareth
    * More pretty pretty print feature. Patch by Kevin King. Closes bug #13840.
    *
  @@ -189,39 +192,39 @@
   // default end-of-line sequence
   static const XMLCh  gEOLSeq[] =
   {
  -     chLF, chNull
  +    chLF, chNull
   };
   
   //UTF-8
   static const XMLCh  gUTF8[] =
   {
  -     chLatin_U, chLatin_T, chLatin_F, chDash, chDigit_8, chNull
  +    chLatin_U, chLatin_T, chLatin_F, chDash, chDigit_8, chNull
   };
   
   //</
   static const XMLCh  gEndElement[] =
   {
  -     chOpenAngle, chForwardSlash, chNull
  +    chOpenAngle, chForwardSlash, chNull
   };
   
   //?>
   static const XMLCh  gEndPI[] =
   {
  -     chQuestion, chCloseAngle, chNull
  +    chQuestion, chCloseAngle, chNull
   };
   
   //<?
   static const XMLCh  gStartPI[] =
   {
  -     chOpenAngle, chQuestion, chNull
  +    chOpenAngle, chQuestion, chNull
   };
   
   //<?xml version="
   static const XMLCh  gXMLDecl_VersionInfo[] =
   {
  -     chOpenAngle, chQuestion, chLatin_x,     chLatin_m,  chLatin_l,  chSpace,
  -     chLatin_v,   chLatin_e,  chLatin_r,     chLatin_s,  chLatin_i,  chLatin_o,
  -     chLatin_n,   chEqual,    chDoubleQuote, chNull
  +    chOpenAngle, chQuestion, chLatin_x,     chLatin_m,  chLatin_l,  chSpace,
  +    chLatin_v,   chLatin_e,  chLatin_r,     chLatin_s,  chLatin_i,  chLatin_o,
  +    chLatin_n,   chEqual,    chDoubleQuote, chNull
   };
   
   static const XMLCh gXMLDecl_ver10[] =
  @@ -232,14 +235,14 @@
   //encoding="
   static const XMLCh  gXMLDecl_EncodingDecl[] =
   {
  -     chLatin_e,  chLatin_n,  chLatin_c,  chLatin_o,      chLatin_d, chLatin_i,
  +    chLatin_e,  chLatin_n,  chLatin_c,  chLatin_o,      chLatin_d, chLatin_i,
       chLatin_n,  chLatin_g,  chEqual,    chDoubleQuote,  chNull
   };
   
   //" standalone="
   static const XMLCh  gXMLDecl_SDDecl[] =
   {
  -     chLatin_s, chLatin_t, chLatin_a,   chLatin_n,    chLatin_d,   chLatin_a,
  +    chLatin_s, chLatin_t, chLatin_a,   chLatin_n,    chLatin_d,   chLatin_a,
       chLatin_l, chLatin_o, chLatin_n,   chLatin_e,    chEqual,     chDoubleQuote,
       chNull
   };
  @@ -247,19 +250,19 @@
   //"
   static const XMLCh  gXMLDecl_separator[] =
   {
  -     chDoubleQuote, chSpace, chNull
  +    chDoubleQuote, chSpace, chNull
   };
   
   //?>
   static const XMLCh  gXMLDecl_endtag[] =
   {
  -     chQuestion, chCloseAngle,  chNull
  +    chQuestion, chCloseAngle,  chNull
   };
   
   //<![CDATA[
   static const XMLCh  gStartCDATA[] =
   {
  -     chOpenAngle, chBang,    chOpenSquare, chLatin_C, chLatin_D,
  +    chOpenAngle, chBang,    chOpenSquare, chLatin_C, chLatin_D,
       chLatin_A,   chLatin_T, chLatin_A,    chOpenSquare, chNull
   };
   
  @@ -322,52 +325,52 @@
   // Unrecognized node type
   static const XMLCh  gUnrecognizedNodeType[] =
   {
  -     chLatin_U, chLatin_n, chLatin_r, chLatin_e, chLatin_c, chLatin_o,
  +    chLatin_U, chLatin_n, chLatin_r, chLatin_e, chLatin_c, chLatin_o,
       chLatin_g, chLatin_n, chLatin_i, chLatin_z, chLatin_e, chLatin_d,
  -     chSpace,   chLatin_N, chLatin_o, chLatin_d, chLatin_e, chSpace,
  -     chLatin_T, chLatin_y, chLatin_p, chLatin_e, chNull
  +    chSpace,   chLatin_N, chLatin_o, chLatin_d, chLatin_e, chSpace,
  +    chLatin_T, chLatin_y, chLatin_p, chLatin_e, chNull
   };
   
   // nested cdata
   static const XMLCh  gNestedCdata[] =
   {
  -     chLatin_N, chLatin_e, chLatin_s, chLatin_t, chLatin_e, chLatin_d,
  +    chLatin_N, chLatin_e, chLatin_s, chLatin_t, chLatin_e, chLatin_d,
       chLatin_C, chLatin_D, chLatin_a, chLatin_t, chLatin_a, chNull
   };
   
   // Unrepresentable char
   static const XMLCh  gUnrepresentableChar[] =
   {
  -     chLatin_U, chLatin_n, chLatin_r, chLatin_e, chLatin_p, chLatin_r,
  +    chLatin_U, chLatin_n, chLatin_r, chLatin_e, chLatin_p, chLatin_r,
       chLatin_e, chLatin_s, chLatin_e, chLatin_n, chLatin_t, chLatin_a,
  -     chLatin_b, chLatin_l, chLatin_e, chSpace,   chLatin_C, chLatin_h,
  -     chLatin_a, chLatin_r, chNull
  +    chLatin_b, chLatin_l, chLatin_e, chSpace,   chLatin_C, chLatin_h,
  +    chLatin_a, chLatin_r, chNull
   };
   
   //Feature
   static const XMLCh  gFeature[] =
   {
  -     chLatin_F, chLatin_e, chLatin_a, chLatin_t, chLatin_u, chLatin_r,
  +    chLatin_F, chLatin_e, chLatin_a, chLatin_t, chLatin_u, chLatin_r,
       chLatin_e, chSpace,   chNull
   };
   
   // Can not be set to
   static const XMLCh  gCantSet[] =
   {
  -     chSpace,   chLatin_C, chLatin_a, chLatin_n, chSpace, chLatin_n, chLatin_o,
  +    chSpace,   chLatin_C, chLatin_a, chLatin_n, chSpace, chLatin_n, chLatin_o,
       chLatin_t, chSpace,   chLatin_b, chLatin_e, chSpace, chLatin_s,
       chLatin_e, chLatin_t, chSpace,   chLatin_t, chLatin_o, chSpace, chNull
   };
   
   static const XMLCh  gTrue[] =
   {
  -     chSingleQuote, chLatin_t, chLatin_r, chLatin_u, chLatin_e,
  +    chSingleQuote, chLatin_t, chLatin_r, chLatin_u, chLatin_e,
       chSingleQuote, chLF,      chNull
   };
   
   static const XMLCh  gFalse[] =
   {
  -     chSingleQuote, chLatin_f, chLatin_a, chLatin_l, chLatin_s,
  +    chSingleQuote, chLatin_f, chLatin_a, chLatin_l, chLatin_s,
       chLatin_e,     chSingleQuote, chLF, chNull
   };
   
  @@ -390,23 +393,23 @@
   fFormatter->setUnRepFlags(XMLFormatter::UnRep_Fail);                 \
   try                                                                  \
   {                                                                    \
  -     action;                                                         \
  -}                                                                 \
  +    action;                                                          \
  +}                                                                    \
   catch(TranscodingException const &e)                                 \
   {                                                                    \
       if ( !reportError(nodeToWrite                                    \
                       , DOMError::DOM_SEVERITY_FATAL_ERROR             \
                       , e.getMessage())                       ||       \
  -         forceToRethrow                                      )       \
  +          forceToRethrow)                                            \
           throw;                                                       \
   }
   
   DOMWriterImpl::~DOMWriterImpl()
   {
  -     delete [] fEncoding;
  -     delete [] fNewLine;
  +    delete [] fEncoding;
  +    delete [] fNewLine;
   
  -     // we don't own/adopt error handler and filter
  +    // we don't own/adopt error handler and filter
   }
   
   DOMWriterImpl::DOMWriterImpl()
  @@ -425,17 +428,17 @@
       // set features to default setting
       //
       setFeature(CANONICAL_FORM_ID,                false);
  -     setFeature(DISCARD_DEFAULT_CONTENT_ID,       true );
  -     setFeature(ENTITIES_ID,                      true );
  -     setFeature(FORMAT_PRETTY_PRINT_ID,               false);
  -     setFeature(NORMALIZE_CHARACTERS_ID,          false);
  -     setFeature(SPLIT_CDATA_SECTIONS_ID,          true );
  -     setFeature(VALIDATION_ID,                    false);
  -     setFeature(WHITESPACE_IN_ELEMENT_CONTENT_ID, true );
  +    setFeature(DISCARD_DEFAULT_CONTENT_ID,       true );
  +    setFeature(ENTITIES_ID,                      true );
  +    setFeature(FORMAT_PRETTY_PRINT_ID,             false);
  +    setFeature(NORMALIZE_CHARACTERS_ID,          false);
  +    setFeature(SPLIT_CDATA_SECTIONS_ID,          true );
  +    setFeature(VALIDATION_ID,                    false);
  +    setFeature(WHITESPACE_IN_ELEMENT_CONTENT_ID, true );
   }
   
   bool DOMWriterImpl::canSetFeature(const XMLCh* const featName
  -                                                     , bool               state) 
const
  +                                  , bool               state) const
   {
       int featureId = INVALID_FEATURE_ID;
       return checkFeature(featName, false, featureId) ? canSetFeature(featureId, 
state) : false;
  @@ -447,22 +450,22 @@
       int featureId = INVALID_FEATURE_ID;
       checkFeature(featName, true, featureId);
   
  -     if (!canSetFeature(featureId, state))
  +    if (!canSetFeature(featureId, state))
       {
           XMLCh  tmpbuf[256];
           XMLString::copyString(tmpbuf, gFeature);
           XMLString::catString(tmpbuf, featName);
           XMLString::catString(tmpbuf, gCantSet);
           XMLString::catString(tmpbuf, state? gTrue : gFalse);
  -             throw DOMException(DOMException::NOT_SUPPORTED_ERR, tmpbuf);
  +        throw DOMException(DOMException::NOT_SUPPORTED_ERR, tmpbuf);
       }
       else
           setFeature(featureId, state);
   
  -     //
  -     // canonical-form and format-pretty-print can not be both set to true
  -     // meaning set canonical-form true will automatically set
  -     // format-pretty-print to false and vise versa.
  +    //
  +    // canonical-form and format-pretty-print can not be both set to true
  +    // meaning set canonical-form true will automatically set
  +    // format-pretty-print to false and vise versa.
       //
       if ((featureId == CANONICAL_FORM_ID) && state)
           setFeature(FORMAT_PRETTY_PRINT_ID, false);
  @@ -483,44 +486,44 @@
   // we don't check the validity of the encoding set
   void DOMWriterImpl::setEncoding(const XMLCh* const encoding)
   {
  -     delete [] fEncoding;
  -     fEncoding = XMLString::replicate(encoding);
  +    delete [] fEncoding;
  +    fEncoding = XMLString::replicate(encoding);
   }
   
   const XMLCh* DOMWriterImpl::getEncoding() const
   {
  -     return fEncoding;
  +    return fEncoding;
   }
   
   void DOMWriterImpl::setNewLine(const XMLCh* const newLine)
   {
  -     delete [] fNewLine;
  -     fNewLine = XMLString::replicate(newLine);
  +    delete [] fNewLine;
  +    fNewLine = XMLString::replicate(newLine);
   }
   
   const XMLCh* DOMWriterImpl::getNewLine() const
   {
  -     return fNewLine;
  +    return fNewLine;
   }
   
   void DOMWriterImpl::setErrorHandler(DOMErrorHandler *errorHandler)
   {
  -     fErrorHandler = errorHandler;
  +    fErrorHandler = errorHandler;
   }
   
   DOMErrorHandler* DOMWriterImpl::getErrorHandler() const
   {
  -     return fErrorHandler;
  +    return fErrorHandler;
   }
   
   void DOMWriterImpl::setFilter(DOMWriterFilter *filter)
   {
  -     fFilter = filter;
  +    fFilter = filter;
   }
   
   DOMWriterFilter* DOMWriterImpl::getFilter() const
   {
  -     return fFilter;
  +    return fFilter;
   }
   
   //
  @@ -529,8 +532,8 @@
   bool DOMWriterImpl::writeNode(XMLFormatTarget* const destination
                               , const DOMNode         &nodeToWrite)
   {
  -     //init session vars
  -     initSession(&nodeToWrite);
  +    //init session vars
  +    initSession(&nodeToWrite);
   
       try
       {
  @@ -549,45 +552,45 @@
       {
           Janitor<XMLFormatter> janName(fFormatter);
           processNode(&nodeToWrite);
  -     }
  +    }
  +
  +    //
  +    // The serialize engine (processNode) throws an exception to abort
  +    // serialization if
  +    //
  +    //   . A fatal error occurs which renters the output ill-formed, or
  +    //   . Instructed by the application's error handler
  +    //
  +    catch (const TranscodingException&)
  +    {
  +        return false;
  +    }
   
  -     //
  -     // The serialize engine (processNode) throws an exception to abort
  -     // serialization if
  -     //
  -     //   . A fatal error occurs which renters the output ill-formed, or
  -     //   . Instructed by the application's error handler
  -     //
  -     catch (const TranscodingException&)
  -     {
  -             return false;
  -     }
  -
  -     catch (const DOMException&)
  -     {
  -             return false;
  -     }
  +    catch (const DOMException&)
  +    {
  +        return false;
  +    }
   
  -     //
  -     // DOMSystemException
  +    //
  +    // DOMSystemException
       // This exception will be raised in response to any sort of IO or system
       // error that occurs while writing to the destination. It may wrap an
       // underlying system exception.
  -     //
  -     //catch (RuntimeException const &)
  -     catch (...)
  -     {
  -             // REVISIT generate a DOMSystemException wrapping the underlying
  -             //         exception.
  -             throw;
  -     }
  -
  -     //
  -     // true if node was successfully serialized and
  -     // false in case a failure occured and the
  -     // failure wasn't canceled by the error handler.
  -     //
  -     return ((fErrorCount == 0)? true : false);
  +    //
  +    //catch (RuntimeException const &)
  +    catch (...)
  +    {
  +        // REVISIT generate a DOMSystemException wrapping the underlying
  +        //         exception.
  +        throw;
  +    }
  +
  +    //
  +    // true if node was successfully serialized and
  +    // false in case a failure occured and the
  +    // failure wasn't canceled by the error handler.
  +    //
  +    return ((fErrorCount == 0)? true : false);
   }
   
   //
  @@ -596,26 +599,26 @@
   //
   XMLCh* DOMWriterImpl::writeToString(const DOMNode &nodeToWrite)
   {
  -     MemBufFormatTarget  destination;
  -     bool retVal;
  +    MemBufFormatTarget  destination;
  +    bool retVal;
  +
  +    // XMLCh is unicode, assume fEncoding as UTF-16
  +    XMLCh* tempEncoding = fEncoding;
  +    fEncoding = (XMLCh*) XMLUni::fgUTF16EncodingString;
   
  -   // XMLCh is unicode, assume fEncoding as UTF-16
  -   XMLCh* tempEncoding = fEncoding;
  -   fEncoding = (XMLCh*) XMLUni::fgUTF16EncodingString;
  -
  -     try
  -     {
  -             retVal = writeNode(&destination, nodeToWrite);
  -     }
  -     catch (...)
  -     {
  -             //
  -             // there is a possibility that memeory allocation
  -             // exception thrown in XMLBuffer class
  -             //
  -      fEncoding = tempEncoding;
  -             return 0;
  -     }
  +    try
  +    {
  +        retVal = writeNode(&destination, nodeToWrite);
  +    }
  +    catch (...)
  +    {
  +        //
  +        // there is a possibility that memeory allocation
  +        // exception thrown in XMLBuffer class
  +        //
  +        fEncoding = tempEncoding;
  +        return 0;
  +    }
   
       fEncoding = tempEncoding;
       return (retVal ? XMLString::replicate((XMLCh*) destination.getRawBuffer()) : 0);
  @@ -633,15 +636,15 @@
    *            from the document) that value will be used.
    *     If neither of the above provides an encoding name, a default encoding of
    *            "UTF-8" will be used.
  - */  
  -     fEncodingUsed = gUTF8;
  + */
  +    fEncodingUsed = gUTF8;
   
  -     if (fEncoding && *fEncoding)
  -     {
  -             fEncodingUsed = fEncoding;
  -     }
  -     else
  -     {
  +    if (fEncoding && *fEncoding)
  +    {
  +        fEncodingUsed = fEncoding;
  +    }
  +    else
  +    {
           const DOMDocument *docu = (nodeToWrite->getNodeType() == 
DOMNode::DOCUMENT_NODE)?
                               (const DOMDocument*)nodeToWrite : 
nodeToWrite->getOwnerDocument();
           if (docu)
  @@ -664,26 +667,26 @@
           }
       }
   
  -/**
  - *  The end-of-line sequence of characters to be used in the XML being
  - *  written out. The only permitted values are these:
  - *     . null
  - *
  - *  Use a default end-of-line sequence. DOM implementations should choose
  - * the default to match the usual convention for text files in the
  - * environment being used. Implementations must choose a default
  - * sequence that matches one of those allowed by  2.11 "End-of-Line
  - * Handling".
  - *
  - *    CR    The carriage-return character (#xD)
  - *    CR-LF The carriage-return and line-feed characters (#xD #xA)
  - *    LF    The line-feed character (#xA)
  - *
  - *  The default value for this attribute is null
  - */
  -     fNewLineUsed = (fNewLine && *fNewLine)? fNewLine : gEOLSeq;
  +    /**
  +     *  The end-of-line sequence of characters to be used in the XML being
  +     *  written out. The only permitted values are these:
  +     *     . null
  +     *
  +     *  Use a default end-of-line sequence. DOM implementations should choose
  +     * the default to match the usual convention for text files in the
  +     * environment being used. Implementations must choose a default
  +     * sequence that matches one of those allowed by  2.11 "End-of-Line
  +     * Handling".
  +     *
  +     *    CR    The carriage-return character (#xD)
  +     *    CR-LF The carriage-return and line-feed characters (#xD #xA)
  +     *    LF    The line-feed character (#xA)
  +     *
  +     *  The default value for this attribute is null
  +     */
  +    fNewLineUsed = (fNewLine && *fNewLine)? fNewLine : gEOLSeq;
   
  -     fErrorCount = 0;        
  +    fErrorCount = 0;
   }
   
   //
  @@ -732,10 +735,10 @@
   
       switch (nodeToWrite->getNodeType())
       {
  -     case DOMNode::TEXT_NODE:
  +    case DOMNode::TEXT_NODE:
           {
  -                     if (checkFilter(nodeToWrite) != DOMNodeFilter::FILTER_ACCEPT)
  -                             break;
  +            if (checkFilter(nodeToWrite) != DOMNodeFilter::FILTER_ACCEPT)
  +                break;
   
               //skip ws if pretty print
               if (getFeature(FORMAT_PRETTY_PRINT_ID))
  @@ -743,33 +746,36 @@
                   if(XMLString::isAllWhiteSpace(nodeValue))
                       break;
               }
  -             
  -                     setURCharRef();      // character data
  +
  +            setURCharRef();      // character data
               fFormatter->formatBuf(nodeValue, lent, XMLFormatter::CharEscapes);
               break;
           }
   
  -     case DOMNode::PROCESSING_INSTRUCTION_NODE:
  +    case DOMNode::PROCESSING_INSTRUCTION_NODE:
           {
  -                     if (checkFilter(nodeToWrite) != DOMNodeFilter::FILTER_ACCEPT)
  -                             break;
  +            if (checkFilter(nodeToWrite) != DOMNodeFilter::FILTER_ACCEPT)
  +                break;
   
  -                     TRY_CATCH_THROW
  -                     (
  -                             *fFormatter << XMLFormatter::NoEscapes << gStartPI << 
nodeName;
  -                             if (lent > 0)
  -                             {
  -                                     *fFormatter << chSpace << nodeValue;
  -                             }
  -                             *fFormatter << gEndPI;
  -                             ,true
  -                     )
  +            printNewLine();
  +            printIndent(level);
  +
  +            TRY_CATCH_THROW
  +            (
  +                *fFormatter << XMLFormatter::NoEscapes << gStartPI << nodeName;
  +                if (lent > 0)
  +                {
  +                    *fFormatter << chSpace << nodeValue;
  +                }
  +                *fFormatter << gEndPI;
  +                ,true
  +            )
               break;
           }
   
  -     case DOMNode::DOCUMENT_NODE: // Not to be shown to Filter
  +    case DOMNode::DOCUMENT_NODE: // Not to be shown to Filter
           {
  -                     setURCharRef();
  +            setURCharRef();
               const DOMDocument *docu = (const DOMDocument*)nodeToWrite;
   
               //[23] XMLDecl      ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? 
'?>'
  @@ -781,7 +787,7 @@
               // present in the original XML instance document or not.
               //
               const XMLCh* versionNo = (docu->getVersion()) ? docu->getVersion() : 
gXMLDecl_ver10;
  -                     *fFormatter << gXMLDecl_VersionInfo << versionNo << 
gXMLDecl_separator;
  +            *fFormatter << gXMLDecl_VersionInfo << versionNo << gXMLDecl_separator;
   
               // use the encoding resolved in initSession()
               *fFormatter << gXMLDecl_EncodingDecl << fEncodingUsed << 
gXMLDecl_separator;
  @@ -790,104 +796,94 @@
               *fFormatter << gXMLDecl_SDDecl << st << gXMLDecl_separator;
   
               *fFormatter << gXMLDecl_endtag;
  -            printNewLine();
   
               DOMNode *child = nodeToWrite->getFirstChild();
               while( child != 0)
               {
                   processNode(child, level);
  -                printNewLine();
                   child = child->getNextSibling();
               }
               break;
           }
   
  -     case DOMNode::ELEMENT_NODE:
  +    case DOMNode::ELEMENT_NODE:
           {
  -            level++;
  +            DOMNodeFilter::FilterAction filterAction = checkFilter(nodeToWrite);
   
  -            //Add an extra blank line for level 0 nodes 
  -            if(level == 0)   
  -                printNewLine();
  +            if ( filterAction == DOMNodeFilter::FILTER_REJECT)
  +                break;
   
  -            printNewLine();  
  +            printNewLine();
  +            printIndent(level);
   
               //track the line number the current node begins on
               int nodeLine = fCurrentLine;
   
  -                     DOMNodeFilter::FilterAction filterAction = 
checkFilter(nodeToWrite);
  -                     
  -                     if ( filterAction == DOMNodeFilter::FILTER_REJECT)
  +            if ( filterAction == DOMNodeFilter::FILTER_ACCEPT)
               {
  -               level--;
  -                             break;
  -            }
  -
  -                     if ( filterAction == DOMNodeFilter::FILTER_ACCEPT)
  -                     {
  -                printIndent(level); 
  -
  -                             //           this element    attributes   child 
elements
  +                //           this element    attributes   child elements
                   // accept        yes             yes           yes
  -                             // skip          no              no            yes
  -                             //
  -                             TRY_CATCH_THROW
  -                             (
  -                             // The name has to be representable without any escapes
  +                // skip          no              no            yes
  +                //
  +                TRY_CATCH_THROW
  +                (
  +                // The name has to be representable without any escapes
                       *fFormatter  << XMLFormatter::NoEscapes
                                    << chOpenAngle << nodeName;
  -                             ,true
  -                         )
  +                    ,true
  +                )
   
  -                             // Output any attributes on this element
  -                             setURCharRef();
  -                             DOMNamedNodeMap *attributes = 
nodeToWrite->getAttributes();
  -                             int attrCount = attributes->getLength();
  -
  -                             bool discard = getFeature(DISCARD_DEFAULT_CONTENT_ID);
  -                             for (int i = 0; i < attrCount; i++)
  -                             {
  -                                     DOMNode  *attribute = attributes->item(i);
  -
  -                                     // Not to be shown to Filter
  -
  -                                     //
  -                                     //"discard-default-content"
  -                                     //      true
  -                                     //      [required] (default)
  -                                     //      Use whatever information available to 
the implementation
  -                                     //  (i.e. XML schema, DTD, the specified flag 
on Attr nodes,
  -                                     //  and so on) to decide what attributes and 
content should be
  -                                     //  discarded or not.
  -                                     //  Note that the specified flag on Attr nodes 
in itself is
  -                                     //  not always reliable, it is only reliable 
when it is set
  -                                     //  to false since the only case where it can 
be set to false
  -                                     //  is if the attribute was created by the 
implementation.
  -                                     //  The default content won't be removed if an 
implementation
  -                                     //  does not have any information available.
  -                                     //      false
  -                                     //      [required]
  -                                     //      Keep all attributes and all content.
  -                                     //
  -                                     if (discard && !((DOMAttr*)attribute 
)->getSpecified())
  -                                             continue;
  -                                     //
  -                                     //  Again the name has to be completely 
representable. But the
  -                                     //  attribute can have refs and requires the 
attribute style
  -                                     //  escaping.
  -                                     //
  +                // Output any attributes on this element
  +                setURCharRef();
  +                DOMNamedNodeMap *attributes = nodeToWrite->getAttributes();
  +                int attrCount = attributes->getLength();
  +
  +                bool discard = getFeature(DISCARD_DEFAULT_CONTENT_ID);
  +                for (int i = 0; i < attrCount; i++)
  +                {
  +                    DOMNode  *attribute = attributes->item(i);
   
  -                                     *fFormatter  << XMLFormatter::NoEscapes
  +                    // Not to be shown to Filter
  +
  +                    //
  +                    //"discard-default-content"
  +                    //    true
  +                    //    [required] (default)
  +                    //    Use whatever information available to the implementation
  +                    //  (i.e. XML schema, DTD, the specified flag on Attr nodes,
  +                    //  and so on) to decide what attributes and content should be
  +                    //  discarded or not.
  +                    //  Note that the specified flag on Attr nodes in itself is
  +                    //  not always reliable, it is only reliable when it is set
  +                    //  to false since the only case where it can be set to false
  +                    //  is if the attribute was created by the implementation.
  +                    //  The default content won't be removed if an implementation
  +                    //  does not have any information available.
  +                    //    false
  +                    //    [required]
  +                    //    Keep all attributes and all content.
  +                    //
  +                    if (discard && !((DOMAttr*)attribute )->getSpecified())
  +                        continue;
  +                    //
  +                    //  Again the name has to be completely representable. But the
  +                    //  attribute can have refs and requires the attribute style
  +                    //  escaping.
  +                    //
  +
  +                    *fFormatter  << XMLFormatter::NoEscapes
                                    << chSpace << attribute->getNodeName()
                                    << chEqual << chDoubleQuote
                                    << XMLFormatter::AttrEscapes
                                    << attribute->getNodeValue()
                                    << XMLFormatter::NoEscapes
                                    << chDoubleQuote;
  -                             } // end of for
  -                     } // end of FILTER_ACCEPT
  +                } // end of for
  +            } // end of FILTER_ACCEPT
   
  -                     // FILTER_SKIP may start from here
  +            level++;
  +
  +            // FILTER_SKIP may start from here
   
               //
               //  Test for the presence of children, which includes both
  @@ -898,8 +894,11 @@
               {
                   // There are children. Close start-tag, and output children.
                   // No escapes are legal here
  -                             if (filterAction == DOMNodeFilter::FILTER_ACCEPT)
  -                                     *fFormatter << XMLFormatter::NoEscapes << 
chCloseAngle;
  +                if (filterAction == DOMNodeFilter::FILTER_ACCEPT)
  +                    *fFormatter << XMLFormatter::NoEscapes << chCloseAngle;
  +
  +                if(level == 1)
  +                    printNewLine();
   
                   while( child != 0)
                   {
  @@ -907,8 +906,10 @@
                       child = child->getNextSibling();
                   }
   
  -                             if (filterAction == DOMNodeFilter::FILTER_ACCEPT)
  -                             {
  +                level--;
  +
  +                if (filterAction == DOMNodeFilter::FILTER_ACCEPT)
  +                {
                       //if we are not on the same line as when we started
                       //this node then print a new line and indent
                       if(nodeLine != fCurrentLine)
  @@ -916,68 +917,68 @@
                           printNewLine();
                           printIndent(level);
                       }
  -                                     TRY_CATCH_THROW
  -                                     (
  +                    TRY_CATCH_THROW
  +                    (
                            *fFormatter << XMLFormatter::NoEscapes << gEndElement
                                        << nodeName << chCloseAngle;
                           ,true
  -                     )
  +                    )
   
                       //for level 1 nodes that span multiple lines, add an extra 
blank line
  -                    if(nodeLine != fCurrentLine && level == 1)
  +                    if(nodeLine != fCurrentLine && (level == 1 || level==0) )
                           printNewLine();
  -                    
  -                             }
  +
  +                }
               }
               else
               {
  +                level--;
  +
                   //
                   //  There were no children. Output the short form close of
                   //  the element start tag, making it an empty-element tag.
                   //
  -                             if (filterAction == DOMNodeFilter::FILTER_ACCEPT)
  -                             {
  -                                     TRY_CATCH_THROW
  +                if (filterAction == DOMNodeFilter::FILTER_ACCEPT)
  +                {
  +                    TRY_CATCH_THROW
                       (
  -                                         *fFormatter << XMLFormatter::NoEscapes << 
chForwardSlash << chCloseAngle;
  -                                    , true
  -                                 )
  -                             }
  +                        *fFormatter << XMLFormatter::NoEscapes << chForwardSlash << 
chCloseAngle;
  +                       , true
  +                    )
  +                }
               }
   
  -            level--;
  - 
               break;
           }
   
  -     case DOMNode::ENTITY_REFERENCE_NODE:
  -             {
  -                     //"entities"
  -                     //true
  -                     //[required] (default)
  -                     //Keep EntityReference and Entity nodes in the document.
  -
  -                     //false
  -                     //[optional]
  -                     //Remove all EntityReference and Entity nodes from the 
document,
  -                     //       putting the entity expansions directly in their place.
  -                     //       Text nodes are into "normal" form.
  -                     //Only EntityReference nodes to non-defined entities are kept 
in the document.
  -
  -                     if (checkFilter(nodeToWrite) != DOMNodeFilter::FILTER_ACCEPT)
  -                             break;
  -
  -                     if (getFeature(ENTITIES_ID))
  -                     {
  -                             TRY_CATCH_THROW
  -                             (
  -                                     *fFormatter << XMLFormatter::NoEscapes << 
chAmpersand
  +    case DOMNode::ENTITY_REFERENCE_NODE:
  +        {
  +            //"entities"
  +            //true
  +            //[required] (default)
  +            //Keep EntityReference and Entity nodes in the document.
  +
  +            //false
  +            //[optional]
  +            //Remove all EntityReference and Entity nodes from the document,
  +            //       putting the entity expansions directly in their place.
  +            //       Text nodes are into "normal" form.
  +            //Only EntityReference nodes to non-defined entities are kept in the 
document.
  +
  +            if (checkFilter(nodeToWrite) != DOMNodeFilter::FILTER_ACCEPT)
  +                break;
  +
  +            if (getFeature(ENTITIES_ID))
  +            {
  +                TRY_CATCH_THROW
  +                (
  +                    *fFormatter << XMLFormatter::NoEscapes << chAmpersand
                                   << nodeName << chSemiColon;
  -                                 , true
  -                             )
  -                     }
  -                     else
  -                     {
  +                    , true
  +                )
  +            }
  +            else
  +            {
                   // check if the referenced entity is defined or not
                   if 
(nodeToWrite->getOwnerDocument()->getDoctype()->getEntities()->getNamedItem(nodeName))
                   {
  @@ -995,11 +996,11 @@
                      (
                           
*fFormatter<<XMLFormatter::NoEscapes<<chAmpersand<<nodeName<<chSemiColon;
                           , true
  -                                 )
  +                    )
                   }
  -                     }
  -                     break;
  -             }
  +            }
  +            break;
  +        }
   
           //
           //  feature:split_cdata_sections     occurence of ]]>   unrep-char
  @@ -1007,19 +1008,19 @@
           //          true                        split            split
           //          false                       fails            fails
           //
  -     case DOMNode::CDATA_SECTION_NODE:
  -             {
  -                     if (checkFilter(nodeToWrite) != DOMNodeFilter::FILTER_ACCEPT)
  -                             break;
  +    case DOMNode::CDATA_SECTION_NODE:
  +        {
  +            if (checkFilter(nodeToWrite) != DOMNodeFilter::FILTER_ACCEPT)
  +                break;
   
  -                     if (getFeature(SPLIT_CDATA_SECTIONS_ID))
  -                     {
  +            if (getFeature(SPLIT_CDATA_SECTIONS_ID))
  +            {
                   // it is fairly complicated and we process this
                   // in a separate function.
                   procCdataSection(nodeValue, nodeToWrite);
  -                     }
  -                     else
  -                     {
  +            }
  +            else
  +            {
                   // search for "]]>"
                   if (XMLString::patternMatch((XMLCh* const) nodeValue, gEndCDATA) != 
-1)
                   {
  @@ -1032,124 +1033,129 @@
                       // transcoder throws exception for unrep chars
                       *fFormatter << XMLFormatter::NoEscapes << gStartCDATA << 
nodeValue << gEndCDATA;
                      , true
  -                         )
  +                )
               }
   
               break;
  -             }
  +        }
   
  -     case DOMNode::COMMENT_NODE:
  +    case DOMNode::COMMENT_NODE:
           {
  -                     if (checkFilter(nodeToWrite) != DOMNodeFilter::FILTER_ACCEPT)
  -                             break;
  +            if (checkFilter(nodeToWrite) != DOMNodeFilter::FILTER_ACCEPT)
  +                break;
   
  -                     TRY_CATCH_THROW
  -                     (
  +        printNewLine();
  +        printIndent(level);
  +
  +            TRY_CATCH_THROW
  +            (
                   *fFormatter << XMLFormatter::NoEscapes << gStartComment
                   << nodeValue << gEndComment;
  -                         , true
  -                     )
  -                     break;
  +                , true
  +            )
  +            break;
           }
   
  -     case DOMNode::DOCUMENT_TYPE_NODE:  // Not to be shown to Filter
  -             {
  +    case DOMNode::DOCUMENT_TYPE_NODE:  // Not to be shown to Filter
  +        {
               const DOMDocumentType *doctype = (const DOMDocumentType *)nodeToWrite;;
   
  -                     fFormatter->setEscapeFlags(XMLFormatter::NoEscapes);
  +            fFormatter->setEscapeFlags(XMLFormatter::NoEscapes);
  +
  +            printNewLine();
  +            printIndent(level);
               TRY_CATCH_THROW
  -                     (
  -                     *fFormatter << gStartDoctype << nodeName;
  +            (
  +                *fFormatter << gStartDoctype << nodeName;
   
  -                     const XMLCh  *id = doctype->getPublicId();
  +                const XMLCh  *id = doctype->getPublicId();
                   if (id && *id)
  -                             {
  +                {
                       *fFormatter << chSpace << gPublic << id << chDoubleQuote;
   
  -                                     id = doctype->getSystemId();
  -                                     if (id && *id)
  -                                     {
  -                                             *fFormatter << chSpace << 
chDoubleQuote << id << chDoubleQuote;
  -                                     }               
  -                                     else
  -                                     {
  -                                             //
  +                    id = doctype->getSystemId();
  +                    if (id && *id)
  +                    {
  +                        *fFormatter << chSpace << chDoubleQuote << id << 
chDoubleQuote;
  +                    }
  +                    else
  +                    {
  +                        //
                           // 4.2.2 External Entities
                           // [Definition: If the entity is not internal,
  -                                             //           it is an external entity, 
declared as follows:]
  -                                             // External Entity Declaration
  -                                             // [75] ExternalID ::= 'SYSTEM' S 
SystemLiteral
  -                                             //                   | 'PUBLIC' S 
PubidLiteral S SystemLiteral
  -                                             //
  +                        //           it is an external entity, declared as follows:]
  +                        // External Entity Declaration
  +                        // [75] ExternalID ::= 'SYSTEM' S SystemLiteral
  +                        //                   | 'PUBLIC' S PubidLiteral S 
SystemLiteral
  +                        //
                           reportError(nodeToWrite, 
DOMError::DOM_SEVERITY_FATAL_ERROR, gUnrecognizedNodeType);
                           throw DOMException(DOMException::NOT_FOUND_ERR, 0);
  -                                             // systemLiteral not found
  -                                     }
  -                             }
  -                             else
  -                             {
  -                                     id = doctype->getSystemId();
  -                                     if (id && *id)
  -                                     {
  -                                             *fFormatter << chSpace << gSystem << 
id << chDoubleQuote;
  -                                     }
  -                             }
  -
  -                             id = doctype->getInternalSubset();
  -                             if (id && *id)
  -                             {
  -                                     *fFormatter << chSpace << chOpenSquare << id 
<< chCloseSquare;
  -                             }
  +                        // systemLiteral not found
  +                    }
  +                }
  +                else
  +                {
  +                    id = doctype->getSystemId();
  +                    if (id && *id)
  +                    {
  +                        *fFormatter << chSpace << gSystem << id << chDoubleQuote;
  +                    }
  +                }
   
  -                             *fFormatter << chCloseAngle;
  -                             , true
  +                id = doctype->getInternalSubset();
  +                if (id && *id)
  +                {
  +                    *fFormatter << chSpace << chOpenSquare << id << chCloseSquare;
  +                }
   
  -                     ) // end of TRY_CATCH_THROW
  +                *fFormatter << chCloseAngle;
  +                , true
  +
  +            ) // end of TRY_CATCH_THROW
   
  -                     break;
  +            break;
           }
   
  -     case DOMNode::ENTITY_NODE:  // Not to be shown to Filter
  +    case DOMNode::ENTITY_NODE:  // Not to be shown to Filter
           {
  -                     //
  -                     // REVISIT: how does the feature "entities" impact
  -                     // entity node?
  -                     //
  -
  -                     fFormatter->setEscapeFlags(XMLFormatter::NoEscapes);
  -                     *fFormatter << gStartEntity     << nodeName;
  -
  -                     const XMLCh * id = ((const 
DOMEntity*)nodeToWrite)->getPublicId();
  -                     if (id)
  -                             *fFormatter << gPublic << id << chDoubleQuote;
  -
  -                     id = ((const DOMEntity*)nodeToWrite)->getSystemId();
  -                     if (id)
  -                             *fFormatter << gSystem << id << chDoubleQuote;
  -
  -                     id = ((const DOMEntity*)nodeToWrite)->getNotationName();
  -                     if (id)
  -                             *fFormatter << gNotation << id << chDoubleQuote;
  +            //
  +            // REVISIT: how does the feature "entities" impact
  +            // entity node?
  +            //
  +            printNewLine();
  +            printIndent(level);
  +            fFormatter->setEscapeFlags(XMLFormatter::NoEscapes);
  +            *fFormatter << gStartEntity    << nodeName;
  +
  +            const XMLCh * id = ((const DOMEntity*)nodeToWrite)->getPublicId();
  +            if (id)
  +                *fFormatter << gPublic << id << chDoubleQuote;
  +
  +            id = ((const DOMEntity*)nodeToWrite)->getSystemId();
  +            if (id)
  +                *fFormatter << gSystem << id << chDoubleQuote;
  +
  +            id = ((const DOMEntity*)nodeToWrite)->getNotationName();
  +            if (id)
  +                *fFormatter << gNotation << id << chDoubleQuote;
   
               *fFormatter << chCloseAngle;
   
  -            printNewLine();
  -
  -                     break;
  +            break;
           }
   
  -     default:
  -     /***
  -                 This is an implementation specific behaviour, we abort 
serialization
  -                     once unrecognized node type encountered.
  -          ***/
  +    default:
  +        /***
  +            This is an implementation specific behaviour, we abort serialization
  +            once unrecognized node type encountered.
  +         ***/
           {
               reportError(nodeToWrite, DOMError::DOM_SEVERITY_FATAL_ERROR, 
gUnrecognizedNodeType);
               throw DOMException(DOMException::NOT_FOUND_ERR, 0);
  -                     // UnreognizedNodeType;
  -             }
  +            // UnreognizedNodeType;
  +        }
   
  -             break;
  +        break;
       }
   
   }
  @@ -1158,16 +1164,16 @@
   //
   DOMNodeFilter::FilterAction DOMWriterImpl::checkFilter(const DOMNode* const node) 
const
   {
  -     if (!fFilter ||
  +    if (!fFilter ||
           ((fFilter->getWhatToShow() & (1 << (node->getNodeType() - 1))) == 0))
  -             return DOMNodeFilter::FILTER_ACCEPT;
  +        return DOMNodeFilter::FILTER_ACCEPT;
   
  -     //
  -     // if and only if there is a filter, and it is interested
  -     // in the node type, then we pass the node to the filter
  -     // for examination
  -     //
  -     return (DOMNodeFilter::FilterAction) fFilter->acceptNode(node);
  +    //
  +    // if and only if there is a filter, and it is interested
  +    // in the node type, then we pass the node to the filter
  +    // for examination
  +    //
  +    return (DOMNodeFilter::FilterAction) fFilter->acceptNode(node);
   }
   
   
  @@ -1207,7 +1213,7 @@
       if (featureId == INVALID_FEATURE_ID)
       {
           if (toThrow)
  -            throw DOMException(DOMException::NOT_FOUND_ERR, featName);              
         
  +            throw DOMException(DOMException::NOT_FOUND_ERR, featName);
   
           return false;
       }
  @@ -1273,13 +1279,13 @@
           if (endTagPos == 0)
           {
               TRY_CATCH_THROW
  -           (
  +            (
                   *fFormatter << XMLFormatter::NoEscapes << gStartCDATA << gEndCDATA;
                   , true
               )
           }
           else
  -        {       
  +        {
               procUnrepCharInCdataSection(curPtr, nodeToWrite);
           }
   
  @@ -1354,16 +1360,16 @@
               // Update the source pointer to our new spot
               srcPtr = tmpPtr;
           }
  -         else
  +        else
           {
  -             //
  -             //  We hit something unrepresentable. So continue forward doing
  -             //  char refs until we hit something representable again or the
  -             //  end of input.
  -             //
  +            //
  +            //  We hit something unrepresentable. So continue forward doing
  +            //  char refs until we hit something representable again or the
  +            //  end of input.
  +            //
   
  -             // one warning for consective unrep chars
  -             reportError(nodeToWrite, DOMError::DOM_SEVERITY_WARNING, 
gUnrepresentableChar);
  +            // one warning for consective unrep chars
  +            reportError(nodeToWrite, DOMError::DOM_SEVERITY_WARNING, 
gUnrepresentableChar);
   
               while (srcPtr < endPtr)
               {
  @@ -1389,13 +1395,11 @@
               }
           }
       }
  -
  -
   }
   
   void DOMWriterImpl::processNode(const DOMNode* const nodeToWrite)
   {
  -    processNode(nodeToWrite, -1);
  +    processNode(nodeToWrite, 0);
   }
   
   bool DOMWriterImpl::canSetFeature(const int featureId
  @@ -1404,7 +1408,7 @@
       return featuresSupported[2*featureId + (val? 0: 1)];
   }
   
  -void DOMWriterImpl::printNewLine() 
  +void DOMWriterImpl::printNewLine()
   {
       if (getFeature(FORMAT_PRETTY_PRINT_ID))
       {
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to