/** * Parses the attributes an element has and sets the corresponding attributes. * @returns {Function} */ module.exports = (function (){ var attributeParser = {}, // Style ANONYMOUS = "anonymous", DATATYPE = "datatype", DEPRECATED = "deprecated", EXTERNAL = "external", OBJECT = "object", RDF = "rdf", // Representations ASYMMETRIC = "asymmetric", FUNCTIONAL = "functional", INVERSE_FUNCTIONAL = "inverse functional", IRREFLEXIVE = "irreflexive", KEY = "key", REFLEXIVE = "reflexive", SYMMETRIC = "symmetric", TRANSITIVE = "transitive", // Attribute groups VISUAL_ATTRIBUTE_GROUPS = [ [DEPRECATED, DATATYPE, OBJECT, RDF], [ANONYMOUS] ], CLASS_INDICATIONS = [DEPRECATED, EXTERNAL], PROPERTY_INDICATIONS = [ASYMMETRIC, FUNCTIONAL, INVERSE_FUNCTIONAL, IRREFLEXIVE, KEY, REFLEXIVE, SYMMETRIC, TRANSITIVE]; /** * Parses and sets the attributes of a class. * @param clazz */ attributeParser.parseClassAttributes = function ( clazz ){ if ( !(clazz.attributes() instanceof Array) ) { return; } parseVisualAttributes(clazz); parseClassIndications(clazz); }; function parseVisualAttributes( element ){ VISUAL_ATTRIBUTE_GROUPS.forEach(function ( attributeGroup ){ setVisualAttributeOfGroup(element, attributeGroup); }); } function setVisualAttributeOfGroup( element, group ){ var i, l, attribute; for ( i = 0, l = group.length; i < l; i++ ) { attribute = group[i]; if ( element.attributes().indexOf(attribute) >= 0 ) { element.visualAttributes().push(attribute); // Just a single attribute is possible break; } } } function parseClassIndications( clazz ){ var i, l, indication; for ( i = 0, l = CLASS_INDICATIONS.length; i < l; i++ ) { indication = CLASS_INDICATIONS[i]; if ( clazz.attributes().indexOf(indication) >= 0 ) { clazz.indications().push(indication); } } } /** * Parses and sets the attributes of a property. * @param property */ attributeParser.parsePropertyAttributes = function ( property ){ if ( !(property.attributes() instanceof Array) ) { return; } parseVisualAttributes(property); parsePropertyIndications(property); }; function parsePropertyIndications( property ){ var i, l, indication; for ( i = 0, l = PROPERTY_INDICATIONS.length; i < l; i++ ) { indication = PROPERTY_INDICATIONS[i]; if ( property.attributes().indexOf(indication) >= 0 ) { property.indications().push(indication); } } } return function (){ // Return a function to keep module interfaces consistent return attributeParser; }; })();