UNPKG

angular-xml-editor

Version:
183 lines (182 loc) 19.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { XmlCursorPos, XMLCursorPositions } from '../cursor/xmlCursorPos.class'; import { XmlRuleAttribut } from './xmlRuleAttribut.class'; import { Xml2html } from '../xml-html-converter/xml2html.class'; export class XmlEditRuleCheckAttributes { /** * @param {?} xmlSchema */ constructor(xmlSchema) { this.xmlSchema = xmlSchema; } /** * @param {?} cursorPosToCheck * @return {?} */ AttributesAllowedAtThisCursorPos(cursorPosToCheck) { if (!cursorPosToCheck) { return []; } /** @type {?} */ const parentNode = this.getRelevantParentNodeForCursorPos(cursorPosToCheck); /** @type {?} */ const parentName = Xml2html.getTagNameFromNode(parentNode); return this.getAttributesForElementName(parentName); } /** * @param {?} cursorPosToCheck * @return {?} */ getRelevantParentNodeForCursorPos(cursorPosToCheck) { if (cursorPosToCheck) { /** @type {?} */ let parentNode = cursorPosToCheck.ActualNode; switch (parentNode.nodeType) { case Node.COMMENT_NODE: case Node.TEXT_NODE: parentNode = parentNode.parentElement; break; case Node.ELEMENT_NODE: switch (cursorPosToCheck.PosAtNode) { case XMLCursorPositions.CursorInEmptyNode: case XMLCursorPositions.CursorInsideTextNode: case XMLCursorPositions.CursorOnCompleteNode: break; case XMLCursorPositions.CursorBehindNode: case XMLCursorPositions.CursorInFrontOfNode: parentNode = parentNode.parentElement; break; default: throw new Error(`unhandled cursorPosToCheck.PosAmNode "${cursorPosToCheck.PosAtNode}"/${XmlCursorPos.getXmlCursorPositionDebugName(cursorPosToCheck.PosAtNode)}" `); } break; default: throw new Error(`unhandled parentNode.nodeType "${parentNode.nodeType}"`); } return parentNode; } } /** * @param {?} elementName * @return {?} */ getAttributesForElementName(elementName) { /** @type {?} */ const xsdNode = this.xmlSchema.findXsdNodeForTagName(elementName); return this.getAttributesForElement(xsdNode, new Set([xsdNode])); } /** * @param {?} xsdNode * @param {?} alreadyAddedElements * @return {?} */ getAttributesForElement(xsdNode, alreadyAddedElements) { /** @type {?} */ let attributes = []; if (xsdNode) { alreadyAddedElements.add(xsdNode); /** @type {?} */ const childNodes = Array.prototype.slice.call(xsdNode.childNodes); childNodes.forEach(child => { if (xsdNode.nodeType === Node.ELEMENT_NODE) { /** @type {?} */ const childElem = /** @type {?} */ (child); if (childElem) { if (child.localName === 'attribute') { // is attribute attributes = attributes.concat([ new XmlRuleAttribut({ attribName: childElem.attributes.getNamedItem('name').value, required: this.isRequiredAttribute(childElem), xsdRawNode: childElem, fixedValues: this.getFixedValues(childElem), defaultValue: this.getDefaultValue(childElem) }) ]); } else { // no attribute if (!alreadyAddedElements.has(child)) { /** @type {?} */ const subNodeAttributes = this.getAttributesForElement(child, alreadyAddedElements); attributes = attributes.concat(subNodeAttributes); } else { // Element already added } } } } }); } return attributes; } /** * the default value for this attribute * @param {?} childElem * @return {?} */ getDefaultValue(childElem) { /** @type {?} */ const attrib = childElem.attributes.getNamedItem('default'); if (attrib !== null) { return attrib.value; } return undefined; } /** * is this attribute required? * @param {?} childElem * @return {?} */ isRequiredAttribute(childElem) { /** @type {?} */ const attrib = childElem.attributes.getNamedItem('use'); /** @type {?} */ const value = attrib !== null && attrib.value === 'required'; return value; } /** * get the allowes values for this attribute * @param {?} xsdNode * @param {?=} alreadyChecked * @return {?} */ getFixedValues(xsdNode, alreadyChecked = []) { /** @type {?} */ let values = []; /** @type {?} */ const childNodes = Array.prototype.slice.call(xsdNode.childNodes); childNodes.forEach(child => { if (xsdNode.nodeType === Node.ELEMENT_NODE) { /** @type {?} */ const childElem = /** @type {?} */ (child); if (childElem) { if (child.localName === 'enumeration') { values = values.concat([childElem.attributes.getNamedItem('value').value]); } else { // no attribute if (alreadyChecked.indexOf(child) === -1) { /** @type {?} */ const subNodeAttributes = this.getFixedValues(child, alreadyChecked); values = values.concat(subNodeAttributes); } else { // Element already added } } } } }); return values; } } if (false) { /** @type {?} */ XmlEditRuleCheckAttributes.prototype.xmlSchema; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1sRWRpdFJ1bGVDaGVja0F0dHJpYnV0ZXMuY2xhc3MuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLXhtbC1lZGl0b3IvIiwic291cmNlcyI6WyJsaWIvY29kZS94bWwtcnVsZXMtY2hlY2sveG1sRWRpdFJ1bGVDaGVja0F0dHJpYnV0ZXMuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFMUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRWhFLE1BQU07Ozs7SUFDSixZQUFvQixTQUFvQjtRQUFwQixjQUFTLEdBQVQsU0FBUyxDQUFXO0tBQUk7Ozs7O0lBRTVDLGdDQUFnQyxDQUFDLGdCQUE4QjtRQUM3RCxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDckIsT0FBTyxFQUFFLENBQUM7U0FDWDs7UUFDRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsaUNBQWlDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzs7UUFDNUUsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNELE9BQU8sSUFBSSxDQUFDLDJCQUEyQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBQ3JEOzs7OztJQUVELGlDQUFpQyxDQUFDLGdCQUE4QjtRQUM5RCxJQUFJLGdCQUFnQixFQUFFOztZQUNwQixJQUFJLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUM7WUFFN0MsUUFBUSxVQUFVLENBQUMsUUFBUSxFQUFFO2dCQUMzQixLQUFLLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBQ3ZCLEtBQUssSUFBSSxDQUFDLFNBQVM7b0JBQ2pCLFVBQVUsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDO29CQUN0QyxNQUFNO2dCQUVSLEtB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QUM7NEJBQ3JFLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7eUJBQzNDOzZCQUFNOzt5QkFFTjtxQkFDRjtpQkFDRjthQUNGO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsT0FBTyxNQUFNLENBQUM7O0NBRWpCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgWG1sQ3Vyc29yUG9zLCBYTUxDdXJzb3JQb3NpdGlvbnMgfSBmcm9tICcuLi9jdXJzb3IveG1sQ3Vyc29yUG9zLmNsYXNzJztcclxuaW1wb3J0IHsgWG1sUnVsZUF0dHJpYnV0IH0gZnJvbSAnLi94bWxSdWxlQXR0cmlidXQuY2xhc3MnO1xyXG5pbXBvcnQgeyBYbWxTY2hlbWEgfSBmcm9tICcuL3htbFNjaGVtYS5jbGFzcyc7XHJcbmltcG9ydCB7IFhtbDJodG1sIH0gZnJvbSAnLi4veG1sLWh0bWwtY29udmVydGVyL3htbDJodG1sLmNsYXNzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBYbWxFZGl0UnVsZUNoZWNrQXR0cmlidXRlcyB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB4bWxTY2hlbWE6IFhtbFNjaGVtYSkge31cclxuXHJcbiAgQXR0cmlidXRlc0FsbG93ZWRBdFRoaXNDdXJzb3JQb3MoY3Vyc29yUG9zVG9DaGVjazogWG1sQ3Vyc29yUG9zKTogWG1sUnVsZUF0dHJpYnV0W10ge1xyXG4gICAgaWYgKCFjdXJzb3JQb3NUb0NoZWNrKSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLmdldFJlbGV2YW50UGFyZW50Tm9kZUZvckN1cnNvclBvcyhjdXJzb3JQb3NUb0NoZWNrKTtcclxuICAgIGNvbnN0IHBhcmVudE5hbWUgPSBYbWwyaHRtbC5nZXRUYWdOYW1lRnJvbU5vZGUocGFyZW50Tm9kZSk7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzRm9yRWxlbWVudE5hbWUocGFyZW50TmFtZSk7XHJcbiAgfVxyXG5cclxuICBnZXRSZWxldmFudFBhcmVudE5vZGVGb3JDdXJzb3JQb3MoY3Vyc29yUG9zVG9DaGVjazogWG1sQ3Vyc29yUG9zKTogTm9kZSB7XHJcbiAgICBpZiAoY3Vyc29yUG9zVG9DaGVjaykge1xyXG4gICAgICBsZXQgcGFyZW50Tm9kZSA9IGN1cnNvclBvc1RvQ2hlY2suQWN0dWFsTm9kZTtcclxuXHJcbiAgICAgIHN3aXRjaCAocGFyZW50Tm9kZS5ub2RlVHlwZSkge1xyXG4gICAgICAgIGNhc2UgTm9kZS5DT01NRU5UX05PREU6XHJcbiAgICAgICAgY2FzZSBOb2RlLlRFWFRfTk9ERTpcclxuICAgICAgICAgIHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERTpcclxuICAgICAgICAgIHN3aXRjaCAoY3Vyc29yUG9zVG9DaGVjay5Qb3NBdE5vZGUpIHtcclxuICAgICAgICAgICAgY2FzZSBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29ySW5FbXB0eU5vZGU6XHJcbiAgICAgICAgICAgIGNhc2UgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluc2lkZVRleHROb2RlOlxyXG4gICAgICAgICAgICBjYXNlIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JPbkNvbXBsZXRlTm9kZTpcclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckJlaGluZE5vZGU6XHJcbiAgICAgICAgICAgIGNhc2UgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluRnJvbnRPZk5vZGU6XHJcbiAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudE5vZGUucGFyZW50RWxlbWVudDtcclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmhhbmRsZWQgY3Vyc29yUG9zVG9DaGVjay5Qb3NBbU5vZGUgXCIke2N1cnNvclBvc1RvQ2hlY2suUG9zQXROb2RlfVwiLyR7WG1sQ3Vyc29yUG9zLmdldFhtbEN1cnNvclBvc2l0aW9uRGVidWdOYW1lKGN1cnNvclBvc1RvQ2hlY2suUG9zQXROb2RlKX1cIiBgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmhhbmRsZWQgcGFyZW50Tm9kZS5ub2RlVHlwZSBcIiR7cGFyZW50Tm9kZS5ub2RlVHlwZX1cImApO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBwYXJlbnROb2RlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0QXR0cmlidXRlc0ZvckVsZW1lbnROYW1lKGVsZW1lbnROYW1lOiBzdHJpbmcpOiBYbWxSdWxlQXR0cmlidXRbXSB7XHJcbiAgICBjb25zdCB4c2ROb2RlID0gdGhpcy54bWxTY2hlbWEuZmluZFhzZE5vZGVGb3JUYWdOYW1lKGVsZW1lbnROYW1lKTtcclxuICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXNGb3JFbGVtZW50KHhzZE5vZGUsIG5ldyBTZXQoW3hzZE5vZGVdKSk7XHJcbiAgfVxyXG5cclxuICBnZXRBdHRyaWJ1dGVzRm9yRWxlbWVudCh4c2ROb2RlOiBOb2RlLCBhbHJlYWR5QWRkZWRFbGVtZW50czogU2V0PE5vZGU+KTogWG1sUnVsZUF0dHJpYnV0W10ge1xyXG4gICAgbGV0IGF0dHJpYnV0ZXM6IFhtbFJ1bGVBdHRyaWJ1dFtdID0gW107XHJcblxyXG4gICAgaWYgKHhzZE5vZGUpIHtcclxuICAgICAgYWxyZWFkeUFkZGVkRWxlbWVudHMuYWRkKHhzZE5vZGUpO1xyXG5cclxuICAgICAgY29uc3QgY2hpbGROb2RlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHhzZE5vZGUuY2hpbGROb2Rlcyk7XHJcblxyXG4gICAgICBjaGlsZE5vZGVzLmZvckVhY2goY2hpbGQgPT4ge1xyXG4gICAgICAgIGlmICh4c2ROb2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xyXG4gICAgICAgICAgY29uc3QgY2hpbGRFbGVtID0gY2hpbGQgYXMgRWxlbWVudDtcclxuICAgICAgICAgIGlmIChjaGlsZEVsZW0pIHtcclxuICAgICAgICAgICAgaWYgKGNoaWxkLmxvY2FsTmFtZSA9PT0gJ2F0dHJpYnV0ZScpIHtcclxuICAgICAgICAgICAgICAvLyBpcyBhdHRyaWJ1dGVcclxuICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gYXR0cmlidXRlcy5jb25jYXQoW1xyXG4gICAgICAgICAgICAgICAgbmV3IFhtbFJ1bGVBdHRyaWJ1dCh7XHJcbiAgICAgICAgICAgICAgICAgIGF0dHJpYk5hbWU6IGNoaWxkRWxlbS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgnbmFtZScpLnZhbHVlLFxyXG4gICAgICAgICAgICAgICAgICByZXF1aXJlZDogdGhpcy5pc1JlcXVpcmVkQXR0cmlidXRlKGNoaWxkRWxlbSksXHJcbiAgICAgICAgICAgICAgICAgIHhzZFJhd05vZGU6IGNoaWxkRWxlbSxcclxuICAgICAgICAgICAgICAgICAgZml4ZWRWYWx1ZXM6IHRoaXMuZ2V0Rml4ZWRWYWx1ZXMoY2hpbGRFbGVtKSxcclxuICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiB0aGlzLmdldERlZmF1bHRWYWx1ZShjaGlsZEVsZW0pXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIF0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIC8vIG5vIGF0dHJpYnV0ZVxyXG4gICAgICAgICAgICAgIGlmICghYWxyZWFkeUFkZGVkRWxlbWVudHMuaGFzKGNoaWxkKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViTm9kZUF0dHJpYnV0ZXMgPSB0aGlzLmdldEF0dHJpYnV0ZXNGb3JFbGVtZW50KGNoaWxkLCBhbHJlYWR5QWRkZWRFbGVtZW50cyk7XHJcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gYXR0cmlidXRlcy5jb25jYXQoc3ViTm9kZUF0dHJpYnV0ZXMpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBFbGVtZW50IGFscmVhZHkgYWRkZWRcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhdHRyaWJ1dGVzO1xyXG4gIH1cclxuXHJcbiAgLyoqIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGF0dHJpYnV0ZSAqL1xyXG4gIHByaXZhdGUgZ2V0RGVmYXVsdFZhbHVlKGNoaWxkRWxlbTogRWxlbWVudCkge1xyXG4gICAgY29uc3QgYXR0cmliID0gY2hpbGRFbGVtLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCdkZWZhdWx0Jyk7XHJcbiAgICBpZiAoYXR0cmliICE9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBhdHRyaWIudmFsdWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgLyoqIGlzIHRoaXMgYXR0cmlidXRlIHJlcXVpcmVkPyAqL1xyXG4gIHByaXZhdGUgaXNSZXF1aXJlZEF0dHJpYnV0ZShjaGlsZEVsZW06IEVsZW1lbnQpIHtcclxuICAgIGNvbnN0IGF0dHJpYiA9IGNoaWxkRWxlbS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgndXNlJyk7XHJcbiAgICBjb25zdCB2YWx1ZSA9IGF0dHJpYiAhPT0gbnVsbCAmJiBhdHRyaWIudmFsdWUgPT09ICdyZXF1aXJlZCc7XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKiogZ2V0IHRoZSBhbGxvd2VzIHZhbHVlcyBmb3IgdGhpcyBhdHRyaWJ1dGUgKi9cclxuICBwcml2YXRlIGdldEZpeGVkVmFsdWVzKHhzZE5vZGU6IEVsZW1lbnQsIGFscmVhZHlDaGVja2VkOiBOb2RlW10gPSBbXSk6IHN0cmluZ1tdIHtcclxuICAgIGxldCB2YWx1ZXM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgY29uc3QgY2hpbGROb2RlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHhzZE5vZGUuY2hpbGROb2Rlcyk7XHJcbiAgICBjaGlsZE5vZGVzLmZvckVhY2goY2hpbGQgPT4ge1xyXG4gICAgICBpZiAoeHNkTm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcclxuICAgICAgICBjb25zdCBjaGlsZEVsZW0gPSBjaGlsZCBhcyBFbGVtZW50O1xyXG4gICAgICAgIGlmIChjaGlsZEVsZW0pIHtcclxuICAgICAgICAgIGlmIChjaGlsZC5sb2NhbE5hbWUgPT09ICdlbnVtZXJhdGlvbicpIHtcclxuICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdChbY2hpbGRFbGVtLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCd2YWx1ZScpLnZhbHVlXSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBubyBhdHRyaWJ1dGVcclxuICAgICAgICAgICAgaWYgKGFscmVhZHlDaGVja2VkLmluZGV4T2YoY2hpbGQpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHN1Yk5vZGVBdHRyaWJ1dGVzID0gdGhpcy5nZXRGaXhlZFZhbHVlcyhjaGlsZCwgYWxyZWFkeUNoZWNrZWQpO1xyXG4gICAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5jb25jYXQoc3ViTm9kZUF0dHJpYnV0ZXMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIC8vIEVsZW1lbnQgYWxyZWFkeSBhZGRlZFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gdmFsdWVzO1xyXG4gIH1cclxufVxyXG4iXX0=