gareth      2002/12/09 03:46:08

  Modified:    c/src/xercesc/dom/impl DOMWriterImpl.cpp DOMWriterImpl.hpp
  Log:
  More pretty pretty print feature. Patch by Kevin King. Closes bug #13840.
  
  Revision  Changes    Path
  1.22      +69 -15    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.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- DOMWriterImpl.cpp 2 Dec 2002 23:08:09 -0000       1.21
  +++ DOMWriterImpl.cpp 9 Dec 2002 11:46:08 -0000       1.22
  @@ -57,6 +57,9 @@
   /*
    * $Id$
    * $Log$
  + * Revision 1.22  2002/12/09 11:46:08  gareth
  + * More pretty pretty print feature. Patch by Kevin King. Closes bug #13840.
  + *
    * Revision 1.21  2002/12/02 23:08:09  peiyongz
    * fix to bug#14528: output n+1 cdatasection
    *
  @@ -416,6 +419,7 @@
   ,fNewLineUsed(0)
   ,fFormatter(0)
   ,fErrorCount(0)
  +,fCurrentLine(0)
   {
       //
       // set features to default setting
  @@ -712,22 +716,15 @@
   //    "split_cdata_section"  true                      --- char ref
   //                           false                     ---      ERROR
   //
  -
  -//
  -// REVISIT
  -//    FormatPrettyPrint requires proper indentation, newline, and etc.
  -//    currently we partially support this feature by adding new line to
  -//    xmldecl, doctype and root element, later on we need to work on
  -//    other nodes, such as element, attribute and so on.
  -//
  -
   // ---------------------------------------------------------------------------
   //  Stream out a DOM node, and, recursively, all of its children. This
   //  function is the heart of writing a DOM tree out as XML source. Give it
   //  a document node and it will do the whole thing.
   // ---------------------------------------------------------------------------
  -void DOMWriterImpl::processNode(const DOMNode* const nodeToWrite)
  +
  +void DOMWriterImpl::processNode(const DOMNode* const nodeToWrite, int level)
   {
  +
       // Get the name and value out for convenience
       const XMLCh*    nodeName = nodeToWrite->getNodeName();
       const XMLCh*    nodeValue = nodeToWrite->getNodeValue();
  @@ -740,6 +737,13 @@
                        if (checkFilter(nodeToWrite) != DOMNodeFilter::FILTER_ACCEPT)
                                break;
   
  +            //skip ws if pretty print
  +            if (getFeature(FORMAT_PRETTY_PRINT_ID))
  +            {
  +                if(XMLString::isAllWhiteSpace(nodeValue))
  +                    break;
  +            }
  +             
                        setURCharRef();      // character data
               fFormatter->formatBuf(nodeValue, lent, XMLFormatter::CharEscapes);
               break;
  @@ -791,7 +795,7 @@
               DOMNode *child = nodeToWrite->getFirstChild();
               while( child != 0)
               {
  -                processNode(child);
  +                processNode(child, level);
                   printNewLine();
                   child = child->getNextSibling();
               }
  @@ -800,13 +804,29 @@
   
        case DOMNode::ELEMENT_NODE:
           {
  +            level++;
  +
  +            //Add an extra blank line for level 0 nodes 
  +            if(level == 0)   
  +                printNewLine();
  +
  +            printNewLine();  
  +
  +            //track the line number the current node begins on
  +            int nodeLine = fCurrentLine;
  +
                        DOMNodeFilter::FilterAction filterAction = 
checkFilter(nodeToWrite);
                        
                        if ( filterAction == DOMNodeFilter::FILTER_REJECT)
  +            {
  +               level--;
                                break;
  +            }
   
                        if ( filterAction == DOMNodeFilter::FILTER_ACCEPT)
                        {
  +                printIndent(level); 
  +
                                //           this element    attributes   child 
elements
                   // accept        yes             yes           yes
                                // skip          no              no            yes
  @@ -883,18 +903,30 @@
   
                   while( child != 0)
                   {
  -                    processNode(child);
  +                    processNode(child, level);
                       child = child->getNextSibling();
                   }
   
                                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)
  +                    {
  +                        printNewLine();
  +                        printIndent(level);
  +                    }
                                        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)
  +                        printNewLine();
  +                    
                                }
               }
               else
  @@ -912,6 +944,9 @@
                                    )
                                }
               }
  +
  +            level--;
  + 
               break;
           }
   
  @@ -951,7 +986,7 @@
                       child != 0;
                       child = child->getNextSibling())
                       {
  -                        processNode(child);
  +                        processNode(child, level);
                       }
                   }
                   else
  @@ -1354,6 +1389,13 @@
               }
           }
       }
  +
  +
  +}
  +
  +void DOMWriterImpl::processNode(const DOMNode* const nodeToWrite)
  +{
  +    processNode(nodeToWrite, -1);
   }
   
   bool DOMWriterImpl::canSetFeature(const int featureId
  @@ -1362,10 +1404,22 @@
       return featuresSupported[2*featureId + (val? 0: 1)];
   }
   
  -void DOMWriterImpl::printNewLine() const
  +void DOMWriterImpl::printNewLine() 
   {
       if (getFeature(FORMAT_PRETTY_PRINT_ID))
  +    {
  +        fCurrentLine++;
           *fFormatter << fNewLineUsed;
  +}
  +}
  +
  +void DOMWriterImpl::printIndent(int level) const
  +{
  +    if (getFeature(FORMAT_PRETTY_PRINT_ID))
  +    {
  +        for(int i = 0; i < level; i++)
  +            *fFormatter << chSpace << chSpace;
  +    }
   }
   
   void DOMWriterImpl::release()
  
  
  
  1.9       +15 -2     xml-xerces/c/src/xercesc/dom/impl/DOMWriterImpl.hpp
  
  Index: DOMWriterImpl.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/dom/impl/DOMWriterImpl.hpp,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- DOMWriterImpl.hpp 4 Nov 2002 15:07:35 -0000       1.8
  +++ DOMWriterImpl.hpp 9 Dec 2002 11:46:08 -0000       1.9
  @@ -57,6 +57,9 @@
   /*
    * $Id$
    * $Log$
  + * Revision 1.9  2002/12/09 11:46:08  gareth
  + * More pretty pretty print feature. Patch by Kevin King. Closes bug #13840.
  + *
    * Revision 1.8  2002/11/04 15:07:35  tng
    * C++ Namespace Support.
    *
  @@ -390,9 +393,14 @@
                                              , bool      val);
       bool                          getFeature(const int featureId) const;
   
  -    void                          printNewLine() const;
  +    void                          printNewLine();
       void                          setURCharRef();
   
  +
  +    void printIndent(int level) const;
  +    //does the actual work for processNode while keeping track of the level
  +    void processNode(const DOMNode* const nodeToWrite, int level);
  +
       // -----------------------------------------------------------------------
       //  Private data members
       //
  @@ -427,6 +435,10 @@
       //      treat as fatal. And the serializer will return true/false
       //      based on this value.
       //
  +    //  fCurrentLine
  +    //      the current line. Used to track the line number the current 
  +    //      node begins on      
  +    //
       // -----------------------------------------------------------------------
   
       int                           fFeatures;
  @@ -440,6 +452,7 @@
       const XMLCh                  *fNewLineUsed;
       XMLFormatter                 *fFormatter;
       int                           fErrorCount;
  +    int                           fCurrentLine;
   };
   
   inline void DOMWriterImpl::setFeature(const int featureId
  
  
  

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

Reply via email to