wishthis/node_modules/yamljs/lib/Parser.js
2022-01-21 09:28:41 +01:00

603 lines
21 KiB
JavaScript

// Generated by CoffeeScript 1.12.4
var Inline, ParseException, ParseMore, Parser, Pattern, Utils;
Inline = require('./Inline');
Pattern = require('./Pattern');
Utils = require('./Utils');
ParseException = require('./Exception/ParseException');
ParseMore = require('./Exception/ParseMore');
Parser = (function() {
Parser.prototype.PATTERN_FOLDED_SCALAR_ALL = new Pattern('^(?:(?<type>![^\\|>]*)\\s+)?(?<separator>\\||>)(?<modifiers>\\+|\\-|\\d+|\\+\\d+|\\-\\d+|\\d+\\+|\\d+\\-)?(?<comments> +#.*)?$');
Parser.prototype.PATTERN_FOLDED_SCALAR_END = new Pattern('(?<separator>\\||>)(?<modifiers>\\+|\\-|\\d+|\\+\\d+|\\-\\d+|\\d+\\+|\\d+\\-)?(?<comments> +#.*)?$');
Parser.prototype.PATTERN_SEQUENCE_ITEM = new Pattern('^\\-((?<leadspaces>\\s+)(?<value>.+?))?\\s*$');
Parser.prototype.PATTERN_ANCHOR_VALUE = new Pattern('^&(?<ref>[^ ]+) *(?<value>.*)');
Parser.prototype.PATTERN_COMPACT_NOTATION = new Pattern('^(?<key>' + Inline.REGEX_QUOTED_STRING + '|[^ \'"\\{\\[].*?) *\\:(\\s+(?<value>.+?))?\\s*$');
Parser.prototype.PATTERN_MAPPING_ITEM = new Pattern('^(?<key>' + Inline.REGEX_QUOTED_STRING + '|[^ \'"\\[\\{].*?) *\\:(\\s+(?<value>.+?))?\\s*$');
Parser.prototype.PATTERN_DECIMAL = new Pattern('\\d+');
Parser.prototype.PATTERN_INDENT_SPACES = new Pattern('^ +');
Parser.prototype.PATTERN_TRAILING_LINES = new Pattern('(\n*)$');
Parser.prototype.PATTERN_YAML_HEADER = new Pattern('^\\%YAML[: ][\\d\\.]+.*\n', 'm');
Parser.prototype.PATTERN_LEADING_COMMENTS = new Pattern('^(\\#.*?\n)+', 'm');
Parser.prototype.PATTERN_DOCUMENT_MARKER_START = new Pattern('^\\-\\-\\-.*?\n', 'm');
Parser.prototype.PATTERN_DOCUMENT_MARKER_END = new Pattern('^\\.\\.\\.\\s*$', 'm');
Parser.prototype.PATTERN_FOLDED_SCALAR_BY_INDENTATION = {};
Parser.prototype.CONTEXT_NONE = 0;
Parser.prototype.CONTEXT_SEQUENCE = 1;
Parser.prototype.CONTEXT_MAPPING = 2;
function Parser(offset) {
this.offset = offset != null ? offset : 0;
this.lines = [];
this.currentLineNb = -1;
this.currentLine = '';
this.refs = {};
}
Parser.prototype.parse = function(value, exceptionOnInvalidType, objectDecoder) {
var alias, allowOverwrite, block, c, context, data, e, first, i, indent, isRef, j, k, key, l, lastKey, len, len1, len2, len3, lineCount, m, matches, mergeNode, n, name, parsed, parsedItem, parser, ref, ref1, ref2, refName, refValue, val, values;
if (exceptionOnInvalidType == null) {
exceptionOnInvalidType = false;
}
if (objectDecoder == null) {
objectDecoder = null;
}
this.currentLineNb = -1;
this.currentLine = '';
this.lines = this.cleanup(value).split("\n");
data = null;
context = this.CONTEXT_NONE;
allowOverwrite = false;
while (this.moveToNextLine()) {
if (this.isCurrentLineEmpty()) {
continue;
}
if ("\t" === this.currentLine[0]) {
throw new ParseException('A YAML file cannot contain tabs as indentation.', this.getRealCurrentLineNb() + 1, this.currentLine);
}
isRef = mergeNode = false;
if (values = this.PATTERN_SEQUENCE_ITEM.exec(this.currentLine)) {
if (this.CONTEXT_MAPPING === context) {
throw new ParseException('You cannot define a sequence item when in a mapping');
}
context = this.CONTEXT_SEQUENCE;
if (data == null) {
data = [];
}
if ((values.value != null) && (matches = this.PATTERN_ANCHOR_VALUE.exec(values.value))) {
isRef = matches.ref;
values.value = matches.value;
}
if (!(values.value != null) || '' === Utils.trim(values.value, ' ') || Utils.ltrim(values.value, ' ').indexOf('#') === 0) {
if (this.currentLineNb < this.lines.length - 1 && !this.isNextLineUnIndentedCollection()) {
c = this.getRealCurrentLineNb() + 1;
parser = new Parser(c);
parser.refs = this.refs;
data.push(parser.parse(this.getNextEmbedBlock(null, true), exceptionOnInvalidType, objectDecoder));
} else {
data.push(null);
}
} else {
if (((ref = values.leadspaces) != null ? ref.length : void 0) && (matches = this.PATTERN_COMPACT_NOTATION.exec(values.value))) {
c = this.getRealCurrentLineNb();
parser = new Parser(c);
parser.refs = this.refs;
block = values.value;
indent = this.getCurrentLineIndentation();
if (this.isNextLineIndented(false)) {
block += "\n" + this.getNextEmbedBlock(indent + values.leadspaces.length + 1, true);
}
data.push(parser.parse(block, exceptionOnInvalidType, objectDecoder));
} else {
data.push(this.parseValue(values.value, exceptionOnInvalidType, objectDecoder));
}
}
} else if ((values = this.PATTERN_MAPPING_ITEM.exec(this.currentLine)) && values.key.indexOf(' #') === -1) {
if (this.CONTEXT_SEQUENCE === context) {
throw new ParseException('You cannot define a mapping item when in a sequence');
}
context = this.CONTEXT_MAPPING;
if (data == null) {
data = {};
}
Inline.configure(exceptionOnInvalidType, objectDecoder);
try {
key = Inline.parseScalar(values.key);
} catch (error) {
e = error;
e.parsedLine = this.getRealCurrentLineNb() + 1;
e.snippet = this.currentLine;
throw e;
}
if ('<<' === key) {
mergeNode = true;
allowOverwrite = true;
if (((ref1 = values.value) != null ? ref1.indexOf('*') : void 0) === 0) {
refName = values.value.slice(1);
if (this.refs[refName] == null) {
throw new ParseException('Reference "' + refName + '" does not exist.', this.getRealCurrentLineNb() + 1, this.currentLine);
}
refValue = this.refs[refName];
if (typeof refValue !== 'object') {
throw new ParseException('YAML merge keys used with a scalar value instead of an object.', this.getRealCurrentLineNb() + 1, this.currentLine);
}
if (refValue instanceof Array) {
for (i = j = 0, len = refValue.length; j < len; i = ++j) {
value = refValue[i];
if (data[name = String(i)] == null) {
data[name] = value;
}
}
} else {
for (key in refValue) {
value = refValue[key];
if (data[key] == null) {
data[key] = value;
}
}
}
} else {
if ((values.value != null) && values.value !== '') {
value = values.value;
} else {
value = this.getNextEmbedBlock();
}
c = this.getRealCurrentLineNb() + 1;
parser = new Parser(c);
parser.refs = this.refs;
parsed = parser.parse(value, exceptionOnInvalidType);
if (typeof parsed !== 'object') {
throw new ParseException('YAML merge keys used with a scalar value instead of an object.', this.getRealCurrentLineNb() + 1, this.currentLine);
}
if (parsed instanceof Array) {
for (l = 0, len1 = parsed.length; l < len1; l++) {
parsedItem = parsed[l];
if (typeof parsedItem !== 'object') {
throw new ParseException('Merge items must be objects.', this.getRealCurrentLineNb() + 1, parsedItem);
}
if (parsedItem instanceof Array) {
for (i = m = 0, len2 = parsedItem.length; m < len2; i = ++m) {
value = parsedItem[i];
k = String(i);
if (!data.hasOwnProperty(k)) {
data[k] = value;
}
}
} else {
for (key in parsedItem) {
value = parsedItem[key];
if (!data.hasOwnProperty(key)) {
data[key] = value;
}
}
}
}
} else {
for (key in parsed) {
value = parsed[key];
if (!data.hasOwnProperty(key)) {
data[key] = value;
}
}
}
}
} else if ((values.value != null) && (matches = this.PATTERN_ANCHOR_VALUE.exec(values.value))) {
isRef = matches.ref;
values.value = matches.value;
}
if (mergeNode) {
} else if (!(values.value != null) || '' === Utils.trim(values.value, ' ') || Utils.ltrim(values.value, ' ').indexOf('#') === 0) {
if (!(this.isNextLineIndented()) && !(this.isNextLineUnIndentedCollection())) {
if (allowOverwrite || data[key] === void 0) {
data[key] = null;
}
} else {
c = this.getRealCurrentLineNb() + 1;
parser = new Parser(c);
parser.refs = this.refs;
val = parser.parse(this.getNextEmbedBlock(), exceptionOnInvalidType, objectDecoder);
if (allowOverwrite || data[key] === void 0) {
data[key] = val;
}
}
} else {
val = this.parseValue(values.value, exceptionOnInvalidType, objectDecoder);
if (allowOverwrite || data[key] === void 0) {
data[key] = val;
}
}
} else {
lineCount = this.lines.length;
if (1 === lineCount || (2 === lineCount && Utils.isEmpty(this.lines[1]))) {
try {
value = Inline.parse(this.lines[0], exceptionOnInvalidType, objectDecoder);
} catch (error) {
e = error;
e.parsedLine = this.getRealCurrentLineNb() + 1;
e.snippet = this.currentLine;
throw e;
}
if (typeof value === 'object') {
if (value instanceof Array) {
first = value[0];
} else {
for (key in value) {
first = value[key];
break;
}
}
if (typeof first === 'string' && first.indexOf('*') === 0) {
data = [];
for (n = 0, len3 = value.length; n < len3; n++) {
alias = value[n];
data.push(this.refs[alias.slice(1)]);
}
value = data;
}
}
return value;
} else if ((ref2 = Utils.ltrim(value).charAt(0)) === '[' || ref2 === '{') {
try {
return Inline.parse(value, exceptionOnInvalidType, objectDecoder);
} catch (error) {
e = error;
e.parsedLine = this.getRealCurrentLineNb() + 1;
e.snippet = this.currentLine;
throw e;
}
}
throw new ParseException('Unable to parse.', this.getRealCurrentLineNb() + 1, this.currentLine);
}
if (isRef) {
if (data instanceof Array) {
this.refs[isRef] = data[data.length - 1];
} else {
lastKey = null;
for (key in data) {
lastKey = key;
}
this.refs[isRef] = data[lastKey];
}
}
}
if (Utils.isEmpty(data)) {
return null;
} else {
return data;
}
};
Parser.prototype.getRealCurrentLineNb = function() {
return this.currentLineNb + this.offset;
};
Parser.prototype.getCurrentLineIndentation = function() {
return this.currentLine.length - Utils.ltrim(this.currentLine, ' ').length;
};
Parser.prototype.getNextEmbedBlock = function(indentation, includeUnindentedCollection) {
var data, indent, isItUnindentedCollection, newIndent, removeComments, removeCommentsPattern, unindentedEmbedBlock;
if (indentation == null) {
indentation = null;
}
if (includeUnindentedCollection == null) {
includeUnindentedCollection = false;
}
this.moveToNextLine();
if (indentation == null) {
newIndent = this.getCurrentLineIndentation();
unindentedEmbedBlock = this.isStringUnIndentedCollectionItem(this.currentLine);
if (!(this.isCurrentLineEmpty()) && 0 === newIndent && !unindentedEmbedBlock) {
throw new ParseException('Indentation problem.', this.getRealCurrentLineNb() + 1, this.currentLine);
}
} else {
newIndent = indentation;
}
data = [this.currentLine.slice(newIndent)];
if (!includeUnindentedCollection) {
isItUnindentedCollection = this.isStringUnIndentedCollectionItem(this.currentLine);
}
removeCommentsPattern = this.PATTERN_FOLDED_SCALAR_END;
removeComments = !removeCommentsPattern.test(this.currentLine);
while (this.moveToNextLine()) {
indent = this.getCurrentLineIndentation();
if (indent === newIndent) {
removeComments = !removeCommentsPattern.test(this.currentLine);
}
if (removeComments && this.isCurrentLineComment()) {
continue;
}
if (this.isCurrentLineBlank()) {
data.push(this.currentLine.slice(newIndent));
continue;
}
if (isItUnindentedCollection && !this.isStringUnIndentedCollectionItem(this.currentLine) && indent === newIndent) {
this.moveToPreviousLine();
break;
}
if (indent >= newIndent) {
data.push(this.currentLine.slice(newIndent));
} else if (Utils.ltrim(this.currentLine).charAt(0) === '#') {
} else if (0 === indent) {
this.moveToPreviousLine();
break;
} else {
throw new ParseException('Indentation problem.', this.getRealCurrentLineNb() + 1, this.currentLine);
}
}
return data.join("\n");
};
Parser.prototype.moveToNextLine = function() {
if (this.currentLineNb >= this.lines.length - 1) {
return false;
}
this.currentLine = this.lines[++this.currentLineNb];
return true;
};
Parser.prototype.moveToPreviousLine = function() {
this.currentLine = this.lines[--this.currentLineNb];
};
Parser.prototype.parseValue = function(value, exceptionOnInvalidType, objectDecoder) {
var e, foldedIndent, matches, modifiers, pos, ref, ref1, val;
if (0 === value.indexOf('*')) {
pos = value.indexOf('#');
if (pos !== -1) {
value = value.substr(1, pos - 2);
} else {
value = value.slice(1);
}
if (this.refs[value] === void 0) {
throw new ParseException('Reference "' + value + '" does not exist.', this.currentLine);
}
return this.refs[value];
}
if (matches = this.PATTERN_FOLDED_SCALAR_ALL.exec(value)) {
modifiers = (ref = matches.modifiers) != null ? ref : '';
foldedIndent = Math.abs(parseInt(modifiers));
if (isNaN(foldedIndent)) {
foldedIndent = 0;
}
val = this.parseFoldedScalar(matches.separator, this.PATTERN_DECIMAL.replace(modifiers, ''), foldedIndent);
if (matches.type != null) {
Inline.configure(exceptionOnInvalidType, objectDecoder);
return Inline.parseScalar(matches.type + ' ' + val);
} else {
return val;
}
}
if ((ref1 = value.charAt(0)) === '[' || ref1 === '{' || ref1 === '"' || ref1 === "'") {
while (true) {
try {
return Inline.parse(value, exceptionOnInvalidType, objectDecoder);
} catch (error) {
e = error;
if (e instanceof ParseMore && this.moveToNextLine()) {
value += "\n" + Utils.trim(this.currentLine, ' ');
} else {
e.parsedLine = this.getRealCurrentLineNb() + 1;
e.snippet = this.currentLine;
throw e;
}
}
}
} else {
if (this.isNextLineIndented()) {
value += "\n" + this.getNextEmbedBlock();
}
return Inline.parse(value, exceptionOnInvalidType, objectDecoder);
}
};
Parser.prototype.parseFoldedScalar = function(separator, indicator, indentation) {
var isCurrentLineBlank, j, len, line, matches, newText, notEOF, pattern, ref, text;
if (indicator == null) {
indicator = '';
}
if (indentation == null) {
indentation = 0;
}
notEOF = this.moveToNextLine();
if (!notEOF) {
return '';
}
isCurrentLineBlank = this.isCurrentLineBlank();
text = '';
while (notEOF && isCurrentLineBlank) {
if (notEOF = this.moveToNextLine()) {
text += "\n";
isCurrentLineBlank = this.isCurrentLineBlank();
}
}
if (0 === indentation) {
if (matches = this.PATTERN_INDENT_SPACES.exec(this.currentLine)) {
indentation = matches[0].length;
}
}
if (indentation > 0) {
pattern = this.PATTERN_FOLDED_SCALAR_BY_INDENTATION[indentation];
if (pattern == null) {
pattern = new Pattern('^ {' + indentation + '}(.*)$');
Parser.prototype.PATTERN_FOLDED_SCALAR_BY_INDENTATION[indentation] = pattern;
}
while (notEOF && (isCurrentLineBlank || (matches = pattern.exec(this.currentLine)))) {
if (isCurrentLineBlank) {
text += this.currentLine.slice(indentation);
} else {
text += matches[1];
}
if (notEOF = this.moveToNextLine()) {
text += "\n";
isCurrentLineBlank = this.isCurrentLineBlank();
}
}
} else if (notEOF) {
text += "\n";
}
if (notEOF) {
this.moveToPreviousLine();
}
if ('>' === separator) {
newText = '';
ref = text.split("\n");
for (j = 0, len = ref.length; j < len; j++) {
line = ref[j];
if (line.length === 0 || line.charAt(0) === ' ') {
newText = Utils.rtrim(newText, ' ') + line + "\n";
} else {
newText += line + ' ';
}
}
text = newText;
}
if ('+' !== indicator) {
text = Utils.rtrim(text);
}
if ('' === indicator) {
text = this.PATTERN_TRAILING_LINES.replace(text, "\n");
} else if ('-' === indicator) {
text = this.PATTERN_TRAILING_LINES.replace(text, '');
}
return text;
};
Parser.prototype.isNextLineIndented = function(ignoreComments) {
var EOF, currentIndentation, ret;
if (ignoreComments == null) {
ignoreComments = true;
}
currentIndentation = this.getCurrentLineIndentation();
EOF = !this.moveToNextLine();
if (ignoreComments) {
while (!EOF && this.isCurrentLineEmpty()) {
EOF = !this.moveToNextLine();
}
} else {
while (!EOF && this.isCurrentLineBlank()) {
EOF = !this.moveToNextLine();
}
}
if (EOF) {
return false;
}
ret = false;
if (this.getCurrentLineIndentation() > currentIndentation) {
ret = true;
}
this.moveToPreviousLine();
return ret;
};
Parser.prototype.isCurrentLineEmpty = function() {
var trimmedLine;
trimmedLine = Utils.trim(this.currentLine, ' ');
return trimmedLine.length === 0 || trimmedLine.charAt(0) === '#';
};
Parser.prototype.isCurrentLineBlank = function() {
return '' === Utils.trim(this.currentLine, ' ');
};
Parser.prototype.isCurrentLineComment = function() {
var ltrimmedLine;
ltrimmedLine = Utils.ltrim(this.currentLine, ' ');
return ltrimmedLine.charAt(0) === '#';
};
Parser.prototype.cleanup = function(value) {
var count, i, indent, j, l, len, len1, line, lines, ref, ref1, ref2, smallestIndent, trimmedValue;
if (value.indexOf("\r") !== -1) {
value = value.split("\r\n").join("\n").split("\r").join("\n");
}
count = 0;
ref = this.PATTERN_YAML_HEADER.replaceAll(value, ''), value = ref[0], count = ref[1];
this.offset += count;
ref1 = this.PATTERN_LEADING_COMMENTS.replaceAll(value, '', 1), trimmedValue = ref1[0], count = ref1[1];
if (count === 1) {
this.offset += Utils.subStrCount(value, "\n") - Utils.subStrCount(trimmedValue, "\n");
value = trimmedValue;
}
ref2 = this.PATTERN_DOCUMENT_MARKER_START.replaceAll(value, '', 1), trimmedValue = ref2[0], count = ref2[1];
if (count === 1) {
this.offset += Utils.subStrCount(value, "\n") - Utils.subStrCount(trimmedValue, "\n");
value = trimmedValue;
value = this.PATTERN_DOCUMENT_MARKER_END.replace(value, '');
}
lines = value.split("\n");
smallestIndent = -1;
for (j = 0, len = lines.length; j < len; j++) {
line = lines[j];
if (Utils.trim(line, ' ').length === 0) {
continue;
}
indent = line.length - Utils.ltrim(line).length;
if (smallestIndent === -1 || indent < smallestIndent) {
smallestIndent = indent;
}
}
if (smallestIndent > 0) {
for (i = l = 0, len1 = lines.length; l < len1; i = ++l) {
line = lines[i];
lines[i] = line.slice(smallestIndent);
}
value = lines.join("\n");
}
return value;
};
Parser.prototype.isNextLineUnIndentedCollection = function(currentIndentation) {
var notEOF, ret;
if (currentIndentation == null) {
currentIndentation = null;
}
if (currentIndentation == null) {
currentIndentation = this.getCurrentLineIndentation();
}
notEOF = this.moveToNextLine();
while (notEOF && this.isCurrentLineEmpty()) {
notEOF = this.moveToNextLine();
}
if (false === notEOF) {
return false;
}
ret = false;
if (this.getCurrentLineIndentation() === currentIndentation && this.isStringUnIndentedCollectionItem(this.currentLine)) {
ret = true;
}
this.moveToPreviousLine();
return ret;
};
Parser.prototype.isStringUnIndentedCollectionItem = function() {
return this.currentLine === '-' || this.currentLine.slice(0, 2) === '- ';
};
return Parser;
})();
module.exports = Parser;