diff options
| -rw-r--r-- | lib/ical.js | 1396 |
1 files changed, 1396 insertions, 0 deletions
diff --git a/lib/ical.js b/lib/ical.js new file mode 100644 index 0000000..fe0ba00 --- /dev/null +++ b/lib/ical.js @@ -0,0 +1,1396 @@ +module.exports = (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, + "ContentLineList": parse_ContentLineList, + "ContentLine": parse_ContentLine, + "Name": parse_Name, + "IANAToken": parse_IANAToken, + "XName": parse_XName, + "VendorID": parse_VendorID, + "Param": parse_Param, + "ParamValueList": parse_ParamValueList, + "ParamName": parse_ParamName, + "ParamValue": parse_ParamValue, + "ParamText": parse_ParamText, + "Value": parse_Value, + "QuotedString": parse_QuotedString, + "QSAFE_CHAR": parse_QSAFE_CHAR, + "SAFE_CHAR": parse_SAFE_CHAR, + "VALUE_CHAR": parse_VALUE_CHAR, + "NON_US_ASCII": parse_NON_US_ASCII, + "CONTROL": parse_CONTROL, + "LineEnd": parse_LineEnd, + "CR": parse_CR, + "LF": parse_LF, + "UTF8_Octets": parse_UTF8_Octets, + "UTF8_Char": parse_UTF8_Char, + "UTF8_1": parse_UTF8_1, + "UTF8_2": parse_UTF8_2, + "UTF8_3": parse_UTF8_3, + "UTF8_4": parse_UTF8_4, + "UTF8_Tail": parse_UTF8_Tail, + "UTF8_Tail2": parse_UTF8_Tail2 + }; + + 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 = []; + + 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 result0; + var pos0; + + result0 = parse_ContentLineList(); + if (result0 === null) { + pos0 = pos; + result0 = ""; + if (result0 !== null) { + result0 = (function(offset) { return []; })(pos0); + } + if (result0 === null) { + pos = pos0; + } + } + return result0; + } + + function parse_ContentLineList() { + var result0, result1, result2, result3; + var pos0, pos1, pos2; + + pos0 = pos; + pos1 = pos; + result0 = parse_ContentLine(); + if (result0 !== null) { + result1 = []; + pos2 = pos; + result2 = parse_LineEnd(); + if (result2 !== null) { + result3 = parse_ContentLine(); + 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_LineEnd(); + if (result2 !== null) { + result3 = parse_ContentLine(); + 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, head, tail) { + var result = [head], i = 0; + for (; i < tail.length; ++i) result.push(tail[i][1]); + return result; + })(pos0, result0[0], result0[1]); + } + if (result0 === null) { + pos = pos0; + } + return result0; + } + + function parse_ContentLine() { + var result0, result1, result2, result3; + var pos0, pos1, pos2; + + pos0 = pos; + pos1 = pos; + result0 = parse_Name(); + if (result0 !== null) { + result1 = []; + pos2 = pos; + if (input.charCodeAt(pos) === 59) { + result2 = ";"; + pos++; + } else { + result2 = null; + if (reportFailures === 0) { + matchFailed("\";\""); + } + } + if (result2 !== null) { + result3 = parse_Param(); + if (result3 !== null) { + result2 = [result2, result3]; + } else { + result2 = null; + pos = pos2; + } + } else { + result2 = null; + pos = pos2; + } + while (result2 !== null) { + result1.push(result2); + pos2 = pos; + if (input.charCodeAt(pos) === 59) { + result2 = ";"; + pos++; + } else { + result2 = null; + if (reportFailures === 0) { + matchFailed("\";\""); + } + } + if (result2 !== null) { + result3 = parse_Param(); + if (result3 !== null) { + result2 = [result2, result3]; + } else { + result2 = null; + pos = pos2; + } + } else { + result2 = null; + pos = pos2; + } + } + if (result1 !== null) { + if (input.charCodeAt(pos) === 58) { + result2 = ":"; + pos++; + } else { + result2 = null; + if (reportFailures === 0) { + matchFailed("\":\""); + } + } + if (result2 !== null) { + result3 = parse_Value(); + if (result3 !== null) { + result0 = [result0, result1, result2, result3]; + } 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, params, value) { + var par = [], i = 0; + for (i = 0; i < params.length; ++i) par.push(params[i][1]); + return {name:name, params:par, value:value}; + })(pos0, result0[0], result0[1], result0[3]); + } + if (result0 === null) { + pos = pos0; + } + return result0; + } + + function parse_Name() { + var result0; + + result0 = parse_XName(); + if (result0 === null) { + result0 = parse_IANAToken(); + } + return result0; + } + + function parse_IANAToken() { + var result0, result1; + var pos0; + + pos0 = pos; + if (/^[A-Za-z0-9\-]/.test(input.charAt(pos))) { + result1 = input.charAt(pos); + pos++; + } else { + result1 = null; + if (reportFailures === 0) { + matchFailed("[A-Za-z0-9\\-]"); + } + } + if (result1 !== null) { + result0 = []; + while (result1 !== null) { + result0.push(result1); + if (/^[A-Za-z0-9\-]/.test(input.charAt(pos))) { + result1 = input.charAt(pos); + pos++; + } else { + result1 = null; + if (reportFailures === 0) { + matchFailed("[A-Za-z0-9\\-]"); + } + } + } + } else { + result0 = null; + } + if (result0 !== null) { + result0 = (function(offset, token) { return token.join(""); })(pos0, result0); + } + if (result0 === null) { + pos = pos0; + } + return result0; + } + + function parse_XName() { + var result0, result1, result2, result3; + var pos0, pos1, pos2; + + pos0 = pos; + pos1 = pos; + if (input.substr(pos, 2) === "X-") { + result0 = "X-"; + pos += 2; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed("\"X-\""); + } + } + if (result0 !== null) { + pos2 = pos; + result1 = parse_VendorID(); + if (result1 !== null) { + if (input.charCodeAt(pos) === 45) { + result2 = "-"; + pos++; + } else { + result2 = null; + if (reportFailures === 0) { + matchFailed("\"-\""); + } + } + if (result2 !== null) { + result1 = [result1, result2]; + } else { + result1 = null; + pos = pos2; + } + } else { + result1 = null; + pos = pos2; + } + result1 = result1 !== null ? result1 : ""; + if (result1 !== null) { + if (/^[A-Za-z0-9\-]/.test(input.charAt(pos))) { + result3 = input.charAt(pos); + pos++; + } else { + result3 = null; + if (reportFailures === 0) { + matchFailed("[A-Za-z0-9\\-]"); + } + } + if (result3 !== null) { + result2 = []; + while (result3 !== null) { + result2.push(result3); + if (/^[A-Za-z0-9\-]/.test(input.charAt(pos))) { + result3 = input.charAt(pos); + pos++; + } else { + result3 = null; + if (reportFailures === 0) { + matchFailed("[A-Za-z0-9\\-]"); + } + } + } + } else { + result2 = null; + } + 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, x, vendor, tok) { + if (vendor !== null) vendor = vendor[0] + '-'; + else vendor = ''; + return x + vendor + tok.join(""); + })(pos0, result0[0], result0[1], result0[2]); + } + if (result0 === null) { + pos = pos0; + } + return result0; + } + + function parse_VendorID() { + var result0, result1; + var pos0; + + pos0 = pos; + if (/^[A-Za-z0-9]/.test(input.charAt(pos))) { + result1 = input.charAt(pos); + pos++; + } else { + result1 = null; + if (reportFailures === 0) { + matchFailed("[A-Za-z0-9]"); + } + } + if (result1 !== null) { + result0 = []; + while (result1 !== null) { + result0.push(result1); + if (/^[A-Za-z0-9]/.test(input.charAt(pos))) { + result1 = input.charAt(pos); + pos++; + } else { + result1 = null; + if (reportFailures === 0) { + matchFailed("[A-Za-z0-9]"); + } + } + } + } else { + result0 = null; + } + if (result0 !== null) { + result0 = (function(offset, chars) { + return chars.join(""); + })(pos0, result0); + } + if (result0 === null) { + pos = pos0; + } + return result0; + } + + function parse_Param() { + var result0, result1, result2; + var pos0, pos1; + + pos0 = pos; + pos1 = pos; + result0 = parse_ParamName(); + if (result0 !== null) { + if (input.charCodeAt(pos) === 61) { + result1 = "="; + pos++; + } else { + result1 = null; + if (reportFailures === 0) { + matchFailed("\"=\""); + } + } + if (result1 !== null) { + result2 = parse_ParamValueList(); + 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, name, params) { + return {name:name, values:params}; + })(pos0, result0[0], result0[2]); + } + if (result0 === null) { + pos = pos0; + } + return result0; + } + + function parse_ParamValueList() { + var result0, result1, result2, result3; + var pos0, pos1, pos2; + + pos0 = pos; + pos1 = pos; + result0 = parse_ParamValue(); + if (result0 !== null) { + result1 = []; + pos2 = pos; + if (input.charCodeAt(pos) === 44) { + result2 = ","; + pos++; + } else { + result2 = null; + if (reportFailures === 0) { + matchFailed("\",\""); + } + } + if (result2 !== null) { + result3 = parse_ParamValue(); + if (result3 !== null) { + result2 = [result2, result3]; + } else { + result2 = null; + pos = pos2; + } + } else { + result2 = null; + pos = pos2; + } + while (result2 !== null) { + result1.push(result2); + pos2 = pos; + if (input.charCodeAt(pos) === 44) { + result2 = ","; + pos++; + } else { + result2 = null; + if (reportFailures === 0) { + matchFailed("\",\""); + } + } + if (result2 !== null) { + result3 = parse_ParamValue(); + 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, head, tail) { + var result = [head]; + var i = 0; + for (i = 0; i < tail.length; ++i) result.push(tail[i][1]); + return result; + })(pos0, result0[0], result0[1]); + } + if (result0 === null) { + pos = pos0; + } + return result0; + } + + function parse_ParamName() { + var result0; + + reportFailures++; + result0 = parse_XName(); + if (result0 === null) { + result0 = parse_IANAToken(); + } + reportFailures--; + if (reportFailures === 0 && result0 === null) { + matchFailed("ParamName"); + } + return result0; + } + + function parse_ParamValue() { + var result0; + + reportFailures++; + result0 = parse_QuotedString(); + if (result0 === null) { + result0 = parse_ParamText(); + } + reportFailures--; + if (reportFailures === 0 && result0 === null) { + matchFailed("ParamValue"); + } + return result0; + } + + function parse_ParamText() { + var result0, result1; + var pos0; + + reportFailures++; + pos0 = pos; + result0 = []; + result1 = parse_SAFE_CHAR(); + while (result1 !== null) { + result0.push(result1); + result1 = parse_SAFE_CHAR(); + } + if (result0 !== null) { + result0 = (function(offset, chars) { return chars.join(""); })(pos0, result0); + } + if (result0 === null) { + pos = pos0; + } + reportFailures--; + if (reportFailures === 0 && result0 === null) { + matchFailed("ParamText"); + } + return result0; + } + + function parse_Value() { + var result0, result1; + var pos0; + + reportFailures++; + pos0 = pos; + result0 = []; + result1 = parse_VALUE_CHAR(); + while (result1 !== null) { + result0.push(result1); + result1 = parse_VALUE_CHAR(); + } + if (result0 !== null) { + result0 = (function(offset, chars) { return chars.join(""); })(pos0, result0); + } + if (result0 === null) { + pos = pos0; + } + reportFailures--; + if (reportFailures === 0 && result0 === null) { + matchFailed("Value"); + } + return result0; + } + + function parse_QuotedString() { + var result0, result1, result2; + var pos0, pos1; + + reportFailures++; + pos0 = pos; + pos1 = pos; + if (input.charCodeAt(pos) === 34) { + result0 = "\""; + pos++; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed("\"\\\"\""); + } + } + if (result0 !== null) { + result1 = []; + result2 = parse_QSAFE_CHAR(); + while (result2 !== null) { + result1.push(result2); + result2 = parse_QSAFE_CHAR(); + } + 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, chars) { return '"' + chars.join("") + '"'; })(pos0, result0[1]); + } + if (result0 === null) { + pos = pos0; + } + reportFailures--; + if (reportFailures === 0 && result0 === null) { + matchFailed("QuotedString"); + } + return result0; + } + + function parse_QSAFE_CHAR() { + var result0; + + reportFailures++; + if (/^[^"\0-\x08\n-\x1F]/.test(input.charAt(pos))) { + result0 = input.charAt(pos); + pos++; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed("[^\"\\0-\\x08\\n-\\x1F]"); + } + } + reportFailures--; + if (reportFailures === 0 && result0 === null) { + matchFailed("QSAFE_CHAR"); + } + return result0; + } + + function parse_SAFE_CHAR() { + var result0; + + reportFailures++; + if (/^[^"\0-\x08\n-\x1F;:,]/.test(input.charAt(pos))) { + result0 = input.charAt(pos); + pos++; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed("[^\"\\0-\\x08\\n-\\x1F;:,]"); + } + } + reportFailures--; + if (reportFailures === 0 && result0 === null) { + matchFailed("SAFE_CHAR"); + } + return result0; + } + + function parse_VALUE_CHAR() { + var result0; + + reportFailures++; + if (/^[^\0-\x08\n-\x1F]/.test(input.charAt(pos))) { + result0 = input.charAt(pos); + pos++; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed("[^\\0-\\x08\\n-\\x1F]"); + } + } + reportFailures--; + if (reportFailures === 0 && result0 === null) { + matchFailed("VALUE_CHAR"); + } + return result0; + } + + function parse_NON_US_ASCII() { + var result0; + + result0 = parse_UTF8_2(); + if (result0 === null) { + result0 = parse_UTF8_3(); + if (result0 === null) { + result0 = parse_UTF8_4(); + } + } + return result0; + } + + function parse_CONTROL() { + var result0; + + if (/^[\0-\x08\n-\x1F]/.test(input.charAt(pos))) { + result0 = input.charAt(pos); + pos++; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed("[\\0-\\x08\\n-\\x1F]"); + } + } + return result0; + } + + function parse_LineEnd() { + var result0, result1; + var pos0; + + reportFailures++; + pos0 = pos; + result0 = parse_CR(); + if (result0 !== null) { + result1 = parse_LF(); + if (result1 !== null) { + result0 = [result0, result1]; + } else { + result0 = null; + pos = pos0; + } + } else { + result0 = null; + pos = pos0; + } + if (result0 === null) { + result0 = parse_LF(); + } + reportFailures--; + if (reportFailures === 0 && result0 === null) { + matchFailed("LineEnd"); + } + return result0; + } + + function parse_CR() { + var result0; + + reportFailures++; + if (input.charCodeAt(pos) === 13) { + result0 = "\r"; + pos++; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed("\"\\r\""); + } + } + reportFailures--; + if (reportFailures === 0 && result0 === null) { + matchFailed("CR"); + } + return result0; + } + + function parse_LF() { + var result0; + + reportFailures++; + if (input.charCodeAt(pos) === 10) { + result0 = "\n"; + pos++; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed("\"\\n\""); + } + } + reportFailures--; + if (reportFailures === 0 && result0 === null) { + matchFailed("LF"); + } + return result0; + } + + function parse_UTF8_Octets() { + var result0, result1; + + result0 = []; + result1 = parse_UTF8_Char(); + while (result1 !== null) { + result0.push(result1); + result1 = parse_UTF8_Char(); + } + return result0; + } + + function parse_UTF8_Char() { + var result0; + + result0 = parse_UTF8_1(); + if (result0 === null) { + result0 = parse_UTF8_2(); + if (result0 === null) { + result0 = parse_UTF8_3(); + if (result0 === null) { + result0 = parse_UTF8_4(); + } + } + } + return result0; + } + + function parse_UTF8_1() { + var result0; + + if (/^[\0-]/.test(input.charAt(pos))) { + result0 = input.charAt(pos); + pos++; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed("[\\0-]"); + } + } + return result0; + } + + function parse_UTF8_2() { + var result0, result1; + var pos0; + + pos0 = pos; + if (/^[\xC2-\xDF]/.test(input.charAt(pos))) { + result0 = input.charAt(pos); + pos++; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed("[\\xC2-\\xDF]"); + } + } + if (result0 !== null) { + result1 = parse_UTF8_Tail(); + if (result1 !== null) { + result0 = [result0, result1]; + } else { + result0 = null; + pos = pos0; + } + } else { + result0 = null; + pos = pos0; + } + return result0; + } + + function parse_UTF8_3() { + var result0, result1, result2; + var pos0; + + pos0 = pos; + if (input.charCodeAt(pos) === 224) { + result0 = "\xE0"; + pos++; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed("\"\\xE0\""); + } + } + if (result0 !== null) { + if (/^[\xA0-\xBF]/.test(input.charAt(pos))) { + result1 = input.charAt(pos); + pos++; + } else { + result1 = null; + if (reportFailures === 0) { + matchFailed("[\\xA0-\\xBF]"); + } + } + if (result1 !== null) { + result2 = parse_UTF8_Tail(); + if (result2 !== null) { + result0 = [result0, result1, result2]; + } else { + result0 = null; + pos = pos0; + } + } else { + result0 = null; + pos = pos0; + } + } else { + result0 = null; + pos = pos0; + } + if (result0 === null) { + pos0 = pos; + if (/^[\xE1-\xEC]/.test(input.charAt(pos))) { + result0 = input.charAt(pos); + pos++; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed("[\\xE1-\\xEC]"); + } + } + if (result0 !== null) { + result1 = parse_UTF8_Tail2(); + if (result1 !== null) { + result0 = [result0, result1]; + } else { + result0 = null; + pos = pos0; + } + } else { + result0 = null; + pos = pos0; + } + if (result0 === null) { + pos0 = pos; + if (input.charCodeAt(pos) === 237) { + result0 = "\xED"; + pos++; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed("\"\\xED\""); + } + } + if (result0 !== null) { + if (/^[\x80-\x9F]/.test(input.charAt(pos))) { + result1 = input.charAt(pos); + pos++; + } else { + result1 = null; + if (reportFailures === 0) { + matchFailed("[\\x80-\\x9F]"); + } + } + if (result1 !== null) { + result2 = parse_UTF8_Tail(); + if (result2 !== null) { + result0 = [result0, result1, result2]; + } else { + result0 = null; + pos = pos0; + } + } else { + result0 = null; + pos = pos0; + } + } else { + result0 = null; + pos = pos0; + } + if (result0 === null) { + pos0 = pos; + if (/^[\xEE-\xEF]/.test(input.charAt(pos))) { + result0 = input.charAt(pos); + pos++; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed("[\\xEE-\\xEF]"); + } + } + if (result0 !== null) { + result1 = parse_UTF8_Tail2(); + if (result1 !== null) { + result0 = [result0, result1]; + } else { + result0 = null; + pos = pos0; + } + } else { + result0 = null; + pos = pos0; + } + } + } + } + return result0; + } + + function parse_UTF8_4() { + var result0, result1, result2; + var pos0; + + pos0 = pos; + if (input.charCodeAt(pos) === 240) { + result0 = "\xF0"; + pos++; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed("\"\\xF0\""); + } + } + if (result0 !== null) { + if (/^[\x90-\xBF]/.test(input.charAt(pos))) { + result1 = input.charAt(pos); + pos++; + } else { + result1 = null; + if (reportFailures === 0) { + matchFailed("[\\x90-\\xBF]"); + } + } + if (result1 !== null) { + result2 = parse_UTF8_Tail2(); + if (result2 !== null) { + result0 = [result0, result1, result2]; + } else { + result0 = null; + pos = pos0; + } + } else { + result0 = null; + pos = pos0; + } + } else { + result0 = null; + pos = pos0; + } + if (result0 === null) { + pos0 = pos; + if (/^[\xF1-\xF3]/.test(input.charAt(pos))) { + result0 = input.charAt(pos); + pos++; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed("[\\xF1-\\xF3]"); + } + } + if (result0 !== null) { + result1 = parse_UTF8_Tail2(); + if (result1 !== null) { + result2 = parse_UTF8_Tail(); + if (result2 !== null) { + result0 = [result0, result1, result2]; + } else { + result0 = null; + pos = pos0; + } + } else { + result0 = null; + pos = pos0; + } + } else { + result0 = null; + pos = pos0; + } + if (result0 === null) { + pos0 = pos; + if (input.charCodeAt(pos) === 244) { + result0 = "\xF4"; + pos++; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed("\"\\xF4\""); + } + } + if (result0 !== null) { + if (/^[\x80-\x8F]/.test(input.charAt(pos))) { + result1 = input.charAt(pos); + pos++; + } else { + result1 = null; + if (reportFailures === 0) { + matchFailed("[\\x80-\\x8F]"); + } + } + if (result1 !== null) { + result2 = parse_UTF8_Tail2(); + if (result2 !== null) { + result0 = [result0, result1, result2]; + } else { + result0 = null; + pos = pos0; + } + } else { + result0 = null; + pos = pos0; + } + } else { + result0 = null; + pos = pos0; + } + } + } + return result0; + } + + function parse_UTF8_Tail() { + var result0; + + if (/^[\x80-\xBF]/.test(input.charAt(pos))) { + result0 = input.charAt(pos); + pos++; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed("[\\x80-\\xBF]"); + } + } + return result0; + } + + function parse_UTF8_Tail2() { + var result0, result1; + var pos0; + + pos0 = pos; + result0 = parse_UTF8_Tail(); + if (result0 !== null) { + result1 = parse_UTF8_Tail(); + if (result1 !== null) { + result0 = [result0, result1]; + } else { + result0 = null; + pos = pos0; + } + } else { + result0 = null; + pos = pos0; + } + 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 }; + } + + + var foldRe = /[\n][ \t]/g; + + while (foldRe.test(input)) { + input = input.replace(foldRe, ''); + } + + + 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; +})(); |
