diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/xmlcomposer.cpp | 1 | ||||
| -rw-r--r-- | src/xmlfixups.cpp | 41 | ||||
| -rw-r--r-- | src/xmlfixups.h | 1 | 
3 files changed, 43 insertions, 0 deletions
diff --git a/src/xmlcomposer.cpp b/src/xmlcomposer.cpp index 5c29e65..c2b0b10 100644 --- a/src/xmlcomposer.cpp +++ b/src/xmlcomposer.cpp @@ -104,6 +104,7 @@ void RtfParser::endDocument()  	// Cleanup the tree  	RtfFixups::removeDuplicates(m_document); +	RtfFixups::consolidateStartTags(m_document);      RtfFixups::consolidateEndTags(m_document);  	RtfFixups::breakTables(m_document);  	RtfFixups::breakTags(m_document, kElTable, kElRow); diff --git a/src/xmlfixups.cpp b/src/xmlfixups.cpp index 64d360d..fe2232b 100644 --- a/src/xmlfixups.cpp +++ b/src/xmlfixups.cpp @@ -56,6 +56,9 @@ static const char* kHideList[] =  static const char* kConsolidateEnd[] =      { kElFootNote, NULL }; +static const char* kConsolidateStart[] = +    { kElInfo, kElStylesheet, NULL }; +  void RtfFixups::breakBreak(DOM::Document& doc, const string& contain,                                const string& tag)  { @@ -719,6 +722,44 @@ void RtfFixups::consolidateEndTags(DOM::Document& doc)  }  /** + * Consolidates a certain tag types at the start of the document + */ +void RtfFixups::consolidateStartTags(DOM::Document& doc) +{ +    DOM::Element top = doc.getDocumentElement(); +    ASSERT(top != NULL); + +	DOM::Node first = top.getFirstChild(); + +    for(const char** t = kConsolidateStart; *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 || element == first) +                    continue; + +                DOM::Element parent = (const DOM::Element&)element.getParentNode(); +                if(parent == NULL) +                    continue; + +                // Remove it from it's child +                parent.removeChild(element); + +                // And put at start of the document of the document +				ASSERT(first != NULL); +				top.insertBefore(element, first); +            } +        } +    } +} + +/**   * Removes adjacent duplicate nodes of certain names   */  void RtfFixups::removeDuplicates(const DOM::Document& doc) diff --git a/src/xmlfixups.h b/src/xmlfixups.h index 2def770..a250c5a 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 consolidateStartTags(DOM::Document& doc);      static void consolidateEndTags(DOM::Document& doc);  };  | 
