angular-xml-editor
Version:
XML editor component for Angular
159 lines (158 loc) • 17.3 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 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