summaryrefslogtreecommitdiffstats
path: root/src/attribute-rel-svg.cpp
diff options
context:
space:
mode:
authorAndrew Higginson <at.higginson@gmail.com>2011-12-27 21:04:47 +0000
committerAndrew <at.higginson@gmail.com>2011-12-27 21:04:47 +0000
commit80960b623a99aae1402ab651b2974ef544ed3b03 (patch)
treeba49d42c2789e9e11f805e2d5263e10f9fedeef8 /src/attribute-rel-svg.cpp
parenttry to fix bug (diff)
parentGDL: Cherry-pick upstream patch 73852 (2011-03-23) - Add missing return value. (diff)
downloadinkscape-80960b623a99aae1402ab651b2974ef544ed3b03.tar.gz
inkscape-80960b623a99aae1402ab651b2974ef544ed3b03.zip
merged with trunk so I can build again...
(bzr r10092.1.36)
Diffstat (limited to 'src/attribute-rel-svg.cpp')
-rw-r--r--src/attribute-rel-svg.cpp120
1 files changed, 120 insertions, 0 deletions
diff --git a/src/attribute-rel-svg.cpp b/src/attribute-rel-svg.cpp
new file mode 100644
index 000000000..3f5ce9395
--- /dev/null
+++ b/src/attribute-rel-svg.cpp
@@ -0,0 +1,120 @@
+/*
+ * attribute-rel-svg.cpp
+ *
+ * Created on: Jul 25, 2011
+ * Author: abhishek
+ */
+
+/** \class SPAttributeRelSVG
+ *
+ * SPAttributeRelSVG class stores the mapping of element->attribute
+ * relationship and provides a static function to access that
+ * mapping indirectly(only reading).
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <fstream>
+#include <sstream>
+#include <string>
+
+#include "attribute-rel-svg.h"
+
+#include "path-prefix.h"
+#include "preferences.h"
+
+SPAttributeRelSVG * SPAttributeRelSVG::instance = NULL;
+
+/*
+ * This functions checks whether an element -> attribute pair is allowed or not
+ */
+bool SPAttributeRelSVG::findIfValid(Glib::ustring attribute, Glib::ustring element)
+{
+ if (SPAttributeRelSVG::instance == NULL) {
+ SPAttributeRelSVG::instance = new SPAttributeRelSVG();
+ }
+
+ // Strip of "svg:" from the element's name
+ Glib::ustring temp = element;
+ if ( temp.find("svg:") != std::string::npos ) {
+ temp.erase( temp.find("svg:"), 4 );
+ }
+
+ // Check for attributes with -, role, aria etc. to allow for more accessbility
+ if (attribute[0] == '-'
+ || attribute.substr(0,4) == "role"
+ || attribute.substr(0,4) == "aria"
+ || attribute.substr(0,5) == "xmlns"
+ || attribute.substr(0,9) == "inkscape:"
+ || attribute.substr(0,9) == "sodipodi:"
+ || attribute.substr(0,4) == "rdf:"
+ || attribute.substr(0,3) == "cc:"
+ || (SPAttributeRelSVG::instance->attributesOfElements[temp].find(attribute)
+ != SPAttributeRelSVG::instance->attributesOfElements[temp].end()) ) {
+ return true;
+ } else {
+ //g_warning( "Invalid attribute: %s used on <%s>", attribute.c_str(), element.c_str() );
+ return false;
+ }
+}
+
+/*
+ * One timer singleton constructor, to load the element -> attributes data
+ * into memory.
+ */
+SPAttributeRelSVG::SPAttributeRelSVG()
+{
+ std::fstream f;
+
+ // Read data from standard path
+ std::string filepath = INKSCAPE_ATTRRELDIR;
+ filepath += "/svgprops";
+
+ f.open(filepath.c_str(), std::ios::in);
+
+ if (!f.is_open()) {
+ // Set the default preference of attribute checking to ignore
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ prefs->setInt("/options/svgoutput/incorrect_attributes", 3);
+
+ // Display warning for file not open
+ g_warning("Could not open the data file for XML attribute-element map construction: %s", filepath.c_str());
+ f.close();
+ return ;
+ }
+
+ while (!f.eof()){
+ std::stringstream ss;
+ std::string s;
+
+ std::getline(f,s,'"');
+ std::getline(f,s,'"');
+ if(s.size() > 0 && s[0] != '\n'){
+ std::string prop = s;
+ getline(f,s);
+ ss << s;
+
+ while(std::getline(ss,s,'"')){
+ std::string element;
+ std::getline(ss,s,'"');
+ element = s;
+ attributesOfElements[element].insert(prop);
+ }
+ }
+ }
+
+ f.close();
+}
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :