angular-xml-editor
Version:
XML editor component for Angular
183 lines (182 loc) • 19.1 kB
JavaScript
/**
* @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=