You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

486 lines
15 KiB
JavaScript

// 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;