X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fextension%2Finternal%2Fsvg.cpp;h=946ff22fe196a7651d2efce60f1efc866f864aed;hb=6302669b796eadd6994ecdc2e70f0119b29194dd;hp=47f1ce31bfddebd7ac7c67648b862f408b2d63f2;hpb=07916b4c23e70df45383ea8348cf817c1d029083;p=inkscape.git diff --git a/src/extension/internal/svg.cpp b/src/extension/internal/svg.cpp index 47f1ce31b..946ff22fe 100644 --- a/src/extension/internal/svg.cpp +++ b/src/extension/internal/svg.cpp @@ -6,6 +6,8 @@ * Authors: * Lauris Kaplinski * Ted Gould + * Jon A. Cruz + * Abhishek Sharma * * Copyright (C) 2002-2003 Authors * @@ -21,6 +23,7 @@ #include "extension/system.h" #include "extension/output.h" #include +#include "xml/attribute-record.h" #ifdef WITH_GNOME_VFS # include @@ -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 toBeRemoved; + for ( List 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::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 @@ -51,7 +85,7 @@ Svg::init(void) /* SVG in */ ext = Inkscape::Extension::build_from_mem( - "\n" + "\n" "" N_("SVG Input") "\n" "" SP_MODULE_KEY_INPUT_SVG "\n" "\n" @@ -65,7 +99,7 @@ Svg::init(void) /* SVG out Inkscape */ ext = Inkscape::Extension::build_from_mem( - "\n" + "\n" "" N_("SVG Output Inkscape") "\n" "" SP_MODULE_KEY_OUTPUT_SVG_INKSCAPE "\n" "\n" @@ -73,13 +107,13 @@ Svg::init(void) "image/x-inkscape-svg\n" "" N_("Inkscape SVG (*.svg)") "\n" "" N_("SVG format with Inkscape extensions") "\n" - "FALSE\n" + "false\n" "\n" "", new Svg()); /* SVG out */ ext = Inkscape::Extension::build_from_mem( - "\n" + "\n" "" N_("SVG Output") "\n" "" SP_MODULE_KEY_OUTPUT_SVG "\n" "\n" @@ -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); }