[calligra] libs/kotext: Do not create rdf objects if the xml:id doesn't start with rdfid-

Boudewijn Rempt boud at valdyas.org
Wed Dec 14 15:51:14 UTC 2011


Git commit c8277fb5d062a50e1c3654d35c808bb7dccff42f by Boudewijn Rempt.
Committed on 14/12/2011 at 16:48.
Pushed by rempt into branch 'master'.

Do not create rdf objects if the xml:id doesn't start with rdfid-

Following the deprecation of draw:id and text:id, elements that used to
just save draw:id and text:id now also save these id's as xml:id.

Calligra's rdf support thinks that every xml:id is a reference to some
rdf metadata. This breaks because there _is_ no rdf data associated.

Until I've found a proper solution to shared xml:id's between various
parts of calligra, check whether the xml:id starts with rdfid- and only
then load the metadata.

Yes, this probably means we can no longer load documents with rdf saved
by other applications like abiword. I'm working on a "proper" solution.

CCMAIL:calligra-devel at kde.org

M  +4    -0    libs/kotext/KoBookmark.cpp
M  +3    -0    libs/kotext/KoTextInlineRdf.cpp
M  +34   -13   libs/kotext/opendocument/KoTextLoader.cpp

http://commits.kde.org/calligra/c8277fb5d062a50e1c3654d35c808bb7dccff42f

