28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free/*
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free * attribute-rel-css.cpp
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free *
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free * Created on: Jul 25, 2011
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free * Author: abhishek
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free */
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free/** \class SPAttributeRelCSS
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free *
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free * SPAttributeRelCSS class stores the mapping of element->style_properties
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free * relationship and provides a static function to access that
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free * mapping indirectly(only reading).
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free */
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free#ifdef HAVE_CONFIG_H
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free# include <config.h>
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free#endif
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free#include <fstream>
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free#include <sstream>
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free#include <string>
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free#include <iostream>
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free#include "attribute-rel-css.h"
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free#include "path-prefix.h"
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free#include "preferences.h"
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-freeSPAttributeRelCSS * SPAttributeRelCSS::instance = NULL;
038c5713d0a49f1bf9fec03f116387bd945a27c8tavmjong-freebool SPAttributeRelCSS::foundFileProp = false;
038c5713d0a49f1bf9fec03f116387bd945a27c8tavmjong-freebool SPAttributeRelCSS::foundFileDefault = false;
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free/*
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free * This function checks whether an element -> CSS property pair
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free * is allowed or not
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free */
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-freebool SPAttributeRelCSS::findIfValid(Glib::ustring property, Glib::ustring element)
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free{
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free if (SPAttributeRelCSS::instance == NULL) {
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free SPAttributeRelCSS::instance = new SPAttributeRelCSS();
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free }
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free
038c5713d0a49f1bf9fec03f116387bd945a27c8tavmjong-free // Always valid if data file not found!
038c5713d0a49f1bf9fec03f116387bd945a27c8tavmjong-free if( !foundFileProp ) return true;
038c5713d0a49f1bf9fec03f116387bd945a27c8tavmjong-free
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free // Strip of "svg:" from the element's name
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free Glib::ustring temp = element;
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free if ( temp.find("svg:") != std::string::npos ) {
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free temp.erase( temp.find("svg:"), 4 );
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free }
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free // Don't check for properties with -, role, aria etc. to allow for more accessbility
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free // FixMe: Name space list should be created when file read in.
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free if (property[0] == '-'
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free || property.substr(0,4) == "role"
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free || property.substr(0,4) == "aria"
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free || property.substr(0,5) == "xmlns"
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free || property.substr(0,8) == "inkscape:"
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free || property.substr(0,9) == "sodipodi:"
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free || property.substr(0,4) == "rdf:"
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free || property.substr(0,3) == "cc:"
6093ffd39c5580cfcd4e151cc6069cb94170a08btavmjong-free || property.substr(0,4) == "ns1:" // JessyInk
2bb676e8e9d55e40a19a90c055d46e35195f9430tavmjong-free || property.substr(0,4) == "osb:" // Open Swatch Book
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free || (SPAttributeRelCSS::instance->propertiesOfElements[temp].find(property)
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free != SPAttributeRelCSS::instance->propertiesOfElements[temp].end()) ) {
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free return true;
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free } else {
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free //g_warning( "Invalid attribute: %s used on <%s>", property.c_str(), element.c_str() );
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free return false;
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free }
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free}
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free/*
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free * This function checks whether an CSS property -> default value
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free * pair is allowed or not
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free */
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-freebool SPAttributeRelCSS::findIfDefault(Glib::ustring property, Glib::ustring value)
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free{
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free if (SPAttributeRelCSS::instance == NULL) {
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free SPAttributeRelCSS::instance = new SPAttributeRelCSS();
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free }
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free
038c5713d0a49f1bf9fec03f116387bd945a27c8tavmjong-free // Always false if data file not found!
038c5713d0a49f1bf9fec03f116387bd945a27c8tavmjong-free if( !foundFileDefault ) return false;
038c5713d0a49f1bf9fec03f116387bd945a27c8tavmjong-free
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free if( instance->defaultValuesOfProps[property] == value) {
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free return true;
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free } else {
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free return false;
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free }
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free}
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free/*
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free * Check if property can be inherited.
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free */
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-freebool SPAttributeRelCSS::findIfInherit(Glib::ustring property)
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free{
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free if (SPAttributeRelCSS::instance == NULL) {
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free SPAttributeRelCSS::instance = new SPAttributeRelCSS();
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free }
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free
038c5713d0a49f1bf9fec03f116387bd945a27c8tavmjong-free // Always false if data file not found!
038c5713d0a49f1bf9fec03f116387bd945a27c8tavmjong-free if( !foundFileDefault ) return false;
038c5713d0a49f1bf9fec03f116387bd945a27c8tavmjong-free
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free return instance->inheritProps[property];
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free}
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free/*
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free * Check if attribute is a property.
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free */
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-freebool SPAttributeRelCSS::findIfProperty(Glib::ustring property)
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free{
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free if (SPAttributeRelCSS::instance == NULL) {
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free SPAttributeRelCSS::instance = new SPAttributeRelCSS();
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free }
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free
038c5713d0a49f1bf9fec03f116387bd945a27c8tavmjong-free // Always true if data file not found!
038c5713d0a49f1bf9fec03f116387bd945a27c8tavmjong-free if( !foundFileProp ) return true;
038c5713d0a49f1bf9fec03f116387bd945a27c8tavmjong-free
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free return ( instance->defaultValuesOfProps.find( property )
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free != instance->defaultValuesOfProps.end() );
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free}
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-freeSPAttributeRelCSS::SPAttributeRelCSS()
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free{
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free // Read data from standard path
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free std::string filepath = INKSCAPE_ATTRRELDIR;
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free filepath += "/cssprops";
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free // Try and load data from filepath
038c5713d0a49f1bf9fec03f116387bd945a27c8tavmjong-free if (readDataFromFileIn(filepath, SPAttributeRelCSS::prop_element_pair)) {
038c5713d0a49f1bf9fec03f116387bd945a27c8tavmjong-free foundFileProp = true;
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free }
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free // Read data from standard path
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free filepath = INKSCAPE_ATTRRELDIR;
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free filepath += "/css_defaults";
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free // Try and load data from filepath
038c5713d0a49f1bf9fec03f116387bd945a27c8tavmjong-free if (readDataFromFileIn(filepath, SPAttributeRelCSS::prop_defValue_pair)) {
038c5713d0a49f1bf9fec03f116387bd945a27c8tavmjong-free foundFileDefault = true;
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free }
038c5713d0a49f1bf9fec03f116387bd945a27c8tavmjong-free
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free}
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-freebool SPAttributeRelCSS::readDataFromFileIn(Glib::ustring fileName, storageType type)
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free{
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free std::fstream file;
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free file.open(fileName.c_str(), std::ios::in);
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free if (!file.is_open()) {
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free // Display warning for file not open
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free g_warning("Could not open the data file for CSS attribute-element map construction: %s", fileName.c_str());
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free file.close();
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free return false;
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free }
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free while (!file.eof()) {
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free std::stringstream ss;
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free std::string s;
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free std::getline(file,s,'"');
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free std::getline(file,s,'"');
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free if (s.size() > 0 && s[0] != '\n') {
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free std::string prop = s;
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free getline(file,s);
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free ss << s;
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free // Load data to structure that holds element -> set of CSS props
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free if (type == SPAttributeRelCSS::prop_element_pair) {
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free while (std::getline(ss,s,'"')) {
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free std::string element;
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free std::getline(ss,s,'"');
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free element = s;
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free propertiesOfElements[element].insert(prop);
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free }
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free // Load data to structure that holds CSS prop -> default value
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free } else if (type == SPAttributeRelCSS::prop_defValue_pair) {
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free std::string value;
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free std::getline(ss,s,'"');
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free std::getline(ss,s,'"');
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free value = s;
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free defaultValuesOfProps[prop] = value;
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free std::getline(ss,s,'"');
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free std::getline(ss,s,'"');
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free gboolean inherit = false;
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free if ( s.find( "yes" ) != std::string::npos ) {
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free inherit = true;
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free }
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free inheritProps[prop] = inherit;
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free }
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free }
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free }
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free file.close();
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free return true;
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free}
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free/*
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free Local Variables:
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free mode:c++
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free c-file-style:"stroustrup"
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free indent-tabs-mode:nil
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free fill-column:99
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free End:
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free*/
28bf548be956fa98bffa377e2caba5f28fb281adtavmjong-free// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :