1
0
mirror of https://github.com/svg/svgo.git synced 2025-12-03 21:11:14 +03:00
Files
svgo/lib/jsAPI.js
deepsweet 13af2ed95e go!
2012-09-27 14:06:28 +03:00

250 lines
5.6 KiB
JavaScript

var INHERIT = require('inherit'),
extend = require('./tools').extend;
/**
* @class SVG-as-JS Nodes API.
*/
exports.Nodes = INHERIT(
/**
* @lends Nodes.prototype
*/
{
/**
* @constructs
* @private
*/
__constructor: function(data) {
extend(this, data);
},
/**
* Remove item.
*/
remove: function() {
delete this;
},
/**
* Determine if item is an element
* (any, with a specific name or in a names array).
*
* @param {String|Array} [param] element name or names arrays
* @return {Boolean}
*/
isElem: function(param) {
if (!param) return !!this.elem;
if (Array.isArray(param)) return !!this.elem && (param.indexOf(this.elem) > -1);
return !!this.elem && this.elem === param;
},
/**
* Determine if item is a doctype.
*
* @return {Boolean}
*/
isDoctype: function() {
return !!this.doctype;
},
/**
* Determine if item is a XML Processing Instruction.
*
* @return {Boolean}
*/
isProcInst: function() {
return !!this.processinginstruction;
},
/**
* Determine if item is a CDATA block.
*
* @return {Boolean}
*/
isCDATA: function() {
return !!this.cdata;
},
/**
* Determine if item is a comment node.
*
* @return {Boolean}
*/
isComment: function() {
return !!this.comment;
},
/**
* Determine if item is a text node.
*
* @return {Boolean}
*/
isText: function() {
return !!this.text;
},
/**
* Determine if element is empty.
*
* @return {Boolean}
*/
isEmpty: function() {
return !this.content || !this.content.length;
},
/**
* Iterates over all attributes.
*
* @param {Function} callback
* @return {Boolean} false if the are no any attributes
*/
eachAttr: function(callback) {
if (!this.hasAttr()) return false;
Object.getOwnPropertyNames(this.attrs).forEach(function(name) {
callback(this.attrs[name]);
}, this);
},
/**
* Determine if element has an attribute
* (any, or by name or by name + value).
*
* @param {String|Object} [name] attribute name or object
* @param {String} [val] attribute value (will be toString()'ed)
* @return {Boolean}
*/
hasAttr: function(attr, val) {
if (!this.attrs || !Object.keys(this.attrs).length) return false;
if (!arguments.length) return !!this.attrs;
if (typeof attr === 'object') {
val = attr.value;
attr = attr.name;
}
if (val !== undefined) return !!this.attrs[attr] && this.attrs[attr].value === val.toString();
return !!this.attrs[attr];
},
/**
* Get a specific attribute from an element
* (by name or name + value).
*
* @param {String} [name] attribute name
* @param {String} [val] attribute value (will be toString()'ed)
* @return {Object}
*/
attr: function(name, val) {
if (!this.hasAttr() || !arguments.length) return undefined;
if (val !== undefined) return this.hasAttr(name, val) && this.attrs[name];
return this.hasAttr(name) && this.attrs[name];
},
/**
* Remove a specific attribute.
*
* @param {String|Object} attr attribute name or object
* @param {String} [val] attribute value
* @return {Boolean}
*/
removeAttr: function(attr, val) {
if (!this.hasAttr(attr)) return false;
if (!arguments.length) {
delete this.attrs;
return true;
}
if (typeof attr === 'object') {
val = attr.value;
attr = attr.name;
}
if (val && this.attrs[attr].value !== val) return false;
delete this.attrs[attr];
if (!Object.keys(this.attrs).length) delete this.attrs;
return true;
},
/**
* Add attribute.
*
* @param {Object} attr attribute object
*/
addAttr: function(attr, val) {
this.attrs = this.attrs || {};
this.attrs[attr.name] = attr;
},
/**
* Determine if item's content has an element(s)
* (any or by name or by names array).
*
* @param {String|Array} [name] element name or names array
* @return {Boolean}
*/
hasElem: function(name) {
return this.content.some(function(item) {
return name ? item.isElem(name) : item.isElem();
});
},
/**
* Determine if item's content has only elements
* (any or by name or by names array).
*
* @param {String|Array} [name] element name or names array
* @return {Boolean}
*/
hasAllElems: function(name) {
return this.content.every(function(item) {
return name ? item.isElem(name) : item.isElem();
});
}
}
);