diff options
| -rw-r--r-- | src/tags.h | 15 | ||||
| -rw-r--r-- | src/xmlcomposer.cpp | 15 | ||||
| -rw-r--r-- | src/xmlcomposer.h | 2 | ||||
| -rw-r--r-- | src/xmlfixups.cpp | 164 | ||||
| -rw-r--r-- | src/xmlfixups.h | 1 | 
5 files changed, 118 insertions, 79 deletions
@@ -86,7 +86,7 @@ static const char* kAtOrdered = "ordered";  static const char* kAtStart = "start";  static const char* kAtId = "id";  static const char* kAtIndex = "id"; -static const char* kAtFootNote = "footnote"; +static const char* kAtTo = "to";  static const wchar_t* kValDisc = L"disc";  static const wchar_t* kValLowerAlpha = L"lower-alpha"; @@ -95,23 +95,12 @@ static const wchar_t* kValLowerRoman = L"lower-roman";  static const wchar_t* kValUpperRoman = L"upper-roman";  static const wchar_t* kValArabic = L"arabic";  static const wchar_t* kValNull = L""; +static const wchar_t* kValFootNote = L"footnote";  static const wchar_t* kValList = L"list";  static const wchar_t* kValPara = L"para";  static const wchar_t* kValTable = L"table"; -static const char* kNoDuplicates[] = -    { kElB, kElU, kElI, kElColor, kElHide, kElColor, NULL }; - -static const char* kRemoveTags[] = - { kElDest, kElListdef, kElListtable, NULL }; - -static const char* kBlockTags[] = -  { kElTable, kElPara, NULL }; - -static const char* kHideList[] = -   { kAtId, kAtList, NULL }; -  static const char* kNSPrefix = "xmlns";  #endif // __TAGS_H__ diff --git a/src/xmlcomposer.cpp b/src/xmlcomposer.cpp index 4091adb..5c29e65 100644 --- a/src/xmlcomposer.cpp +++ b/src/xmlcomposer.cpp @@ -104,6 +104,7 @@ void RtfParser::endDocument()  	// Cleanup the tree  	RtfFixups::removeDuplicates(m_document); +    RtfFixups::consolidateEndTags(m_document);  	RtfFixups::breakTables(m_document);  	RtfFixups::breakTags(m_document, kElTable, kElRow);  	RtfFixups::breakTags(m_document, kElRow, kElCell); @@ -504,7 +505,8 @@ bool RtfParser::ParseAnalyser::processTextAutoContent(const string& cw, int flag          int ac = m_parser->getAutoCount(AUTOCOUNT_FOOTNOTE);          AN_ELEMENT(kElRef); -        AN_ATTRIBUTE(kAtFootNote, ac); +        AN_ATTRIBUTE(kAtType, kValFootNote); +        AN_ATTRIBUTE(kAtTo, ac);          dest->charData(formatInt(ac));          AN_POP_ELEMENT();          return true; @@ -953,18 +955,7 @@ ON_DONE(FootNote)      m_parser->incrementAutoCount(AUTOCOUNT_FOOTNOTE);  } -// TODO: Remove these (for debugging) -ON_GROUPSTART(FootNote) -{ -    int ac = m_parser->getAutoCount(AUTOCOUNT_FOOTNOTE); -    fprintf(stderr, "%d start\n", ac); -} -ON_GROUPEND(FootNote) -{ -    int ac = m_parser->getAutoCount(AUTOCOUNT_FOOTNOTE); -    fprintf(stderr, "%d end\n", ac); -}  ON_CHARDATA(Raw) diff --git a/src/xmlcomposer.h b/src/xmlcomposer.h index fc40496..deba4ba 100644 --- a/src/xmlcomposer.h +++ b/src/xmlcomposer.h @@ -234,8 +234,6 @@ protected:      ANALYSER(FootNote)          INITIALIZE          CONTROLWORD -        GROUPSTART -        GROUPEND          DONE      END_ANALYSER  }; diff --git a/src/xmlfixups.cpp b/src/xmlfixups.cpp index 7201703..64d360d 100644 --- a/src/xmlfixups.cpp +++ b/src/xmlfixups.cpp @@ -41,6 +41,21 @@  #include "domhelpers.h"  #include "tags.h" +static const char* kNoDuplicates[] = +    { kElB, kElU, kElI, kElColor, kElHide, kElColor, kElSuper, kElSub, NULL }; + +static const char* kRemoveTags[] = + { kElDest, kElListdef, kElListtable, NULL }; + +static const char* kBlockTags[] = +  { kElTable, kElPara, NULL }; + +static const char* kHideList[] = +   { kAtId, kAtList, NULL }; + +static const char* kConsolidateEnd[] = +    { kElFootNote, NULL }; +  void RtfFixups::breakBreak(DOM::Document& doc, const string& contain,                                const string& tag)  { @@ -668,72 +683,117 @@ void RtfFixups::fixBlocks(const DOM::Document doc)    }  } -  /** - * Removes adjacent duplicate nodes of certain names + * Consolidates a certain tag types at the end of the document   */ -void RtfFixups::removeDuplicates(const DOM::Document& doc) +void RtfFixups::consolidateEndTags(DOM::Document& doc)  { -    // Go through the list of nodes -    for(const char** t = kNoDuplicates; *t = NULL; t++) -    { -      DOM::NodeList elements = doc.getElementsByTagName(*t); -     if(elements != NULL) -       { -          int x = elements->getLength(); -         for(int j = 0; j < elements->getLength(); j++) -         { +    DOM::Element top = doc.getDocumentElement(); +    ASSERT(top != NULL); -             // Make sure it's a valid element +    for(const char** t = kConsolidateEnd; *t != NULL; t++) +    { +        DOM::NodeList elements = doc.getElementsByTagName(*t); +        if(elements != NULL) +        { +            int x = elements->getLength(); +            for(int j = 0; j < x; j++) +            { +                // Make sure it's a valid element                  DOM::Element element = (const DOM::Element&)elements->item(j); -             if(element == NULL) +                if(element == NULL)                      continue; -             // Get neighbors -               DOM::Node previous = element.getPreviousSibling(); -             DOM::Node next = element.getNextSibling(); - -                // Make sure it's still in the document, as we may have -               // removed it on a previous loop -               DOM::Node parent = element.getParentNode(); +                DOM::Element parent = (const DOM::Element&)element.getParentNode();                  if(parent == NULL) -                 continue; +                    continue; -             // Combine previous if valid -               if(previous != NULL && previous.getNodeType() == DOM::Node::ELEMENT_NODE && -                   DOMHelpers::isEqualElement((DOM::Element&)previous, element)) -              { -                  while(previous.hasChildNodes()) +                // Remove it from it's child +                parent.removeChild(element); + +                // And append it to the end of the document +                top.appendChild(element); +            } +        } +    } +} + +/** + * Removes adjacent duplicate nodes of certain names + */ +void RtfFixups::removeDuplicates(const DOM::Document& doc) +{ +    bool found; + +    do +    { +        found = false; + +        // Go through the list of nodes +        for(const char** t = kNoDuplicates; *t != NULL; t++) +        { +            DOM::NodeList elements = doc.getElementsByTagName(*t); +            if(elements != NULL) +            { +                int x = elements->getLength(); +                for(int j = 0; j < x; j++) +                { +                    // Make sure it's a valid element +                    DOM::Element element = (const DOM::Element&)elements->item(j); +                    if(element == NULL) +                        continue; + +                    // Get neighbors +                    DOM::Node previous = element.getPreviousSibling(); +                    DOM::Node next = element.getNextSibling(); + +                    // Make sure it's still in the document, as we may have +                    // removed it on a previous loop +                    DOM::Node parent = element.getParentNode(); +                    if(parent == NULL) +                        continue; + +                    // Combine previous if valid +                    if(previous != NULL && previous.getNodeType() == DOM::Node::ELEMENT_NODE && +                        DOMHelpers::isEqualElement((DOM::Element&)previous, element))                      { -                      DOM::Node child = previous.removeChild(previous.getLastChild()); -                       if(child != NULL) -                      { -                          if(element.hasChildNodes()) -                                element.insertBefore(child, element.getFirstChild()); -                          else -                               element.appendChild(child); +                        while(previous.hasChildNodes()) +                        { +                            DOM::Node child = previous.removeChild(previous.getLastChild()); +                            if(child != NULL) +                            { +                                if(element.hasChildNodes()) +                                    element.insertBefore(child, element.getFirstChild()); +                                else +                                    element.appendChild(child); +                            }                          } -                  } -                 // Remove duplicate node -                   parent.removeChild(previous); -              } +                        // Remove duplicate node +                        parent.removeChild(previous); +                        found = true; +                    } -             // Combine next if valid -               if(next != NULL && next.getNodeType() == DOM::Node::ELEMENT_NODE && -                    DOMHelpers::isEqualElement((DOM::Element&)next, element)) -              { -                  while(next.hasChildNodes()) +                    // Combine next if valid +                    if(next != NULL && next.getNodeType() == DOM::Node::ELEMENT_NODE && +                        DOMHelpers::isEqualElement((DOM::Element&)next, element))                      { -                      DOM::Node child = next.removeChild(next.getFirstChild()); -                      if(child != NULL) -                          element.appendChild(child); +                        while(next.hasChildNodes()) +                        { +                            DOM::Node child = next.removeChild(next.getFirstChild()); +                            if(child != NULL) +                                element.appendChild(child); +                        } + +                        // Remove duplicate node +                        parent.removeChild(next); +                        found = true;                      } +                } +            } +        } -                 // Remove duplicate node -                   parent.removeChild(next); -              } -          } -      } -  } +        // Keep looping until no more duplicates found +    } +    while(found);  } diff --git a/src/xmlfixups.h b/src/xmlfixups.h index 8cc9b82..2def770 100644 --- a/src/xmlfixups.h +++ b/src/xmlfixups.h @@ -57,6 +57,7 @@ public:      static void wrapTags(DOM::Document& document, const string& tagName, const string& wrapName);      static void removeTags(const DOM::Document& doc);      static void removeDuplicates(const DOM::Document& doc); +    static void consolidateEndTags(DOM::Document& doc);  };  #endif // __RTFFIXUPS_H__  | 
