| Index: node_modules/vulcanize/node_modules/whacko/node_modules/CSSselect/lib/attributes.js
|
| diff --git a/node_modules/vulcanize/node_modules/whacko/node_modules/CSSselect/lib/attributes.js b/node_modules/vulcanize/node_modules/whacko/node_modules/CSSselect/lib/attributes.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..97d5f08b0629f7cafac19265f34870ba0e883320
|
| --- /dev/null
|
| +++ b/node_modules/vulcanize/node_modules/whacko/node_modules/CSSselect/lib/attributes.js
|
| @@ -0,0 +1,178 @@
|
| +var DomUtils = require("domutils"),
|
| + hasAttrib = DomUtils.hasAttrib,
|
| + getAttributeValue = DomUtils.getAttributeValue,
|
| + falseFunc = require("./basefunctions.js").falseFunc;
|
| +
|
| +//https://github.com/slevithan/XRegExp/blob/master/src/xregexp.js#L469
|
| +var reChars = /[-[\]{}()*+?.,\\^$|#\s]/g;
|
| +
|
| +/*
|
| + attribute selectors
|
| +*/
|
| +
|
| +var attributeRules = {
|
| + __proto__: null,
|
| + equals: function(next, data){
|
| + var name = data.name,
|
| + value = data.value;
|
| +
|
| + if(data.ignoreCase){
|
| + value = value.toLowerCase();
|
| +
|
| + return function equalsIC(elem){
|
| + var attr = getAttributeValue(elem, name);
|
| + return attr != null && attr.toLowerCase() === value && next(elem);
|
| + };
|
| + }
|
| +
|
| + return function equals(elem){
|
| + return getAttributeValue(elem, name) === value && next(elem);
|
| + };
|
| + },
|
| + hyphen: function(next, data){
|
| + var name = data.name,
|
| + value = data.value,
|
| + len = value.length;
|
| +
|
| + if(data.ignoreCase){
|
| + value = value.toLowerCase();
|
| +
|
| + return function hyphenIC(elem){
|
| + var attr = getAttributeValue(elem, name);
|
| + return attr != null &&
|
| + (attr.length === len || attr.charAt(len) === "-") &&
|
| + attr.substr(0, len).toLowerCase() === value &&
|
| + next(elem);
|
| + };
|
| + }
|
| +
|
| + return function hyphen(elem){
|
| + var attr = getAttributeValue(elem, name);
|
| + return attr != null &&
|
| + attr.substr(0, len) === value &&
|
| + (attr.length === len || attr.charAt(len) === "-") &&
|
| + next(elem);
|
| + };
|
| + },
|
| + element: function(next, data){
|
| + var name = data.name,
|
| + value = data.value;
|
| +
|
| + if(/\s/.test(value)){
|
| + return falseFunc;
|
| + }
|
| +
|
| + value = value.replace(reChars, "\\$&");
|
| +
|
| + var pattern = "(?:^|\\s)" + value + "(?:$|\\s)",
|
| + flags = data.ignoreCase ? "i" : "",
|
| + regex = new RegExp(pattern, flags);
|
| +
|
| + return function element(elem){
|
| + var attr = getAttributeValue(elem, name);
|
| + return attr != null && regex.test(attr) && next(elem);
|
| + };
|
| + },
|
| + exists: function(next, data){
|
| + var name = data.name;
|
| + return function exists(elem){
|
| + return hasAttrib(elem, name) && next(elem);
|
| + };
|
| + },
|
| + start: function(next, data){
|
| + var name = data.name,
|
| + value = data.value,
|
| + len = value.length;
|
| +
|
| + if(len === 0){
|
| + return falseFunc;
|
| + }
|
| +
|
| + if(data.ignoreCase){
|
| + value = value.toLowerCase();
|
| +
|
| + return function startIC(elem){
|
| + var attr = getAttributeValue(elem, name);
|
| + return attr != null && attr.substr(0, len).toLowerCase() === value && next(elem);
|
| + };
|
| + }
|
| +
|
| + return function start(elem){
|
| + var attr = getAttributeValue(elem, name);
|
| + return attr != null && attr.substr(0, len) === value && next(elem);
|
| + };
|
| + },
|
| + end: function(next, data){
|
| + var name = data.name,
|
| + value = data.value,
|
| + len = -value.length;
|
| +
|
| + if(len === 0){
|
| + return falseFunc;
|
| + }
|
| +
|
| + if(data.ignoreCase){
|
| + value = value.toLowerCase();
|
| +
|
| + return function endIC(elem){
|
| + var attr = getAttributeValue(elem, name);
|
| + return attr != null && attr.substr(len).toLowerCase() === value && next(elem);
|
| + };
|
| + }
|
| +
|
| + return function end(elem){
|
| + var attr = getAttributeValue(elem, name);
|
| + return attr != null && attr.substr(len) === value && next(elem);
|
| + };
|
| + },
|
| + any: function(next, data){
|
| + var name = data.name,
|
| + value = data.value;
|
| +
|
| + if(value === ""){
|
| + return falseFunc;
|
| + }
|
| +
|
| + if(data.ignoreCase){
|
| + var regex = new RegExp(value.replace(reChars, "\\$&"), "i");
|
| +
|
| + return function anyIC(elem){
|
| + var attr = getAttributeValue(elem, name);
|
| + return attr != null && regex.test(attr) && next(elem);
|
| + };
|
| + }
|
| +
|
| + return function any(elem){
|
| + var attr = getAttributeValue(elem, name);
|
| + return attr != null && attr.indexOf(value) >= 0 && next(elem);
|
| + };
|
| + },
|
| + not: function(next, data){
|
| + var name = data.name,
|
| + value = data.value;
|
| +
|
| + if(value === ""){
|
| + return function notEmpty(elem){
|
| + return !!getAttributeValue(elem, name) && next(elem);
|
| + };
|
| + } else if(data.ignoreCase){
|
| + value = value.toLowerCase();
|
| +
|
| + return function notIC(elem){
|
| + var attr = getAttributeValue(elem, name);
|
| + return attr != null && attr.toLowerCase() !== value && next(elem);
|
| + };
|
| + }
|
| +
|
| + return function not(elem){
|
| + return getAttributeValue(elem, name) !== value && next(elem);
|
| + };
|
| + }
|
| +};
|
| +
|
| +module.exports = {
|
| + compile: function(next, data){
|
| + return attributeRules[data.action](next, data);
|
| + },
|
| + rules: attributeRules
|
| +};
|
|
|