mirror of
https://github.com/svg/svgo.git
synced 2025-08-10 13:43:01 +03:00
There is a lot of attributes manipulation which is hard to remove at once. In this diff I added `attributes` object and wrapped it as proxy for `attrs` field.
96 lines
2.3 KiB
JavaScript
96 lines
2.3 KiB
JavaScript
'use strict';
|
|
|
|
var CSSClassList = function (node) {
|
|
this.parentNode = node;
|
|
this.classNames = new Set();
|
|
//this.classValue = null;
|
|
};
|
|
|
|
/**
|
|
* Performs a deep clone of this object.
|
|
*
|
|
* @param parentNode the parentNode to assign to the cloned result
|
|
*/
|
|
CSSClassList.prototype.clone = function (parentNode) {
|
|
var node = this;
|
|
var nodeData = {};
|
|
|
|
Object.keys(node).forEach(function (key) {
|
|
if (key !== 'parentNode') {
|
|
nodeData[key] = node[key];
|
|
}
|
|
});
|
|
|
|
// Deep-clone node data.
|
|
nodeData = JSON.parse(JSON.stringify(nodeData));
|
|
|
|
var clone = new CSSClassList(parentNode);
|
|
Object.assign(clone, nodeData);
|
|
return clone;
|
|
};
|
|
|
|
CSSClassList.prototype.hasClass = function () {
|
|
this.addClassValueHandler();
|
|
};
|
|
|
|
// attr.class.value
|
|
|
|
CSSClassList.prototype.addClassValueHandler = function () {
|
|
Object.defineProperty(this.parentNode.attributes, 'class', {
|
|
get: this.getClassValue.bind(this),
|
|
set: this.setClassValue.bind(this),
|
|
enumerable: true,
|
|
configurable: true,
|
|
});
|
|
};
|
|
|
|
CSSClassList.prototype.getClassValue = function () {
|
|
var arrClassNames = Array.from(this.classNames);
|
|
return arrClassNames.join(' ');
|
|
};
|
|
|
|
CSSClassList.prototype.setClassValue = function (newValue) {
|
|
if (typeof newValue === 'undefined') {
|
|
this.classNames.clear();
|
|
return;
|
|
}
|
|
var arrClassNames = newValue.split(' ');
|
|
this.classNames = new Set(arrClassNames);
|
|
};
|
|
|
|
CSSClassList.prototype.add = function (/* variadic */) {
|
|
this.hasClass();
|
|
Object.values(arguments).forEach(this._addSingle.bind(this));
|
|
};
|
|
|
|
CSSClassList.prototype._addSingle = function (className) {
|
|
this.classNames.add(className);
|
|
};
|
|
|
|
CSSClassList.prototype.remove = function (/* variadic */) {
|
|
this.hasClass();
|
|
Object.values(arguments).forEach(this._removeSingle.bind(this));
|
|
};
|
|
|
|
CSSClassList.prototype._removeSingle = function (className) {
|
|
this.classNames.delete(className);
|
|
};
|
|
|
|
CSSClassList.prototype.item = function (index) {
|
|
var arrClassNames = Array.from(this.classNames);
|
|
return arrClassNames[index];
|
|
};
|
|
|
|
CSSClassList.prototype.toggle = function (className, force) {
|
|
if (this.contains(className) || force === false) {
|
|
this.classNames.delete(className);
|
|
}
|
|
this.classNames.add(className);
|
|
};
|
|
|
|
CSSClassList.prototype.contains = function (className) {
|
|
return this.classNames.has(className);
|
|
};
|
|
|
|
module.exports = CSSClassList;
|