UNPKG

gorillajs

Version:

A smart development environment designed to easily install and neatly manage web applications. Gorilla JS frees you from the repetitive daily tasks like apps installation, database management, creation of virtual environment, server configuration… And it

486 lines (459 loc) • 15.3 kB
// Generated by CoffeeScript 1.12.4 var DumpException, Escaper, Inline, ParseException, ParseMore, Pattern, Unescaper, Utils, indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; Pattern = require('./Pattern'); Unescaper = require('./Unescaper'); Escaper = require('./Escaper'); Utils = require('./Utils'); ParseException = require('./Exception/ParseException'); ParseMore = require('./Exception/ParseMore'); DumpException = require('./Exception/DumpException'); Inline = (function() { function Inline() {} Inline.REGEX_QUOTED_STRING = '(?:"(?:[^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'(?:[^\']*(?:\'\'[^\']*)*)\')'; Inline.PATTERN_TRAILING_COMMENTS = new Pattern('^\\s*#.*$'); Inline.PATTERN_QUOTED_SCALAR = new Pattern('^' + Inline.REGEX_QUOTED_STRING); Inline.PATTERN_THOUSAND_NUMERIC_SCALAR = new Pattern('^(-|\\+)?[0-9,]+(\\.[0-9]+)?$'); Inline.PATTERN_SCALAR_BY_DELIMITERS = {}; Inline.settings = {}; Inline.configure = function(exceptionOnInvalidType, objectDecoder) { if (exceptionOnInvalidType == null) { exceptionOnInvalidType = null; } if (objectDecoder == null) { objectDecoder = null; } this.settings.exceptionOnInvalidType = exceptionOnInvalidType; this.settings.objectDecoder = objectDecoder; }; Inline.parse = function(value, exceptionOnInvalidType, objectDecoder) { var context, result; if (exceptionOnInvalidType == null) { exceptionOnInvalidType = false; } if (objectDecoder == null) { objectDecoder = null; } this.settings.exceptionOnInvalidType = exceptionOnInvalidType; this.settings.objectDecoder = objectDecoder; if (value == null) { return ''; } value = Utils.trim(value); if (0 === value.length) { return ''; } context = { exceptionOnInvalidType: exceptionOnInvalidType, objectDecoder: objectDecoder, i: 0 }; switch (value.charAt(0)) { case '[': result = this.parseSequence(value, context); ++context.i; break; case '{': result = this.parseMapping(value, context); ++context.i; break; default: result = this.parseScalar(value, null, ['"', "'"], context); } if (this.PATTERN_TRAILING_COMMENTS.replace(value.slice(context.i), '') !== '') { throw new ParseException('Unexpected characters near "' + value.slice(context.i) + '".'); } return result; }; Inline.dump = function(value, exceptionOnInvalidType, objectEncoder) { var ref, result, type; if (exceptionOnInvalidType == null) { exceptionOnInvalidType = false; } if (objectEncoder == null) { objectEncoder = null; } if (value == null) { return 'null'; } type = typeof value; if (type === 'object') { if (value instanceof Date) { return value.toISOString(); } else if (objectEncoder != null) { result = objectEncoder(value); if (typeof result === 'string' || (result != null)) { return result; } } return this.dumpObject(value); } if (type === 'boolean') { return (value ? 'true' : 'false'); } if (Utils.isDigits(value)) { return (type === 'string' ? "'" + value + "'" : String(parseInt(value))); } if (Utils.isNumeric(value)) { return (type === 'string' ? "'" + value + "'" : String(parseFloat(value))); } if (type === 'number') { return (value === 2e308 ? '.Inf' : (value === -2e308 ? '-.Inf' : (isNaN(value) ? '.NaN' : value))); } if (Escaper.requiresDoubleQuoting(value)) { return Escaper.escapeWithDoubleQuotes(value); } if (Escaper.requiresSingleQuoting(value)) { return Escaper.escapeWithSingleQuotes(value); } if ('' === value) { return '""'; } if (Utils.PATTERN_DATE.test(value)) { return "'" + value + "'"; } if ((ref = value.toLowerCase()) === 'null' || ref === '~' || ref === 'true' || ref === 'false') { return "'" + value + "'"; } return value; }; Inline.dumpObject = function(value, exceptionOnInvalidType, objectSupport) { var j, key, len1, output, val; if (objectSupport == null) { objectSupport = null; } if (value instanceof Array) { output = []; for (j = 0, len1 = value.length; j < len1; j++) { val = value[j]; output.push(this.dump(val)); } return '[' + output.join(', ') + ']'; } else { output = []; for (key in value) { val = value[key]; output.push(this.dump(key) + ': ' + this.dump(val)); } return '{' + output.join(', ') + '}'; } }; Inline.parseScalar = function(scalar, delimiters, stringDelimiters, context, evaluate) { var i, joinedDelimiters, match, output, pattern, ref, ref1, strpos, tmp; if (delimiters == null) { delimiters = null; } if (stringDelimiters == null) { stringDelimiters = ['"', "'"]; } if (context == null) { context = null; } if (evaluate == null) { evaluate = true; } if (context == null) { context = { exceptionOnInvalidType: this.settings.exceptionOnInvalidType, objectDecoder: this.settings.objectDecoder, i: 0 }; } i = context.i; if (ref = scalar.charAt(i), indexOf.call(stringDelimiters, ref) >= 0) { output = this.parseQuotedScalar(scalar, context); i = context.i; if (delimiters != null) { tmp = Utils.ltrim(scalar.slice(i), ' '); if (!(ref1 = tmp.charAt(0), indexOf.call(delimiters, ref1) >= 0)) { throw new ParseException('Unexpected characters (' + scalar.slice(i) + ').'); } } } else { if (!delimiters) { output = scalar.slice(i); i += output.length; strpos = output.indexOf(' #'); if (strpos !== -1) { output = Utils.rtrim(output.slice(0, strpos)); } } else { joinedDelimiters = delimiters.join('|'); pattern = this.PATTERN_SCALAR_BY_DELIMITERS[joinedDelimiters]; if (pattern == null) { pattern = new Pattern('^(.+?)(' + joinedDelimiters + ')'); this.PATTERN_SCALAR_BY_DELIMITERS[joinedDelimiters] = pattern; } if (match = pattern.exec(scalar.slice(i))) { output = match[1]; i += output.length; } else { throw new ParseException('Malformed inline YAML string (' + scalar + ').'); } } if (evaluate) { output = this.evaluateScalar(output, context); } } context.i = i; return output; }; Inline.parseQuotedScalar = function(scalar, context) { var i, match, output; i = context.i; if (!(match = this.PATTERN_QUOTED_SCALAR.exec(scalar.slice(i)))) { throw new ParseMore('Malformed inline YAML string (' + scalar.slice(i) + ').'); } output = match[0].substr(1, match[0].length - 2); if ('"' === scalar.charAt(i)) { output = Unescaper.unescapeDoubleQuotedString(output); } else { output = Unescaper.unescapeSingleQuotedString(output); } i += match[0].length; context.i = i; return output; }; Inline.parseSequence = function(sequence, context) { var e, i, isQuoted, len, output, ref, value; output = []; len = sequence.length; i = context.i; i += 1; while (i < len) { context.i = i; switch (sequence.charAt(i)) { case '[': output.push(this.parseSequence(sequence, context)); i = context.i; break; case '{': output.push(this.parseMapping(sequence, context)); i = context.i; break; case ']': return output; case ',': case ' ': case "\n": break; default: isQuoted = ((ref = sequence.charAt(i)) === '"' || ref === "'"); value = this.parseScalar(sequence, [',', ']'], ['"', "'"], context); i = context.i; if (!isQuoted && typeof value === 'string' && (value.indexOf(': ') !== -1 || value.indexOf(":\n") !== -1)) { try { value = this.parseMapping('{' + value + '}'); } catch (error) { e = error; } } output.push(value); --i; } ++i; } throw new ParseMore('Malformed inline YAML string ' + sequence); }; Inline.parseMapping = function(mapping, context) { var done, i, key, len, output, shouldContinueWhileLoop, value; output = {}; len = mapping.length; i = context.i; i += 1; shouldContinueWhileLoop = false; while (i < len) { context.i = i; switch (mapping.charAt(i)) { case ' ': case ',': case "\n": ++i; context.i = i; shouldContinueWhileLoop = true; break; case '}': return output; } if (shouldContinueWhileLoop) { shouldContinueWhileLoop = false; continue; } key = this.parseScalar(mapping, [':', ' ', "\n"], ['"', "'"], context, false); i = context.i; done = false; while (i < len) { context.i = i; switch (mapping.charAt(i)) { case '[': value = this.parseSequence(mapping, context); i = context.i; if (output[key] === void 0) { output[key] = value; } done = true; break; case '{': value = this.parseMapping(mapping, context); i = context.i; if (output[key] === void 0) { output[key] = value; } done = true; break; case ':': case ' ': case "\n": break; default: value = this.parseScalar(mapping, [',', '}'], ['"', "'"], context); i = context.i; if (output[key] === void 0) { output[key] = value; } done = true; --i; } ++i; if (done) { break; } } } throw new ParseMore('Malformed inline YAML string ' + mapping); }; Inline.evaluateScalar = function(scalar, context) { var cast, date, exceptionOnInvalidType, firstChar, firstSpace, firstWord, objectDecoder, raw, scalarLower, subValue, trimmedScalar; scalar = Utils.trim(scalar); scalarLower = scalar.toLowerCase(); switch (scalarLower) { case 'null': case '': case '~': return null; case 'true': return true; case 'false': return false; case '.inf': return 2e308; case '.nan': return 0/0; case '-.inf': return 2e308; default: firstChar = scalarLower.charAt(0); switch (firstChar) { case '!': firstSpace = scalar.indexOf(' '); if (firstSpace === -1) { firstWord = scalarLower; } else { firstWord = scalarLower.slice(0, firstSpace); } switch (firstWord) { case '!': if (firstSpace !== -1) { return parseInt(this.parseScalar(scalar.slice(2))); } return null; case '!str': return Utils.ltrim(scalar.slice(4)); case '!!str': return Utils.ltrim(scalar.slice(5)); case '!!int': return parseInt(this.parseScalar(scalar.slice(5))); case '!!bool': return Utils.parseBoolean(this.parseScalar(scalar.slice(6)), false); case '!!float': return parseFloat(this.parseScalar(scalar.slice(7))); case '!!timestamp': return Utils.stringToDate(Utils.ltrim(scalar.slice(11))); default: if (context == null) { context = { exceptionOnInvalidType: this.settings.exceptionOnInvalidType, objectDecoder: this.settings.objectDecoder, i: 0 }; } objectDecoder = context.objectDecoder, exceptionOnInvalidType = context.exceptionOnInvalidType; if (objectDecoder) { trimmedScalar = Utils.rtrim(scalar); firstSpace = trimmedScalar.indexOf(' '); if (firstSpace === -1) { return objectDecoder(trimmedScalar, null); } else { subValue = Utils.ltrim(trimmedScalar.slice(firstSpace + 1)); if (!(subValue.length > 0)) { subValue = null; } return objectDecoder(trimmedScalar.slice(0, firstSpace), subValue); } } if (exceptionOnInvalidType) { throw new ParseException('Custom object support when parsing a YAML file has been disabled.'); } return null; } break; case '0': if ('0x' === scalar.slice(0, 2)) { return Utils.hexDec(scalar); } else if (Utils.isDigits(scalar)) { return Utils.octDec(scalar); } else if (Utils.isNumeric(scalar)) { return parseFloat(scalar); } else { return scalar; } break; case '+': if (Utils.isDigits(scalar)) { raw = scalar; cast = parseInt(raw); if (raw === String(cast)) { return cast; } else { return raw; } } else if (Utils.isNumeric(scalar)) { return parseFloat(scalar); } else if (this.PATTERN_THOUSAND_NUMERIC_SCALAR.test(scalar)) { return parseFloat(scalar.replace(',', '')); } return scalar; case '-': if (Utils.isDigits(scalar.slice(1))) { if ('0' === scalar.charAt(1)) { return -Utils.octDec(scalar.slice(1)); } else { raw = scalar.slice(1); cast = parseInt(raw); if (raw === String(cast)) { return -cast; } else { return -raw; } } } else if (Utils.isNumeric(scalar)) { return parseFloat(scalar); } else if (this.PATTERN_THOUSAND_NUMERIC_SCALAR.test(scalar)) { return parseFloat(scalar.replace(',', '')); } return scalar; default: if (date = Utils.stringToDate(scalar)) { return date; } else if (Utils.isNumeric(scalar)) { return parseFloat(scalar); } else if (this.PATTERN_THOUSAND_NUMERIC_SCALAR.test(scalar)) { return parseFloat(scalar.replace(',', '')); } return scalar; } } }; return Inline; })(); module.exports = Inline;