mirror of
https://github.com/marko-js/marko.git
synced 2025-12-08 19:26:05 +00:00
149 lines
3.6 KiB
JavaScript
149 lines
3.6 KiB
JavaScript
'use strict';
|
|
|
|
var ok = require('assert').ok;
|
|
|
|
var HtmlAttribute = require('./HtmlAttribute');
|
|
var Node = require('./Node');
|
|
|
|
class HtmlAttributeCollection {
|
|
constructor(attributes) {
|
|
this.setAttributes(attributes);
|
|
}
|
|
|
|
addAttribute(newAttr) {
|
|
if (arguments.length === 2) {
|
|
let name = arguments[0];
|
|
let expression = arguments[1];
|
|
newAttr = new HtmlAttribute(name, expression);
|
|
} else if (!HtmlAttribute.isHtmlAttribute(newAttr)) {
|
|
newAttr = new HtmlAttribute(newAttr);
|
|
}
|
|
|
|
var name = newAttr.name;
|
|
|
|
if (this.lookup.hasOwnProperty(name)) {
|
|
for (var i=0; i<this.all.length; i++) {
|
|
var curAttr = this.all[i];
|
|
if (curAttr.name === name) {
|
|
this.all.splice(i, 1);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (name) {
|
|
this.lookup[name] = newAttr;
|
|
}
|
|
|
|
this.all.push(newAttr);
|
|
}
|
|
|
|
removeAttribute(name) {
|
|
ok(typeof name === 'string', 'Invalid attribute name');
|
|
|
|
if (!this.lookup.hasOwnProperty(name)) {
|
|
return false;
|
|
}
|
|
|
|
delete this.lookup[name];
|
|
|
|
for (var i=0; i<this.all.length; i++) {
|
|
var curAttr = this.all[i];
|
|
if (curAttr.name === name) {
|
|
this.all.splice(i, 1);
|
|
break;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
renameAttribute(oldName, newName) {
|
|
var key = oldName;
|
|
|
|
var attr = this.lookup[key];
|
|
if (!attr) {
|
|
return;
|
|
}
|
|
|
|
attr.name = newName;
|
|
delete this.lookup[key];
|
|
this.lookup[key] = attr;
|
|
}
|
|
|
|
hasAttribute(name) {
|
|
ok(typeof name === 'string', 'Invalid attribute name');
|
|
return this.lookup.hasOwnProperty(name);
|
|
}
|
|
|
|
hasAttributes() {
|
|
return this.all.length > 0;
|
|
}
|
|
|
|
getAttribute(name) {
|
|
return this.lookup[name];
|
|
}
|
|
|
|
setAttributeValue(name, value) {
|
|
var attr = this.getAttribute(name);
|
|
if (attr) {
|
|
attr.value = value;
|
|
} else {
|
|
this.addAttribute({
|
|
name: name,
|
|
value: value
|
|
});
|
|
}
|
|
}
|
|
|
|
getAttributes() {
|
|
return this.all;
|
|
}
|
|
|
|
toJSON() {
|
|
return this.all;
|
|
}
|
|
|
|
toString() {
|
|
return JSON.stringify(this.all);
|
|
}
|
|
|
|
setAttributes(attributes) {
|
|
this.all = [];
|
|
this.lookup = {};
|
|
|
|
if (attributes) {
|
|
if (Array.isArray(attributes)) {
|
|
attributes.forEach((attr) => {
|
|
this.addAttribute(attr);
|
|
});
|
|
} else {
|
|
for (var attrName in attributes) {
|
|
if (attributes.hasOwnProperty(attrName)) {
|
|
let attrValue = attributes[attrName];
|
|
let attrDef;
|
|
|
|
if (typeof attrValue === 'object' && !(attrValue instanceof Node)) {
|
|
attrDef = attrValue;
|
|
attrDef.name = attrName;
|
|
} else {
|
|
attrDef = {
|
|
name: attrName,
|
|
value: attrValue
|
|
};
|
|
}
|
|
|
|
this.addAttribute(attrDef);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
walk(walker) {
|
|
var newAttributes = walker.walk(this.all);
|
|
this.setAttributes(newAttributes);
|
|
}
|
|
}
|
|
|
|
module.exports = HtmlAttributeCollection; |