maestro-cli-roku
Version:
command line tools for maestro-roku projects
167 lines (166 loc) • 8.59 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Binding_1 = require("../bindingSupport/Binding");
var BindingType_1 = require("../bindingSupport/BindingType");
var Feedback_1 = require("../utils/Feedback");
var Utils_1 = require("../utils/Utils");
var bindingTypeTextMap = {
onewaytarget: BindingType_1.BindingType.oneWayTarget,
twoway: BindingType_1.BindingType.twoWay,
onewaysource: BindingType_1.BindingType.oneWaySource
};
var XMLTag = /** @class */ (function () {
function XMLTag(xmlElement, tagText, file) {
if (!xmlElement || !tagText) {
Feedback_1.feedbackError(file, "Received corrupt XMLElement \"" + tagText);
}
this.startPosition = xmlElement.startTagPosition;
this.endPosition = xmlElement.endTagPosition;
this._file = file;
this.text = tagText;
this.isTopTag = xmlElement.name.toLowerCase() === 'field';
var tagLength = tagText.length;
this.bindings = this.getBindings(xmlElement, tagText);
// const regex = new RegExp('"@([\\(\\{\\[])+(.*)([\\)\\}\\]])+"', 'gi');
var that = this;
this.bindings.forEach(function (b) {
if (b.properties.type === BindingType_1.BindingType.code) {
var pattern = "(" + (b.isTopBinding ? 'value' : b.nodeField) + ")(\\s*)=(\\s*)((?:\"|'){{=" + Utils_1.escapeRegExp(b.rawValueText) + "}}(?:\"|'))";
var regex = new RegExp(pattern, 'gim');
that.text = that.text.replace(regex, function (m, m1, m2, m3, m4) {
return ''.padEnd(m1.length) + m2 + m3 + ''.padEnd(m4.length + 1);
});
}
else {
var regex = new RegExp("(" + (b.isTopBinding ? 'value' : b.nodeField) + ")(\\s*)=(\\s*)((?:\"|')" + Utils_1.escapeRegExp(b.rawValueText) + "(?:\"|'))", 'gim');
that.text = that.text.replace(regex, function (m, m1, m2, m3, m4) {
return ''.padEnd(m1.length) + m2 + m3 + ''.padEnd(m4.length + 1);
});
}
});
if (this.text.length < tagLength) {
this.text = this.text.padEnd(tagLength - this.text.length);
}
}
XMLTag.prototype.getBindings = function (xmlElement, tagText) {
var staticRegex = new RegExp('^{(\\{\\:|\\{\\=)+(.*)(\\})+\\}$', 'i');
var regex = new RegExp('^\\{([\\(\\{\\[])+(.*)([\\}\\)\\]])+\\}$', 'i');
this.id = xmlElement.attr.id;
var bindings = [];
for (var attribute in xmlElement.attr) {
if (attribute.toLowerCase() !== 'id') {
var matches = staticRegex.exec(xmlElement.attr[attribute]);
matches = matches || regex.exec(xmlElement.attr[attribute]);
var bindingText = matches && matches.length > 2 ? matches[2] : null;
var bindingStartType = matches && matches.length > 1 ? matches[1] : null;
var bindingEndType = matches && matches.length > 3 ? matches[3] : null;
if (bindingText) {
var indicatedBindingMode = this.getBindingMode(bindingStartType, bindingEndType);
var binding = new Binding_1.default();
binding.nodeId = this.isTopTag ? 'top' : this.id;
binding.nodeField = this.isTopTag ? this.id : attribute;
binding.isTopBinding = this.isTopTag;
if (binding.properties.type === BindingType_1.BindingType.invalid) {
binding.properties.type = indicatedBindingMode;
}
if (indicatedBindingMode === BindingType_1.BindingType.code) {
var value = xmlElement.attr[this.isTopTag ? 'value' : attribute];
binding.rawValueText = value.substring(3, value.length - 2);
}
else {
var parts = bindingText.split(',');
for (var i = 0; i < parts.length; i++) {
this.parseBindingPart(i, parts[i].replace(/\s/g, ''), binding, tagText);
}
binding.rawValueText = xmlElement.attr[this.isTopTag ? 'value' : attribute];
}
binding.validate();
if (binding.isValid) {
bindings.push(binding);
}
else {
Feedback_1.feedbackError(this._file, "Could not parse binding for tag \"" + tagText + "\" at position: " + this.startPosition + " \n reason: " + binding.errorMessage);
}
}
}
}
this.hasBindings = bindings.length > 0;
return bindings;
};
XMLTag.prototype.parseBindingPart = function (index, partText, binding, tagText) {
if (index === 0) {
var bindingParts = partText.split('.');
if (bindingParts.length > 1) {
binding.observerId = bindingParts[0];
binding.observerField = bindingParts.slice(1).join('.');
binding.isFunctionBinding = binding.observerField.endsWith('()');
binding.observerField = binding.observerField.replace('()', '');
}
else {
Feedback_1.feedbackError(this._file, "Could not parse binding details for field \"" + partText + "\" from tag \"" + tagText + "\" at position: " + this.startPosition, true);
}
}
else if (partText.toLowerCase().includes('mode=')) {
//mode
var mode = bindingTypeTextMap[partText.substring(5).toLowerCase()];
if (mode) {
binding.properties.type = mode;
}
else {
Feedback_1.feedbackWarning(this._file, "Could not parse binding mode for field \"" + partText + "\" from tag \"" + tagText + "\" at position: " + this.startPosition);
}
}
else if (partText.toLowerCase().includes('transform=')) {
//transform function
var transformFunction = partText.substring(10);
if (transformFunction.trim()) {
binding.properties.transformFunction = transformFunction;
}
else {
Feedback_1.feedbackWarning(this._file, "Could not parse transformFunction for field \"" + partText + "\" from tag \"" + tagText + "\" at position: " + this.startPosition);
}
}
else if (partText.toLowerCase().includes('issettinginitialvalue=')) {
//transform function
var isSettingInitialValueText = partText.substring(22).toLowerCase();
if (isSettingInitialValueText.trim()) {
binding.properties.isSettingInitialValue = isSettingInitialValueText === 'true';
}
else {
Feedback_1.feedbackWarning(this._file, "Could not parse isSettingInitialValueText for field \"" + partText + "\" from tag \"" + tagText + "\" at position: " + this.startPosition);
}
}
else if (partText.toLowerCase().includes('isFiringOnce=')) {
//transform function
var isFiringOnce = partText.substring(13).toLowerCase();
if (isFiringOnce.trim()) {
binding.properties.isFiringOnce = isFiringOnce === 'true';
}
else {
Feedback_1.feedbackWarning(this._file, "Could not parse isFiringOnce for field \"" + partText + "\" from tag \"" + tagText + "\" at position: " + this.startPosition);
}
}
};
XMLTag.prototype.getBindingMode = function (bindingStartType, bindingEndType) {
if (bindingStartType === '{' && bindingEndType === '}') {
return BindingType_1.BindingType.oneWaySource;
}
else if (bindingStartType === '(' && bindingEndType === ')') {
return BindingType_1.BindingType.oneWayTarget;
}
else if (bindingStartType === '[' && bindingEndType === ']') {
return BindingType_1.BindingType.twoWay;
}
else if (bindingStartType === '{:' && bindingEndType === '}') {
return BindingType_1.BindingType.static;
}
else if (bindingStartType === '{=' && bindingEndType === '}') {
return BindingType_1.BindingType.code;
}
else {
return BindingType_1.BindingType.invalid;
}
};
return XMLTag;
}());
exports.XMLTag = XMLTag;