summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorStef <stef@ws.local>2004-07-13 02:53:48 +0000
committerStef <stef@ws.local>2004-07-13 02:53:48 +0000
commit868bfee512331e44b90a2cf42d4b734f79ed4622 (patch)
treef7f02f3e7ae0bd29520f6543211771e71d8711d7 /src
parentffaca765ed010aa6f367f417a97eaa99902870a1 (diff)
Consolidate certain tags to the beginning of the document.
Diffstat (limited to 'src')
-rw-r--r--src/xmlcomposer.cpp1
-rw-r--r--src/xmlfixups.cpp41
-rw-r--r--src/xmlfixups.h1
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);
};