angular-xml-editor
Version:
XML editor component for Angular
156 lines (155 loc) • 17.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { XmlCursorPos, XMLCursorPositions } from '../cursor/xmlCursorPos.class';
import { Xml2html } from '../xml-html-converter/xml2html.class';
export class XmlEditRuleCheckElements {
/**
* @param {?} xsdNodes
*/
constructor(xsdNodes) {
this.xsdNodes = xsdNodes;
}
/**
* @param {?} cursorPosToCheck
* @return {?}
*/
ElementsAllowedAtThisCursorPos(cursorPosToCheck) {
if (!cursorPosToCheck) {
return [];
}
/** @type {?} */
const parentNode = this.getRelevantParentNodeForCursorPos(cursorPosToCheck);
/** @type {?} */
const parentName = Xml2html.getTagNameFromNode(parentNode);
/** @type {?} */
const xsdNode = this.xsdNodes.get(parentName);
if (xsdNode) {
/** @type {?} */
const result = this.getSubElementNames(xsdNode, []);
return result;
}
else {
// console.warn('element "' + parentName + '" not found');
return [];
}
}
/**
* @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:
break;
case XMLCursorPositions.CursorBehindNode:
case XMLCursorPositions.CursorInFrontOfNode:
case XMLCursorPositions.CursorOnCompleteNode:
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 {?} xsdNode
* @param {?} alreadyAddedElementNames
* @param {?=} depth
* @return {?}
*/
getSubElementNames(xsdNode, alreadyAddedElementNames, depth = 0) {
/** @type {?} */
let elementNames = [];
/** @type {?} */
let elementName;
if (xsdNode.nodeType === Node.ELEMENT_NODE) {
/** @type {?} */
const asElem = /** @type {?} */ (xsdNode);
if (asElem) {
if (asElem.localName === 'element') {
elementName = asElem.getAttribute('name');
}
}
}
if (elementName) {
// console.warn('found: ' + JSON.stringify(elementName) + ' depth: ' + depth);
if (alreadyAddedElementNames.length !== 0) {
if (alreadyAddedElementNames.indexOf(elementName) !== -1) {
return elementNames; // element recursion detected
}
if (depth === 0) {
// is the parent element itself - skip!
}
else {
elementNames = elementNames.concat(elementName);
return elementNames;
}
}
alreadyAddedElementNames.push(elementName);
}
/** @type {?} */
const childNodes = /** @type {?} */ (Array.prototype.slice.call(xsdNode.childNodes));
depth++;
childNodes.forEach(child => {
if (child.nodeType === Node.ELEMENT_NODE) {
/** @type {?} */
const childElem = /** @type {?} */ (child);
if (childElem) {
switch (childElem.localName) {
case 'complexType':
case 'sequence':
case 'choice':
case 'simpleContent':
case 'extension':
elementNames = elementNames.concat(this.getSubElementNames(child, alreadyAddedElementNames, depth));
break;
case 'element':
/** @type {?} */
const refname = childElem.attributes.getNamedItem('ref');
if (refname) {
/** @type {?} */
const referedNode = this.xsdNodes.get(refname.value);
if (referedNode) {
elementNames = elementNames.concat(this.getSubElementNames(referedNode, alreadyAddedElementNames, depth));
}
else {
throw new Error(` refered element "${refname}" for element "${childElem.outerHTML}" not found`);
}
}
else {
elementNames = elementNames.concat(this.getSubElementNames(child, alreadyAddedElementNames, depth));
}
break;
case 'attribute':
break;
default:
throw new Error(`unknown childElem.localname "${childElem.localName}"/${childElem.outerHTML}`);
}
}
}
});
return elementNames;
}
}
if (false) {
/** @type {?} */
XmlEditRuleCheckElements.prototype.xsdNodes;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1sRWRpdFJ1bGVDaGVja0VsZW1lbnRzLmNsYXNzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci14bWwtZWRpdG9yLyIsInNvdXJjZXMiOlsibGliL2NvZGUveG1sLXJ1bGVzLWNoZWNrL3htbEVkaXRSdWxlQ2hlY2tFbGVtZW50cy5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUVoRSxNQUFNOzs7O0lBQ0osWUFBb0IsUUFBOEI7UUFBOUIsYUFBUSxHQUFSLFFBQVEsQ0FBc0I7S0FBSTs7Ozs7SUFFdEQsOEJBQThCLENBQUMsZ0JBQThCO1FBQzNELElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUNyQixPQUFPLEVBQUUsQ0FBQztTQUNYOztRQUNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDOztRQUM1RSxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7O1FBQzNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzlDLElBQUksT0FBTyxFQUFFOztZQUNYLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDcEQsT0FBTyxNQUFNLENBQUM7U0FDZjthQUFNOztZQUVMLE9BQU8sRUFBRSxDQUFDO1NBQ1g7S0FDRjs7Ozs7SUFFRCxpQ0FBaUMsQ0FBQyxnQkFBOEI7UUFDOUQsSUFBSSxnQkFBZ0IsRUFBRTs7WUFDcEIsSUFBSSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsVUFBVSxDQUFDO1lBRTdDLFFBQVEsVUFBVSxDQUFDLFFBQVEsRUFB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RyxNQUFNO3dCQUVSLEtBQUssU0FBUzs7NEJBQ1osTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQ3pELElBQUksT0FBTyxFQUFFOztnQ0FDWCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7Z0NBQ3JELElBQUksV0FBVyxFQUFFO29DQUNmLFlBQVksR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztpQ0FDM0c7cUNBQU07b0NBQ0wsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsT0FBTyxrQkFBa0IsU0FBUyxDQUFDLFNBQVMsYUFBYSxDQUFDLENBQUM7aUNBQ2pHOzZCQUNGO2lDQUFNO2dDQUNMLFlBQVksR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQzs2QkFDckc7NEJBQ0QsTUFBTTt3QkFFUixLQUFLLFdBQVc7NEJBQ2QsTUFBTTt3QkFFUjs0QkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxTQUFTLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO3FCQUNsRztpQkFDRjthQUNGO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsT0FBTyxZQUFZLENBQUM7O0NBRXZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgWG1sQ3Vyc29yUG9zLCBYTUxDdXJzb3JQb3NpdGlvbnMgfSBmcm9tICcuLi9jdXJzb3IveG1sQ3Vyc29yUG9zLmNsYXNzJztcclxuaW1wb3J0IHsgWG1sMmh0bWwgfSBmcm9tICcuLi94bWwtaHRtbC1jb252ZXJ0ZXIveG1sMmh0bWwuY2xhc3MnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFhtbEVkaXRSdWxlQ2hlY2tFbGVtZW50cyB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB4c2ROb2RlczogTWFwPHN0cmluZywgRWxlbWVudD4pIHt9XHJcblxyXG4gIEVsZW1lbnRzQWxsb3dlZEF0VGhpc0N1cnNvclBvcyhjdXJzb3JQb3NUb0NoZWNrOiBYbWxDdXJzb3JQb3MpOiBzdHJpbmdbXSB7XHJcbiAgICBpZiAoIWN1cnNvclBvc1RvQ2hlY2spIHtcclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuZ2V0UmVsZXZhbnRQYXJlbnROb2RlRm9yQ3Vyc29yUG9zKGN1cnNvclBvc1RvQ2hlY2spO1xyXG4gICAgY29uc3QgcGFyZW50TmFtZSA9IFhtbDJodG1sLmdldFRhZ05hbWVGcm9tTm9kZShwYXJlbnROb2RlKTtcclxuICAgIGNvbnN0IHhzZE5vZGUgPSB0aGlzLnhzZE5vZGVzLmdldChwYXJlbnROYW1lKTtcclxuICAgIGlmICh4c2ROb2RlKSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZ2V0U3ViRWxlbWVudE5hbWVzKHhzZE5vZGUsIFtdKTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIGNvbnNvbGUud2FybignZWxlbWVudCBcIicgKyBwYXJlbnROYW1lICsgJ1wiIG5vdCBmb3VuZCcpO1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRSZWxldmFudFBhcmVudE5vZGVGb3JDdXJzb3JQb3MoY3Vyc29yUG9zVG9DaGVjazogWG1sQ3Vyc29yUG9zKTogTm9kZSB7XHJcbiAgICBpZiAoY3Vyc29yUG9zVG9DaGVjaykge1xyXG4gICAgICBsZXQgcGFyZW50Tm9kZSA9IGN1cnNvclBvc1RvQ2hlY2suQWN0dWFsTm9kZTtcclxuXHJcbiAgICAgIHN3aXRjaCAocGFyZW50Tm9kZS5ub2RlVHlwZSkge1xyXG4gICAgICAgIGNhc2UgTm9kZS5DT01NRU5UX05PREU6XHJcbiAgICAgICAgY2FzZSBOb2RlLlRFWFRfTk9ERTpcclxuICAgICAgICAgIHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERTpcclxuICAgICAgICAgIHN3aXRjaCAoY3Vyc29yUG9zVG9DaGVjay5Qb3NBdE5vZGUpIHtcclxuICAgICAgICAgICAgY2FzZSBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29ySW5FbXB0eU5vZGU6XHJcbiAgICAgICAgICAgIGNhc2UgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluc2lkZVRleHROb2RlOlxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29yQmVoaW5kTm9kZTpcclxuICAgICAgICAgICAgY2FzZSBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29ySW5Gcm9udE9mTm9kZTpcclxuICAgICAgICAgICAgY2FzZSBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29yT25Db21wbGV0ZU5vZGU6XHJcbiAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudE5vZGUucGFyZW50RWxlbWVudDtcclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmhhbmRsZWQgIGN1cnNvclBvc1RvQ2hlY2suUG9zQW1Ob2RlIFwiJHtjdXJzb3JQb3NUb0NoZWNrLlBvc0F0Tm9kZX1cIi8ke1htbEN1cnNvclBvcy5nZXRYbWxDdXJzb3JQb3NpdGlvbkRlYnVnTmFtZShjdXJzb3JQb3NUb0NoZWNrLlBvc0F0Tm9kZSl9XCIgYCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5oYW5kbGVkICBwYXJlbnROb2RlLm5vZGVUeXBlIFwiJHtwYXJlbnROb2RlLm5vZGVUeXBlfVwiYCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHBhcmVudE5vZGU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0U3ViRWxlbWVudE5hbWVzKHhzZE5vZGU6IE5vZGUsIGFscmVhZHlBZGRlZEVsZW1lbnROYW1lczogc3RyaW5nW10sIGRlcHRoOiBudW1iZXIgPSAwKTogc3RyaW5nW10ge1xyXG4gICAgbGV0IGVsZW1lbnROYW1lczogc3RyaW5nW10gPSBbXTtcclxuICAgIGxldCBlbGVtZW50TmFtZTogc3RyaW5nO1xyXG5cclxuICAgIGlmICh4c2ROb2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xyXG4gICAgICBjb25zdCBhc0VsZW0gPSB4c2ROb2RlIGFzIEVsZW1lbnQ7XHJcbiAgICAgIGlmIChhc0VsZW0pIHtcclxuICAgICAgICBpZiAoYXNFbGVtLmxvY2FsTmFtZSA9PT0gJ2VsZW1lbnQnKSB7XHJcbiAgICAgICAgICBlbGVtZW50TmFtZSA9IGFzRWxlbS5nZXRBdHRyaWJ1dGUoJ25hbWUnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoZWxlbWVudE5hbWUpIHtcclxuICAgICAgLy8gY29uc29sZS53YXJuKCdmb3VuZDogJyArIEpTT04uc3RyaW5naWZ5KGVsZW1lbnROYW1lKSArICcgZGVwdGg6ICcgKyBkZXB0aCk7XHJcbiAgICAgIGlmIChhbHJlYWR5QWRkZWRFbGVtZW50TmFtZXMubGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgICAgaWYgKGFscmVhZHlBZGRlZEVsZW1lbnROYW1lcy5pbmRleE9mKGVsZW1lbnROYW1lKSAhPT0gLTEpIHtcclxuICAgICAgICAgIHJldHVybiBlbGVtZW50TmFtZXM7IC8vIGVsZW1lbnQgcmVjdXJzaW9uIGRldGVjdGVkXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xyXG4gICAgICAgICAgLy8gaXMgdGhlIHBhcmVudCBlbGVtZW50IGl0c2VsZiAtIHNraXAhXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGVsZW1lbnROYW1lcyA9IGVsZW1lbnROYW1lcy5jb25jYXQoZWxlbWVudE5hbWUpO1xyXG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnROYW1lcztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgYWxyZWFkeUFkZGVkRWxlbWVudE5hbWVzLnB1c2goZWxlbWVudE5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNoaWxkTm9kZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh4c2ROb2RlLmNoaWxkTm9kZXMpIGFzIE5vZGVbXTtcclxuXHJcbiAgICBkZXB0aCsrO1xyXG5cclxuICAgIGNoaWxkTm9kZXMuZm9yRWFjaChjaGlsZCA9PiB7XHJcbiAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcclxuICAgICAgICBjb25zdCBjaGlsZEVsZW0gPSBjaGlsZCBhcyBFbGVtZW50O1xyXG4gICAgICAgIGlmIChjaGlsZEVsZW0pIHtcclxuICAgICAgICAgIHN3aXRjaCAoY2hpbGRFbGVtLmxvY2FsTmFtZSkge1xyXG4gICAgICAgICAgICBjYXNlICdjb21wbGV4VHlwZSc6XHJcbiAgICAgICAgICAgIGNhc2UgJ3NlcXVlbmNlJzpcclxuICAgICAgICAgICAgY2FzZSAnY2hvaWNlJzpcclxuICAgICAgICAgICAgY2FzZSAnc2ltcGxlQ29udGVudCc6XHJcbiAgICAgICAgICAgIGNhc2UgJ2V4dGVuc2lvbic6XHJcbiAgICAgICAgICAgICAgZWxlbWVudE5hbWVzID0gZWxlbWVudE5hbWVzLmNvbmNhdCh0aGlzLmdldFN1YkVsZW1lbnROYW1lcyhjaGlsZCwgYWxyZWFkeUFkZGVkRWxlbWVudE5hbWVzLCBkZXB0aCkpO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSAnZWxlbWVudCc6XHJcbiAgICAgICAgICAgICAgY29uc3QgcmVmbmFtZSA9IGNoaWxkRWxlbS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgncmVmJyk7XHJcbiAgICAgICAgICAgICAgaWYgKHJlZm5hbWUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlZmVyZWROb2RlID0gdGhpcy54c2ROb2Rlcy5nZXQocmVmbmFtZS52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVmZXJlZE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWVzID0gZWxlbWVudE5hbWVzLmNvbmNhdCh0aGlzLmdldFN1YkVsZW1lbnROYW1lcyhyZWZlcmVkTm9kZSwgYWxyZWFkeUFkZGVkRWxlbWVudE5hbWVzLCBkZXB0aCkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAgcmVmZXJlZCBlbGVtZW50IFwiJHtyZWZuYW1lfVwiIGZvciBlbGVtZW50IFwiJHtjaGlsZEVsZW0ub3V0ZXJIVE1MfVwiIG5vdCBmb3VuZGApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50TmFtZXMgPSBlbGVtZW50TmFtZXMuY29uY2F0KHRoaXMuZ2V0U3ViRWxlbWVudE5hbWVzKGNoaWxkLCBhbHJlYWR5QWRkZWRFbGVtZW50TmFtZXMsIGRlcHRoKSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSAnYXR0cmlidXRlJzpcclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmtub3duIGNoaWxkRWxlbS5sb2NhbG5hbWUgXCIke2NoaWxkRWxlbS5sb2NhbE5hbWV9XCIvJHtjaGlsZEVsZW0ub3V0ZXJIVE1MfWApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGVsZW1lbnROYW1lcztcclxuICB9XHJcbn1cclxuIl19