165 lines
5.1 KiB
JavaScript
165 lines
5.1 KiB
JavaScript
(function() {
|
|
var MarkedYAMLError, events, nodes, _ref,
|
|
__hasProp = {}.hasOwnProperty,
|
|
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
|
|
|
|
events = require('./events');
|
|
|
|
MarkedYAMLError = require('./errors').MarkedYAMLError;
|
|
|
|
nodes = require('./nodes');
|
|
|
|
this.ComposerError = (function(_super) {
|
|
__extends(ComposerError, _super);
|
|
|
|
function ComposerError() {
|
|
_ref = ComposerError.__super__.constructor.apply(this, arguments);
|
|
return _ref;
|
|
}
|
|
|
|
return ComposerError;
|
|
|
|
})(MarkedYAMLError);
|
|
|
|
this.Composer = (function() {
|
|
function Composer() {
|
|
this.anchors = {};
|
|
}
|
|
|
|
Composer.prototype.check_node = function() {
|
|
if (this.check_event(events.StreamStartEvent)) {
|
|
this.get_event();
|
|
}
|
|
return !this.check_event(events.StreamEndEvent);
|
|
};
|
|
|
|
/*
|
|
Get the root node of the next document.
|
|
*/
|
|
|
|
|
|
Composer.prototype.get_node = function() {
|
|
if (!this.check_event(events.StreamEndEvent)) {
|
|
return this.compose_document();
|
|
}
|
|
};
|
|
|
|
Composer.prototype.get_single_node = function() {
|
|
var document, event;
|
|
|
|
this.get_event();
|
|
document = null;
|
|
if (!this.check_event(events.StreamEndEvent)) {
|
|
document = this.compose_document();
|
|
}
|
|
if (!this.check_event(events.StreamEndEvent)) {
|
|
event = this.get_event();
|
|
throw new exports.ComposerError('expected a single document in the stream', document.start_mark, 'but found another document', event.start_mark);
|
|
}
|
|
this.get_event();
|
|
return document;
|
|
};
|
|
|
|
Composer.prototype.compose_document = function() {
|
|
var node;
|
|
|
|
this.get_event();
|
|
node = this.compose_node();
|
|
this.get_event();
|
|
this.anchors = {};
|
|
return node;
|
|
};
|
|
|
|
Composer.prototype.compose_node = function(parent, index) {
|
|
var anchor, event, node;
|
|
|
|
if (this.check_event(events.AliasEvent)) {
|
|
event = this.get_event();
|
|
anchor = event.anchor;
|
|
if (!(anchor in this.anchors)) {
|
|
throw new exports.ComposerError(null, null, "found undefined alias " + anchor, event.start_mark);
|
|
}
|
|
return this.anchors[anchor];
|
|
}
|
|
event = this.peek_event();
|
|
anchor = event.anchor;
|
|
if (anchor !== null && anchor in this.anchors) {
|
|
throw new exports.ComposerError("found duplicate anchor " + anchor + "; first occurence", this.anchors[anchor].start_mark, 'second occurrence', event.start_mark);
|
|
}
|
|
this.descend_resolver(parent, index);
|
|
if (this.check_event(events.ScalarEvent)) {
|
|
node = this.compose_scalar_node(anchor);
|
|
} else if (this.check_event(events.SequenceStartEvent)) {
|
|
node = this.compose_sequence_node(anchor);
|
|
} else if (this.check_event(events.MappingStartEvent)) {
|
|
node = this.compose_mapping_node(anchor);
|
|
}
|
|
this.ascend_resolver();
|
|
return node;
|
|
};
|
|
|
|
Composer.prototype.compose_scalar_node = function(anchor) {
|
|
var event, node, tag;
|
|
|
|
event = this.get_event();
|
|
tag = event.tag;
|
|
if (tag === null || tag === '!') {
|
|
tag = this.resolve(nodes.ScalarNode, event.value, event.implicit);
|
|
}
|
|
node = new nodes.ScalarNode(tag, event.value, event.start_mark, event.end_mark, event.style);
|
|
if (anchor !== null) {
|
|
this.anchors[anchor] = node;
|
|
}
|
|
return node;
|
|
};
|
|
|
|
Composer.prototype.compose_sequence_node = function(anchor) {
|
|
var end_event, index, node, start_event, tag;
|
|
|
|
start_event = this.get_event();
|
|
tag = start_event.tag;
|
|
if (tag === null || tag === '!') {
|
|
tag = this.resolve(nodes.SequenceNode, null, start_event.implicit);
|
|
}
|
|
node = new nodes.SequenceNode(tag, [], start_event.start_mark, null, start_event.flow_style);
|
|
if (anchor !== null) {
|
|
this.anchors[anchor] = node;
|
|
}
|
|
index = 0;
|
|
while (!this.check_event(events.SequenceEndEvent)) {
|
|
node.value.push(this.compose_node(node, index));
|
|
index++;
|
|
}
|
|
end_event = this.get_event();
|
|
node.end_mark = end_event.end_mark;
|
|
return node;
|
|
};
|
|
|
|
Composer.prototype.compose_mapping_node = function(anchor) {
|
|
var end_event, item_key, item_value, node, start_event, tag;
|
|
|
|
start_event = this.get_event();
|
|
tag = start_event.tag;
|
|
if (tag === null || tag === '!') {
|
|
tag = this.resolve(nodes.MappingNode, null, start_event.implicit);
|
|
}
|
|
node = new nodes.MappingNode(tag, [], start_event.start_mark, null, start_event.flow_style);
|
|
if (anchor !== null) {
|
|
this.anchors[anchor] = node;
|
|
}
|
|
while (!this.check_event(events.MappingEndEvent)) {
|
|
item_key = this.compose_node(node);
|
|
item_value = this.compose_node(node, item_key);
|
|
node.value.push([item_key, item_value]);
|
|
}
|
|
end_event = this.get_event();
|
|
node.end_mark = end_event.end_mark;
|
|
return node;
|
|
};
|
|
|
|
return Composer;
|
|
|
|
})();
|
|
|
|
}).call(this);
|