UNPKG

angular-xml-editor

Version:
156 lines (155 loc) 17.4 kB
/** * @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