UNPKG

angular-xml-editor

Version:
140 lines (139 loc) 18.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { XMLCursorPositions } from '../cursor/xmlCursorPos.class'; import { XmlEditRuleCheckTextInsert } from '../xml-rules-check/xmlEditRuleCheckTextInsert.class'; import { XmlEditDelete } from './xmlEditDeleteclass'; import { DomDummyNodeManager } from '../dummyNodes/domDummyNodeManager.class'; export class XmlEditInsert { /** * @param {?} pos * @param {?} value * @param {?} rootNode * @param {?} xmlRules * @param {?} xmlSchema * @return {?} */ static replaceWithText(pos, value, rootNode, xmlRules, xmlSchema) { if (pos === undefined) { return false; } if (value === '' || value === undefined || value == null) { return false; } if (pos.isEmptySelection() === false) { if (XmlEditDelete.deleteSelection(pos, rootNode, xmlRules) === false) { return false; } } return XmlEditInsert.insertText(pos.EndPos, value, rootNode, xmlRules, xmlSchema); } /** * @param {?} pos * @param {?} value * @param {?} rootNode * @param {?} xmlRules * @param {?} xmlSchema * @return {?} */ static insertText(pos, value, rootNode, xmlRules, xmlSchema) { if (pos === undefined) { return false; } if (value === '' || value === undefined || value == null) { return false; } switch (pos.PosAtNode) { case XMLCursorPositions.CursorOnCompleteNode: /** @type {?} */ let textAllowed = XmlEditInsert.isTextAllowedInParentNode(pos, xmlSchema); if (textAllowed === true) { /** @type {?} */ const newTextNode = pos.ActualNode.ownerDocument.createTextNode(value); pos.ActualNode.parentElement.insertBefore(newTextNode, pos.ActualNode); pos.ActualNode.parentElement.removeChild(pos.ActualNode); /** @type {?} */ const nextSibling = DomDummyNodeManager.getNextSibling(newTextNode); if (nextSibling) { pos.SetCursor(nextSibling, XMLCursorPositions.CursorInFrontOfNode); } else { pos.SetCursor(newTextNode, XMLCursorPositions.CursorBehindNode); } return true; } else { return false; } case XMLCursorPositions.CursorBehindNode: if (pos.ActualNode.nodeType === Node.TEXT_NODE) { pos.ActualNode.textContent = pos.ActualNode.textContent + value; return true; } else { textAllowed = XmlEditInsert.isTextAllowedInParentNode(pos, xmlSchema); if (textAllowed === true) { /** @type {?} */ const newTextNode = pos.ActualNode.ownerDocument.createTextNode(value); pos.ActualNode.parentElement.insertBefore(newTextNode, pos.ActualNode.nextSibling); // inserts the new node after the actual node return true; } else { return false; } } case XMLCursorPositions.CursorInFrontOfNode: if (pos.ActualNode.nodeType === Node.TEXT_NODE) { pos.ActualNode.textContent = value + pos.ActualNode.textContent; return true; } else { textAllowed = XmlEditInsert.isTextAllowedInParentNode(pos, xmlSchema); if (textAllowed === true) { /** @type {?} */ const newTextNode = pos.ActualNode.ownerDocument.createTextNode(value); pos.ActualNode.parentElement.insertBefore(newTextNode, pos.ActualNode); return true; } else { return false; } } case XMLCursorPositions.CursorInEmptyNode: textAllowed = new XmlEditRuleCheckTextInsert(xmlSchema.xsdNodes).isTextAllowedAtThisCursorPos(pos); if (textAllowed === true) { /** @type {?} */ const newTextNode = pos.ActualNode.ownerDocument.createTextNode(value); pos.ActualNode.appendChild(newTextNode); return true; } else { return false; } case XMLCursorPositions.CursorInsideTextNode: /** @type {?} */ const text = pos.ActualNode.textContent; pos.ActualNode.textContent = text.substr(0, pos.PosInTextnode) + value + text.substr(pos.PosInTextnode, text.length); pos.SetCursor(pos.ActualNode, XMLCursorPositions.CursorInsideTextNode, pos.PosInTextnode + 1); break; default: throw new Error(`String.Format("XmlEditInsert.insert: unknown CursorPos ${pos.getDebugDescription()}`); } return true; } /** * @param {?} pos * @param {?} xmlSchema * @return {?} */ static isTextAllowedInParentNode(pos, xmlSchema) { /** @type {?} */ const parentNode = pos.ActualNode.parentElement; /** @type {?} */ const parentCursorPos = pos.clone(); parentCursorPos.SetCursor(parentNode, XMLCursorPositions.CursorInEmptyNode); return new XmlEditRuleCheckTextInsert(xmlSchema.xsdNodes).isTextAllowedAtThisCursorPos(parentCursorPos); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1sRWRpdEluc2VydC5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXIteG1sLWVkaXRvci8iLCJzb3VyY2VzIjpbImxpYi9jb2RlL3htbC1lZGl0aW5nL3htbEVkaXRJbnNlcnQuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBZ0Isa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUVoRixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUVqRyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFFOUUsTUFBTTs7Ozs7Ozs7O0lBQ0csTUFBTSxDQUFDLGVBQWUsQ0FBQyxHQUFjLEVBQUUsS0FBYSxFQUFFLFFBQWlCLEVBQUUsUUFBa0IsRUFBRSxTQUFvQjtRQUN0SCxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUU7WUFDckIsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELElBQUksS0FBSyxLQUFLLEVBQUUsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7WUFDeEQsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELElBQUksR0FBRyxDQUFDLGdCQUFnQixFQUFFLEtBQUssS0FBSyxFQUFFO1lBQ3BDLElBQUksYUFBYSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEtBQUssRUFBRTtnQkFDcEUsT0FBTyxLQUFLLENBQUM7YUFDZDtTQUNGO1FBRUQsT0FBTyxhQUFhLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7Ozs7Ozs7Ozs7SUFHN0UsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFpQixFQUFFLEtBQWEsRUFBRSxR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QUFDO1NBQzNHO1FBRUQsT0FBTyxJQUFJLENBQUM7Ozs7Ozs7SUFHTixNQUFNLENBQUMseUJBQXlCLENBQUMsR0FBaUIsRUFBRSxTQUFvQjs7UUFDOUUsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7O1FBQ2hELE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQyxlQUFlLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzVFLE9BQU8sSUFBSSwwQkFBMEIsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsNEJBQTRCLENBQUMsZUFBZSxDQUFDLENBQUM7O0NBRTNHIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgWG1sQ3Vyc29yUG9zLCBYTUxDdXJzb3JQb3NpdGlvbnMgfSBmcm9tICcuLi9jdXJzb3IveG1sQ3Vyc29yUG9zLmNsYXNzJztcclxuaW1wb3J0IHsgWG1sUnVsZXMgfSBmcm9tICcuLi94bWwtcnVsZXMtY2hlY2sveG1sUnVsZXMuY2xhc3MnO1xyXG5pbXBvcnQgeyBYbWxFZGl0UnVsZUNoZWNrVGV4dEluc2VydCB9IGZyb20gJy4uL3htbC1ydWxlcy1jaGVjay94bWxFZGl0UnVsZUNoZWNrVGV4dEluc2VydC5jbGFzcyc7XHJcbmltcG9ydCB7IFhtbFNjaGVtYSB9IGZyb20gJy4uL3htbC1ydWxlcy1jaGVjay94bWxTY2hlbWEuY2xhc3MnO1xyXG5pbXBvcnQgeyBYbWxFZGl0RGVsZXRlIH0gZnJvbSAnLi94bWxFZGl0RGVsZXRlY2xhc3MnO1xyXG5pbXBvcnQgeyBYbWxDdXJzb3IgfSBmcm9tICcuLi9jdXJzb3IveG1sQ3Vyc29yLmNsYXNzJztcclxuaW1wb3J0IHsgRG9tRHVtbXlOb2RlTWFuYWdlciB9IGZyb20gJy4uL2R1bW15Tm9kZXMvZG9tRHVtbXlOb2RlTWFuYWdlci5jbGFzcyc7XHJcblxyXG5leHBvcnQgY2xhc3MgWG1sRWRpdEluc2VydCB7XHJcbiAgcHVibGljIHN0YXRpYyByZXBsYWNlV2l0aFRleHQocG9zOiBYbWxDdXJzb3IsIHZhbHVlOiBzdHJpbmcsIHJvb3ROb2RlOiBFbGVtZW50LCB4bWxSdWxlczogWG1sUnVsZXMsIHhtbFNjaGVtYTogWG1sU2NoZW1hKTogYm9vbGVhbiB7XHJcbiAgICBpZiAocG9zID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChwb3MuaXNFbXB0eVNlbGVjdGlvbigpID09PSBmYWxzZSkge1xyXG4gICAgICBpZiAoWG1sRWRpdERlbGV0ZS5kZWxldGVTZWxlY3Rpb24ocG9zLCByb290Tm9kZSwgeG1sUnVsZXMpID09PSBmYWxzZSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBYbWxFZGl0SW5zZXJ0Lmluc2VydFRleHQocG9zLkVuZFBvcywgdmFsdWUsIHJvb3ROb2RlLCB4bWxSdWxlcywgeG1sU2NoZW1hKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgaW5zZXJ0VGV4dChwb3M6IFhtbEN1cnNvclBvcywgdmFsdWU6IHN0cmluZywgcm9vdE5vZGU6IEVsZW1lbnQsIHhtbFJ1bGVzOiBYbWxSdWxlcywgeG1sU2NoZW1hOiBYbWxTY2hlbWEpOiBib29sZWFuIHtcclxuICAgIGlmIChwb3MgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHN3aXRjaCAocG9zLlBvc0F0Tm9kZSkge1xyXG4gICAgICBjYXNlIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JPbkNvbXBsZXRlTm9kZTpcclxuICAgICAgICBsZXQgdGV4dEFsbG93ZWQgPSBYbWxFZGl0SW5zZXJ0LmlzVGV4dEFsbG93ZWRJblBhcmVudE5vZGUocG9zLCB4bWxTY2hlbWEpO1xyXG4gICAgICAgIGlmICh0ZXh0QWxsb3dlZCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgY29uc3QgbmV3VGV4dE5vZGUgPSBwb3MuQWN0dWFsTm9kZS5vd25lckRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHZhbHVlKTtcclxuICAgICAgICAgIHBvcy5BY3R1YWxOb2RlLnBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKG5ld1RleHROb2RlLCBwb3MuQWN0dWFsTm9kZSk7XHJcbiAgICAgICAgICBwb3MuQWN0dWFsTm9kZS5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHBvcy5BY3R1YWxOb2RlKTtcclxuICAgICAgICAgIGNvbnN0IG5leHRTaWJsaW5nID0gRG9tRHVtbXlOb2RlTWFuYWdlci5nZXROZXh0U2libGluZyhuZXdUZXh0Tm9kZSk7XHJcbiAgICAgICAgICBpZiAobmV4dFNpYmxpbmcpIHtcclxuICAgICAgICAgICAgcG9zLlNldEN1cnNvcihuZXh0U2libGluZywgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluRnJvbnRPZk5vZGUpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcG9zLlNldEN1cnNvcihuZXdUZXh0Tm9kZSwgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckJlaGluZE5vZGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICBjYXNlIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JCZWhpbmROb2RlOlxyXG4gICAgICAgIGlmIChwb3MuQWN0dWFsTm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcclxuICAgICAgICAgIHBvcy5BY3R1YWxOb2RlLnRleHRDb250ZW50ID0gcG9zLkFjdHVhbE5vZGUudGV4dENvbnRlbnQgKyB2YWx1ZTtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0ZXh0QWxsb3dlZCA9IFhtbEVkaXRJbnNlcnQuaXNUZXh0QWxsb3dlZEluUGFyZW50Tm9kZShwb3MsIHhtbFNjaGVtYSk7XHJcbiAgICAgICAgICBpZiAodGV4dEFsbG93ZWQgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV3VGV4dE5vZGUgPSBwb3MuQWN0dWFsTm9kZS5vd25lckRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHZhbHVlKTtcclxuICAgICAgICAgICAgcG9zLkFjdHVhbE5vZGUucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUobmV3VGV4dE5vZGUsIHBvcy5BY3R1YWxOb2RlLm5leHRTaWJsaW5nKTsgLy8gaW5zZXJ0cyB0aGUgbmV3IG5vZGUgYWZ0ZXIgdGhlIGFjdHVhbCBub2RlXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIGNhc2UgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluRnJvbnRPZk5vZGU6XHJcbiAgICAgICAgaWYgKHBvcy5BY3R1YWxOb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgcG9zLkFjdHVhbE5vZGUudGV4dENvbnRlbnQgPSB2YWx1ZSArIHBvcy5BY3R1YWxOb2RlLnRleHRDb250ZW50O1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRleHRBbGxvd2VkID0gWG1sRWRpdEluc2VydC5pc1RleHRBbGxvd2VkSW5QYXJlbnROb2RlKHBvcywgeG1sU2NoZW1hKTtcclxuICAgICAgICAgIGlmICh0ZXh0QWxsb3dlZCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBjb25zdCBuZXdUZXh0Tm9kZSA9IHBvcy5BY3R1YWxOb2RlLm93bmVyRG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodmFsdWUpO1xyXG4gICAgICAgICAgICBwb3MuQWN0dWFsTm9kZS5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShuZXdUZXh0Tm9kZSwgcG9zLkFjdHVhbE5vZGUpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICBjYXNlIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JJbkVtcHR5Tm9kZTpcclxuICAgICAgICB0ZXh0QWxsb3dlZCA9IG5ldyBYbWxFZGl0UnVsZUNoZWNrVGV4dEluc2VydCh4bWxTY2hlbWEueHNkTm9kZXMpLmlzVGV4dEFsbG93ZWRBdFRoaXNDdXJzb3JQb3MocG9zKTtcclxuICAgICAgICBpZiAodGV4dEFsbG93ZWQgPT09IHRydWUpIHtcclxuICAgICAgICAgIGNvbnN0IG5ld1RleHROb2RlID0gcG9zLkFjdHVhbE5vZGUub3duZXJEb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh2YWx1ZSk7XHJcbiAgICAgICAgICBwb3MuQWN0dWFsTm9kZS5hcHBlbmRDaGlsZChuZXdUZXh0Tm9kZSk7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIGNhc2UgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluc2lkZVRleHROb2RlOlxyXG4gICAgICAgIGNvbnN0IHRleHQgPSBwb3MuQWN0dWFsTm9kZS50ZXh0Q29udGVudDtcclxuICAgICAgICBwb3MuQWN0dWFsTm9kZS50ZXh0Q29udGVudCA9IHRleHQuc3Vic3RyKDAsIHBvcy5Qb3NJblRleHRub2RlKSArIHZhbHVlICsgdGV4dC5zdWJzdHIocG9zLlBvc0luVGV4dG5vZGUsIHRleHQubGVuZ3RoKTtcclxuICAgICAgICBwb3MuU2V0Q3Vyc29yKHBvcy5BY3R1YWxOb2RlLCBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29ySW5zaWRlVGV4dE5vZGUsIHBvcy5Qb3NJblRleHRub2RlICsgMSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RyaW5nLkZvcm1hdChcIlhtbEVkaXRJbnNlcnQuaW5zZXJ0OiB1bmtub3duIEN1cnNvclBvcyAgJHtwb3MuZ2V0RGVidWdEZXNjcmlwdGlvbigpfWApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgaXNUZXh0QWxsb3dlZEluUGFyZW50Tm9kZShwb3M6IFhtbEN1cnNvclBvcywgeG1sU2NoZW1hOiBYbWxTY2hlbWEpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHBhcmVudE5vZGUgPSBwb3MuQWN0dWFsTm9kZS5wYXJlbnRFbGVtZW50O1xyXG4gICAgY29uc3QgcGFyZW50Q3Vyc29yUG9zID0gcG9zLmNsb25lKCk7XHJcbiAgICBwYXJlbnRDdXJzb3JQb3MuU2V0Q3Vyc29yKHBhcmVudE5vZGUsIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JJbkVtcHR5Tm9kZSk7XHJcbiAgICByZXR1cm4gbmV3IFhtbEVkaXRSdWxlQ2hlY2tUZXh0SW5zZXJ0KHhtbFNjaGVtYS54c2ROb2RlcykuaXNUZXh0QWxsb3dlZEF0VGhpc0N1cnNvclBvcyhwYXJlbnRDdXJzb3JQb3MpO1xyXG4gIH1cclxufVxyXG4iXX0=