src/pyams_skin/resources/js/ext/tinymce/dev/classes/dom/Range.js
changeset 566 a1707c607eec
parent 565 318533413200
child 567 bca1726b1d85
--- a/src/pyams_skin/resources/js/ext/tinymce/dev/classes/dom/Range.js	Sun Jul 19 02:02:20 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,777 +0,0 @@
-/**
- * Range.js
- *
- * Copyright, Moxiecode Systems AB
- * Released under LGPL License.
- *
- * License: http://www.tinymce.com/license
- * Contributing: http://www.tinymce.com/contributing
- */
-
-define("tinymce/dom/Range", [
-	"tinymce/util/Tools"
-], function(Tools) {
-	// Range constructor
-	function Range(dom) {
-		var self = this,
-			doc = dom.doc,
-			EXTRACT = 0,
-			CLONE = 1,
-			DELETE = 2,
-			TRUE = true,
-			FALSE = false,
-			START_OFFSET = 'startOffset',
-			START_CONTAINER = 'startContainer',
-			END_CONTAINER = 'endContainer',
-			END_OFFSET = 'endOffset',
-			extend = Tools.extend,
-			nodeIndex = dom.nodeIndex;
-
-		function createDocumentFragment() {
-			return doc.createDocumentFragment();
-		}
-
-		function setStart(n, o) {
-			_setEndPoint(TRUE, n, o);
-		}
-
-		function setEnd(n, o) {
-			_setEndPoint(FALSE, n, o);
-		}
-
-		function setStartBefore(n) {
-			setStart(n.parentNode, nodeIndex(n));
-		}
-
-		function setStartAfter(n) {
-			setStart(n.parentNode, nodeIndex(n) + 1);
-		}
-
-		function setEndBefore(n) {
-			setEnd(n.parentNode, nodeIndex(n));
-		}
-
-		function setEndAfter(n) {
-			setEnd(n.parentNode, nodeIndex(n) + 1);
-		}
-
-		function collapse(ts) {
-			if (ts) {
-				self[END_CONTAINER] = self[START_CONTAINER];
-				self[END_OFFSET] = self[START_OFFSET];
-			} else {
-				self[START_CONTAINER] = self[END_CONTAINER];
-				self[START_OFFSET] = self[END_OFFSET];
-			}
-
-			self.collapsed = TRUE;
-		}
-
-		function selectNode(n) {
-			setStartBefore(n);
-			setEndAfter(n);
-		}
-
-		function selectNodeContents(n) {
-			setStart(n, 0);
-			setEnd(n, n.nodeType === 1 ? n.childNodes.length : n.nodeValue.length);
-		}
-
-		function compareBoundaryPoints(h, r) {
-			var sc = self[START_CONTAINER], so = self[START_OFFSET], ec = self[END_CONTAINER], eo = self[END_OFFSET],
-			rsc = r.startContainer, rso = r.startOffset, rec = r.endContainer, reo = r.endOffset;
-
-			// Check START_TO_START
-			if (h === 0) {
-				return _compareBoundaryPoints(sc, so, rsc, rso);
-			}
-
-			// Check START_TO_END
-			if (h === 1) {
-				return _compareBoundaryPoints(ec, eo, rsc, rso);
-			}
-
-			// Check END_TO_END
-			if (h === 2) {
-				return _compareBoundaryPoints(ec, eo, rec, reo);
-			}
-
-			// Check END_TO_START
-			if (h === 3) {
-				return _compareBoundaryPoints(sc, so, rec, reo);
-			}
-		}
-
-		function deleteContents() {
-			_traverse(DELETE);
-		}
-
-		function extractContents() {
-			return _traverse(EXTRACT);
-		}
-
-		function cloneContents() {
-			return _traverse(CLONE);
-		}
-
-		function insertNode(n) {
-			var startContainer = this[START_CONTAINER],
-				startOffset = this[START_OFFSET], nn, o;
-
-			// Node is TEXT_NODE or CDATA
-			if ((startContainer.nodeType === 3 || startContainer.nodeType === 4) && startContainer.nodeValue) {
-				if (!startOffset) {
-					// At the start of text
-					startContainer.parentNode.insertBefore(n, startContainer);
-				} else if (startOffset >= startContainer.nodeValue.length) {
-					// At the end of text
-					dom.insertAfter(n, startContainer);
-				} else {
-					// Middle, need to split
-					nn = startContainer.splitText(startOffset);
-					startContainer.parentNode.insertBefore(n, nn);
-				}
-			} else {
-				// Insert element node
-				if (startContainer.childNodes.length > 0) {
-					o = startContainer.childNodes[startOffset];
-				}
-
-				if (o) {
-					startContainer.insertBefore(n, o);
-				} else {
-					if (startContainer.nodeType == 3) {
-						dom.insertAfter(n, startContainer);
-					} else {
-						startContainer.appendChild(n);
-					}
-				}
-			}
-		}
-
-		function surroundContents(n) {
-			var f = self.extractContents();
-
-			self.insertNode(n);
-			n.appendChild(f);
-			self.selectNode(n);
-		}
-
-		function cloneRange() {
-			return extend(new Range(dom), {
-				startContainer: self[START_CONTAINER],
-				startOffset: self[START_OFFSET],
-				endContainer: self[END_CONTAINER],
-				endOffset: self[END_OFFSET],
-				collapsed: self.collapsed,
-				commonAncestorContainer: self.commonAncestorContainer
-			});
-		}
-
-		// Private methods
-
-		function _getSelectedNode(container, offset) {
-			var child;
-
-			if (container.nodeType == 3 /* TEXT_NODE */) {
-				return container;
-			}
-
-			if (offset < 0) {
-				return container;
-			}
-
-			child = container.firstChild;
-			while (child && offset > 0) {
-				--offset;
-				child = child.nextSibling;
-			}
-
-			if (child) {
-				return child;
-			}
-
-			return container;
-		}
-
-		function _isCollapsed() {
-			return (self[START_CONTAINER] == self[END_CONTAINER] && self[START_OFFSET] == self[END_OFFSET]);
-		}
-
-		function _compareBoundaryPoints(containerA, offsetA, containerB, offsetB) {
-			var c, offsetC, n, cmnRoot, childA, childB;
-
-			// In the first case the boundary-points have the same container. A is before B
-			// if its offset is less than the offset of B, A is equal to B if its offset is
-			// equal to the offset of B, and A is after B if its offset is greater than the
-			// offset of B.
-			if (containerA == containerB) {
-				if (offsetA == offsetB) {
-					return 0; // equal
-				}
-
-				if (offsetA < offsetB) {
-					return -1; // before
-				}
-
-				return 1; // after
-			}
-
-			// In the second case a child node C of the container of A is an ancestor
-			// container of B. In this case, A is before B if the offset of A is less than or
-			// equal to the index of the child node C and A is after B otherwise.
-			c = containerB;
-			while (c && c.parentNode != containerA) {
-				c = c.parentNode;
-			}
-
-			if (c) {
-				offsetC = 0;
-				n = containerA.firstChild;
-
-				while (n != c && offsetC < offsetA) {
-					offsetC++;
-					n = n.nextSibling;
-				}
-
-				if (offsetA <= offsetC) {
-					return -1; // before
-				}
-
-				return 1; // after
-			}
-
-			// In the third case a child node C of the container of B is an ancestor container
-			// of A. In this case, A is before B if the index of the child node C is less than
-			// the offset of B and A is after B otherwise.
-			c = containerA;
-			while (c && c.parentNode != containerB) {
-				c = c.parentNode;
-			}
-
-			if (c) {
-				offsetC = 0;
-				n = containerB.firstChild;
-
-				while (n != c && offsetC < offsetB) {
-					offsetC++;
-					n = n.nextSibling;
-				}
-
-				if (offsetC < offsetB) {
-					return -1; // before
-				}
-
-				return 1; // after
-			}
-
-			// In the fourth case, none of three other cases hold: the containers of A and B
-			// are siblings or descendants of sibling nodes. In this case, A is before B if
-			// the container of A is before the container of B in a pre-order traversal of the
-			// Ranges' context tree and A is after B otherwise.
-			cmnRoot = dom.findCommonAncestor(containerA, containerB);
-			childA = containerA;
-
-			while (childA && childA.parentNode != cmnRoot) {
-				childA = childA.parentNode;
-			}
-
-			if (!childA) {
-				childA = cmnRoot;
-			}
-
-			childB = containerB;
-			while (childB && childB.parentNode != cmnRoot) {
-				childB = childB.parentNode;
-			}
-
-			if (!childB) {
-				childB = cmnRoot;
-			}
-
-			if (childA == childB) {
-				return 0; // equal
-			}
-
-			n = cmnRoot.firstChild;
-			while (n) {
-				if (n == childA) {
-					return -1; // before
-				}
-
-				if (n == childB) {
-					return 1; // after
-				}
-
-				n = n.nextSibling;
-			}
-		}
-
-		function _setEndPoint(st, n, o) {
-			var ec, sc;
-
-			if (st) {
-				self[START_CONTAINER] = n;
-				self[START_OFFSET] = o;
-			} else {
-				self[END_CONTAINER] = n;
-				self[END_OFFSET] = o;
-			}
-
-			// If one boundary-point of a Range is set to have a root container
-			// other than the current one for the Range, the Range is collapsed to
-			// the new position. This enforces the restriction that both boundary-
-			// points of a Range must have the same root container.
-			ec = self[END_CONTAINER];
-			while (ec.parentNode) {
-				ec = ec.parentNode;
-			}
-
-			sc = self[START_CONTAINER];
-			while (sc.parentNode) {
-				sc = sc.parentNode;
-			}
-
-			if (sc == ec) {
-				// The start position of a Range is guaranteed to never be after the
-				// end position. To enforce this restriction, if the start is set to
-				// be at a position after the end, the Range is collapsed to that
-				// position.
-				if (_compareBoundaryPoints(self[START_CONTAINER], self[START_OFFSET], self[END_CONTAINER], self[END_OFFSET]) > 0) {
-					self.collapse(st);
-				}
-			} else {
-				self.collapse(st);
-			}
-
-			self.collapsed = _isCollapsed();
-			self.commonAncestorContainer = dom.findCommonAncestor(self[START_CONTAINER], self[END_CONTAINER]);
-		}
-
-		function _traverse(how) {
-			var c, endContainerDepth = 0, startContainerDepth = 0, p, depthDiff, startNode, endNode, sp, ep;
-
-			if (self[START_CONTAINER] == self[END_CONTAINER]) {
-				return _traverseSameContainer(how);
-			}
-
-			for (c = self[END_CONTAINER], p = c.parentNode; p; c = p, p = p.parentNode) {
-				if (p == self[START_CONTAINER]) {
-					return _traverseCommonStartContainer(c, how);
-				}
-
-				++endContainerDepth;
-			}
-
-			for (c = self[START_CONTAINER], p = c.parentNode; p; c = p, p = p.parentNode) {
-				if (p == self[END_CONTAINER]) {
-					return _traverseCommonEndContainer(c, how);
-				}
-
-				++startContainerDepth;
-			}
-
-			depthDiff = startContainerDepth - endContainerDepth;
-
-			startNode = self[START_CONTAINER];
-			while (depthDiff > 0) {
-				startNode = startNode.parentNode;
-				depthDiff--;
-			}
-
-			endNode = self[END_CONTAINER];
-			while (depthDiff < 0) {
-				endNode = endNode.parentNode;
-				depthDiff++;
-			}
-
-			// ascend the ancestor hierarchy until we have a common parent.
-			for (sp = startNode.parentNode, ep = endNode.parentNode; sp != ep; sp = sp.parentNode, ep = ep.parentNode) {
-				startNode = sp;
-				endNode = ep;
-			}
-
-			return _traverseCommonAncestors(startNode, endNode, how);
-		}
-
-		function _traverseSameContainer(how) {
-			var frag, s, sub, n, cnt, sibling, xferNode, start, len;
-
-			if (how != DELETE) {
-				frag = createDocumentFragment();
-			}
-
-			// If selection is empty, just return the fragment
-			if (self[START_OFFSET] == self[END_OFFSET]) {
-				return frag;
-			}
-
-			// Text node needs special case handling
-			if (self[START_CONTAINER].nodeType == 3 /* TEXT_NODE */) {
-				// get the substring
-				s = self[START_CONTAINER].nodeValue;
-				sub = s.substring(self[START_OFFSET], self[END_OFFSET]);
-
-				// set the original text node to its new value
-				if (how != CLONE) {
-					n = self[START_CONTAINER];
-					start = self[START_OFFSET];
-					len = self[END_OFFSET] - self[START_OFFSET];
-
-					if (start === 0 && len >= n.nodeValue.length - 1) {
-						n.parentNode.removeChild(n);
-					} else {
-						n.deleteData(start, len);
-					}
-
-					// Nothing is partially selected, so collapse to start point
-					self.collapse(TRUE);
-				}
-
-				if (how == DELETE) {
-					return;
-				}
-
-				if (sub.length > 0) {
-					frag.appendChild(doc.createTextNode(sub));
-				}
-
-				return frag;
-			}
-
-			// Copy nodes between the start/end offsets.
-			n = _getSelectedNode(self[START_CONTAINER], self[START_OFFSET]);
-			cnt = self[END_OFFSET] - self[START_OFFSET];
-
-			while (n && cnt > 0) {
-				sibling = n.nextSibling;
-				xferNode = _traverseFullySelected(n, how);
-
-				if (frag) {
-					frag.appendChild(xferNode);
-				}
-
-				--cnt;
-				n = sibling;
-			}
-
-			// Nothing is partially selected, so collapse to start point
-			if (how != CLONE) {
-				self.collapse(TRUE);
-			}
-
-			return frag;
-		}
-
-		function _traverseCommonStartContainer(endAncestor, how) {
-			var frag, n, endIdx, cnt, sibling, xferNode;
-
-			if (how != DELETE) {
-				frag = createDocumentFragment();
-			}
-
-			n = _traverseRightBoundary(endAncestor, how);
-
-			if (frag) {
-				frag.appendChild(n);
-			}
-
-			endIdx = nodeIndex(endAncestor);
-			cnt = endIdx - self[START_OFFSET];
-
-			if (cnt <= 0) {
-				// Collapse to just before the endAncestor, which
-				// is partially selected.
-				if (how != CLONE) {
-					self.setEndBefore(endAncestor);
-					self.collapse(FALSE);
-				}
-
-				return frag;
-			}
-
-			n = endAncestor.previousSibling;
-			while (cnt > 0) {
-				sibling = n.previousSibling;
-				xferNode = _traverseFullySelected(n, how);
-
-				if (frag) {
-					frag.insertBefore(xferNode, frag.firstChild);
-				}
-
-				--cnt;
-				n = sibling;
-			}
-
-			// Collapse to just before the endAncestor, which
-			// is partially selected.
-			if (how != CLONE) {
-				self.setEndBefore(endAncestor);
-				self.collapse(FALSE);
-			}
-
-			return frag;
-		}
-
-		function _traverseCommonEndContainer(startAncestor, how) {
-			var frag, startIdx, n, cnt, sibling, xferNode;
-
-			if (how != DELETE) {
-				frag = createDocumentFragment();
-			}
-
-			n = _traverseLeftBoundary(startAncestor, how);
-			if (frag) {
-				frag.appendChild(n);
-			}
-
-			startIdx = nodeIndex(startAncestor);
-			++startIdx; // Because we already traversed it
-
-			cnt = self[END_OFFSET] - startIdx;
-			n = startAncestor.nextSibling;
-			while (n && cnt > 0) {
-				sibling = n.nextSibling;
-				xferNode = _traverseFullySelected(n, how);
-
-				if (frag) {
-					frag.appendChild(xferNode);
-				}
-
-				--cnt;
-				n = sibling;
-			}
-
-			if (how != CLONE) {
-				self.setStartAfter(startAncestor);
-				self.collapse(TRUE);
-			}
-
-			return frag;
-		}
-
-		function _traverseCommonAncestors(startAncestor, endAncestor, how) {
-			var n, frag, startOffset, endOffset, cnt, sibling, nextSibling;
-
-			if (how != DELETE) {
-				frag = createDocumentFragment();
-			}
-
-			n = _traverseLeftBoundary(startAncestor, how);
-			if (frag) {
-				frag.appendChild(n);
-			}
-
-			startOffset = nodeIndex(startAncestor);
-			endOffset = nodeIndex(endAncestor);
-			++startOffset;
-
-			cnt = endOffset - startOffset;
-			sibling = startAncestor.nextSibling;
-
-			while (cnt > 0) {
-				nextSibling = sibling.nextSibling;
-				n = _traverseFullySelected(sibling, how);
-
-				if (frag) {
-					frag.appendChild(n);
-				}
-
-				sibling = nextSibling;
-				--cnt;
-			}
-
-			n = _traverseRightBoundary(endAncestor, how);
-
-			if (frag) {
-				frag.appendChild(n);
-			}
-
-			if (how != CLONE) {
-				self.setStartAfter(startAncestor);
-				self.collapse(TRUE);
-			}
-
-			return frag;
-		}
-
-		function _traverseRightBoundary(root, how) {
-			var next = _getSelectedNode(self[END_CONTAINER], self[END_OFFSET] - 1), parent, clonedParent;
-			var prevSibling, clonedChild, clonedGrandParent, isFullySelected = next != self[END_CONTAINER];
-
-			if (next == root) {
-				return _traverseNode(next, isFullySelected, FALSE, how);
-			}
-
-			parent = next.parentNode;
-			clonedParent = _traverseNode(parent, FALSE, FALSE, how);
-
-			while (parent) {
-				while (next) {
-					prevSibling = next.previousSibling;
-					clonedChild = _traverseNode(next, isFullySelected, FALSE, how);
-
-					if (how != DELETE) {
-						clonedParent.insertBefore(clonedChild, clonedParent.firstChild);
-					}
-
-					isFullySelected = TRUE;
-					next = prevSibling;
-				}
-
-				if (parent == root) {
-					return clonedParent;
-				}
-
-				next = parent.previousSibling;
-				parent = parent.parentNode;
-
-				clonedGrandParent = _traverseNode(parent, FALSE, FALSE, how);
-
-				if (how != DELETE) {
-					clonedGrandParent.appendChild(clonedParent);
-				}
-
-				clonedParent = clonedGrandParent;
-			}
-		}
-
-		function _traverseLeftBoundary(root, how) {
-			var next = _getSelectedNode(self[START_CONTAINER], self[START_OFFSET]), isFullySelected = next != self[START_CONTAINER];
-			var parent, clonedParent, nextSibling, clonedChild, clonedGrandParent;
-
-			if (next == root) {
-				return _traverseNode(next, isFullySelected, TRUE, how);
-			}
-
-			parent = next.parentNode;
-			clonedParent = _traverseNode(parent, FALSE, TRUE, how);
-
-			while (parent) {
-				while (next) {
-					nextSibling = next.nextSibling;
-					clonedChild = _traverseNode(next, isFullySelected, TRUE, how);
-
-					if (how != DELETE) {
-						clonedParent.appendChild(clonedChild);
-					}
-
-					isFullySelected = TRUE;
-					next = nextSibling;
-				}
-
-				if (parent == root) {
-					return clonedParent;
-				}
-
-				next = parent.nextSibling;
-				parent = parent.parentNode;
-
-				clonedGrandParent = _traverseNode(parent, FALSE, TRUE, how);
-
-				if (how != DELETE) {
-					clonedGrandParent.appendChild(clonedParent);
-				}
-
-				clonedParent = clonedGrandParent;
-			}
-		}
-
-		function _traverseNode(n, isFullySelected, isLeft, how) {
-			var txtValue, newNodeValue, oldNodeValue, offset, newNode;
-
-			if (isFullySelected) {
-				return _traverseFullySelected(n, how);
-			}
-
-			if (n.nodeType == 3 /* TEXT_NODE */) {
-				txtValue = n.nodeValue;
-
-				if (isLeft) {
-					offset = self[START_OFFSET];
-					newNodeValue = txtValue.substring(offset);
-					oldNodeValue = txtValue.substring(0, offset);
-				} else {
-					offset = self[END_OFFSET];
-					newNodeValue = txtValue.substring(0, offset);
-					oldNodeValue = txtValue.substring(offset);
-				}
-
-				if (how != CLONE) {
-					n.nodeValue = oldNodeValue;
-				}
-
-				if (how == DELETE) {
-					return;
-				}
-
-				newNode = dom.clone(n, FALSE);
-				newNode.nodeValue = newNodeValue;
-
-				return newNode;
-			}
-
-			if (how == DELETE) {
-				return;
-			}
-
-			return dom.clone(n, FALSE);
-		}
-
-		function _traverseFullySelected(n, how) {
-			if (how != DELETE) {
-				return how == CLONE ? dom.clone(n, TRUE) : n;
-			}
-
-			n.parentNode.removeChild(n);
-		}
-
-		function toStringIE() {
-			return dom.create('body', null, cloneContents()).outerText;
-		}
-
-		extend(self, {
-			// Inital states
-			startContainer: doc,
-			startOffset: 0,
-			endContainer: doc,
-			endOffset: 0,
-			collapsed: TRUE,
-			commonAncestorContainer: doc,
-
-			// Range constants
-			START_TO_START: 0,
-			START_TO_END: 1,
-			END_TO_END: 2,
-			END_TO_START: 3,
-
-			// Public methods
-			setStart: setStart,
-			setEnd: setEnd,
-			setStartBefore: setStartBefore,
-			setStartAfter: setStartAfter,
-			setEndBefore: setEndBefore,
-			setEndAfter: setEndAfter,
-			collapse: collapse,
-			selectNode: selectNode,
-			selectNodeContents: selectNodeContents,
-			compareBoundaryPoints: compareBoundaryPoints,
-			deleteContents: deleteContents,
-			extractContents: extractContents,
-			cloneContents: cloneContents,
-			insertNode: insertNode,
-			surroundContents: surroundContents,
-			cloneRange: cloneRange,
-			toStringIE: toStringIE
-		});
-
-		return self;
-	}
-
-	// Older IE versions doesn't let you override toString by it's constructor so we have to stick it in the prototype
-	Range.prototype.toString = function() {
-		return this.toStringIE();
-	};
-
-	return Range;
-});