35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux/*
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux * SVG conditional attribute evaluation
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux *
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux * Authors:
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux * Andrius R. <knutux@gmail.com>
9dc68827cbd515262ecb8d5ae8547d9e82c72e00Jon A. Cruz * Abhishek Sharma
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux *
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux * Copyright (C) 2006 authors
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux *
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux * Released under GNU GPL, read the file 'COPYING' for more information
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux */
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux#ifdef HAVE_CONFIG_H
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux# include "config.h"
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux#endif
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux#include <set>
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux#include <glibmm/ustring.h>
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux#include "conditions.h"
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux#include "xml/repr.h"
a73e5f92baa51f76f70126ed64cabac4fa811764tweenk#include "rdf.h"
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxtypedef bool (* condition_evaluator)(SPItem const *item, gchar const *value);
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxstruct Condition {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux gchar const *attribute;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux condition_evaluator evaluator;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux};
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxstatic bool evaluateSystemLanguage(SPItem const *item, gchar const *value);
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxstatic bool evaluateRequiredFeatures(SPItem const *item, gchar const *value);
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxstatic bool evaluateRequiredExtensions(SPItem const *item, gchar const *value);
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux/* define any conditional attributes and their handler functions in this array */
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxstatic Condition _condition_handlers[] = {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux { "systemLanguage", evaluateSystemLanguage },
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux { "requiredFeatures", evaluateRequiredFeatures },
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux { "requiredExtensions", evaluateRequiredExtensions },
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux};
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
9dc68827cbd515262ecb8d5ae8547d9e82c72e00Jon A. Cruz// function which evaluates if item should be displayed
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxbool sp_item_evaluate(SPItem const *item) {
9dc68827cbd515262ecb8d5ae8547d9e82c72e00Jon A. Cruz bool needDisplay = true;
9dc68827cbd515262ecb8d5ae8547d9e82c72e00Jon A. Cruz for ( unsigned int i = 0 ; needDisplay && (i < sizeof(_condition_handlers) / sizeof(_condition_handlers[0])) ; i++ ) {
ef610fdbfb424e7ad204ac9de142c05bb986e1dcAbhishek Sharma public gchar const *value = item->getAttribute(_condition_handlers[i].attribute);
9dc68827cbd515262ecb8d5ae8547d9e82c72e00Jon A. Cruz if ( value && !_condition_handlers[i].evaluator(item, value) ) {
9dc68827cbd515262ecb8d5ae8547d9e82c72e00Jon A. Cruz needDisplay = false;
9dc68827cbd515262ecb8d5ae8547d9e82c72e00Jon A. Cruz }
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux }
9dc68827cbd515262ecb8d5ae8547d9e82c72e00Jon A. Cruz return needDisplay;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux}
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux#define ISALNUM(c) (((c) >= 'a' && (c) <= 'z') || ((c) >= 'A' && (c) <= 'Z') || ((c) >= '0' && (c) <= '9'))
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxstatic gchar *preprocessLanguageCode(gchar *lngcode) {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux if ( NULL == lngcode )
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return NULL;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux lngcode = g_strstrip(lngcode);
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux if ( 0 == *lngcode )
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return lngcode;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux for ( unsigned int i = 0 ; i < strlen(lngcode) ; i++ ) {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux if ( lngcode[i] >= 'A' && lngcode[i] <= 'Z' ) {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux lngcode[i] = g_ascii_tolower(lngcode[i]);
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux } else if ( '_' == lngcode[i] ) {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux lngcode[i] = '-';
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux } else if ( !ISALNUM(lngcode[i]) && '-' != lngcode[i] ) {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // only alpha numeric characters and '-' may be contained in language code
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux lngcode[0] = 0;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux break;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux }
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux }
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return lngcode;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux}
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxstatic bool evaluateSystemLanguage(SPItem const *item, gchar const *value) {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux if ( NULL == value )
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return true;
27f0de16cb17d59b22ba3d0814a77f9b59c63413tavmjong-free
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux std::set<Glib::ustring> language_codes;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux gchar *str = NULL;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux gchar **strlist = g_strsplit( value, ",", 0);
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux for ( int i = 0 ; (str = strlist[i]) ; i++ ) {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux gchar *lngcode = preprocessLanguageCode(str);
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux if ( 0 == *lngcode )
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux continue;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux language_codes.insert(lngcode);
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux gchar *pos = strchr (lngcode, '-');
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux if (pos)
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // if subtag is used, primary tag is still a perfect match
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux *pos = 0;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux if ( language_codes.find(lngcode) == language_codes.end() ) {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux language_codes.insert(lngcode);
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux }
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux }
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux }
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux g_strfreev(strlist);
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux if (language_codes.empty())
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return false;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
9afeede0d946047f0421ae5f766568927eda11d6Jon A. Cruz SPDocument *document = item->document;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux Glib::ustring document_language = document->getLanguage();
27f0de16cb17d59b22ba3d0814a77f9b59c63413tavmjong-free
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux if (document_language.size() == 0)
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return false;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux bool match = true;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux strlist = g_strsplit( document_language.c_str(), ",", 0);
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux for ( int i = 0 ; (str = strlist[i]) ; i++ ) {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux gchar *lngcode = preprocessLanguageCode(str);
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux if ( 0 == *lngcode )
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux continue;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux if ( language_codes.find(lngcode) != language_codes.end() ) {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux match = true;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux break;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux }
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux match = false;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux }
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux g_strfreev(strlist);
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return match;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux}
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxstatic std::vector<Glib::ustring> splitByWhitespace(gchar const *value) {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux std::vector<Glib::ustring> parts;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux gchar *str = NULL;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux gchar **strlist = g_strsplit( value, ",", 0);
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux for ( int i = 0 ; (str = strlist[i]) ; i++ ) {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux gchar *part = g_strstrip(str);
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux if ( 0 == *part )
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux continue;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux parts.push_back(part);
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux }
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux g_strfreev(strlist);
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return parts;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux}
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux#define SVG11FEATURE "http://www.w3.org/TR/SVG11/feature#"
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux#define SVG10FEATURE "org.w3c."
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxstatic bool evaluateSVG11Feature(gchar const *feature) {
8eedd32fec442b11bd26c213c06c2e780209a825pjrm static gchar const *_supported_features[] = {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "SVG", // incomplete "SVG-static" - missing support for "Filter"
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux /* SVG - user agent supports at least one of the following:
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "SVG-static", "SVG-animation", "SVG-dynamic" or "SVGDOM" */
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "SVGDOM", // not sure
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux /* SVGDOM - user agent supports at least one of the following:
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "SVGDOM-static", "SVGDOM-animation" or "SVGDOM-dynamic" */
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "SVG-static", // incomplete - missing support for "Filter"
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux /* SVG-static - user agent supports the following features:
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "CoreAttribute", "Structure", "ContainerAttribute",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "ConditionalProcessing", "Image", "Style", "ViewportAttribute",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "Shape", "Text", "PaintAttribute", "OpacityAttribute",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "GraphicsAttribute", "Marker", "ColorProfile",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "Gradient", "Pattern", "Clip", "Mask", "Filter",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "XlinkAttribute", "Font", "Extensibility" */
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "SVGDOM-static", // not sure
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux /* SVGDOM-static - All of the DOM interfaces and methods
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux that correspond to SVG-static */
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "SVG-animation", // no support
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux /* SVG-animation - All of the language features from "SVG-static"
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux plus the feature "feature#Animation" */
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "SVGDOM-animation", // no support
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux /* SVGDOM-animation - All of the DOM interfaces and methods
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux that correspond to SVG-animation */
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "SVG-dynamic", // no support
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux /* SVG-dynamic - user agent supports all "SVG-animation" and the following features:
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "Hyperlinking", "Scripting", "View", "Cursor",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "GraphicalEventsAttribute", "DocumentEventsAttribute", "AnimationEventsAttribute" */
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "SVGDOM-dynamic", // no support
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux /* SVGDOM-dynamic - All of the DOM interfaces and methods
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux that correspond to SVG-dynamic */
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "CoreAttribute",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "Structure",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "BasicStructure",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "ContainerAttribute",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "ConditionalProcessing",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "Image",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "Style",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "ViewportAttribute", // not sure
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "Shape",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "Text",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "BasicText",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "PaintAttribute",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "BasicPaintAttribute",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "OpacityAttribute",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "GraphicsAttribute",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "BasicGraphicsAttribute",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "Marker",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "ColorProfile",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "Gradient",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "Pattern",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "Clip",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "BasicClip",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "Mask",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "Filter",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "BasicFilter",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "DocumentEventsAttribute",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "GraphicalEventsAttribute",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "AnimationEventsAttribute",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "Cursor", // not sure
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "Hyperlinking", // not sure
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "XlinkAttribute", // not sure
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "ExternalResourcesRequired", // not sure
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "View",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "Script",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "Animation",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "Font",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "BasicFont",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "Extensibility", // not sure
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux };
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux for ( unsigned int i = 0 ; i < sizeof(_supported_features)/sizeof(_supported_features[0]); i++ ) {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux if ( 0 == strcasecmp(feature, _supported_features[0]) )
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return true;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux }
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return false;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux}
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxstatic bool evaluateSVG10Feature(gchar const *feature) {
8eedd32fec442b11bd26c213c06c2e780209a825pjrm static gchar const *_supported_features[] = {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "svg.static", // incomplete - no filter effects
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "dom.svg.static", // not sure
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "svg.animation",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "dom.svg.animation",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "svg.dynamic",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "dom.svg.dynamic"
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "svg.all",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "dom.svg.all"
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux };
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux for ( unsigned int i = 0 ; i < sizeof(_supported_features)/sizeof(_supported_features[0]); i++ ) {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux if ( 0 == strcasecmp(feature, _supported_features[0]) )
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return true;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux }
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return false;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux}
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxstatic bool evaluateSingleFeature(gchar const *value) {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux if ( NULL == value )
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return false;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux gchar const *found;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux found = strstr(value, SVG11FEATURE);
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux if ( value == found )
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return evaluateSVG11Feature(found + strlen(SVG11FEATURE));
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux found = strstr(value, SVG10FEATURE);
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux if ( value == found )
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return evaluateSVG10Feature(found + strlen(SVG10FEATURE));
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return false;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux}
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
caf60ce95aac2d44c7cdd41125e9f4ab32ded886joncruzstatic bool evaluateRequiredFeatures(SPItem const */*item*/, gchar const *value) {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux if ( NULL == value )
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return true;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux std::vector<Glib::ustring> parts = splitByWhitespace(value);
b6b6fb614b494412013ec0cde6f9cd147e8207f3Kris if (parts.empty())
b6b6fb614b494412013ec0cde6f9cd147e8207f3Kris {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return false;
b6b6fb614b494412013ec0cde6f9cd147e8207f3Kris }
b6b6fb614b494412013ec0cde6f9cd147e8207f3Kris
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux for ( unsigned int i = 0 ; i < parts.size() ; i++ ) {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux if (!evaluateSingleFeature(parts[i].c_str())) {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return false;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux }
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux }
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return true;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux}
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
caf60ce95aac2d44c7cdd41125e9f4ab32ded886joncruzstatic bool evaluateRequiredExtensions(SPItem const */*item*/, gchar const *value) {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux if ( NULL == value )
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return true;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return false;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux}
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux/*
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux * Language codes and names:
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxaa Afar
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxab Abkhazian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxaf Afrikaans
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxam Amharic
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxar Arabic
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxas Assamese
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxay Aymara
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxaz Azerbaijani
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxba Bashkir
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxbe Byelorussian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxbg Bulgarian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxbh Bihari
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxbi Bislama
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxbn Bengali; Bangla
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxbo Tibetan
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxbr Breton
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxca Catalan
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxco Corsican
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxcs Czech
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxcy Welsh
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxda Danish
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxde German
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxdz Bhutani
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxel Greek
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxen English
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxeo Esperanto
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxes Spanish
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxet Estonian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxeu Basque
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxfa Persian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxfi Finnish
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxfj Fiji
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxfo Faroese
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxfr French
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxfy Frisian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxga Irish
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxgd Scots Gaelic
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxgl Galician
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxgn Guarani
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxgu Gujarati
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxha Hausa
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxhe Hebrew (formerly iw)
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxhi Hindi
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxhr Croatian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxhu Hungarian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxhy Armenian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxia Interlingua
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxid Indonesian (formerly in)
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxie Interlingue
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxik Inupiak
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxis Icelandic
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxit Italian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxiu Inuktitut
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxja Japanese
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxjw Javanese
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxka Georgian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxkk Kazakh
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxkl Greenlandic
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxkm Cambodian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxkn Kannada
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxko Korean
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxks Kashmiri
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxku Kurdish
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxky Kirghiz
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxla Latin
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxln Lingala
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxlo Laothian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxlt Lithuanian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxlv Latvian, Lettish
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxmg Malagasy
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxmi Maori
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxmk Macedonian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxml Malayalam
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxmn Mongolian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxmo Moldavian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxmr Marathi
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxms Malay
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxmt Maltese
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxmy Burmese
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxna Nauru
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxne Nepali
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxnl Dutch
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxno Norwegian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxoc Occitan
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxom (Afan) Oromo
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxor Oriya
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxpa Punjabi
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxpl Polish
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxps Pashto, Pushto
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxpt Portuguese
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxqu Quechua
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxrm Rhaeto-Romance
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxrn Kirundi
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxro Romanian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxru Russian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxrw Kinyarwanda
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxsa Sanskrit
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxsd Sindhi
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxsg Sangho
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxsh Serbo-Croatian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxsi Sinhalese
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxsk Slovak
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxsl Slovenian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxsm Samoan
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxsn Shona
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxso Somali
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxsq Albanian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxsr Serbian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxss Siswati
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxst Sesotho
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxsu Sundanese
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxsv Swedish
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxsw Swahili
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxta Tamil
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxte Telugu
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxtg Tajik
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxth Thai
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxti Tigrinya
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxtk Turkmen
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxtl Tagalog
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxtn Setswana
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxto Tonga
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxtr Turkish
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxts Tsonga
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxtt Tatar
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxtw Twi
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxug Uighur
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxuk Ukrainian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxur Urdu
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxuz Uzbek
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxvi Vietnamese
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxvo Volapuk
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxwo Wolof
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxxh Xhosa
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxyi Yiddish (formerly ji)
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxyo Yoruba
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxza Zhuang
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxzh Chinese
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxzu Zulu
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux */
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux/*
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux Local Variables:
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux mode:c++
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux c-file-style:"stroustrup"
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux indent-tabs-mode:nil
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux fill-column:99
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux End:
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux*/
a4030d5ca449e7e384bc699cd249ee704faaeab0Chris Morgan// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :