express-8.x-1.x-dev/themes/contrib/bootstrap/js/attributes.js
themes/contrib/bootstrap/js/attributes.js
(function ($, _) {
/**
* Class to help modify attributes.
*
* @param {object} object
* An object to initialize attributes with.
*
* @constructor
*/
var Attributes = function (object) {
this.data = object && _.isObject(object) && _.clone(object) || {};
};
/**
* Renders the attributes object as a string to inject into an HTML element.
*
* @returns {string}
*/
Attributes.prototype.toString = function () {
var output = '';
var name, value;
var checkPlain = function (str) {
return str && str.toString().replace(/&/g, '&').replace(/"/g, '"').replace(/</g, '<').replace(/>/g, '>') || '';
};
for (name in this.data) {
if (!this.data.hasOwnProperty(name)) continue;
value = this.data[name];
if (_.isFunction(value)) value = value();
if (_.isObject(value)) value = _.values(value);
if (_.isArray(value)) value = value.join(' ');
output += ' ' + checkPlain(name) + '="' + checkPlain(value) + '"';
}
return output;
};
/**
* Add class(es) to the array.
*
* @param {string|Array} value
* An individual class or an array of classes to add.
*
* @return {Attributes}
*
* @chainable
*/
Attributes.prototype.addClass = function (value) {
var classes = this.getClasses();
value = [].concat(classes, value);
this.set('class', _.uniq(value));
return this;
};
/**
* Returns whether the requested attribute exists.
*
* @param {string} name
* An attribute name to check.
*
* @return {boolean}
* TRUE or FALSE
*/
Attributes.prototype.exists = function (name) {
return this.data[name] !== void(0) && this.data[name] !== null;
};
/**
* Retrieve a specific attribute from the array.
*
* @param {string} name
* The specific attribute to retrieve.
* @param {*} defaultValue
* (optional) The default value to set if the attribute does not exist.
*
* @return {*}
* A specific attribute value, passed by reference.
*/
Attributes.prototype.get = function (name, defaultValue) {
if (!this.exists(name)) this.data[name] = defaultValue;
return this.data[name];
};
/**
* Retrieves a cloned copy of the internal attributes data object.
*
* @returns {Object}
*/
Attributes.prototype.getData = function () {
return _.clone(this.data);
};
/**
* Retrieves classes from the array.
*
* @return {Array}
* The classes array.
*/
Attributes.prototype.getClasses = function () {
var classes = [].concat(this.get('class', []));
return _.uniq(classes);
};
/**
* Indicates whether a class is present in the array.
*
* @param {string|Array} name
* The class(es) to search for.
*
* @return {boolean}
* TRUE or FALSE
*/
Attributes.prototype.hasClass = function (name) {
name = [].concat(name);
var classes = this.getClasses();
var found = false;
_.each(name, function (value) { if (_.indexOf(classes, value) !== -1) found = true; });
return found;
};
/**
* Merges multiple values into the array.
*
* @param {object} values
* An associative key/value array.
* @param {boolean} [recursive]
* Flag determining whether or not to recursively merge key/value pairs.
*
* @return {Attributes}
*
* @chainable
*/
Attributes.prototype.merge = function (values, recursive) {
values = values instanceof Attributes ? values.getData() : values;
if (recursive === void(0) || recursive) {
this.data = $.extend(true, {}, this.data, values);
}
else {
$.extend(this.data, values);
}
return this;
};
/**
* Removes an attribute from the array.
*
* @param {string} name
* The name of the attribute to remove.
*
* @return {Attributes}
*
* @chainable
*/
Attributes.prototype.remove = function (name) {
if (this.exists(name)) delete this.data[name];
return this;
};
/**
* Removes a class from the attributes array.
*
* @param {string|Array} value
* An individual class or an array of classes to remove.
*
* @return {Attributes}
*
* @chainable
*/
Attributes.prototype.removeClass = function (value) {
this.set('class', _.without(this.getClasses(), [].concat(value)));
return this;
};
/**
* Replaces a class in the attributes array.
*
* @param {string} oldValue
* The old class to remove.
* @param {string} newValue
* The new class. It will not be added if the old class does not exist.
*
* @return {Attributes}
*
* @chainable
*/
Attributes.prototype.replaceClass = function (oldValue, newValue) {
var classes = this.getClasses();
var i = _.indexOf(oldValue, classes);
if (i >= 0) {
classes[i] = newValue;
this.set('class', classes);
}
return this;
};
/**
* Sets an attribute on the array.
*
* @param {string} name
* The name of the attribute to set.
* @param {*} value
* The value of the attribute to set.
*
* @return {Attributes}
*
* @chainable
*/
Attributes.prototype.set = function (name, value) {
this.data[name] = value;
return this;
};
/**
* Creates an Attributes instance.
*
* @param {object|Attributes} object
* An object to initialize attributes with.
*
* @returns {Attributes}
*
* @global
*
* @constructor
*/
window.Attributes = function (object) {
return object instanceof Attributes ? object : new Attributes(object);
};
})(window.jQuery, window._);
