35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux * SVG conditional attribute evaluation
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux * Andrius R. <knutux@gmail.com>
9dc68827cbd515262ecb8d5ae8547d9e82c72e00Jon A. Cruz * Abhishek Sharma
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux * Copyright (C) 2006 authors
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux * Released under GNU GPL, read the file 'COPYING' for more information
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxtypedef bool (* condition_evaluator)(SPItem const *item, gchar const *value);
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/* define any conditional attributes and their handler functions in this array */
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux { "requiredExtensions", evaluateRequiredExtensions },
9dc68827cbd515262ecb8d5ae8547d9e82c72e00Jon A. Cruz// function which evaluates if item should be displayed
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) ) {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux#define ISALNUM(c) (((c) >= 'a' && (c) <= 'z') || ((c) >= 'A' && (c) <= 'Z') || ((c) >= '0' && (c) <= '9'))
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxstatic gchar *preprocessLanguageCode(gchar *lngcode) {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux if ( 0 == *lngcode )
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux for ( unsigned int i = 0 ; i < strlen(lngcode) ; i++ ) {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux } else if ( !ISALNUM(lngcode[i]) && '-' != lngcode[i] ) {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // only alpha numeric characters and '-' may be contained in language code
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxstatic bool evaluateSystemLanguage(SPItem const *item, gchar const *value) {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return true;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux if ( 0 == *lngcode )
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // if subtag is used, primary tag is still a perfect match
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux if ( language_codes.find(lngcode) == language_codes.end() ) {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return false;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux Glib::ustring document_language = document->getLanguage();
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return false;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux bool match = true;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux strlist = g_strsplit( document_language.c_str(), ",", 0);
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux if ( 0 == *lngcode )
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux if ( language_codes.find(lngcode) != language_codes.end() ) {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxstatic std::vector<Glib::ustring> splitByWhitespace(gchar const *value) {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux if ( 0 == *part )
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux#define SVG11FEATURE "http://www.w3.org/TR/SVG11/feature#"
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxstatic bool evaluateSVG11Feature(gchar const *feature) {
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 "BasicText",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "PaintAttribute",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "BasicPaintAttribute",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "OpacityAttribute",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "GraphicsAttribute",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "BasicGraphicsAttribute",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "ColorProfile",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "Gradient",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "BasicClip",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "Filter",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "BasicFilter",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "DocumentEventsAttribute",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "GraphicalEventsAttribute",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "AnimationEventsAttribute",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "Cursor", // not sure
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "Script",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "Animation",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux "BasicFont",
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 return false;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxstatic bool evaluateSVG10Feature(gchar const *feature) {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "svg.animation",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "dom.svg.animation",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "svg.dynamic",
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "dom.svg.dynamic"
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux // "svg.all",
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 return false;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxstatic bool evaluateSingleFeature(gchar const *value) {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return false;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return evaluateSVG11Feature(found + strlen(SVG11FEATURE));
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return evaluateSVG10Feature(found + strlen(SVG10FEATURE));
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return false;
caf60ce95aac2d44c7cdd41125e9f4ab32ded886joncruzstatic bool evaluateRequiredFeatures(SPItem const */*item*/, gchar const *value) {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return true;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux std::vector<Glib::ustring> parts = splitByWhitespace(value);
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return false;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux for ( unsigned int i = 0 ; i < parts.size() ; i++ ) {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return false;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return true;
caf60ce95aac2d44c7cdd41125e9f4ab32ded886joncruzstatic bool evaluateRequiredExtensions(SPItem const */*item*/, gchar const *value) {
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return true;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux return false;
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux * Language codes and names:
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxab Abkhazian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxaf Afrikaans
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxaz Azerbaijani
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxbe Byelorussian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxbg Bulgarian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxbn Bengali; Bangla
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxeo Esperanto
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxgd Scots Gaelic
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxhe Hebrew (formerly iw)
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxhu Hungarian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxia Interlingua
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxid Indonesian (formerly in)
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxie Interlingue
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxis Icelandic
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxiu Inuktitut
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxkl Greenlandic
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxkm Cambodian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxlt Lithuanian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxlv Latvian, Lettish
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxmk Macedonian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxml Malayalam
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxmn Mongolian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxmo Moldavian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxno Norwegian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxom (Afan) Oromo
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxps Pashto, Pushto
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxpt Portuguese
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxrm Rhaeto-Romance
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxrw Kinyarwanda
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxsh Serbo-Croatian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxsi Sinhalese
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxsl Slovenian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxsu Sundanese
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxuk Ukrainian
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxvi Vietnamese
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutuxyi Yiddish (formerly ji)
35e0418c921e7057987f57ba30ba95ec5e03c9e5knutux Local Variables:
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
a4030d5ca449e7e384bc699cd249ee704faaeab0Chris Morgan// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :