UNPKG

angular-xml-editor

Version:
159 lines (158 loc) 17.3 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 XmlEditRuleCheckTextInsert { /** * @param {?} xsdNodes */ constructor(xsdNodes) { this.xsdNodes = xsdNodes; this.namespacePraefix = 'xs:'; } /** * @param {?} cursorPosToCheck * @return {?} */ isTextAllowedAtThisCursorPos(cursorPosToCheck) { if (!cursorPosToCheck) { return false; } /** @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.isTextAllowedInThisElement(xsdNode); return result; } else { return false; // element not found } } /** * @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 * @return {?} */ isTextAllowedInThisElement(xsdNode, alreadyAddedElementNames = new Set()) { /** @type {?} */ let elementName; if (xsdNode.nodeType === Node.ELEMENT_NODE) { /** @type {?} */ const asElem = /** @type {?} */ (xsdNode); if (asElem) { /** @type {?} */ const mixedAttrib = asElem.getAttribute('mixed'); if (mixedAttrib) { return true; } /** @type {?} */ const typeAttrib = asElem.getAttribute('type'); if (typeAttrib && typeAttrib === `${this.namespacePraefix}string`) { return true; } if (asElem.localName === 'element') { elementName = asElem.getAttribute('name'); if (elementName) { if (alreadyAddedElementNames.has(elementName)) { return false; // element recursion detected } } alreadyAddedElementNames.add(elementName); } } } /** @type {?} */ const childNodes = /** @type {?} */ (Array.prototype.slice.call(xsdNode.childNodes)); /** @type {?} */ let allowed = false; 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': if (this.isTextAllowedInThisElement(child, alreadyAddedElementNames) === true) { allowed = true; break; } break; case 'element': /** @type {?} */ const refname = childElem.attributes.getNamedItem('ref'); if (refname) { /** @type {?} */ const referedNode = this.xsdNodes.get(refname.value); if (referedNode) { if (this.isTextAllowedInThisElement(referedNode, alreadyAddedElementNames) === true) { allowed = true; break; } } else { throw new Error(` refered element "${refname}" for element "${childElem.outerHTML}" not found`); } } break; case 'attribute': break; default: alert('unknown childElem.localname "' + childElem.localName + '"/' + childElem.outerHTML); } } } }); return allowed; } } if (false) { /** @type {?} */ XmlEditRuleCheckTextInsert.prototype.namespacePraefix; /** @type {?} */ XmlEditRuleCheckTextInsert.prototype.xsdNodes; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1sRWRpdFJ1bGVDaGVja1RleHRJbnNlcnQuY2xhc3MuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLXhtbC1lZGl0b3IvIiwic291cmNlcyI6WyJsaWIvY29kZS94bWwtcnVsZXMtY2hlY2sveG1sRWRpdFJ1bGVDaGVja1RleHRJbnNlcnQuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFaEUsTUFBTTs7OztJQUdKLFlBQW9CLFFBQThCO1FBQTlCLGFBQVEsR0FBUixRQUFRLENBQXNCO2dDQUYvQixLQUFLO0tBRThCOzs7OztJQUV0RCw0QkFBNEIsQ0FBQyxnQkFBOEI7UUFDekQsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3JCLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7O1FBQ0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLGdCQUFnQixDQUFDLENBQUM7O1FBQzVFLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQzs7UUFDM0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUMsSUFBSSxPQUFPLEVBQUU7O1lBQ1gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hELE9BQU8sTUFBTSxDQUFDO1NBQ2Y7YUFBTTtZQUNMLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7S0FDRjs7Ozs7SUFFRCxpQ0FBaUMsQ0FBQyxnQkFBOEI7UUFDOUQsSUFBSSxnQkFBZ0IsRUFBRTs7WUFDcEIsSUFBSSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsVUFBVSxDQUFDO1lBRTdDLFFBQVEsVUFBVSxDQUFDLFFB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QyxLQUFLLElBQUksRUFBRTtnQ0FDN0UsT0FBTyxHQUFHLElBQUksQ0FBQztnQ0FDZixNQUFNOzZCQUNQOzRCQUNELE1BQU07d0JBRVIsS0FBSyxTQUFTOzs0QkFDWixNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQzs0QkFDekQsSUFBSSxPQUFPLEVBQUU7O2dDQUNYLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQ0FDckQsSUFBSSxXQUFXLEVBQUU7b0NBQ2YsSUFBSSxJQUFJLENBQUMsMEJBQTBCLENBQUMsV0FBVyxFQUFFLHdCQUF3QixDQUFDLEtBQUssSUFBSSxFQUFFO3dDQUNuRixPQUFPLEdBQUcsSUFBSSxDQUFDO3dDQUNmLE1BQU07cUNBQ1A7aUNBQ0Y7cUNBQU07b0NBQ0wsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsT0FBTyxrQkFBa0IsU0FBUyxDQUFDLFNBQVMsYUFBYSxDQUFDLENBQUM7aUNBQ2pHOzZCQUNGOzRCQUNELE1BQU07d0JBRVIsS0FBSyxXQUFXOzRCQUNkLE1BQU07d0JBRVI7NEJBQ0UsS0FBSyxDQUFDLCtCQUErQixHQUFHLFNBQVMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztxQkFDN0Y7aUJBQ0Y7YUFDRjtTQUNGLENBQUMsQ0FBQztRQUVILE9BQU8sT0FBTyxDQUFDO0tBQ2hCO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBYbWxDdXJzb3JQb3MsIFhNTEN1cnNvclBvc2l0aW9ucyB9IGZyb20gJy4uL2N1cnNvci94bWxDdXJzb3JQb3MuY2xhc3MnO1xyXG5pbXBvcnQgeyBYbWwyaHRtbCB9IGZyb20gJy4uL3htbC1odG1sLWNvbnZlcnRlci94bWwyaHRtbC5jbGFzcyc7XHJcblxyXG5leHBvcnQgY2xhc3MgWG1sRWRpdFJ1bGVDaGVja1RleHRJbnNlcnQge1xyXG4gIG5hbWVzcGFjZVByYWVmaXggPSAneHM6JztcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB4c2ROb2RlczogTWFwPHN0cmluZywgRWxlbWVudD4pIHt9XHJcblxyXG4gIGlzVGV4dEFsbG93ZWRBdFRoaXNDdXJzb3JQb3MoY3Vyc29yUG9zVG9DaGVjazogWG1sQ3Vyc29yUG9zKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIWN1cnNvclBvc1RvQ2hlY2spIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuZ2V0UmVsZXZhbnRQYXJlbnROb2RlRm9yQ3Vyc29yUG9zKGN1cnNvclBvc1RvQ2hlY2spO1xyXG4gICAgY29uc3QgcGFyZW50TmFtZSA9IFhtbDJodG1sLmdldFRhZ05hbWVGcm9tTm9kZShwYXJlbnROb2RlKTtcclxuICAgIGNvbnN0IHhzZE5vZGUgPSB0aGlzLnhzZE5vZGVzLmdldChwYXJlbnROYW1lKTtcclxuICAgIGlmICh4c2ROb2RlKSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuaXNUZXh0QWxsb3dlZEluVGhpc0VsZW1lbnQoeHNkTm9kZSk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7IC8vIGVsZW1lbnQgbm90IGZvdW5kXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRSZWxldmFudFBhcmVudE5vZGVGb3JDdXJzb3JQb3MoY3Vyc29yUG9zVG9DaGVjazogWG1sQ3Vyc29yUG9zKTogTm9kZSB7XHJcbiAgICBpZiAoY3Vyc29yUG9zVG9DaGVjaykge1xyXG4gICAgICBsZXQgcGFyZW50Tm9kZSA9IGN1cnNvclBvc1RvQ2hlY2suQWN0dWFsTm9kZTtcclxuXHJcbiAgICAgIHN3aXRjaCAocGFyZW50Tm9kZS5ub2RlVHlwZSkge1xyXG4gICAgICAgIGNhc2UgTm9kZS5DT01NRU5UX05PREU6XHJcbiAgICAgICAgY2FzZSBOb2RlLlRFWFRfTk9ERTpcclxuICAgICAgICAgIHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERTpcclxuICAgICAgICAgIHN3aXRjaCAoY3Vyc29yUG9zVG9DaGVjay5Qb3NBdE5vZGUpIHtcclxuICAgICAgICAgICAgY2FzZSBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29ySW5FbXB0eU5vZGU6XHJcbiAgICAgICAgICAgIGNhc2UgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluc2lkZVRleHROb2RlOlxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29yQmVoaW5kTm9kZTpcclxuICAgICAgICAgICAgY2FzZSBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29ySW5Gcm9udE9mTm9kZTpcclxuICAgICAgICAgICAgY2FzZSBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29yT25Db21wbGV0ZU5vZGU6XHJcbiAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudE5vZGUucGFyZW50RWxlbWVudDtcclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmhhbmRsZWQgIGN1cnNvclBvc1RvQ2hlY2suUG9zQW1Ob2RlIFwiJHtjdXJzb3JQb3NUb0NoZWNrLlBvc0F0Tm9kZX1cIi8ke1htbEN1cnNvclBvcy5nZXRYbWxDdXJzb3JQb3NpdGlvbkRlYnVnTmFtZShjdXJzb3JQb3NUb0NoZWNrLlBvc0F0Tm9kZSl9XCIgYCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5oYW5kbGVkICBwYXJlbnROb2RlLm5vZGVUeXBlIFwiJHtwYXJlbnROb2RlLm5vZGVUeXBlfVwiYCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHBhcmVudE5vZGU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc1RleHRBbGxvd2VkSW5UaGlzRWxlbWVudCh4c2ROb2RlOiBOb2RlLCBhbHJlYWR5QWRkZWRFbGVtZW50TmFtZXM6IFNldDxzdHJpbmc+ID0gbmV3IFNldDxzdHJpbmc+KCkpOiBib29sZWFuIHtcclxuICAgIGxldCBlbGVtZW50TmFtZTogc3RyaW5nO1xyXG5cclxuICAgIGlmICh4c2ROb2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xyXG4gICAgICBjb25zdCBhc0VsZW0gPSB4c2ROb2RlIGFzIEVsZW1lbnQ7XHJcbiAgICAgIGlmIChhc0VsZW0pIHtcclxuICAgICAgICBjb25zdCBtaXhlZEF0dHJpYiA9IGFzRWxlbS5nZXRBdHRyaWJ1dGUoJ21peGVkJyk7XHJcbiAgICAgICAgaWYgKG1peGVkQXR0cmliKSB7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdHlwZUF0dHJpYiA9IGFzRWxlbS5nZXRBdHRyaWJ1dGUoJ3R5cGUnKTtcclxuICAgICAgICBpZiAodHlwZUF0dHJpYiAmJiB0eXBlQXR0cmliID09PSBgJHt0aGlzLm5hbWVzcGFjZVByYWVmaXh9c3RyaW5nYCkge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYXNFbGVtLmxvY2FsTmFtZSA9PT0gJ2VsZW1lbnQnKSB7XHJcbiAgICAgICAgICBlbGVtZW50TmFtZSA9IGFzRWxlbS5nZXRBdHRyaWJ1dGUoJ25hbWUnKTtcclxuICAgICAgICAgIGlmIChlbGVtZW50TmFtZSkge1xyXG4gICAgICAgICAgICBpZiAoYWxyZWFkeUFkZGVkRWxlbWVudE5hbWVzLmhhcyhlbGVtZW50TmFtZSkpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGVsZW1lbnQgcmVjdXJzaW9uIGRldGVjdGVkXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGFscmVhZHlBZGRlZEVsZW1lbnROYW1lcy5hZGQoZWxlbWVudE5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNoaWxkTm9kZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh4c2ROb2RlLmNoaWxkTm9kZXMpIGFzIE5vZGVbXTtcclxuXHJcbiAgICBsZXQgYWxsb3dlZCA9IGZhbHNlO1xyXG5cclxuICAgIGNoaWxkTm9kZXMuZm9yRWFjaChjaGlsZCA9PiB7XHJcbiAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcclxuICAgICAgICBjb25zdCBjaGlsZEVsZW0gPSBjaGlsZCBhcyBFbGVtZW50O1xyXG4gICAgICAgIGlmIChjaGlsZEVsZW0pIHtcclxuICAgICAgICAgIHN3aXRjaCAoY2hpbGRFbGVtLmxvY2FsTmFtZSkge1xyXG4gICAgICAgICAgICBjYXNlICdjb21wbGV4VHlwZSc6XHJcbiAgICAgICAgICAgIGNhc2UgJ3NlcXVlbmNlJzpcclxuICAgICAgICAgICAgY2FzZSAnY2hvaWNlJzpcclxuICAgICAgICAgICAgY2FzZSAnc2ltcGxlQ29udGVudCc6XHJcbiAgICAgICAgICAgIGNhc2UgJ2V4dGVuc2lvbic6XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaXNUZXh0QWxsb3dlZEluVGhpc0VsZW1lbnQoY2hpbGQsIGFscmVhZHlBZGRlZEVsZW1lbnROYW1lcykgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIGFsbG93ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSAnZWxlbWVudCc6XHJcbiAgICAgICAgICAgICAgY29uc3QgcmVmbmFtZSA9IGNoaWxkRWxlbS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgncmVmJyk7XHJcbiAgICAgICAgICAgICAgaWYgKHJlZm5hbWUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlZmVyZWROb2RlID0gdGhpcy54c2ROb2Rlcy5nZXQocmVmbmFtZS52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVmZXJlZE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNUZXh0QWxsb3dlZEluVGhpc0VsZW1lbnQocmVmZXJlZE5vZGUsIGFscmVhZHlBZGRlZEVsZW1lbnROYW1lcykgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAgcmVmZXJlZCBlbGVtZW50IFwiJHtyZWZuYW1lfVwiIGZvciBlbGVtZW50IFwiJHtjaGlsZEVsZW0ub3V0ZXJIVE1MfVwiIG5vdCBmb3VuZGApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgJ2F0dHJpYnV0ZSc6XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgIGFsZXJ0KCd1bmtub3duIGNoaWxkRWxlbS5sb2NhbG5hbWUgXCInICsgY2hpbGRFbGVtLmxvY2FsTmFtZSArICdcIi8nICsgY2hpbGRFbGVtLm91dGVySFRNTCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gYWxsb3dlZDtcclxuICB9XHJcbn1cclxuIl19