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