define([
'libs/jquery',
+ 'libs/underscore',
'smartxml/smartxml'
-], function($, smartxml) {
+], function($, _, smartxml) {
'use strict';
//
+var AttributesList = function() {};
+AttributesList.prototype = Object.create({});
+AttributesList.prototype.keys = function() {
+ return _.keys(this);
+};
+
+
var WLXMLElementNode = function(nativeNode, document) {
smartxml.ElementNode.call(this, nativeNode, document);
};
$.extend(WLXMLElementNode.prototype, smartxml.ElementNode.prototype, {
getClass: function() {
- return this.getAttr('class');
+ return this.getAttr('class') || '';
},
setClass: function(klass) {
return this.setAttr('class', klass);
},
getMetaAttributes: function() {
- var toret = [];
- this.getAttrs().forEach(function(attr) {
- if(isMetaAttribute(attr.name)) {
- toret.push({name: attr.name.substr(5), value: attr.value});
+ var toret = new AttributesList(),
+ classParts = [''].concat(this.getClass().split('.')),
+ classCurrent, classDesc;
+
+ classParts.forEach(function(part) {
+ classCurrent = classCurrent ? classCurrent + '.' + part : part;
+ classDesc = this.document.options.wlxmlClasses[classCurrent];
+ if(classDesc) {
+ _.keys(classDesc.attrs).forEach(function(attrName) {
+ toret[attrName] = _.extend({value: this.getAttr('meta-' + attrName)}, classDesc.attrs[attrName]);
+ }.bind(this));
}
- });
+ }.bind(this));
return toret;
},
getOtherAttributes: function() {
-var WLXMLDocument = function(xml) {
+var WLXMLDocument = function(xml, options) {
smartxml.Document.call(this, xml);
+ this.options = options;
};
var formatter_prefix = '_wlxml_formatter_';
});
+var wlxmlClasses = {
+ 'uri': {
+ attrs: {uri: {type: 'string'}}
+ }
+};
return {
- WLXMLDocumentFromXML: function(xml) {
- return new WLXMLDocument(xml);
+ WLXMLDocumentFromXML: function(xml, options) {
+ options = _.extend({wlxmlClasses: wlxmlClasses}, options);
+ return new WLXMLDocument(xml, options);
},
WLXMLElementNodeFromXML: function(xml) {
'use strict';
+/* jshint expr:true */
/* global it, describe */
var expect = chai.expect;
return wlxml.WLXMLElementNodeFromXML(xml);
};
-var getDocumentFromXML = function(xml) {
- return wlxml.WLXMLDocumentFromXML(xml);
+var getDocumentFromXML = function(xml, options) {
+ return wlxml.WLXMLDocumentFromXML(xml, options || {});
};
expect(node.getClass()).to.equal('class.subclass');
});
- it('returns its attributes as dict', function() {
- var node = nodeFromXML('<span meta-attr1="val1" meta-attr2="val2"></span>');
- expect(node.getMetaAttributes()).to.eql([{name: 'attr1', value: 'val1'}, {name: 'attr2', value: 'val2'}]);
- });
-
it('returns attributes other than class and meta-* as other attributes', function() {
var node = nodeFromXML('<span class="uri" meta-attr="val" attr1="val1" attr2="val2"></span>');
expect(node.getOtherAttributes()).to.eql({attr1: 'val1', attr2: 'val2'});
});
});
+ describe('WLXML node meta attributes', function() {
+
+ it('inherits keys from super classes', function() {
+ var testClasses = {
+ '': {
+ attrs: {'common': {type: 'string'}}
+ },
+ 'a': {
+ attrs: {'a_attr': {type: 'string'}}
+ },
+ 'a.b': {
+ attrs: {'a_b_attr': {type: 'string'}}
+ },
+ 'a.b.c': {
+ attrs: {'a_b_c_attr': {type: 'string'}}
+ }
+ },
+ doc = getDocumentFromXML('<section></section>', {wlxmlClasses: testClasses}),
+ section = doc.root;
+
+ expect(section.getMetaAttributes().keys()).to.eql(['common']);
+
+ section.setClass('a');
+ expect(section.getMetaAttributes().keys().sort()).to.eql(['common', 'a_attr'].sort());
+
+ section.setClass('a.b');
+ expect(section.getMetaAttributes().keys().sort()).to.eql(['common', 'a_attr', 'a_b_attr'].sort());
+
+ section.setClass('a.b.c');
+ expect(section.getMetaAttributes().keys().sort()).to.eql(['common', 'a_attr', 'a_b_attr', 'a_b_c_attr'].sort());
+ });
+
+ describe('api', function() {
+ it('returns meta attributes as a dict', function() {
+ var testClasses = {
+ 'test': {
+ attrs: {
+ attr1: {type: 'string'},
+ attr2: {type: 'date'}
+ }
+ }
+ },
+ node = getDocumentFromXML(
+ '<span class="test" meta-attr1="val1" meta-attr2="2014-01-01"></span>',
+ {wlxmlClasses: testClasses}
+ ).root,
+ attrs = node.getMetaAttributes();
+
+ expect(attrs.keys().sort()).to.eql(['attr1', 'attr2'].sort());
+ expect(attrs.attr1.value).to.equal('val1');
+ expect(attrs.attr1.type).to.equal('string');
+ expect(attrs.attr2.value).to.equal('2014-01-01');
+ expect(attrs.attr2.type).to.equal('date');
+ });
+ it('returns undefined value if attribute is missing', function() {
+ var testClasses = {
+ 'test': {
+ attrs: {
+ attr1: {type: 'string'},
+ }
+ }
+ },
+ node = getDocumentFromXML('<span class="test"></span>', {wlxmlClasses: testClasses}).root,
+ attrs = node.getMetaAttributes();
+ expect(attrs.attr1.value).to.be.undefined;
+ });
+ });
+ });
+
describe('White space handling', function() {
it('ignores white space surrounding block elements', function() {
var node = nodeFromXML('<section> <div></div> </section>'),