| var result = (function(){ | |
| /* | |
| * Generated by PEG.js 0.7.0. | |
| * | |
| * http://pegjs.majda.cz/ | |
| */ | |
| function quote(s) { | |
| /* | |
| * ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a | |
| * string literal except for the closing quote character, backslash, | |
| * carriage return, line separator, paragraph separator, and line feed. | |
| * Any character may appear in the form of an escape sequence. | |
| * | |
| * For portability, we also escape escape all control and non-ASCII | |
| * characters. Note that "\0" and "\v" escape sequences are not used | |
| * because JSHint does not like the first and IE the second. | |
| */ | |
| return '"' + s | |
| .replace(/\\/g, '\\\\') // backslash | |
| .replace(/"/g, '\\"') // closing quote character | |
| .replace(/\x08/g, '\\b') // backspace | |
| .replace(/\t/g, '\\t') // horizontal tab | |
| .replace(/\n/g, '\\n') // line feed | |
| .replace(/\f/g, '\\f') // form feed | |
| .replace(/\r/g, '\\r') // carriage return | |
| .replace(/[\x00-\x07\x0B\x0E-\x1F\x80-\uFFFF]/g, escape) | |
| + '"'; | |
| } | |
| var result = { | |
| /* | |
| * Parses the input with a generated parser. If the parsing is successfull, | |
| * returns a value explicitly or implicitly specified by the grammar from | |
| * which the parser was generated (see |PEG.buildParser|). If the parsing is | |
| * unsuccessful, throws |PEG.parser.SyntaxError| describing the error. | |
| */ | |
| parse: function(input, startRule) { | |
| var parseFunctions = { | |
| "start": parse_start, | |
| "_": parse__, | |
| "identifierName": parse_identifierName, | |
| "binaryOp": parse_binaryOp, | |
| "selectors": parse_selectors, | |
| "selector": parse_selector, | |
| "sequence": parse_sequence, | |
| "atom": parse_atom, | |
| "wildcard": parse_wildcard, | |
| "identifier": parse_identifier, | |
| "attr": parse_attr, | |
| "attrOps": parse_attrOps, | |
| "attrEqOps": parse_attrEqOps, | |
| "attrName": parse_attrName, | |
| "attrValue": parse_attrValue, | |
| "string": parse_string, | |
| "number": parse_number, | |
| "path": parse_path, | |
| "type": parse_type, | |
| "regex": parse_regex, | |
| "field": parse_field, | |
| "negation": parse_negation, | |
| "matches": parse_matches, | |
| "has": parse_has, | |
| "firstChild": parse_firstChild, | |
| "lastChild": parse_lastChild, | |
| "nthChild": parse_nthChild, | |
| "nthLastChild": parse_nthLastChild, | |
| "class": parse_class | |
| }; | |
| if (startRule !== undefined) { | |
| if (parseFunctions[startRule] === undefined) { | |
| throw new Error("Invalid rule name: " + quote(startRule) + "."); | |
| } | |
| } else { | |
| startRule = "start"; | |
| } | |
| var pos = 0; | |
| var reportFailures = 0; | |
| var rightmostFailuresPos = 0; | |
| var rightmostFailuresExpected = []; | |
| var cache = {}; | |
| function padLeft(input, padding, length) { | |
| var result = input; | |
| var padLength = length - input.length; | |
| for (var i = 0; i < padLength; i++) { | |
| result = padding + result; | |
| } | |
| return result; | |
| } | |
| function escape(ch) { | |
| var charCode = ch.charCodeAt(0); | |
| var escapeChar; | |
| var length; | |
| if (charCode <= 0xFF) { | |
| escapeChar = 'x'; | |
| length = 2; | |
| } else { | |
| escapeChar = 'u'; | |
| length = 4; | |
| } | |
| return '\\' + escapeChar + padLeft(charCode.toString(16).toUpperCase(), '0', length); | |
| } | |
| function matchFailed(failure) { | |
| if (pos < rightmostFailuresPos) { | |
| return; | |
| } | |
| if (pos > rightmostFailuresPos) { | |
| rightmostFailuresPos = pos; | |
| rightmostFailuresExpected = []; | |
| } | |
| rightmostFailuresExpected.push(failure); | |
| } | |
| function parse_start() { | |
| var cacheKey = "start@" + pos; | |
| var cachedResult = cache[cacheKey]; | |
| if (cachedResult) { | |
| pos = cachedResult.nextPos; | |
| return cachedResult.result; | |
| } | |
| var result0, result1, result2; | |
| var pos0, pos1; | |
| pos0 = pos; | |
| pos1 = pos; | |
| result0 = parse__(); | |
| if (result0 !== null) { | |
| result1 = parse_selectors(); | |
| if (result1 !== null) { | |
| result2 = parse__(); | |
| if (result2 !== null) { | |
| result0 = [result0, result1, result2]; | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| if (result0 !== null) { | |
| result0 = (function(offset, ss) { return ss.length === 1 ? ss[0] : { type: 'matches', selectors: ss }; })(pos0, result0[1]); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| if (result0 === null) { | |
| pos0 = pos; | |
| result0 = parse__(); | |
| if (result0 !== null) { | |
| result0 = (function(offset) { return void 0; })(pos0); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| } | |
| cache[cacheKey] = { | |
| nextPos: pos, | |
| result: result0 | |
| }; | |
| return result0; | |
| } | |
| function parse__() { | |
| var cacheKey = "_@" + pos; | |
| var cachedResult = cache[cacheKey]; | |
| if (cachedResult) { | |
| pos = cachedResult.nextPos; | |
| return cachedResult.result; | |
| } | |
| var result0, result1; | |
| result0 = []; | |
| if (input.charCodeAt(pos) === 32) { | |
| result1 = " "; | |
| pos++; | |
| } else { | |
| result1 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\" \""); | |
| } | |
| } | |
| while (result1 !== null) { | |
| result0.push(result1); | |
| if (input.charCodeAt(pos) === 32) { | |
| result1 = " "; | |
| pos++; | |
| } else { | |
| result1 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\" \""); | |
| } | |
| } | |
| } | |
| cache[cacheKey] = { | |
| nextPos: pos, | |
| result: result0 | |
| }; | |
| return result0; | |
| } | |
| function parse_identifierName() { | |
| var cacheKey = "identifierName@" + pos; | |
| var cachedResult = cache[cacheKey]; | |
| if (cachedResult) { | |
| pos = cachedResult.nextPos; | |
| return cachedResult.result; | |
| } | |
| var result0, result1; | |
| var pos0; | |
| pos0 = pos; | |
| if (/^[^ [\],():#!=><~+.]/.test(input.charAt(pos))) { | |
| result1 = input.charAt(pos); | |
| pos++; | |
| } else { | |
| result1 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("[^ [\\],():#!=><~+.]"); | |
| } | |
| } | |
| if (result1 !== null) { | |
| result0 = []; | |
| while (result1 !== null) { | |
| result0.push(result1); | |
| if (/^[^ [\],():#!=><~+.]/.test(input.charAt(pos))) { | |
| result1 = input.charAt(pos); | |
| pos++; | |
| } else { | |
| result1 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("[^ [\\],():#!=><~+.]"); | |
| } | |
| } | |
| } | |
| } else { | |
| result0 = null; | |
| } | |
| if (result0 !== null) { | |
| result0 = (function(offset, i) { return i.join(''); })(pos0, result0); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| cache[cacheKey] = { | |
| nextPos: pos, | |
| result: result0 | |
| }; | |
| return result0; | |
| } | |
| function parse_binaryOp() { | |
| var cacheKey = "binaryOp@" + pos; | |
| var cachedResult = cache[cacheKey]; | |
| if (cachedResult) { | |
| pos = cachedResult.nextPos; | |
| return cachedResult.result; | |
| } | |
| var result0, result1, result2; | |
| var pos0, pos1; | |
| pos0 = pos; | |
| pos1 = pos; | |
| result0 = parse__(); | |
| if (result0 !== null) { | |
| if (input.charCodeAt(pos) === 62) { | |
| result1 = ">"; | |
| pos++; | |
| } else { | |
| result1 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\">\""); | |
| } | |
| } | |
| if (result1 !== null) { | |
| result2 = parse__(); | |
| if (result2 !== null) { | |
| result0 = [result0, result1, result2]; | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| if (result0 !== null) { | |
| result0 = (function(offset) { return 'child'; })(pos0); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| if (result0 === null) { | |
| pos0 = pos; | |
| pos1 = pos; | |
| result0 = parse__(); | |
| if (result0 !== null) { | |
| if (input.charCodeAt(pos) === 126) { | |
| result1 = "~"; | |
| pos++; | |
| } else { | |
| result1 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\"~\""); | |
| } | |
| } | |
| if (result1 !== null) { | |
| result2 = parse__(); | |
| if (result2 !== null) { | |
| result0 = [result0, result1, result2]; | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| if (result0 !== null) { | |
| result0 = (function(offset) { return 'sibling'; })(pos0); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| if (result0 === null) { | |
| pos0 = pos; | |
| pos1 = pos; | |
| result0 = parse__(); | |
| if (result0 !== null) { | |
| if (input.charCodeAt(pos) === 43) { | |
| result1 = "+"; | |
| pos++; | |
| } else { | |
| result1 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\"+\""); | |
| } | |
| } | |
| if (result1 !== null) { | |
| result2 = parse__(); | |
| if (result2 !== null) { | |
| result0 = [result0, result1, result2]; | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| if (result0 !== null) { | |
| result0 = (function(offset) { return 'adjacent'; })(pos0); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| if (result0 === null) { | |
| pos0 = pos; | |
| pos1 = pos; | |
| if (input.charCodeAt(pos) === 32) { | |
| result0 = " "; | |
| pos++; | |
| } else { | |
| result0 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\" \""); | |
| } | |
| } | |
| if (result0 !== null) { | |
| result1 = parse__(); | |
| if (result1 !== null) { | |
| result0 = [result0, result1]; | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| if (result0 !== null) { | |
| result0 = (function(offset) { return 'descendant'; })(pos0); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| } | |
| } | |
| } | |
| cache[cacheKey] = { | |
| nextPos: pos, | |
| result: result0 | |
| }; | |
| return result0; | |
| } | |
| function parse_selectors() { | |
| var cacheKey = "selectors@" + pos; | |
| var cachedResult = cache[cacheKey]; | |
| if (cachedResult) { | |
| pos = cachedResult.nextPos; | |
| return cachedResult.result; | |
| } | |
| var result0, result1, result2, result3, result4, result5; | |
| var pos0, pos1, pos2; | |
| pos0 = pos; | |
| pos1 = pos; | |
| result0 = parse_selector(); | |
| if (result0 !== null) { | |
| result1 = []; | |
| pos2 = pos; | |
| result2 = parse__(); | |
| if (result2 !== null) { | |
| if (input.charCodeAt(pos) === 44) { | |
| result3 = ","; | |
| pos++; | |
| } else { | |
| result3 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\",\""); | |
| } | |
| } | |
| if (result3 !== null) { | |
| result4 = parse__(); | |
| if (result4 !== null) { | |
| result5 = parse_selector(); | |
| if (result5 !== null) { | |
| result2 = [result2, result3, result4, result5]; | |
| } else { | |
| result2 = null; | |
| pos = pos2; | |
| } | |
| } else { | |
| result2 = null; | |
| pos = pos2; | |
| } | |
| } else { | |
| result2 = null; | |
| pos = pos2; | |
| } | |
| } else { | |
| result2 = null; | |
| pos = pos2; | |
| } | |
| while (result2 !== null) { | |
| result1.push(result2); | |
| pos2 = pos; | |
| result2 = parse__(); | |
| if (result2 !== null) { | |
| if (input.charCodeAt(pos) === 44) { | |
| result3 = ","; | |
| pos++; | |
| } else { | |
| result3 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\",\""); | |
| } | |
| } | |
| if (result3 !== null) { | |
| result4 = parse__(); | |
| if (result4 !== null) { | |
| result5 = parse_selector(); | |
| if (result5 !== null) { | |
| result2 = [result2, result3, result4, result5]; | |
| } else { | |
| result2 = null; | |
| pos = pos2; | |
| } | |
| } else { | |
| result2 = null; | |
| pos = pos2; | |
| } | |
| } else { | |
| result2 = null; | |
| pos = pos2; | |
| } | |
| } else { | |
| result2 = null; | |
| pos = pos2; | |
| } | |
| } | |
| if (result1 !== null) { | |
| result0 = [result0, result1]; | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| if (result0 !== null) { | |
| result0 = (function(offset, s, ss) { | |
| return [s].concat(ss.map(function (s) { return s[3]; })); | |
| })(pos0, result0[0], result0[1]); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| cache[cacheKey] = { | |
| nextPos: pos, | |
| result: result0 | |
| }; | |
| return result0; | |
| } | |
| function parse_selector() { | |
| var cacheKey = "selector@" + pos; | |
| var cachedResult = cache[cacheKey]; | |
| if (cachedResult) { | |
| pos = cachedResult.nextPos; | |
| return cachedResult.result; | |
| } | |
| var result0, result1, result2, result3; | |
| var pos0, pos1, pos2; | |
| pos0 = pos; | |
| pos1 = pos; | |
| result0 = parse_sequence(); | |
| if (result0 !== null) { | |
| result1 = []; | |
| pos2 = pos; | |
| result2 = parse_binaryOp(); | |
| if (result2 !== null) { | |
| result3 = parse_sequence(); | |
| if (result3 !== null) { | |
| result2 = [result2, result3]; | |
| } else { | |
| result2 = null; | |
| pos = pos2; | |
| } | |
| } else { | |
| result2 = null; | |
| pos = pos2; | |
| } | |
| while (result2 !== null) { | |
| result1.push(result2); | |
| pos2 = pos; | |
| result2 = parse_binaryOp(); | |
| if (result2 !== null) { | |
| result3 = parse_sequence(); | |
| if (result3 !== null) { | |
| result2 = [result2, result3]; | |
| } else { | |
| result2 = null; | |
| pos = pos2; | |
| } | |
| } else { | |
| result2 = null; | |
| pos = pos2; | |
| } | |
| } | |
| if (result1 !== null) { | |
| result0 = [result0, result1]; | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| if (result0 !== null) { | |
| result0 = (function(offset, a, ops) { | |
| return ops.reduce(function (memo, rhs) { | |
| return { type: rhs[0], left: memo, right: rhs[1] }; | |
| }, a); | |
| })(pos0, result0[0], result0[1]); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| cache[cacheKey] = { | |
| nextPos: pos, | |
| result: result0 | |
| }; | |
| return result0; | |
| } | |
| function parse_sequence() { | |
| var cacheKey = "sequence@" + pos; | |
| var cachedResult = cache[cacheKey]; | |
| if (cachedResult) { | |
| pos = cachedResult.nextPos; | |
| return cachedResult.result; | |
| } | |
| var result0, result1, result2; | |
| var pos0, pos1; | |
| pos0 = pos; | |
| pos1 = pos; | |
| if (input.charCodeAt(pos) === 33) { | |
| result0 = "!"; | |
| pos++; | |
| } else { | |
| result0 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\"!\""); | |
| } | |
| } | |
| result0 = result0 !== null ? result0 : ""; | |
| if (result0 !== null) { | |
| result2 = parse_atom(); | |
| if (result2 !== null) { | |
| result1 = []; | |
| while (result2 !== null) { | |
| result1.push(result2); | |
| result2 = parse_atom(); | |
| } | |
| } else { | |
| result1 = null; | |
| } | |
| if (result1 !== null) { | |
| result0 = [result0, result1]; | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| if (result0 !== null) { | |
| result0 = (function(offset, subject, as) { | |
| var b = as.length === 1 ? as[0] : { type: 'compound', selectors: as }; | |
| if(subject) b.subject = true; | |
| return b; | |
| })(pos0, result0[0], result0[1]); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| cache[cacheKey] = { | |
| nextPos: pos, | |
| result: result0 | |
| }; | |
| return result0; | |
| } | |
| function parse_atom() { | |
| var cacheKey = "atom@" + pos; | |
| var cachedResult = cache[cacheKey]; | |
| if (cachedResult) { | |
| pos = cachedResult.nextPos; | |
| return cachedResult.result; | |
| } | |
| var result0; | |
| result0 = parse_wildcard(); | |
| if (result0 === null) { | |
| result0 = parse_identifier(); | |
| if (result0 === null) { | |
| result0 = parse_attr(); | |
| if (result0 === null) { | |
| result0 = parse_field(); | |
| if (result0 === null) { | |
| result0 = parse_negation(); | |
| if (result0 === null) { | |
| result0 = parse_matches(); | |
| if (result0 === null) { | |
| result0 = parse_has(); | |
| if (result0 === null) { | |
| result0 = parse_firstChild(); | |
| if (result0 === null) { | |
| result0 = parse_lastChild(); | |
| if (result0 === null) { | |
| result0 = parse_nthChild(); | |
| if (result0 === null) { | |
| result0 = parse_nthLastChild(); | |
| if (result0 === null) { | |
| result0 = parse_class(); | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| cache[cacheKey] = { | |
| nextPos: pos, | |
| result: result0 | |
| }; | |
| return result0; | |
| } | |
| function parse_wildcard() { | |
| var cacheKey = "wildcard@" + pos; | |
| var cachedResult = cache[cacheKey]; | |
| if (cachedResult) { | |
| pos = cachedResult.nextPos; | |
| return cachedResult.result; | |
| } | |
| var result0; | |
| var pos0; | |
| pos0 = pos; | |
| if (input.charCodeAt(pos) === 42) { | |
| result0 = "*"; | |
| pos++; | |
| } else { | |
| result0 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\"*\""); | |
| } | |
| } | |
| if (result0 !== null) { | |
| result0 = (function(offset, a) { return { type: 'wildcard', value: a }; })(pos0, result0); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| cache[cacheKey] = { | |
| nextPos: pos, | |
| result: result0 | |
| }; | |
| return result0; | |
| } | |
| function parse_identifier() { | |
| var cacheKey = "identifier@" + pos; | |
| var cachedResult = cache[cacheKey]; | |
| if (cachedResult) { | |
| pos = cachedResult.nextPos; | |
| return cachedResult.result; | |
| } | |
| var result0, result1; | |
| var pos0, pos1; | |
| pos0 = pos; | |
| pos1 = pos; | |
| if (input.charCodeAt(pos) === 35) { | |
| result0 = "#"; | |
| pos++; | |
| } else { | |
| result0 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\"#\""); | |
| } | |
| } | |
| result0 = result0 !== null ? result0 : ""; | |
| if (result0 !== null) { | |
| result1 = parse_identifierName(); | |
| if (result1 !== null) { | |
| result0 = [result0, result1]; | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| if (result0 !== null) { | |
| result0 = (function(offset, i) { return { type: 'identifier', value: i }; })(pos0, result0[1]); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| cache[cacheKey] = { | |
| nextPos: pos, | |
| result: result0 | |
| }; | |
| return result0; | |
| } | |
| function parse_attr() { | |
| var cacheKey = "attr@" + pos; | |
| var cachedResult = cache[cacheKey]; | |
| if (cachedResult) { | |
| pos = cachedResult.nextPos; | |
| return cachedResult.result; | |
| } | |
| var result0, result1, result2, result3, result4; | |
| var pos0, pos1; | |
| pos0 = pos; | |
| pos1 = pos; | |
| if (input.charCodeAt(pos) === 91) { | |
| result0 = "["; | |
| pos++; | |
| } else { | |
| result0 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\"[\""); | |
| } | |
| } | |
| if (result0 !== null) { | |
| result1 = parse__(); | |
| if (result1 !== null) { | |
| result2 = parse_attrValue(); | |
| if (result2 !== null) { | |
| result3 = parse__(); | |
| if (result3 !== null) { | |
| if (input.charCodeAt(pos) === 93) { | |
| result4 = "]"; | |
| pos++; | |
| } else { | |
| result4 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\"]\""); | |
| } | |
| } | |
| if (result4 !== null) { | |
| result0 = [result0, result1, result2, result3, result4]; | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| if (result0 !== null) { | |
| result0 = (function(offset, v) { return v; })(pos0, result0[2]); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| cache[cacheKey] = { | |
| nextPos: pos, | |
| result: result0 | |
| }; | |
| return result0; | |
| } | |
| function parse_attrOps() { | |
| var cacheKey = "attrOps@" + pos; | |
| var cachedResult = cache[cacheKey]; | |
| if (cachedResult) { | |
| pos = cachedResult.nextPos; | |
| return cachedResult.result; | |
| } | |
| var result0, result1; | |
| var pos0, pos1; | |
| pos0 = pos; | |
| pos1 = pos; | |
| if (/^[><!]/.test(input.charAt(pos))) { | |
| result0 = input.charAt(pos); | |
| pos++; | |
| } else { | |
| result0 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("[><!]"); | |
| } | |
| } | |
| result0 = result0 !== null ? result0 : ""; | |
| if (result0 !== null) { | |
| if (input.charCodeAt(pos) === 61) { | |
| result1 = "="; | |
| pos++; | |
| } else { | |
| result1 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\"=\""); | |
| } | |
| } | |
| if (result1 !== null) { | |
| result0 = [result0, result1]; | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| if (result0 !== null) { | |
| result0 = (function(offset, a) { return a + '='; })(pos0, result0[0]); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| if (result0 === null) { | |
| if (/^[><]/.test(input.charAt(pos))) { | |
| result0 = input.charAt(pos); | |
| pos++; | |
| } else { | |
| result0 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("[><]"); | |
| } | |
| } | |
| } | |
| cache[cacheKey] = { | |
| nextPos: pos, | |
| result: result0 | |
| }; | |
| return result0; | |
| } | |
| function parse_attrEqOps() { | |
| var cacheKey = "attrEqOps@" + pos; | |
| var cachedResult = cache[cacheKey]; | |
| if (cachedResult) { | |
| pos = cachedResult.nextPos; | |
| return cachedResult.result; | |
| } | |
| var result0, result1; | |
| var pos0, pos1; | |
| pos0 = pos; | |
| pos1 = pos; | |
| if (input.charCodeAt(pos) === 33) { | |
| result0 = "!"; | |
| pos++; | |
| } else { | |
| result0 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\"!\""); | |
| } | |
| } | |
| result0 = result0 !== null ? result0 : ""; | |
| if (result0 !== null) { | |
| if (input.charCodeAt(pos) === 61) { | |
| result1 = "="; | |
| pos++; | |
| } else { | |
| result1 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\"=\""); | |
| } | |
| } | |
| if (result1 !== null) { | |
| result0 = [result0, result1]; | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| if (result0 !== null) { | |
| result0 = (function(offset, a) { return a + '='; })(pos0, result0[0]); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| cache[cacheKey] = { | |
| nextPos: pos, | |
| result: result0 | |
| }; | |
| return result0; | |
| } | |
| function parse_attrName() { | |
| var cacheKey = "attrName@" + pos; | |
| var cachedResult = cache[cacheKey]; | |
| if (cachedResult) { | |
| pos = cachedResult.nextPos; | |
| return cachedResult.result; | |
| } | |
| var result0, result1; | |
| var pos0; | |
| pos0 = pos; | |
| result1 = parse_identifierName(); | |
| if (result1 === null) { | |
| if (input.charCodeAt(pos) === 46) { | |
| result1 = "."; | |
| pos++; | |
| } else { | |
| result1 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\".\""); | |
| } | |
| } | |
| } | |
| if (result1 !== null) { | |
| result0 = []; | |
| while (result1 !== null) { | |
| result0.push(result1); | |
| result1 = parse_identifierName(); | |
| if (result1 === null) { | |
| if (input.charCodeAt(pos) === 46) { | |
| result1 = "."; | |
| pos++; | |
| } else { | |
| result1 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\".\""); | |
| } | |
| } | |
| } | |
| } | |
| } else { | |
| result0 = null; | |
| } | |
| if (result0 !== null) { | |
| result0 = (function(offset, i) { return i.join(''); })(pos0, result0); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| cache[cacheKey] = { | |
| nextPos: pos, | |
| result: result0 | |
| }; | |
| return result0; | |
| } | |
| function parse_attrValue() { | |
| var cacheKey = "attrValue@" + pos; | |
| var cachedResult = cache[cacheKey]; | |
| if (cachedResult) { | |
| pos = cachedResult.nextPos; | |
| return cachedResult.result; | |
| } | |
| var result0, result1, result2, result3, result4; | |
| var pos0, pos1; | |
| pos0 = pos; | |
| pos1 = pos; | |
| result0 = parse_attrName(); | |
| if (result0 !== null) { | |
| result1 = parse__(); | |
| if (result1 !== null) { | |
| result2 = parse_attrEqOps(); | |
| if (result2 !== null) { | |
| result3 = parse__(); | |
| if (result3 !== null) { | |
| result4 = parse_type(); | |
| if (result4 === null) { | |
| result4 = parse_regex(); | |
| } | |
| if (result4 !== null) { | |
| result0 = [result0, result1, result2, result3, result4]; | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| if (result0 !== null) { | |
| result0 = (function(offset, name, op, value) { | |
| return { type: 'attribute', name: name, operator: op, value: value }; | |
| })(pos0, result0[0], result0[2], result0[4]); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| if (result0 === null) { | |
| pos0 = pos; | |
| pos1 = pos; | |
| result0 = parse_attrName(); | |
| if (result0 !== null) { | |
| result1 = parse__(); | |
| if (result1 !== null) { | |
| result2 = parse_attrOps(); | |
| if (result2 !== null) { | |
| result3 = parse__(); | |
| if (result3 !== null) { | |
| result4 = parse_string(); | |
| if (result4 === null) { | |
| result4 = parse_number(); | |
| if (result4 === null) { | |
| result4 = parse_path(); | |
| } | |
| } | |
| if (result4 !== null) { | |
| result0 = [result0, result1, result2, result3, result4]; | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| if (result0 !== null) { | |
| result0 = (function(offset, name, op, value) { | |
| return { type: 'attribute', name: name, operator: op, value: value }; | |
| })(pos0, result0[0], result0[2], result0[4]); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| if (result0 === null) { | |
| pos0 = pos; | |
| result0 = parse_attrName(); | |
| if (result0 !== null) { | |
| result0 = (function(offset, name) { return { type: 'attribute', name: name }; })(pos0, result0); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| } | |
| } | |
| cache[cacheKey] = { | |
| nextPos: pos, | |
| result: result0 | |
| }; | |
| return result0; | |
| } | |
| function parse_string() { | |
| var cacheKey = "string@" + pos; | |
| var cachedResult = cache[cacheKey]; | |
| if (cachedResult) { | |
| pos = cachedResult.nextPos; | |
| return cachedResult.result; | |
| } | |
| var result0, result1, result2, result3; | |
| var pos0, pos1, pos2, pos3; | |
| pos0 = pos; | |
| pos1 = pos; | |
| if (input.charCodeAt(pos) === 34) { | |
| result0 = "\""; | |
| pos++; | |
| } else { | |
| result0 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\"\\\"\""); | |
| } | |
| } | |
| if (result0 !== null) { | |
| result1 = []; | |
| if (/^[^\\"]/.test(input.charAt(pos))) { | |
| result2 = input.charAt(pos); | |
| pos++; | |
| } else { | |
| result2 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("[^\\\\\"]"); | |
| } | |
| } | |
| if (result2 === null) { | |
| pos2 = pos; | |
| pos3 = pos; | |
| if (input.charCodeAt(pos) === 92) { | |
| result2 = "\\"; | |
| pos++; | |
| } else { | |
| result2 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\"\\\\\""); | |
| } | |
| } | |
| if (result2 !== null) { | |
| if (input.length > pos) { | |
| result3 = input.charAt(pos); | |
| pos++; | |
| } else { | |
| result3 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("any character"); | |
| } | |
| } | |
| if (result3 !== null) { | |
| result2 = [result2, result3]; | |
| } else { | |
| result2 = null; | |
| pos = pos3; | |
| } | |
| } else { | |
| result2 = null; | |
| pos = pos3; | |
| } | |
| if (result2 !== null) { | |
| result2 = (function(offset, a, b) { return a + b; })(pos2, result2[0], result2[1]); | |
| } | |
| if (result2 === null) { | |
| pos = pos2; | |
| } | |
| } | |
| while (result2 !== null) { | |
| result1.push(result2); | |
| if (/^[^\\"]/.test(input.charAt(pos))) { | |
| result2 = input.charAt(pos); | |
| pos++; | |
| } else { | |
| result2 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("[^\\\\\"]"); | |
| } | |
| } | |
| if (result2 === null) { | |
| pos2 = pos; | |
| pos3 = pos; | |
| if (input.charCodeAt(pos) === 92) { | |
| result2 = "\\"; | |
| pos++; | |
| } else { | |
| result2 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\"\\\\\""); | |
| } | |
| } | |
| if (result2 !== null) { | |
| if (input.length > pos) { | |
| result3 = input.charAt(pos); | |
| pos++; | |
| } else { | |
| result3 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("any character"); | |
| } | |
| } | |
| if (result3 !== null) { | |
| result2 = [result2, result3]; | |
| } else { | |
| result2 = null; | |
| pos = pos3; | |
| } | |
| } else { | |
| result2 = null; | |
| pos = pos3; | |
| } | |
| if (result2 !== null) { | |
| result2 = (function(offset, a, b) { return a + b; })(pos2, result2[0], result2[1]); | |
| } | |
| if (result2 === null) { | |
| pos = pos2; | |
| } | |
| } | |
| } | |
| if (result1 !== null) { | |
| if (input.charCodeAt(pos) === 34) { | |
| result2 = "\""; | |
| pos++; | |
| } else { | |
| result2 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\"\\\"\""); | |
| } | |
| } | |
| if (result2 !== null) { | |
| result0 = [result0, result1, result2]; | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| if (result0 !== null) { | |
| result0 = (function(offset, d) { | |
| return { type: 'literal', value: strUnescape(d.join('')) }; | |
| })(pos0, result0[1]); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| if (result0 === null) { | |
| pos0 = pos; | |
| pos1 = pos; | |
| if (input.charCodeAt(pos) === 39) { | |
| result0 = "'"; | |
| pos++; | |
| } else { | |
| result0 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\"'\""); | |
| } | |
| } | |
| if (result0 !== null) { | |
| result1 = []; | |
| if (/^[^\\']/.test(input.charAt(pos))) { | |
| result2 = input.charAt(pos); | |
| pos++; | |
| } else { | |
| result2 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("[^\\\\']"); | |
| } | |
| } | |
| if (result2 === null) { | |
| pos2 = pos; | |
| pos3 = pos; | |
| if (input.charCodeAt(pos) === 92) { | |
| result2 = "\\"; | |
| pos++; | |
| } else { | |
| result2 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\"\\\\\""); | |
| } | |
| } | |
| if (result2 !== null) { | |
| if (input.length > pos) { | |
| result3 = input.charAt(pos); | |
| pos++; | |
| } else { | |
| result3 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("any character"); | |
| } | |
| } | |
| if (result3 !== null) { | |
| result2 = [result2, result3]; | |
| } else { | |
| result2 = null; | |
| pos = pos3; | |
| } | |
| } else { | |
| result2 = null; | |
| pos = pos3; | |
| } | |
| if (result2 !== null) { | |
| result2 = (function(offset, a, b) { return a + b; })(pos2, result2[0], result2[1]); | |
| } | |
| if (result2 === null) { | |
| pos = pos2; | |
| } | |
| } | |
| while (result2 !== null) { | |
| result1.push(result2); | |
| if (/^[^\\']/.test(input.charAt(pos))) { | |
| result2 = input.charAt(pos); | |
| pos++; | |
| } else { | |
| result2 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("[^\\\\']"); | |
| } | |
| } | |
| if (result2 === null) { | |
| pos2 = pos; | |
| pos3 = pos; | |
| if (input.charCodeAt(pos) === 92) { | |
| result2 = "\\"; | |
| pos++; | |
| } else { | |
| result2 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\"\\\\\""); | |
| } | |
| } | |
| if (result2 !== null) { | |
| if (input.length > pos) { | |
| result3 = input.charAt(pos); | |
| pos++; | |
| } else { | |
| result3 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("any character"); | |
| } | |
| } | |
| if (result3 !== null) { | |
| result2 = [result2, result3]; | |
| } else { | |
| result2 = null; | |
| pos = pos3; | |
| } | |
| } else { | |
| result2 = null; | |
| pos = pos3; | |
| } | |
| if (result2 !== null) { | |
| result2 = (function(offset, a, b) { return a + b; })(pos2, result2[0], result2[1]); | |
| } | |
| if (result2 === null) { | |
| pos = pos2; | |
| } | |
| } | |
| } | |
| if (result1 !== null) { | |
| if (input.charCodeAt(pos) === 39) { | |
| result2 = "'"; | |
| pos++; | |
| } else { | |
| result2 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\"'\""); | |
| } | |
| } | |
| if (result2 !== null) { | |
| result0 = [result0, result1, result2]; | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| if (result0 !== null) { | |
| result0 = (function(offset, d) { | |
| return { type: 'literal', value: strUnescape(d.join('')) }; | |
| })(pos0, result0[1]); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| } | |
| cache[cacheKey] = { | |
| nextPos: pos, | |
| result: result0 | |
| }; | |
| return result0; | |
| } | |
| function parse_number() { | |
| var cacheKey = "number@" + pos; | |
| var cachedResult = cache[cacheKey]; | |
| if (cachedResult) { | |
| pos = cachedResult.nextPos; | |
| return cachedResult.result; | |
| } | |
| var result0, result1, result2; | |
| var pos0, pos1, pos2; | |
| pos0 = pos; | |
| pos1 = pos; | |
| pos2 = pos; | |
| result0 = []; | |
| if (/^[0-9]/.test(input.charAt(pos))) { | |
| result1 = input.charAt(pos); | |
| pos++; | |
| } else { | |
| result1 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("[0-9]"); | |
| } | |
| } | |
| while (result1 !== null) { | |
| result0.push(result1); | |
| if (/^[0-9]/.test(input.charAt(pos))) { | |
| result1 = input.charAt(pos); | |
| pos++; | |
| } else { | |
| result1 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("[0-9]"); | |
| } | |
| } | |
| } | |
| if (result0 !== null) { | |
| if (input.charCodeAt(pos) === 46) { | |
| result1 = "."; | |
| pos++; | |
| } else { | |
| result1 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\".\""); | |
| } | |
| } | |
| if (result1 !== null) { | |
| result0 = [result0, result1]; | |
| } else { | |
| result0 = null; | |
| pos = pos2; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos2; | |
| } | |
| result0 = result0 !== null ? result0 : ""; | |
| if (result0 !== null) { | |
| if (/^[0-9]/.test(input.charAt(pos))) { | |
| result2 = input.charAt(pos); | |
| pos++; | |
| } else { | |
| result2 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("[0-9]"); | |
| } | |
| } | |
| if (result2 !== null) { | |
| result1 = []; | |
| while (result2 !== null) { | |
| result1.push(result2); | |
| if (/^[0-9]/.test(input.charAt(pos))) { | |
| result2 = input.charAt(pos); | |
| pos++; | |
| } else { | |
| result2 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("[0-9]"); | |
| } | |
| } | |
| } | |
| } else { | |
| result1 = null; | |
| } | |
| if (result1 !== null) { | |
| result0 = [result0, result1]; | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| if (result0 !== null) { | |
| result0 = (function(offset, a, b) { | |
| return { type: 'literal', value: parseFloat((a ? a.join('') : '') + b.join('')) }; | |
| })(pos0, result0[0], result0[1]); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| cache[cacheKey] = { | |
| nextPos: pos, | |
| result: result0 | |
| }; | |
| return result0; | |
| } | |
| function parse_path() { | |
| var cacheKey = "path@" + pos; | |
| var cachedResult = cache[cacheKey]; | |
| if (cachedResult) { | |
| pos = cachedResult.nextPos; | |
| return cachedResult.result; | |
| } | |
| var result0; | |
| var pos0; | |
| pos0 = pos; | |
| result0 = parse_identifierName(); | |
| if (result0 !== null) { | |
| result0 = (function(offset, i) { return { type: 'literal', value: i }; })(pos0, result0); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| cache[cacheKey] = { | |
| nextPos: pos, | |
| result: result0 | |
| }; | |
| return result0; | |
| } | |
| function parse_type() { | |
| var cacheKey = "type@" + pos; | |
| var cachedResult = cache[cacheKey]; | |
| if (cachedResult) { | |
| pos = cachedResult.nextPos; | |
| return cachedResult.result; | |
| } | |
| var result0, result1, result2, result3, result4; | |
| var pos0, pos1; | |
| pos0 = pos; | |
| pos1 = pos; | |
| if (input.substr(pos, 5) === "type(") { | |
| result0 = "type("; | |
| pos += 5; | |
| } else { | |
| result0 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\"type(\""); | |
| } | |
| } | |
| if (result0 !== null) { | |
| result1 = parse__(); | |
| if (result1 !== null) { | |
| if (/^[^ )]/.test(input.charAt(pos))) { | |
| result3 = input.charAt(pos); | |
| pos++; | |
| } else { | |
| result3 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("[^ )]"); | |
| } | |
| } | |
| if (result3 !== null) { | |
| result2 = []; | |
| while (result3 !== null) { | |
| result2.push(result3); | |
| if (/^[^ )]/.test(input.charAt(pos))) { | |
| result3 = input.charAt(pos); | |
| pos++; | |
| } else { | |
| result3 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("[^ )]"); | |
| } | |
| } | |
| } | |
| } else { | |
| result2 = null; | |
| } | |
| if (result2 !== null) { | |
| result3 = parse__(); | |
| if (result3 !== null) { | |
| if (input.charCodeAt(pos) === 41) { | |
| result4 = ")"; | |
| pos++; | |
| } else { | |
| result4 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\")\""); | |
| } | |
| } | |
| if (result4 !== null) { | |
| result0 = [result0, result1, result2, result3, result4]; | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| if (result0 !== null) { | |
| result0 = (function(offset, t) { return { type: 'type', value: t.join('') }; })(pos0, result0[2]); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| cache[cacheKey] = { | |
| nextPos: pos, | |
| result: result0 | |
| }; | |
| return result0; | |
| } | |
| function parse_regex() { | |
| var cacheKey = "regex@" + pos; | |
| var cachedResult = cache[cacheKey]; | |
| if (cachedResult) { | |
| pos = cachedResult.nextPos; | |
| return cachedResult.result; | |
| } | |
| var result0, result1, result2; | |
| var pos0, pos1; | |
| pos0 = pos; | |
| pos1 = pos; | |
| if (input.charCodeAt(pos) === 47) { | |
| result0 = "/"; | |
| pos++; | |
| } else { | |
| result0 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\"/\""); | |
| } | |
| } | |
| if (result0 !== null) { | |
| if (/^[^\/]/.test(input.charAt(pos))) { | |
| result2 = input.charAt(pos); | |
| pos++; | |
| } else { | |
| result2 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("[^\\/]"); | |
| } | |
| } | |
| if (result2 !== null) { | |
| result1 = []; | |
| while (result2 !== null) { | |
| result1.push(result2); | |
| if (/^[^\/]/.test(input.charAt(pos))) { | |
| result2 = input.charAt(pos); | |
| pos++; | |
| } else { | |
| result2 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("[^\\/]"); | |
| } | |
| } | |
| } | |
| } else { | |
| result1 = null; | |
| } | |
| if (result1 !== null) { | |
| if (input.charCodeAt(pos) === 47) { | |
| result2 = "/"; | |
| pos++; | |
| } else { | |
| result2 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\"/\""); | |
| } | |
| } | |
| if (result2 !== null) { | |
| result0 = [result0, result1, result2]; | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| if (result0 !== null) { | |
| result0 = (function(offset, d) { return { type: 'regexp', value: new RegExp(d.join('')) }; })(pos0, result0[1]); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| cache[cacheKey] = { | |
| nextPos: pos, | |
| result: result0 | |
| }; | |
| return result0; | |
| } | |
| function parse_field() { | |
| var cacheKey = "field@" + pos; | |
| var cachedResult = cache[cacheKey]; | |
| if (cachedResult) { | |
| pos = cachedResult.nextPos; | |
| return cachedResult.result; | |
| } | |
| var result0, result1, result2, result3, result4; | |
| var pos0, pos1, pos2; | |
| pos0 = pos; | |
| pos1 = pos; | |
| if (input.charCodeAt(pos) === 46) { | |
| result0 = "."; | |
| pos++; | |
| } else { | |
| result0 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\".\""); | |
| } | |
| } | |
| if (result0 !== null) { | |
| result1 = parse_identifierName(); | |
| if (result1 !== null) { | |
| result2 = []; | |
| pos2 = pos; | |
| if (input.charCodeAt(pos) === 46) { | |
| result3 = "."; | |
| pos++; | |
| } else { | |
| result3 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\".\""); | |
| } | |
| } | |
| if (result3 !== null) { | |
| result4 = parse_identifierName(); | |
| if (result4 !== null) { | |
| result3 = [result3, result4]; | |
| } else { | |
| result3 = null; | |
| pos = pos2; | |
| } | |
| } else { | |
| result3 = null; | |
| pos = pos2; | |
| } | |
| while (result3 !== null) { | |
| result2.push(result3); | |
| pos2 = pos; | |
| if (input.charCodeAt(pos) === 46) { | |
| result3 = "."; | |
| pos++; | |
| } else { | |
| result3 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\".\""); | |
| } | |
| } | |
| if (result3 !== null) { | |
| result4 = parse_identifierName(); | |
| if (result4 !== null) { | |
| result3 = [result3, result4]; | |
| } else { | |
| result3 = null; | |
| pos = pos2; | |
| } | |
| } else { | |
| result3 = null; | |
| pos = pos2; | |
| } | |
| } | |
| if (result2 !== null) { | |
| result0 = [result0, result1, result2]; | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| if (result0 !== null) { | |
| result0 = (function(offset, i, is) { | |
| return { type: 'field', name: is.reduce(function(memo, p){ return memo + p[0] + p[1]; }, i)}; | |
| })(pos0, result0[1], result0[2]); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| cache[cacheKey] = { | |
| nextPos: pos, | |
| result: result0 | |
| }; | |
| return result0; | |
| } | |
| function parse_negation() { | |
| var cacheKey = "negation@" + pos; | |
| var cachedResult = cache[cacheKey]; | |
| if (cachedResult) { | |
| pos = cachedResult.nextPos; | |
| return cachedResult.result; | |
| } | |
| var result0, result1, result2, result3, result4; | |
| var pos0, pos1; | |
| pos0 = pos; | |
| pos1 = pos; | |
| if (input.substr(pos, 5) === ":not(") { | |
| result0 = ":not("; | |
| pos += 5; | |
| } else { | |
| result0 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\":not(\""); | |
| } | |
| } | |
| if (result0 !== null) { | |
| result1 = parse__(); | |
| if (result1 !== null) { | |
| result2 = parse_selectors(); | |
| if (result2 !== null) { | |
| result3 = parse__(); | |
| if (result3 !== null) { | |
| if (input.charCodeAt(pos) === 41) { | |
| result4 = ")"; | |
| pos++; | |
| } else { | |
| result4 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\")\""); | |
| } | |
| } | |
| if (result4 !== null) { | |
| result0 = [result0, result1, result2, result3, result4]; | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| if (result0 !== null) { | |
| result0 = (function(offset, ss) { return { type: 'not', selectors: ss }; })(pos0, result0[2]); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| cache[cacheKey] = { | |
| nextPos: pos, | |
| result: result0 | |
| }; | |
| return result0; | |
| } | |
| function parse_matches() { | |
| var cacheKey = "matches@" + pos; | |
| var cachedResult = cache[cacheKey]; | |
| if (cachedResult) { | |
| pos = cachedResult.nextPos; | |
| return cachedResult.result; | |
| } | |
| var result0, result1, result2, result3, result4; | |
| var pos0, pos1; | |
| pos0 = pos; | |
| pos1 = pos; | |
| if (input.substr(pos, 9) === ":matches(") { | |
| result0 = ":matches("; | |
| pos += 9; | |
| } else { | |
| result0 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\":matches(\""); | |
| } | |
| } | |
| if (result0 !== null) { | |
| result1 = parse__(); | |
| if (result1 !== null) { | |
| result2 = parse_selectors(); | |
| if (result2 !== null) { | |
| result3 = parse__(); | |
| if (result3 !== null) { | |
| if (input.charCodeAt(pos) === 41) { | |
| result4 = ")"; | |
| pos++; | |
| } else { | |
| result4 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\")\""); | |
| } | |
| } | |
| if (result4 !== null) { | |
| result0 = [result0, result1, result2, result3, result4]; | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| if (result0 !== null) { | |
| result0 = (function(offset, ss) { return { type: 'matches', selectors: ss }; })(pos0, result0[2]); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| cache[cacheKey] = { | |
| nextPos: pos, | |
| result: result0 | |
| }; | |
| return result0; | |
| } | |
| function parse_has() { | |
| var cacheKey = "has@" + pos; | |
| var cachedResult = cache[cacheKey]; | |
| if (cachedResult) { | |
| pos = cachedResult.nextPos; | |
| return cachedResult.result; | |
| } | |
| var result0, result1, result2, result3, result4; | |
| var pos0, pos1; | |
| pos0 = pos; | |
| pos1 = pos; | |
| if (input.substr(pos, 5) === ":has(") { | |
| result0 = ":has("; | |
| pos += 5; | |
| } else { | |
| result0 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\":has(\""); | |
| } | |
| } | |
| if (result0 !== null) { | |
| result1 = parse__(); | |
| if (result1 !== null) { | |
| result2 = parse_selectors(); | |
| if (result2 !== null) { | |
| result3 = parse__(); | |
| if (result3 !== null) { | |
| if (input.charCodeAt(pos) === 41) { | |
| result4 = ")"; | |
| pos++; | |
| } else { | |
| result4 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\")\""); | |
| } | |
| } | |
| if (result4 !== null) { | |
| result0 = [result0, result1, result2, result3, result4]; | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| if (result0 !== null) { | |
| result0 = (function(offset, ss) { return { type: 'has', selectors: ss }; })(pos0, result0[2]); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| cache[cacheKey] = { | |
| nextPos: pos, | |
| result: result0 | |
| }; | |
| return result0; | |
| } | |
| function parse_firstChild() { | |
| var cacheKey = "firstChild@" + pos; | |
| var cachedResult = cache[cacheKey]; | |
| if (cachedResult) { | |
| pos = cachedResult.nextPos; | |
| return cachedResult.result; | |
| } | |
| var result0; | |
| var pos0; | |
| pos0 = pos; | |
| if (input.substr(pos, 12) === ":first-child") { | |
| result0 = ":first-child"; | |
| pos += 12; | |
| } else { | |
| result0 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\":first-child\""); | |
| } | |
| } | |
| if (result0 !== null) { | |
| result0 = (function(offset) { return nth(1); })(pos0); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| cache[cacheKey] = { | |
| nextPos: pos, | |
| result: result0 | |
| }; | |
| return result0; | |
| } | |
| function parse_lastChild() { | |
| var cacheKey = "lastChild@" + pos; | |
| var cachedResult = cache[cacheKey]; | |
| if (cachedResult) { | |
| pos = cachedResult.nextPos; | |
| return cachedResult.result; | |
| } | |
| var result0; | |
| var pos0; | |
| pos0 = pos; | |
| if (input.substr(pos, 11) === ":last-child") { | |
| result0 = ":last-child"; | |
| pos += 11; | |
| } else { | |
| result0 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\":last-child\""); | |
| } | |
| } | |
| if (result0 !== null) { | |
| result0 = (function(offset) { return nthLast(1); })(pos0); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| cache[cacheKey] = { | |
| nextPos: pos, | |
| result: result0 | |
| }; | |
| return result0; | |
| } | |
| function parse_nthChild() { | |
| var cacheKey = "nthChild@" + pos; | |
| var cachedResult = cache[cacheKey]; | |
| if (cachedResult) { | |
| pos = cachedResult.nextPos; | |
| return cachedResult.result; | |
| } | |
| var result0, result1, result2, result3, result4; | |
| var pos0, pos1; | |
| pos0 = pos; | |
| pos1 = pos; | |
| if (input.substr(pos, 11) === ":nth-child(") { | |
| result0 = ":nth-child("; | |
| pos += 11; | |
| } else { | |
| result0 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\":nth-child(\""); | |
| } | |
| } | |
| if (result0 !== null) { | |
| result1 = parse__(); | |
| if (result1 !== null) { | |
| if (/^[0-9]/.test(input.charAt(pos))) { | |
| result3 = input.charAt(pos); | |
| pos++; | |
| } else { | |
| result3 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("[0-9]"); | |
| } | |
| } | |
| if (result3 !== null) { | |
| result2 = []; | |
| while (result3 !== null) { | |
| result2.push(result3); | |
| if (/^[0-9]/.test(input.charAt(pos))) { | |
| result3 = input.charAt(pos); | |
| pos++; | |
| } else { | |
| result3 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("[0-9]"); | |
| } | |
| } | |
| } | |
| } else { | |
| result2 = null; | |
| } | |
| if (result2 !== null) { | |
| result3 = parse__(); | |
| if (result3 !== null) { | |
| if (input.charCodeAt(pos) === 41) { | |
| result4 = ")"; | |
| pos++; | |
| } else { | |
| result4 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\")\""); | |
| } | |
| } | |
| if (result4 !== null) { | |
| result0 = [result0, result1, result2, result3, result4]; | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| if (result0 !== null) { | |
| result0 = (function(offset, n) { return nth(parseInt(n.join(''), 10)); })(pos0, result0[2]); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| cache[cacheKey] = { | |
| nextPos: pos, | |
| result: result0 | |
| }; | |
| return result0; | |
| } | |
| function parse_nthLastChild() { | |
| var cacheKey = "nthLastChild@" + pos; | |
| var cachedResult = cache[cacheKey]; | |
| if (cachedResult) { | |
| pos = cachedResult.nextPos; | |
| return cachedResult.result; | |
| } | |
| var result0, result1, result2, result3, result4; | |
| var pos0, pos1; | |
| pos0 = pos; | |
| pos1 = pos; | |
| if (input.substr(pos, 16) === ":nth-last-child(") { | |
| result0 = ":nth-last-child("; | |
| pos += 16; | |
| } else { | |
| result0 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\":nth-last-child(\""); | |
| } | |
| } | |
| if (result0 !== null) { | |
| result1 = parse__(); | |
| if (result1 !== null) { | |
| if (/^[0-9]/.test(input.charAt(pos))) { | |
| result3 = input.charAt(pos); | |
| pos++; | |
| } else { | |
| result3 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("[0-9]"); | |
| } | |
| } | |
| if (result3 !== null) { | |
| result2 = []; | |
| while (result3 !== null) { | |
| result2.push(result3); | |
| if (/^[0-9]/.test(input.charAt(pos))) { | |
| result3 = input.charAt(pos); | |
| pos++; | |
| } else { | |
| result3 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("[0-9]"); | |
| } | |
| } | |
| } | |
| } else { | |
| result2 = null; | |
| } | |
| if (result2 !== null) { | |
| result3 = parse__(); | |
| if (result3 !== null) { | |
| if (input.charCodeAt(pos) === 41) { | |
| result4 = ")"; | |
| pos++; | |
| } else { | |
| result4 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\")\""); | |
| } | |
| } | |
| if (result4 !== null) { | |
| result0 = [result0, result1, result2, result3, result4]; | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| if (result0 !== null) { | |
| result0 = (function(offset, n) { return nthLast(parseInt(n.join(''), 10)); })(pos0, result0[2]); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| cache[cacheKey] = { | |
| nextPos: pos, | |
| result: result0 | |
| }; | |
| return result0; | |
| } | |
| function parse_class() { | |
| var cacheKey = "class@" + pos; | |
| var cachedResult = cache[cacheKey]; | |
| if (cachedResult) { | |
| pos = cachedResult.nextPos; | |
| return cachedResult.result; | |
| } | |
| var result0, result1; | |
| var pos0, pos1; | |
| pos0 = pos; | |
| pos1 = pos; | |
| if (input.charCodeAt(pos) === 58) { | |
| result0 = ":"; | |
| pos++; | |
| } else { | |
| result0 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\":\""); | |
| } | |
| } | |
| if (result0 !== null) { | |
| if (input.substr(pos, 9).toLowerCase() === "statement") { | |
| result1 = input.substr(pos, 9); | |
| pos += 9; | |
| } else { | |
| result1 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\"statement\""); | |
| } | |
| } | |
| if (result1 === null) { | |
| if (input.substr(pos, 10).toLowerCase() === "expression") { | |
| result1 = input.substr(pos, 10); | |
| pos += 10; | |
| } else { | |
| result1 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\"expression\""); | |
| } | |
| } | |
| if (result1 === null) { | |
| if (input.substr(pos, 11).toLowerCase() === "declaration") { | |
| result1 = input.substr(pos, 11); | |
| pos += 11; | |
| } else { | |
| result1 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\"declaration\""); | |
| } | |
| } | |
| if (result1 === null) { | |
| if (input.substr(pos, 8).toLowerCase() === "function") { | |
| result1 = input.substr(pos, 8); | |
| pos += 8; | |
| } else { | |
| result1 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\"function\""); | |
| } | |
| } | |
| if (result1 === null) { | |
| if (input.substr(pos, 7).toLowerCase() === "pattern") { | |
| result1 = input.substr(pos, 7); | |
| pos += 7; | |
| } else { | |
| result1 = null; | |
| if (reportFailures === 0) { | |
| matchFailed("\"pattern\""); | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| if (result1 !== null) { | |
| result0 = [result0, result1]; | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| } else { | |
| result0 = null; | |
| pos = pos1; | |
| } | |
| if (result0 !== null) { | |
| result0 = (function(offset, c) { | |
| return { type: 'class', name: c }; | |
| })(pos0, result0[1]); | |
| } | |
| if (result0 === null) { | |
| pos = pos0; | |
| } | |
| cache[cacheKey] = { | |
| nextPos: pos, | |
| result: result0 | |
| }; | |
| return result0; | |
| } | |
| function cleanupExpected(expected) { | |
| expected.sort(); | |
| var lastExpected = null; | |
| var cleanExpected = []; | |
| for (var i = 0; i < expected.length; i++) { | |
| if (expected[i] !== lastExpected) { | |
| cleanExpected.push(expected[i]); | |
| lastExpected = expected[i]; | |
| } | |
| } | |
| return cleanExpected; | |
| } | |
| function computeErrorPosition() { | |
| /* | |
| * The first idea was to use |String.split| to break the input up to the | |
| * error position along newlines and derive the line and column from | |
| * there. However IE's |split| implementation is so broken that it was | |
| * enough to prevent it. | |
| */ | |
| var line = 1; | |
| var column = 1; | |
| var seenCR = false; | |
| for (var i = 0; i < Math.max(pos, rightmostFailuresPos); i++) { | |
| var ch = input.charAt(i); | |
| if (ch === "\n") { | |
| if (!seenCR) { line++; } | |
| column = 1; | |
| seenCR = false; | |
| } else if (ch === "\r" || ch === "\u2028" || ch === "\u2029") { | |
| line++; | |
| column = 1; | |
| seenCR = true; | |
| } else { | |
| column++; | |
| seenCR = false; | |
| } | |
| } | |
| return { line: line, column: column }; | |
| } | |
| function nth(n) { return { type: 'nth-child', index: { type: 'literal', value: n } }; } | |
| function nthLast(n) { return { type: 'nth-last-child', index: { type: 'literal', value: n } }; } | |
| function strUnescape(s) { | |
| return s.replace(/\\(.)/g, function(match, ch) { | |
| switch(ch) { | |
| case 'a': return '\a'; | |
| case 'b': return '\b'; | |
| case 'f': return '\f'; | |
| case 'n': return '\n'; | |
| case 'r': return '\r'; | |
| case 't': return '\t'; | |
| case 'v': return '\v'; | |
| default: return ch; | |
| } | |
| }); | |
| } | |
| var result = parseFunctions[startRule](); | |
| /* | |
| * The parser is now in one of the following three states: | |
| * | |
| * 1. The parser successfully parsed the whole input. | |
| * | |
| * - |result !== null| | |
| * - |pos === input.length| | |
| * - |rightmostFailuresExpected| may or may not contain something | |
| * | |
| * 2. The parser successfully parsed only a part of the input. | |
| * | |
| * - |result !== null| | |
| * - |pos < input.length| | |
| * - |rightmostFailuresExpected| may or may not contain something | |
| * | |
| * 3. The parser did not successfully parse any part of the input. | |
| * | |
| * - |result === null| | |
| * - |pos === 0| | |
| * - |rightmostFailuresExpected| contains at least one failure | |
| * | |
| * All code following this comment (including called functions) must | |
| * handle these states. | |
| */ | |
| if (result === null || pos !== input.length) { | |
| var offset = Math.max(pos, rightmostFailuresPos); | |
| var found = offset < input.length ? input.charAt(offset) : null; | |
| var errorPosition = computeErrorPosition(); | |
| throw new this.SyntaxError( | |
| cleanupExpected(rightmostFailuresExpected), | |
| found, | |
| offset, | |
| errorPosition.line, | |
| errorPosition.column | |
| ); | |
| } | |
| return result; | |
| }, | |
| /* Returns the parser source code. */ | |
| toSource: function() { return this._source; } | |
| }; | |
| /* Thrown when a parser encounters a syntax error. */ | |
| result.SyntaxError = function(expected, found, offset, line, column) { | |
| function buildMessage(expected, found) { | |
| var expectedHumanized, foundHumanized; | |
| switch (expected.length) { | |
| case 0: | |
| expectedHumanized = "end of input"; | |
| break; | |
| case 1: | |
| expectedHumanized = expected[0]; | |
| break; | |
| default: | |
| expectedHumanized = expected.slice(0, expected.length - 1).join(", ") | |
| + " or " | |
| + expected[expected.length - 1]; | |
| } | |
| foundHumanized = found ? quote(found) : "end of input"; | |
| return "Expected " + expectedHumanized + " but " + foundHumanized + " found."; | |
| } | |
| this.name = "SyntaxError"; | |
| this.expected = expected; | |
| this.found = found; | |
| this.message = buildMessage(expected, found); | |
| this.offset = offset; | |
| this.line = line; | |
| this.column = column; | |
| }; | |
| result.SyntaxError.prototype = Error.prototype; | |
| return result; | |
| })(); | |
| if (typeof define === "function" && define.amd) { define(function(){ return result; }); } else if (typeof module !== "undefined" && module.exports) { module.exports = result; } else { this.esquery = result; } |