Code

Mnemonics in "Fill and stroke", "Align and distribute", and "Transform" dialogs ...
[inkscape.git] / src / extension / internal / svg.cpp
index 19d770af0af04e968ff483607fcc11b86fb521da..946ff22fe196a7651d2efce60f1efc866f864aed 100644 (file)
@@ -6,6 +6,8 @@
  * Authors:
  *   Lauris Kaplinski <lauris@kaplinski.com>
  *   Ted Gould <ted@gould.cx>
+ *   Jon A. Cruz <jon@joncruz.org>
+ *   Abhishek Sharma
  *
  * Copyright (C) 2002-2003 Authors
  *
@@ -21,6 +23,7 @@
 #include "extension/system.h"
 #include "extension/output.h"
 #include <vector>
+#include "xml/attribute-record.h"
 
 #ifdef WITH_GNOME_VFS
 # include <libgnomevfs/gnome-vfs.h>
@@ -32,6 +35,37 @@ namespace Internal {
 
 #include "clear-n_.h"
 
+
+using Inkscape::Util::List;
+using Inkscape::XML::AttributeRecord;
+using Inkscape::XML::Node;
+
+
+
+void pruneExtendedAttributes( Inkscape::XML::Node *repr )
+{
+    if (repr) {
+        if ( repr->type() == Inkscape::XML::ELEMENT_NODE ) {
+            std::vector<gchar const*> toBeRemoved;
+            for ( List<AttributeRecord const> it = repr->attributeList(); it; ++it ) {
+                const gchar* attrName = g_quark_to_string(it->key);
+                if ((strncmp("inkscape:", attrName, 9) == 0) || (strncmp("sodipodi:", attrName, 9) == 0)) {
+                    toBeRemoved.push_back(attrName);
+                }
+            }
+            // Can't change the set we're interating over while we are iterating.
+            for ( std::vector<gchar const*>::iterator it = toBeRemoved.begin(); it != toBeRemoved.end(); ++it ) {
+                repr->setAttribute(*it, 0);
+            }
+        }
+
+        for ( Node *child = repr->firstChild(); child; child = child->next() ) {
+            pruneExtendedAttributes(child);
+        }
+    }
+}
+
+
 /**
     \return   None
     \brief    What would an SVG editor be without loading/saving SVG
@@ -150,19 +184,19 @@ Svg::open (Inkscape::Extension::Input */*mod*/, const gchar *uri)
 #ifdef WITH_GNOME_VFS
     if (!gnome_vfs_initialized() || gnome_vfs_uri_is_local(gnome_vfs_uri_new(uri))) {
         // Use built-in loader instead of VFS for this
-        return sp_document_new(uri, TRUE);
+        return SPDocument::createNewDoc(uri, TRUE);
     }
     gchar * buffer = _load_uri(uri);
     if (buffer == NULL) {
         g_warning("Error:  Could not open file '%s' with VFS\n", uri);
         return NULL;
     }
-    SPDocument * doc = sp_document_new_from_mem(buffer, strlen(buffer), 1);
+    SPDocument * doc = SPDocument::createNewDocFromMem(buffer, strlen(buffer), 1);
 
     g_free(buffer);
     return doc;
 #else
-    return sp_document_new (uri, TRUE);
+    return SPDocument::createNewDoc(uri, TRUE);
 #endif
 }
 
@@ -175,11 +209,11 @@ Svg::open (Inkscape::Extension::Input */*mod*/, const gchar *uri)
     \param     doc   Document to save.
     \param     uri   The filename to save the file to.
 
-    This function first checks it's parameters, and makes sure that
+    This function first checks its parameters, and makes sure that
     we're getting good data.  It also checks the module ID of the
-    incoming module to figure out if this is save should include
+    incoming module to figure out whether this save should include
     the Inkscape namespace stuff or not.  The result of that comparison
-    is stored in the spns variable.
+    is stored in the exportExtensions variable.
 
     If there is not to be Inkscape name spaces a new document is created
     without.  (I think, I'm not sure on this code)
@@ -191,35 +225,35 @@ Svg::open (Inkscape::Extension::Input */*mod*/, const gchar *uri)
     all of this code.  I just stole it.
 */
 void
-Svg::save (Inkscape::Extension::Output *mod, SPDocument *doc, const gchar *uri)
+Svg::save(Inkscape::Extension::Output *mod, SPDocument *doc, gchar const *filename)
 {
     g_return_if_fail(doc != NULL);
-    g_return_if_fail(uri != NULL);
+    g_return_if_fail(filename != NULL);
 
-    gchar *save_path = g_path_get_dirname (uri);
+    gchar *save_path = g_path_get_dirname(filename);
 
-    gboolean const spns = (!mod->get_id()
+    bool const exportExtensions = ( !mod->get_id()
       || !strcmp (mod->get_id(), SP_MODULE_KEY_OUTPUT_SVG_INKSCAPE)
       || !strcmp (mod->get_id(), SP_MODULE_KEY_OUTPUT_SVGZ_INKSCAPE));
 
     Inkscape::XML::Document *rdoc = NULL;
     Inkscape::XML::Node *repr = NULL;
-    if (spns) {
-        repr = sp_document_repr_root (doc);
+    if (exportExtensions) {
+        repr = doc->getReprRoot();
     } else {
         rdoc = sp_repr_document_new ("svg:svg");
         repr = rdoc->root();
-        repr = sp_document_root (doc)->updateRepr(repr, SP_OBJECT_WRITE_BUILD);
-    }
+        repr = doc->getRoot()->updateRepr(rdoc, repr, SP_OBJECT_WRITE_BUILD);
 
-    Inkscape::IO::fixupHrefs( doc, save_path, spns );
+        pruneExtendedAttributes(repr);
+    }
 
-    gboolean const s = sp_repr_save_file (repr->document(), uri, SP_SVG_NS_URI);
-    if (s == FALSE) {
+    if (!sp_repr_save_rebased_file(repr->document(), filename, SP_SVG_NS_URI,
+                                   doc->getBase(), filename)) {
         throw Inkscape::Extension::Output::save_failed();
     }
 
-    if (!spns) {
+    if (!exportExtensions) {
         Inkscape::GC::release(rdoc);
     }