diff --git a/libs/kotext/KoBookmark.cpp b/libs/kotext/KoBookmark.cpp
index 8a40d02..7fb07ba 100644
--- a/libs/kotext/KoBookmark.cpp
+++ b/libs/kotext/KoBookmark.cpp
@@ -169,6 +169,10 @@ bool KoBookmark::loadOdf(const KoXmlElement &element, KoShapeLoadingContext &con
                 if (inlineRdf->loadOdf(element)) {
                     setInlineRdf(inlineRdf);
                 }
+                else {
+                    delete inlineRdf;
+                    inlineRdf = 0;
+                }
             }
         }
         else if (localName == "bookmark-end") {
diff --git a/libs/kotext/KoTextInlineRdf.cpp b/libs/kotext/KoTextInlineRdf.cpp
index 6328d11..f449426 100644
--- a/libs/kotext/KoTextInlineRdf.cpp
+++ b/libs/kotext/KoTextInlineRdf.cpp
@@ -145,6 +145,9 @@ KoTextInlineRdf::~KoTextInlineRdf()
 bool KoTextInlineRdf::loadOdf(const KoXmlElement &e)
 {
     d->id = e.attribute("id", QString());
+    if (!d->id.startsWith("rdfid-")) {
+        return false;
+    }
     d->subject = e.attributeNS(KoXmlNS::xhtml, "about");
     d->predicate = e.attributeNS(KoXmlNS::xhtml, "property");
     d->dt = e.attributeNS(KoXmlNS::xhtml, "datatype");
diff --git a/libs/kotext/opendocument/KoTextLoader.cpp b/libs/kotext/opendocument/KoTextLoader.cpp
index 397ab54..db9f6b1 100644
--- a/libs/kotext/opendocument/KoTextLoader.cpp
+++ b/libs/kotext/opendocument/KoTextLoader.cpp
@@ -1080,8 +1080,13 @@ void KoTextLoader::loadParagraph(const KoXmlElement &element, QTextCursor &curso
         QTextBlock block = cursor.block();
         KoTextInlineRdf* inlineRdf =
                 new KoTextInlineRdf((QTextDocument*)block.document(), block);
-        inlineRdf->loadOdf(element);
-        KoTextInlineRdf::attach(inlineRdf, cursor);
+        if (inlineRdf->loadOdf(element)) {
+                KoTextInlineRdf::attach(inlineRdf, cursor);
+        }
+        else {
+            delete inlineRdf;
+            inlineRdf = 0;
+        }
     }
 
 #ifdef KOOPENDOCUMENTLOADER_DEBUG
@@ -1147,8 +1152,13 @@ void KoTextLoader::loadHeading(const KoXmlElement &element, QTextCursor &cursor)
         QTextBlock block = cursor.block();
         KoTextInlineRdf* inlineRdf =
                 new KoTextInlineRdf((QTextDocument*)block.document(), block);
-        inlineRdf->loadOdf(element);
-        KoTextInlineRdf::attach(inlineRdf, cursor);
+        if (inlineRdf->loadOdf(element)) {
+            KoTextInlineRdf::attach(inlineRdf, cursor);
+        }
+        else {
+            delete inlineRdf;
+            inlineRdf = 0;
+        }
     }
 
 #ifdef KOOPENDOCUMENTLOADER_DEBUG
@@ -1715,7 +1725,7 @@ void KoTextLoader::loadSpan(const KoXmlElement &element, QTextCursor &cursor, bo
             QString target = ts.attributeNS(KoXmlNS::xlink, "href");
             QString styleName = ts.attributeNS(KoXmlNS::text, "style-name", QString());
             QTextCharFormat cf = cursor.charFormat(); // store the current cursor char format
-            
+
             if (!styleName.isEmpty()) {
                 KoCharacterStyle *characterStyle = d->textSharedData->characterStyle(styleName, d->stylesDotXml);
                 if (characterStyle) {
@@ -1728,10 +1738,10 @@ void KoTextLoader::loadSpan(const KoXmlElement &element, QTextCursor &cursor, bo
             newCharFormat.setAnchor(true);
             newCharFormat.setAnchorHref(target);
             cursor.setCharFormat(newCharFormat);
-            
+
             loadSpan(ts, cursor, stripLeadingSpace);   // recurse
             cursor.setCharFormat(cf); // restore the cursor char format
-            
+
             if (!ts.attributeNS(KoXmlNS::delta, "insertion-type").isEmpty())
                 d->closeChangeRegion(ts);
         } else if (isTextNS && localName == "line-break") { // text:line-break
@@ -1759,8 +1769,14 @@ void KoTextLoader::loadSpan(const KoXmlElement &element, QTextCursor &cursor, bo
                         || ts.hasAttribute("id")) {
                     KoTextInlineRdf* inlineRdf =
                             new KoTextInlineRdf((QTextDocument*)document, startmark);
-                    inlineRdf->loadOdf(ts);
-                    startmark->setInlineRdf(inlineRdf);
+                    if (inlineRdf->loadOdf(ts)) {
+                        startmark->setInlineRdf(inlineRdf);
+                    }
+                    else {
+                        delete inlineRdf;
+                        inlineRdf = 0;
+                    }
+
                 }
 
                 loadSpan(ts, cursor, stripLeadingSpace);   // recurse
@@ -2299,10 +2315,15 @@ void KoTextLoader::loadTableCell(KoXmlElement &rowTag, QTextTable *tbl, QList<QR
         // rowTag is the current table cell.
         if (rowTag.hasAttributeNS(KoXmlNS::xhtml, "property") || rowTag.hasAttribute("id")) {
             KoTextInlineRdf* inlineRdf = new KoTextInlineRdf((QTextDocument*)cursor.block().document(),cell);
-            inlineRdf->loadOdf(rowTag);
-            QTextTableCellFormat cellFormat = cell.format().toTableCellFormat();
-            cellFormat.setProperty(KoTableCellStyle::InlineRdf,QVariant::fromValue(inlineRdf));
-            cell.setFormat(cellFormat);
+            if (inlineRdf->loadOdf(rowTag)) {
+                QTextTableCellFormat cellFormat = cell.format().toTableCellFormat();
+                cellFormat.setProperty(KoTableCellStyle::InlineRdf,QVariant::fromValue(inlineRdf));
+                cell.setFormat(cellFormat);
+            }
+            else {
+                delete inlineRdf;
+                inlineRdf = 0;
+            }
         }
 
         cursor = cell.firstCursorPosition();


More information about the calligra-devel mailing list