UNPKG

maestro-cli-roku

Version:

command line tools for maestro-roku projects

167 lines (166 loc) 8.59 kB
"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;