(function (root){ function MessageFormat(locale, pluralFunc){ var fallbackLocale; if (locale && pluralFunc) { MessageFormat.locale[locale] = pluralFunc; } fallbackLocale = locale = locale || "en"; pluralFunc = pluralFunc || MessageFormat.locale[fallbackLocale = MessageFormat.Utils.getFallbackLocale(locale)]; if (!pluralFunc) { throw new Error("Plural Function not found for locale: " + locale) } this.pluralFunc = pluralFunc; this.locale = locale; this.fallbackLocale = fallbackLocale; } MessageFormat.locale = { "en": function (n){ if (n === 1) { return "one"; } return "other"; } } ; MessageFormat.SafeString = function (string){ this.string = string; } ; MessageFormat.SafeString.prototype.toString = function (){ return this.string.toString(); } ; MessageFormat.Utils = { numSub: function (string, key, depth){ return _AN_Call_replace("replace", string, /^#|[^\\]#/g, function (m){ var prefix = m && _AN_Read_length("length", m) === 2? m.charAt(0): ''; return prefix + '" + (function(){ var x = ' + key + ';\nif( isNaN(x) ){\nthrow new Error("MessageFormat: `"+lastkey_' + depth + '+"` isnt a number.");\n}\nreturn x;\n})() + "'; } ); } , escapeExpression: function (string){ var escape = { "\n": "\\n", "\"": '\\"'} , badChars = /[\n"]/g, possible = /[\n"]/, escapeChar = function (chr){ return escape[chr] || "&"; } ; if (string instanceof MessageFormat.SafeString) { return string.toString(); } else if (string === null || string === false ) { return ""; } if (!possible.test(string)) { return string; } return _AN_Call_replace("replace", string, badChars, escapeChar); } , getFallbackLocale: function (locale){ var tagSeparator = locale.indexOf("-") >= 0? "-": "_"; while (!MessageFormat.locale.hasOwnProperty(locale)){ locale = locale.substring(0, locale.lastIndexOf(tagSeparator)); if (_AN_Read_length("length", locale) === 0) { return null ; } } return locale; } } ; var mparser = (function (){ function quote(s){ return '"' + _AN_Call_replace('replace', _AN_Call_replace('replace', _AN_Call_replace('replace', _AN_Call_replace('replace', _AN_Call_replace('replace', _AN_Call_replace('replace', _AN_Call_replace('replace', _AN_Call_replace('replace', s, /\\/g, '\\\\'), /"/g, '\\"'), /\x08/g, '\\b'), /\t/g, '\\t'), /\n/g, '\\n'), /\f/g, '\\f'), /\r/g, '\\r'), /[\x00-\x07\x0B\x0E-\x1F\x80-\uFFFF]/g, escape) + '"'; } var result = { parse: function (input, startRule){ var parseFunctions = { "start": parse_start, "messageFormatPattern": parse_messageFormatPattern, "messageFormatPatternRight": parse_messageFormatPatternRight, "messageFormatElement": parse_messageFormatElement, "elementFormat": parse_elementFormat, "pluralStyle": parse_pluralStyle, "selectStyle": parse_selectStyle, "pluralFormatPattern": parse_pluralFormatPattern, "offsetPattern": parse_offsetPattern, "selectFormatPattern": parse_selectFormatPattern, "pluralForms": parse_pluralForms, "stringKey": parse_stringKey, "string": parse_string, "id": parse_id, "chars": parse_chars, "char": parse_char, "digits": parse_digits, "hexDigit": parse_hexDigit, "_": parse__, "whitespace": parse_whitespace} ; 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 - _AN_Read_length("length", input); 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 <= 255) { 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; pos0 = pos; result0 = parse_messageFormatPattern(); if (result0 !== null ) { result0 = (function (offset, messageFormatPattern){ return { type: "program", program: messageFormatPattern} ; } )(pos0, result0); } if (result0 === null ) { pos = pos0; } return result0; } function parse_messageFormatPattern(){ var result0, result1, result2; var pos0, pos1; pos0 = pos; pos1 = pos; result0 = parse_string(); if (result0 !== null ) { result1 = [] ; result2 = parse_messageFormatPatternRight(); while (result2 !== null ){ result1.push(result2); result2 = parse_messageFormatPatternRight(); } if (result1 !== null ) { result0 = [result0, result1] ; } else { result0 = null ; pos = pos1; } } else { result0 = null ; pos = pos1; } if (result0 !== null ) { result0 = (function (offset, s1, inner){ var st = [] ; if (s1 && s1.val) { st.push(s1); } for (var i in inner){ if (inner.hasOwnProperty(i)) { st.push(inner[i]); } } return { type: 'messageFormatPattern', statements: st} ; } )(pos0, result0[0], result0[1]); } if (result0 === null ) { pos = pos0; } return result0; } function parse_messageFormatPatternRight(){ var result0, result1, result2, result3, result4, result5; var pos0, pos1; pos0 = pos; pos1 = pos; if (input.charCodeAt(pos) === 123) { result0 = "{"; pos++ ; } else { result0 = null ; if (reportFailures === 0) { matchFailed("\"{\""); } } if (result0 !== null ) { result1 = parse__(); if (result1 !== null ) { result2 = parse_messageFormatElement(); if (result2 !== null ) { result3 = parse__(); if (result3 !== null ) { if (input.charCodeAt(pos) === 125) { result4 = "}"; pos++ ; } else { result4 = null ; if (reportFailures === 0) { matchFailed("\"}\""); } } if (result4 !== null ) { result5 = parse_string(); if (result5 !== null ) { result0 = [result0, result1, result2, result3, result4, result5] ; } 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; } } else { result0 = null ; pos = pos1; } if (result0 !== null ) { result0 = (function (offset, mfe, s1){ var res = [] ; if (mfe) { res.push(mfe); } if (s1 && s1.val) { res.push(s1); } return { type: "messageFormatPatternRight", statements: res} ; } )(pos0, result0[2], result0[5]); } if (result0 === null ) { pos = pos0; } return result0; } function parse_messageFormatElement(){ var result0, result1, result2; var pos0, pos1, pos2; pos0 = pos; pos1 = pos; result0 = parse_id(); if (result0 !== null ) { pos2 = pos; if (input.charCodeAt(pos) === 44) { result1 = ","; pos++ ; } else { result1 = null ; if (reportFailures === 0) { matchFailed("\",\""); } } if (result1 !== null ) { result2 = parse_elementFormat(); if (result2 !== null ) { result1 = [result1, result2] ; } else { result1 = null ; pos = pos2; } } else { result1 = null ; pos = pos2; } result1 = result1 !== null ? result1: ""; if (result1 !== null ) { result0 = [result0, result1] ; } else { result0 = null ; pos = pos1; } } else { result0 = null ; pos = pos1; } if (result0 !== null ) { result0 = (function (offset, argIdx, efmt){ var res = { type: "messageFormatElement", argumentIndex: argIdx} ; if (efmt && _AN_Read_length("length", efmt)) { res.elementFormat = efmt[1]; } else { res.output = true ; } return res; } )(pos0, result0[0], result0[1]); } if (result0 === null ) { pos = pos0; } return result0; } function parse_elementFormat(){ var result0, result1, result2, result3, result4, result5, result6; var pos0, pos1; pos0 = pos; pos1 = pos; result0 = parse__(); if (result0 !== null ) { if (input.substr(pos, 6) === "plural") { result1 = "plural"; pos += 6; } else { result1 = null ; if (reportFailures === 0) { matchFailed("\"plural\""); } } if (result1 !== null ) { 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_pluralStyle(); if (result5 !== null ) { result6 = parse__(); if (result6 !== null ) { result0 = [result0, result1, result2, result3, result4, result5, result6] ; } 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; } } else { result0 = null ; pos = pos1; } } else { result0 = null ; pos = pos1; } if (result0 !== null ) { result0 = (function (offset, t, s){ return { type: "elementFormat", key: t, val: s.val} ; } )(pos0, result0[1], result0[5]); } if (result0 === null ) { pos = pos0; } if (result0 === null ) { pos0 = pos; pos1 = pos; result0 = parse__(); if (result0 !== null ) { if (input.substr(pos, 6) === "select") { result1 = "select"; pos += 6; } else { result1 = null ; if (reportFailures === 0) { matchFailed("\"select\""); } } if (result1 !== null ) { 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_selectStyle(); if (result5 !== null ) { result6 = parse__(); if (result6 !== null ) { result0 = [result0, result1, result2, result3, result4, result5, result6] ; } 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; } } else { result0 = null ; pos = pos1; } } else { result0 = null ; pos = pos1; } if (result0 !== null ) { result0 = (function (offset, t, s){ return { type: "elementFormat", key: t, val: s.val} ; } )(pos0, result0[1], result0[5]); } if (result0 === null ) { pos = pos0; } } return result0; } function parse_pluralStyle(){ var result0; var pos0; pos0 = pos; result0 = parse_pluralFormatPattern(); if (result0 !== null ) { result0 = (function (offset, pfp){ return { type: "pluralStyle", val: pfp} ; } )(pos0, result0); } if (result0 === null ) { pos = pos0; } return result0; } function parse_selectStyle(){ var result0; var pos0; pos0 = pos; result0 = parse_selectFormatPattern(); if (result0 !== null ) { result0 = (function (offset, sfp){ return { type: "selectStyle", val: sfp} ; } )(pos0, result0); } if (result0 === null ) { pos = pos0; } return result0; } function parse_pluralFormatPattern(){ var result0, result1, result2; var pos0, pos1; pos0 = pos; pos1 = pos; result0 = parse_offsetPattern(); result0 = result0 !== null ? result0: ""; if (result0 !== null ) { result1 = [] ; result2 = parse_pluralForms(); while (result2 !== null ){ result1.push(result2); result2 = parse_pluralForms(); } if (result1 !== null ) { result0 = [result0, result1] ; } else { result0 = null ; pos = pos1; } } else { result0 = null ; pos = pos1; } if (result0 !== null ) { result0 = (function (offset, op, pf){ var res = { type: "pluralFormatPattern", pluralForms: pf} ; if (op) { res.offset = op; } else { res.offset = 0; } return res; } )(pos0, result0[0], result0[1]); } if (result0 === null ) { pos = pos0; } return result0; } function parse_offsetPattern(){ var result0, result1, result2, result3, result4, result5, result6; var pos0, pos1; pos0 = pos; pos1 = pos; result0 = parse__(); if (result0 !== null ) { if (input.substr(pos, 6) === "offset") { result1 = "offset"; pos += 6; } else { result1 = null ; if (reportFailures === 0) { matchFailed("\"offset\""); } } if (result1 !== null ) { result2 = parse__(); if (result2 !== null ) { if (input.charCodeAt(pos) === 58) { result3 = ":"; pos++ ; } else { result3 = null ; if (reportFailures === 0) { matchFailed("\":\""); } } if (result3 !== null ) { result4 = parse__(); if (result4 !== null ) { result5 = parse_digits(); if (result5 !== null ) { result6 = parse__(); if (result6 !== null ) { result0 = [result0, result1, result2, result3, result4, result5, result6] ; } 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; } } else { result0 = null ; pos = pos1; } } else { result0 = null ; pos = pos1; } if (result0 !== null ) { result0 = (function (offset, d){ return d; } )(pos0, result0[5]); } if (result0 === null ) { pos = pos0; } return result0; } function parse_selectFormatPattern(){ var result0, result1; var pos0; pos0 = pos; result0 = [] ; result1 = parse_pluralForms(); while (result1 !== null ){ result0.push(result1); result1 = parse_pluralForms(); } if (result0 !== null ) { result0 = (function (offset, pf){ return { type: "selectFormatPattern", pluralForms: pf} ; } )(pos0, result0); } if (result0 === null ) { pos = pos0; } return result0; } function parse_pluralForms(){ var result0, result1, result2, result3, result4, result5, result6, result7; var pos0, pos1; pos0 = pos; pos1 = pos; result0 = parse__(); if (result0 !== null ) { result1 = parse_stringKey(); if (result1 !== null ) { result2 = parse__(); if (result2 !== null ) { if (input.charCodeAt(pos) === 123) { result3 = "{"; pos++ ; } else { result3 = null ; if (reportFailures === 0) { matchFailed("\"{\""); } } if (result3 !== null ) { result4 = parse__(); if (result4 !== null ) { result5 = parse_messageFormatPattern(); if (result5 !== null ) { result6 = parse__(); if (result6 !== null ) { if (input.charCodeAt(pos) === 125) { result7 = "}"; pos++ ; } else { result7 = null ; if (reportFailures === 0) { matchFailed("\"}\""); } } if (result7 !== null ) { result0 = [result0, result1, result2, result3, result4, result5, result6, result7] ; } 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; } } else { result0 = null ; pos = pos1; } } else { result0 = null ; pos = pos1; } } else { result0 = null ; pos = pos1; } if (result0 !== null ) { result0 = (function (offset, k, mfp){ return { type: "pluralForms", key: k, val: mfp} ; } )(pos0, result0[1], result0[5]); } if (result0 === null ) { pos = pos0; } return result0; } function parse_stringKey(){ var result0, result1; var pos0, pos1; pos0 = pos; result0 = parse_id(); if (result0 !== null ) { result0 = (function (offset, i){ return i; } )(pos0, result0); } if (result0 === null ) { pos = pos0; } if (result0 === null ) { pos0 = pos; pos1 = pos; if (input.charCodeAt(pos) === 61) { result0 = "="; pos++ ; } else { result0 = null ; if (reportFailures === 0) { matchFailed("\"=\""); } } if (result0 !== null ) { result1 = parse_digits(); if (result1 !== null ) { result0 = [result0, result1] ; } else { result0 = null ; pos = pos1; } } else { result0 = null ; pos = pos1; } if (result0 !== null ) { result0 = (function (offset, d){ return d; } )(pos0, result0[1]); } if (result0 === null ) { pos = pos0; } } return result0; } function parse_string(){ var result0, result1, result2, result3, result4; var pos0, pos1, pos2; pos0 = pos; pos1 = pos; result0 = parse__(); if (result0 !== null ) { result1 = [] ; pos2 = pos; result2 = parse__(); if (result2 !== null ) { result3 = parse_chars(); if (result3 !== null ) { result4 = parse__(); if (result4 !== null ) { result2 = [result2, result3, result4] ; } 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 ) { result3 = parse_chars(); if (result3 !== null ) { result4 = parse__(); if (result4 !== null ) { result2 = [result2, result3, result4] ; } 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, ws, s){ var tmp = [] ; for (var i = 0; i < _AN_Read_length("length", s); ++i){ for (var j = 0; j < _AN_Read_length("length", s[i]); ++j){ tmp.push(s[i][j]); } } return { type: "string", val: ws + tmp.join('')} ; } )(pos0, result0[0], result0[1]); } if (result0 === null ) { pos = pos0; } return result0; } function parse_id(){ var result0, result1, result2, result3; var pos0, pos1; pos0 = pos; pos1 = pos; result0 = parse__(); if (result0 !== null ) { if (/^[a-zA-Z$_]/.test(input.charAt(pos))) { result1 = input.charAt(pos); pos++ ; } else { result1 = null ; if (reportFailures === 0) { matchFailed("[a-zA-Z$_]"); } } if (result1 !== null ) { result2 = [] ; if (/^[^ \t\n\r,.+={}]/.test(input.charAt(pos))) { result3 = input.charAt(pos); pos++ ; } else { result3 = null ; if (reportFailures === 0) { matchFailed("[^ \\t\\n\\r,.+={}]"); } } while (result3 !== null ){ result2.push(result3); if (/^[^ \t\n\r,.+={}]/.test(input.charAt(pos))) { result3 = input.charAt(pos); pos++ ; } else { result3 = null ; if (reportFailures === 0) { matchFailed("[^ \\t\\n\\r,.+={}]"); } } } if (result2 !== null ) { result3 = parse__(); 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, s1, s2){ return s1 + (s2? s2.join(''): ''); } )(pos0, result0[1], result0[2]); } if (result0 === null ) { pos = pos0; } return result0; } function parse_chars(){ var result0, result1; var pos0; pos0 = pos; result1 = parse_char(); if (result1 !== null ) { result0 = [] ; while (result1 !== null ){ result0.push(result1); result1 = parse_char(); } } else { result0 = null ; } if (result0 !== null ) { result0 = (function (offset, chars){ return chars.join(''); } )(pos0, result0); } if (result0 === null ) { pos = pos0; } return result0; } function parse_char(){ var result0, result1, result2, result3, result4; var pos0, pos1; pos0 = pos; if (/^[^{}\\\0-\x1F \t\n\r]/.test(input.charAt(pos))) { result0 = input.charAt(pos); pos++ ; } else { result0 = null ; if (reportFailures === 0) { matchFailed("[^{}\\\\\\0-\\x1F \\t\\n\\r]"); } } if (result0 !== null ) { result0 = (function (offset, x){ return x; } )(pos0, result0); } if (result0 === null ) { pos = pos0; } if (result0 === null ) { pos0 = pos; if (input.substr(pos, 2) === "\\#") { result0 = "\\#"; pos += 2; } else { result0 = null ; if (reportFailures === 0) { matchFailed("\"\\\\#\""); } } if (result0 !== null ) { result0 = (function (offset){ return "\\#"; } )(pos0); } if (result0 === null ) { pos = pos0; } if (result0 === null ) { pos0 = pos; if (input.substr(pos, 2) === "\\{") { result0 = "\\{"; pos += 2; } else { result0 = null ; if (reportFailures === 0) { matchFailed("\"\\\\{\""); } } if (result0 !== null ) { result0 = (function (offset){ return "\u007B"; } )(pos0); } if (result0 === null ) { pos = pos0; } if (result0 === null ) { pos0 = pos; if (input.substr(pos, 2) === "\\}") { result0 = "\\}"; pos += 2; } else { result0 = null ; if (reportFailures === 0) { matchFailed("\"\\\\}\""); } } if (result0 !== null ) { result0 = (function (offset){ return "\u007D"; } )(pos0); } if (result0 === null ) { pos = pos0; } if (result0 === null ) { pos0 = pos; pos1 = pos; if (input.substr(pos, 2) === "\\u") { result0 = "\\u"; pos += 2; } else { result0 = null ; if (reportFailures === 0) { matchFailed("\"\\\\u\""); } } if (result0 !== null ) { result1 = parse_hexDigit(); if (result1 !== null ) { result2 = parse_hexDigit(); if (result2 !== null ) { result3 = parse_hexDigit(); if (result3 !== null ) { result4 = parse_hexDigit(); 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, h1, h2, h3, h4){ return String.fromCharCode(parseInt("0x" + h1 + h2 + h3 + h4)); } )(pos0, result0[1], result0[2], result0[3], result0[4]); } if (result0 === null ) { pos = pos0; } } } } } return result0; } function parse_digits(){ var result0, result1; var pos0; pos0 = pos; if (/^[0-9]/.test(input.charAt(pos))) { result1 = input.charAt(pos); pos++ ; } else { result1 = null ; if (reportFailures === 0) { matchFailed("[0-9]"); } } if (result1 !== null ) { result0 = [] ; 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]"); } } } } else { result0 = null ; } if (result0 !== null ) { result0 = (function (offset, ds){ return parseInt((ds.join('')), 10); } )(pos0, result0); } if (result0 === null ) { pos = pos0; } return result0; } function parse_hexDigit(){ var result0; if (/^[0-9a-fA-F]/.test(input.charAt(pos))) { result0 = input.charAt(pos); pos++ ; } else { result0 = null ; if (reportFailures === 0) { matchFailed("[0-9a-fA-F]"); } } return result0; } function parse__(){ var result0, result1; var pos0; reportFailures++ ; pos0 = pos; result0 = [] ; result1 = parse_whitespace(); while (result1 !== null ){ result0.push(result1); result1 = parse_whitespace(); } if (result0 !== null ) { result0 = (function (offset, w){ return w.join(''); } )(pos0, result0); } if (result0 === null ) { pos = pos0; } reportFailures-- ; if (reportFailures === 0 && result0 === null ) { matchFailed("whitespace"); } return result0; } function parse_whitespace(){ var result0; if (/^[ \t\n\r]/.test(input.charAt(pos))) { result0 = input.charAt(pos); pos++ ; } else { result0 = null ; if (reportFailures === 0) { matchFailed("[ \\t\\n\\r]"); } } return result0; } function cleanupExpected(expected){ expected.sort(); var lastExpected = null ; var cleanExpected = [] ; for (var i = 0; i < _AN_Read_length("length", expected); i++ ){ if (expected[i] !== lastExpected) { cleanExpected.push(expected[i]); lastExpected = expected[i]; } } return cleanExpected; } function computeErrorPosition(){ 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 result = parseFunctions[startRule](); if (result === null || pos !== _AN_Read_length("length", input)) { var offset = Math.max(pos, rightmostFailuresPos); var found = offset < _AN_Read_length("length", input)? input.charAt(offset): null ; var errorPosition = computeErrorPosition(); throw new this.SyntaxError(cleanupExpected(rightmostFailuresExpected), found, offset, errorPosition.line, errorPosition.column) } return result; } , toSource: function (){ return this._source; } } ; 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, _AN_Read_length("length", expected) - 1).join(", ") + " or " + expected[_AN_Read_length("length", expected) - 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; } )(); MessageFormat.prototype.parse = function (){ return mparser.parse.apply(mparser, arguments); } ; MessageFormat.prototype.precompile = function (ast){ var self = this, needOther = false , fp = { begin: 'function(d){\nvar r = "";\n', end: "return r;\n}"} ; function interpMFP(ast, data){ data = data || { } ; var s = '', i, tmp, lastkeyname; switch (ast.type){ case 'program': return interpMFP(ast.program); case 'messageFormatPattern': for (i = 0; i < _AN_Read_length('length', ast.statements); ++i){ s += interpMFP(ast.statements[i], data); } return fp.begin + s + fp.end; case 'messageFormatPatternRight': for (i = 0; i < _AN_Read_length('length', ast.statements); ++i){ s += interpMFP(ast.statements[i], data); } return s; case 'messageFormatElement': data.pf_count = data.pf_count || 0; s += 'if(!d){\nthrow new Error("MessageFormat: No data passed to function.");\n}\n'; if (ast.output) { s += 'r += d["' + ast.argumentIndex + '"];\n'; } else { lastkeyname = 'lastkey_' + (data.pf_count + 1); s += 'var ' + lastkeyname + ' = "' + ast.argumentIndex + '";\n'; s += 'var k_' + (data.pf_count + 1) + '=d[' + lastkeyname + '];\n'; s += interpMFP(ast.elementFormat, data); } return s; case 'elementFormat': if (ast.key === 'select') { s += interpMFP(ast.val, data); s += 'r += (pf_' + data.pf_count + '[ k_' + (data.pf_count + 1) + ' ] || pf_' + data.pf_count + '[ "other" ])( d );\n'; } else if (ast.key === 'plural') { s += interpMFP(ast.val, data); s += 'if ( pf_' + (data.pf_count) + '[ k_' + (data.pf_count + 1) + ' + "" ] ) {\n'; s += 'r += pf_' + data.pf_count + '[ k_' + (data.pf_count + 1) + ' + "" ]( d ); \n'; s += '}\nelse {\n'; s += 'r += (pf_' + data.pf_count + '[ MessageFormat.locale["' + self.fallbackLocale + '"]( k_' + (data.pf_count + 1) + ' - off_' + (data.pf_count) + ' ) ] || pf_' + data.pf_count + '[ "other" ] )( d );\n'; s += '}\n'; } return s; case 'pluralFormatPattern': data.pf_count = data.pf_count || 0; s += 'var off_' + data.pf_count + ' = ' + ast.offset + ';\n'; s += 'var pf_' + data.pf_count + ' = { \n'; needOther = true ; for (i = 0; i < _AN_Read_length('length', ast.pluralForms); ++i){ if (ast.pluralForms[i].key === 'other') { needOther = false ; } if (tmp) { s += ',\n'; } else { tmp = 1; } s += '"' + ast.pluralForms[i].key + '" : ' + interpMFP(ast.pluralForms[i].val, (function (){ var res = JSON.parse(JSON.stringify(data)); res.pf_count++ ; return res; } )()); } s += '\n};\n'; if (needOther) { throw new Error("No 'other' form found in pluralFormatPattern " + data.pf_count) } return s; case 'selectFormatPattern': data.pf_count = data.pf_count || 0; s += 'var off_' + data.pf_count + ' = 0;\n'; s += 'var pf_' + data.pf_count + ' = { \n'; needOther = true ; for (i = 0; i < _AN_Read_length('length', ast.pluralForms); ++i){ if (ast.pluralForms[i].key === 'other') { needOther = false ; } if (tmp) { s += ',\n'; } else { tmp = 1; } s += '"' + ast.pluralForms[i].key + '" : ' + interpMFP(ast.pluralForms[i].val, (function (){ var res = JSON.parse(JSON.stringify(data)); res.pf_count++ ; return res; } )()); } s += '\n};\n'; if (needOther) { throw new Error("No 'other' form found in selectFormatPattern " + data.pf_count) } return s; case 'string': return 'r += "' + MessageFormat.Utils.numSub(MessageFormat.Utils.escapeExpression(ast.val), 'k_' + data.pf_count + ' - off_' + (data.pf_count - 1), data.pf_count) + '";\n'; default : { throw new Error('Bad AST type: ' + ast.type) } } } return interpMFP(ast); } ; MessageFormat.prototype.compile = function (message){ return (new Function('MessageFormat', 'return ' + this.precompile(this.parse(message))))(MessageFormat); } ; if (typeof exports !== 'undefined') { if (typeof module !== 'undefined' && module.exports) { exports = module.exports = MessageFormat; } exports.MessageFormat = MessageFormat; } else if (typeof define === 'function' && define.amd) { define(function (){ return MessageFormat; } ); } else { root.MessageFormat = MessageFormat; } } )(this);