| Index: node_modules/vulcanize/node_modules/whacko/node_modules/CSSselect/node_modules/CSSwhat/index.js
|
| diff --git a/node_modules/vulcanize/node_modules/whacko/node_modules/CSSselect/node_modules/CSSwhat/index.js b/node_modules/vulcanize/node_modules/whacko/node_modules/CSSselect/node_modules/CSSwhat/index.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..4bd5a24d9d46f6d91e3a820c23aa1e82dfe9dddb
|
| --- /dev/null
|
| +++ b/node_modules/vulcanize/node_modules/whacko/node_modules/CSSselect/node_modules/CSSwhat/index.js
|
| @@ -0,0 +1,182 @@
|
| +"use strict";
|
| +
|
| +module.exports = parse;
|
| +
|
| +var re_ws = /^\s/,
|
| + re_name = /^(?:\\.|[\w\-\u00c0-\uFFFF])+/,
|
| + re_escape = /\\([\da-f]{1,6}\s?|(\s)|.)/ig,
|
| + //modified version of https://github.com/jquery/sizzle/blob/master/src/sizzle.js#L87
|
| + re_attr = /^\s*((?:\\.|[\w\u00c0-\uFFFF\-])+)\s*(?:(\S?)=\s*(?:(['"])(.*?)\3|(#?(?:\\.|[\w\u00c0-\uFFFF\-])*)|)|)\s*(i)?\]/;
|
| +
|
| +var actionTypes = {
|
| + __proto__: null,
|
| + "undefined": "exists",
|
| + "": "equals",
|
| + "~": "element",
|
| + "^": "start",
|
| + "$": "end",
|
| + "*": "any",
|
| + "!": "not",
|
| + "|": "hyphen"
|
| +};
|
| +
|
| +var simpleSelectors = {
|
| + __proto__: null,
|
| + ">": "child",
|
| + "<": "parent",
|
| + "~": "sibling",
|
| + "+": "adjacent"
|
| +};
|
| +
|
| +var attribSelectors = {
|
| + __proto__: null,
|
| + "#": ["id", "equals"],
|
| + ".": ["class", "element"]
|
| +};
|
| +
|
| +//unescape function taken from https://github.com/jquery/sizzle/blob/master/src/sizzle.js#L139
|
| +function funescape( _, escaped, escapedWhitespace ) {
|
| + var high = "0x" + escaped - 0x10000;
|
| + // NaN means non-codepoint
|
| + // Support: Firefox
|
| + // Workaround erroneous numeric interpretation of +"0x"
|
| + return high !== high || escapedWhitespace ?
|
| + escaped :
|
| + // BMP codepoint
|
| + high < 0 ?
|
| + String.fromCharCode( high + 0x10000 ) :
|
| + // Supplemental Plane codepoint (surrogate pair)
|
| + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
|
| +}
|
| +
|
| +function unescapeCSS(str){
|
| + return str.replace(re_escape, funescape);
|
| +}
|
| +
|
| +function getClosingPos(selector){
|
| + var pos = 1, counter = 1, len = selector.length;
|
| +
|
| + for(; counter > 0 && pos < len; pos++){
|
| + if(selector.charAt(pos) === "(") counter++;
|
| + else if(selector.charAt(pos) === ")") counter--;
|
| + }
|
| +
|
| + return pos;
|
| +}
|
| +
|
| +function parse(selector, options){
|
| + selector = (selector + "").trimLeft();
|
| +
|
| + var subselects = [],
|
| + tokens = [],
|
| + sawWS = false,
|
| + data, firstChar, name;
|
| +
|
| + function getName(){
|
| + var sub = selector.match(re_name)[0];
|
| + selector = selector.substr(sub.length);
|
| + return unescapeCSS(sub);
|
| + }
|
| +
|
| + while(selector !== ""){
|
| + if(re_name.test(selector)){
|
| + if(sawWS){
|
| + tokens.push({type: "descendant"});
|
| + sawWS = false;
|
| + }
|
| +
|
| + name = getName();
|
| +
|
| + if(!options || ("lowerCaseTags" in options ? options.lowerCaseTags : !options.xmlMode)){
|
| + name = name.toLowerCase();
|
| + }
|
| +
|
| + tokens.push({type: "tag", name: name});
|
| + } else if(re_ws.test(selector)){
|
| + sawWS = true;
|
| + selector = selector.trimLeft();
|
| + } else {
|
| + firstChar = selector.charAt(0);
|
| + selector = selector.substr(1);
|
| +
|
| + if(firstChar in simpleSelectors){
|
| + tokens.push({type: simpleSelectors[firstChar]});
|
| + selector = selector.trimLeft();
|
| + sawWS = false;
|
| + continue;
|
| + } else if(firstChar === ","){
|
| + if(tokens.length === 0){
|
| + throw new SyntaxError("empty sub-selector");
|
| + }
|
| + subselects.push(tokens);
|
| + tokens = [];
|
| +
|
| + selector = selector.trimLeft();
|
| + sawWS = false;
|
| + continue;
|
| + } else if(sawWS){
|
| + tokens.push({type: "descendant"});
|
| + sawWS = false;
|
| + }
|
| +
|
| + if(firstChar === "*"){
|
| + tokens.push({type: "universal"});
|
| + } else if(firstChar in attribSelectors){
|
| + tokens.push({
|
| + type: "attribute",
|
| + name: attribSelectors[firstChar][0],
|
| + action: attribSelectors[firstChar][1],
|
| + value: getName(),
|
| + ignoreCase: false
|
| + });
|
| + } else if(firstChar === "["){
|
| + data = selector.match(re_attr);
|
| + if(!data){
|
| + throw new SyntaxError("Malformed attribute selector: " + selector);
|
| + }
|
| + selector = selector.substr(data[0].length);
|
| + name = unescapeCSS(data[1]);
|
| +
|
| + if(
|
| + !options || (
|
| + "lowerCaseAttributeNames" in options ?
|
| + options.lowerCaseAttributeNames :
|
| + !options.xmlMode
|
| + )
|
| + ){
|
| + name = name.toLowerCase();
|
| + }
|
| +
|
| + tokens.push({
|
| + type: "attribute",
|
| + name: name,
|
| + action: actionTypes[data[2]],
|
| + value: unescapeCSS(data[4] || data[5] || ""),
|
| + ignoreCase: !!data[6]
|
| + });
|
| +
|
| + } else if(firstChar === ":"){
|
| + //if(selector.charAt(0) === ":"){} //TODO pseudo-element
|
| + name = getName().toLowerCase();
|
| + data = null;
|
| +
|
| + if(selector.charAt(0) === "("){
|
| + var pos = getClosingPos(selector);
|
| + data = selector.substr(1, pos - 2);
|
| + selector = selector.substr(pos);
|
| + }
|
| +
|
| + tokens.push({type: "pseudo", name: name, data: data});
|
| + } else {
|
| + //otherwise, the parser needs to throw or it would enter an infinite loop
|
| + throw new SyntaxError("Unmatched selector: " + firstChar + selector);
|
| + }
|
| + }
|
| + }
|
| +
|
| + if(subselects.length > 0 && tokens.length === 0){
|
| + throw new SyntaxError("empty sub-selector");
|
| + }
|
| + subselects.push(tokens);
|
| + return subselects;
|
| +}
|
|
|