[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    =?utf-8?q?=5Bcalligra=5D_libs/kotext/opendocument=3A_Fix_invalid?=
From:       Pierre Ducroquet <pinaraf () pinaraf ! info>
Date:       2011-04-25 12:00:28
Message-ID: 20110425120028.81A27A60A4 () git ! kde ! org
[Download RAW message or body]

Git commit 6082115c052f113165a233e4cf27595126b56070 by Pierre Ducroquet.
Committed on 25/04/2011 at 14:01.
Pushed by ducroquet into branch 'master'.

Fix invalid XML generation with RDF and changetracking

M  +30   -2    libs/kotext/opendocument/KoTextWriter.cpp     

http://commits.kde.org/calligra/6082115c052f113165a233e4cf27595126b56070

diff --git a/libs/kotext/opendocument/KoTextWriter.cpp \
b/libs/kotext/opendocument/KoTextWriter.cpp index 76b33e8..bfb2151 100644
--- a/libs/kotext/opendocument/KoTextWriter.cpp
+++ b/libs/kotext/opendocument/KoTextWriter.cpp
@@ -68,6 +68,7 @@
 #include <changetracker/KoFormatChangeInformation.h>
 #include <KoGenChange.h>
 #include <KoGenChanges.h>
+#include <KoXmlWriter.h>
 #include <rdf/KoDocumentRdfBase.h>
 #include <KoTableOfContentsGeneratorInfo.h>
 
@@ -176,11 +177,13 @@ public:
     QTextBlock& saveList(QTextBlock &block, QHash<QTextList *, QString> &listStyles, \
                int level);
     void saveTableOfContents(QTextDocument *document, int from, int to, \
QHash<QTextList *, QString> &listStyles, QTextTable *currentTable, QTextFrame *toc);  \
void writeBlocks(QTextDocument *document, int from, int to, QHash<QTextList *, \
QString> &listStyles, QTextTable *currentTable = 0, QTextFrame *currentFrame = 0, \
QTextList *currentList = 0); +    void saveInlineRdf(KoTextInlineRdf *rdf, \
TagInformation *tagInfos);  int checkForBlockChange(const QTextBlock &block);
     int checkForListItemChange(const QTextBlock &block);
     int checkForListChange(const QTextBlock &block);
     int checkForTableRowChange(int position);
     int checkForTableColumnChange(int position);
+    
     KoShapeSavingContext &context;
     KoTextSharedSavingData *sharedData;
     KoXmlWriter *writer;
@@ -812,6 +815,29 @@ QHash<QTextList *, QString> \
KoTextWriter::Private::saveListStyles(QTextBlock blo  return listStyles;
 }
 
+void KoTextWriter::Private::saveInlineRdf(KoTextInlineRdf* rdf, \
KoTextWriter::TagInformation* tagInfos) +{
+    QBuffer rdfXmlData;
+    KoXmlWriter *rdfXmlWriter = new KoXmlWriter(&rdfXmlData);
+    rdfXmlWriter->startDocument("rdf");
+    rdfXmlWriter->startElement("rdf");
+    rdf->saveOdf(context, rdfXmlWriter);
+    rdfXmlWriter->endElement();
+    rdfXmlWriter->endDocument();
+    KoXmlDocument *xmlReader = new KoXmlDocument;
+    xmlReader->setContent(rdfXmlData.data(), true);
+    KoXmlElement mainElement = xmlReader->documentElement();
+    QPair<QString, QString> attributeNameNS;
+    foreach (attributeNameNS, mainElement.attributeFullNames()) {
+        QString attributeName = \
QString("%1:%2").arg(KoXmlNS::nsURI2NS(attributeNameNS.first)) +                      \
.arg(attributeNameNS.second); +        if (attributeName.startsWith(':'))
+            attributeName.prepend("xml");
+        tagInfos->addAttribute(attributeName, \
mainElement.attribute(attributeNameNS.second)); +    }
+    delete(rdfXmlWriter);
+}
+
 void KoTextWriter::Private::saveParagraph(const QTextBlock &block, int from, int to)
 {
     QTextCursor cursor(block);
@@ -1005,7 +1031,8 @@ void KoTextWriter::Private::saveParagraph(const QTextBlock \
                &block, int from, int
                     if (KoTextInlineRdf* inlineRdf = \
KoTextInlineRdf::tryToGetInlineRdf(charFormat)) {  // Write xml:id here for Rdf
                         kDebug(30015) << "have inline rdf xmlid:" << \
                inlineRdf->xmlId();
-                        inlineRdf->saveOdf(context, writer);
+                        saveInlineRdf(inlineRdf, &fragmentTagInformation);
+                        //inlineRdf->saveOdf(context, writer);
                     }
                 } else if (!styleName.isEmpty() /*&& !identical*/) {
                     fragmentTagInformation.setTagName("text:span");
@@ -1013,7 +1040,8 @@ void KoTextWriter::Private::saveParagraph(const QTextBlock \
                &block, int from, int
                     if (KoTextInlineRdf* inlineRdf = \
KoTextInlineRdf::tryToGetInlineRdf(charFormat)) {  // Write xml:id here for Rdf
                         kDebug(30015) << "have inline rdf xmlid:" << \
                inlineRdf->xmlId();
-                        inlineRdf->saveOdf(context, writer);
+                        saveInlineRdf(inlineRdf, &fragmentTagInformation);
+                        //inlineRdf->saveOdf(context, writer);
                     }
                 }
 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic