summaryrefslogtreecommitdiff
path: root/bin/wiki/ImportarDesdeURL/node_modules/cheerio/lib/api/attributes.js
diff options
context:
space:
mode:
Diffstat (limited to 'bin/wiki/ImportarDesdeURL/node_modules/cheerio/lib/api/attributes.js')
-rw-r--r--bin/wiki/ImportarDesdeURL/node_modules/cheerio/lib/api/attributes.js492
1 files changed, 492 insertions, 0 deletions
diff --git a/bin/wiki/ImportarDesdeURL/node_modules/cheerio/lib/api/attributes.js b/bin/wiki/ImportarDesdeURL/node_modules/cheerio/lib/api/attributes.js
new file mode 100644
index 00000000..901eac58
--- /dev/null
+++ b/bin/wiki/ImportarDesdeURL/node_modules/cheerio/lib/api/attributes.js
@@ -0,0 +1,492 @@
+var $ = require('../static'),
+ utils = require('../utils'),
+ isTag = utils.isTag,
+ domEach = utils.domEach,
+ hasOwn = Object.prototype.hasOwnProperty,
+ camelCase = utils.camelCase,
+ cssCase = utils.cssCase,
+ rspace = /\s+/,
+ dataAttrPrefix = 'data-',
+ _ = {
+ forEach: require('lodash/forEach'),
+ extend: require('lodash/assignIn'),
+ some: require('lodash/some')
+ },
+
+ // Lookup table for coercing string data-* attributes to their corresponding
+ // JavaScript primitives
+ primitives = {
+ null: null,
+ true: true,
+ false: false
+ },
+
+ // Attributes that are booleans
+ rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+ // Matches strings that look like JSON objects or arrays
+ rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/;
+
+
+var getAttr = function(elem, name) {
+ if (!elem || !isTag(elem)) return;
+
+ if (!elem.attribs) {
+ elem.attribs = {};
+ }
+
+ // Return the entire attribs object if no attribute specified
+ if (!name) {
+ return elem.attribs;
+ }
+
+ if (hasOwn.call(elem.attribs, name)) {
+ // Get the (decoded) attribute
+ return rboolean.test(name) ? name : elem.attribs[name];
+ }
+
+ // Mimic the DOM and return text content as value for `option's`
+ if (elem.name === 'option' && name === 'value') {
+ return $.text(elem.children);
+ }
+
+ // Mimic DOM with default value for radios/checkboxes
+ if (elem.name === 'input' &&
+ (elem.attribs.type === 'radio' || elem.attribs.type === 'checkbox') &&
+ name === 'value') {
+ return 'on';
+ }
+};
+
+var setAttr = function(el, name, value) {
+
+ if (value === null) {
+ removeAttribute(el, name);
+ } else {
+ el.attribs[name] = value+'';
+ }
+};
+
+exports.attr = function(name, value) {
+ // Set the value (with attr map support)
+ if (typeof name === 'object' || value !== undefined) {
+ if (typeof value === 'function') {
+ return domEach(this, function(i, el) {
+ setAttr(el, name, value.call(el, i, el.attribs[name]));
+ });
+ }
+ return domEach(this, function(i, el) {
+ if (!isTag(el)) return;
+
+ if (typeof name === 'object') {
+ _.forEach(name, function(objValue, objName) {
+ setAttr(el, objName, objValue);
+ });
+ } else {
+ setAttr(el, name, value);
+ }
+ });
+ }
+
+ return getAttr(this[0], name);
+};
+
+var getProp = function (el, name) {
+ if (!el || !isTag(el)) return;
+
+ return hasOwn.call(el, name)
+ ? el[name]
+ : rboolean.test(name)
+ ? getAttr(el, name) !== undefined
+ : getAttr(el, name);
+};
+
+var setProp = function (el, name, value) {
+ el[name] = rboolean.test(name) ? !!value : value;
+};
+
+exports.prop = function (name, value) {
+ var i = 0,
+ property;
+
+ if (typeof name === 'string' && value === undefined) {
+
+ switch (name) {
+ case 'style':
+ property = this.css();
+
+ _.forEach(property, function (v, p) {
+ property[i++] = p;
+ });
+
+ property.length = i;
+
+ break;
+ case 'tagName':
+ case 'nodeName':
+ property = this[0].name.toUpperCase();
+ break;
+ default:
+ property = getProp(this[0], name);
+ }
+
+ return property;
+ }
+
+ if (typeof name === 'object' || value !== undefined) {
+
+ if (typeof value === 'function') {
+ return domEach(this, function(j, el) {
+ setProp(el, name, value.call(el, j, getProp(el, name)));
+ });
+ }
+
+ return domEach(this, function(__, el) {
+ if (!isTag(el)) return;
+
+ if (typeof name === 'object') {
+
+ _.forEach(name, function(val, key) {
+ setProp(el, key, val);
+ });
+
+ } else {
+ setProp(el, name, value);
+ }
+ });
+
+ }
+};
+
+var setData = function(el, name, value) {
+ if (!el.data) {
+ el.data = {};
+ }
+
+ if (typeof name === 'object') return _.extend(el.data, name);
+ if (typeof name === 'string' && value !== undefined) {
+ el.data[name] = value;
+ }
+};
+
+// Read the specified attribute from the equivalent HTML5 `data-*` attribute,
+// and (if present) cache the value in the node's internal data store. If no
+// attribute name is specified, read *all* HTML5 `data-*` attributes in this
+// manner.
+var readData = function(el, name) {
+ var readAll = arguments.length === 1;
+ var domNames, domName, jsNames, jsName, value, idx, length;
+
+ if (readAll) {
+ domNames = Object.keys(el.attribs).filter(function(attrName) {
+ return attrName.slice(0, dataAttrPrefix.length) === dataAttrPrefix;
+ });
+ jsNames = domNames.map(function(_domName) {
+ return camelCase(_domName.slice(dataAttrPrefix.length));
+ });
+ } else {
+ domNames = [dataAttrPrefix + cssCase(name)];
+ jsNames = [name];
+ }
+
+ for (idx = 0, length = domNames.length; idx < length; ++idx) {
+ domName = domNames[idx];
+ jsName = jsNames[idx];
+ if (hasOwn.call(el.attribs, domName)) {
+ value = el.attribs[domName];
+
+ if (hasOwn.call(primitives, value)) {
+ value = primitives[value];
+ } else if (value === String(Number(value))) {
+ value = Number(value);
+ } else if (rbrace.test(value)) {
+ try {
+ value = JSON.parse(value);
+ } catch(e){ }
+ }
+
+ el.data[jsName] = value;
+ }
+ }
+
+ return readAll ? el.data : value;
+};
+
+exports.data = function(name, value) {
+ var elem = this[0];
+
+ if (!elem || !isTag(elem)) return;
+
+ if (!elem.data) {
+ elem.data = {};
+ }
+
+ // Return the entire data object if no data specified
+ if (!name) {
+ return readData(elem);
+ }
+
+ // Set the value (with attr map support)
+ if (typeof name === 'object' || value !== undefined) {
+ domEach(this, function(i, el) {
+ setData(el, name, value);
+ });
+ return this;
+ } else if (hasOwn.call(elem.data, name)) {
+ return elem.data[name];
+ }
+
+ return readData(elem, name);
+};
+
+/**
+ * Get the value of an element
+ */
+
+exports.val = function(value) {
+ var querying = arguments.length === 0,
+ element = this[0];
+
+ if(!element) return;
+
+ switch (element.name) {
+ case 'textarea':
+ return this.text(value);
+ case 'input':
+ switch (this.attr('type')) {
+ case 'radio':
+ if (querying) {
+ return this.attr('value');
+ } else {
+ this.attr('value', value);
+ return this;
+ }
+ break;
+ default:
+ return this.attr('value', value);
+ }
+ return;
+ case 'select':
+ var option = this.find('option:selected'),
+ returnValue;
+ if (option === undefined) return undefined;
+ if (!querying) {
+ if (!hasOwn.call(this.attr(), 'multiple') && typeof value == 'object') {
+ return this;
+ }
+ if (typeof value != 'object') {
+ value = [value];
+ }
+ this.find('option').removeAttr('selected');
+ for (var i = 0; i < value.length; i++) {
+ this.find('option[value="' + value[i] + '"]').attr('selected', '');
+ }
+ return this;
+ }
+ returnValue = option.attr('value');
+ if (hasOwn.call(this.attr(), 'multiple')) {
+ returnValue = [];
+ domEach(option, function(__, el) {
+ returnValue.push(getAttr(el, 'value'));
+ });
+ }
+ return returnValue;
+ case 'option':
+ if (!querying) {
+ this.attr('value', value);
+ return this;
+ }
+ return this.attr('value');
+ }
+};
+
+/**
+ * Remove an attribute
+ */
+
+var removeAttribute = function(elem, name) {
+ if (!elem.attribs || !hasOwn.call(elem.attribs, name))
+ return;
+
+ delete elem.attribs[name];
+};
+
+
+exports.removeAttr = function(name) {
+ domEach(this, function(i, elem) {
+ removeAttribute(elem, name);
+ });
+
+ return this;
+};
+
+exports.hasClass = function(className) {
+ return _.some(this, function(elem) {
+ var attrs = elem.attribs,
+ clazz = attrs && attrs['class'],
+ idx = -1,
+ end;
+
+ if (clazz && className.length) {
+ while ((idx = clazz.indexOf(className, idx+1)) > -1) {
+ end = idx + className.length;
+
+ if ((idx === 0 || rspace.test(clazz[idx-1]))
+ && (end === clazz.length || rspace.test(clazz[end]))) {
+ return true;
+ }
+ }
+ }
+ });
+};
+
+exports.addClass = function(value) {
+ // Support functions
+ if (typeof value === 'function') {
+ return domEach(this, function(i, el) {
+ var className = el.attribs['class'] || '';
+ exports.addClass.call([el], value.call(el, i, className));
+ });
+ }
+
+ // Return if no value or not a string or function
+ if (!value || typeof value !== 'string') return this;
+
+ var classNames = value.split(rspace),
+ numElements = this.length;
+
+
+ for (var i = 0; i < numElements; i++) {
+ // If selected element isn't a tag, move on
+ if (!isTag(this[i])) continue;
+
+ // If we don't already have classes
+ var className = getAttr(this[i], 'class'),
+ numClasses,
+ setClass;
+
+ if (!className) {
+ setAttr(this[i], 'class', classNames.join(' ').trim());
+ } else {
+ setClass = ' ' + className + ' ';
+ numClasses = classNames.length;
+
+ // Check if class already exists
+ for (var j = 0; j < numClasses; j++) {
+ var appendClass = classNames[j] + ' ';
+ if (setClass.indexOf(' ' + appendClass) < 0)
+ setClass += appendClass;
+ }
+
+ setAttr(this[i], 'class', setClass.trim());
+ }
+ }
+
+ return this;
+};
+
+var splitClass = function(className) {
+ return className ? className.trim().split(rspace) : [];
+};
+
+exports.removeClass = function(value) {
+ var classes,
+ numClasses,
+ removeAll;
+
+ // Handle if value is a function
+ if (typeof value === 'function') {
+ return domEach(this, function(i, el) {
+ exports.removeClass.call(
+ [el], value.call(el, i, el.attribs['class'] || '')
+ );
+ });
+ }
+
+ classes = splitClass(value);
+ numClasses = classes.length;
+ removeAll = arguments.length === 0;
+
+ return domEach(this, function(i, el) {
+ if (!isTag(el)) return;
+
+ if (removeAll) {
+ // Short circuit the remove all case as this is the nice one
+ el.attribs.class = '';
+ } else {
+ var elClasses = splitClass(el.attribs.class),
+ index,
+ changed;
+
+ for (var j = 0; j < numClasses; j++) {
+ index = elClasses.indexOf(classes[j]);
+
+ if (index >= 0) {
+ elClasses.splice(index, 1);
+ changed = true;
+
+ // We have to do another pass to ensure that there are not duplicate
+ // classes listed
+ j--;
+ }
+ }
+ if (changed) {
+ el.attribs.class = elClasses.join(' ');
+ }
+ }
+ });
+};
+
+exports.toggleClass = function(value, stateVal) {
+ // Support functions
+ if (typeof value === 'function') {
+ return domEach(this, function(i, el) {
+ exports.toggleClass.call(
+ [el],
+ value.call(el, i, el.attribs['class'] || '', stateVal),
+ stateVal
+ );
+ });
+ }
+
+ // Return if no value or not a string or function
+ if (!value || typeof value !== 'string') return this;
+
+ var classNames = value.split(rspace),
+ numClasses = classNames.length,
+ state = typeof stateVal === 'boolean' ? stateVal ? 1 : -1 : 0,
+ numElements = this.length,
+ elementClasses,
+ index;
+
+ for (var i = 0; i < numElements; i++) {
+ // If selected element isn't a tag, move on
+ if (!isTag(this[i])) continue;
+
+ elementClasses = splitClass(this[i].attribs.class);
+
+ // Check if class already exists
+ for (var j = 0; j < numClasses; j++) {
+ // Check if the class name is currently defined
+ index = elementClasses.indexOf(classNames[j]);
+
+ // Add if stateValue === true or we are toggling and there is no value
+ if (state >= 0 && index < 0) {
+ elementClasses.push(classNames[j]);
+ } else if (state <= 0 && index >= 0) {
+ // Otherwise remove but only if the item exists
+ elementClasses.splice(index, 1);
+ }
+ }
+
+ this[i].attribs.class = elementClasses.join(' ');
+ }
+
+ return this;
+};
+
+exports.is = function (selector) {
+ if (selector) {
+ return this.filter(selector).length > 0;
+ }
+ return false;
+};