projen
Version:
CDK for software projects
829 lines • 35 kB
JavaScript
"use strict";
var __values = (this && this.__values) || function(o) {
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
if (m) return m.call(o);
if (o && typeof o.length === "number") return {
next: function () {
if (o && i >= o.length) o = void 0;
return { value: o && o[i++], done: !o };
}
};
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
var __read = (this && this.__read) || function (o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
}
catch (error) { e = { error: error }; }
finally {
try {
if (r && !r.done && (m = i["return"])) m.call(i);
}
finally { if (e) throw e.error; }
}
return ar;
};
var __spread = (this && this.__spread) || function () {
for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
return ar;
};
Object.defineProperty(exports, "__esModule", { value: true });
var interfaces_1 = require("../dom/interfaces");
var DOMException_1 = require("../dom/DOMException");
var util_1 = require("../util");
var CreateAlgorithm_1 = require("./CreateAlgorithm");
var TreeAlgorithm_1 = require("./TreeAlgorithm");
var BoundaryPointAlgorithm_1 = require("./BoundaryPointAlgorithm");
var CharacterDataAlgorithm_1 = require("./CharacterDataAlgorithm");
var NodeAlgorithm_1 = require("./NodeAlgorithm");
var MutationAlgorithm_1 = require("./MutationAlgorithm");
var TextAlgorithm_1 = require("./TextAlgorithm");
/**
* Determines if the node's start boundary point is at its end boundary
* point.
*
* @param range - a range
*/
function range_collapsed(range) {
/**
* A range is collapsed if its start node is its end node and its start offset is its end offset.
*/
return (range._startNode === range._endNode && range._startOffset === range._endOffset);
}
exports.range_collapsed = range_collapsed;
/**
* Gets the root node of a range.
*
* @param range - a range
*/
function range_root(range) {
/**
* The root of a live range is the root of its start node.
*/
return TreeAlgorithm_1.tree_rootNode(range._startNode);
}
exports.range_root = range_root;
/**
* Determines if a node is fully contained in a range.
*
* @param node - a node
* @param range - a range
*/
function range_isContained(node, range) {
/**
* A node node is contained in a live range range if node’s root is range’s
* root, and (node, 0) is after range’s start, and (node, node’s length) is
* before range’s end.
*/
return (TreeAlgorithm_1.tree_rootNode(node) === range_root(range) &&
BoundaryPointAlgorithm_1.boundaryPoint_position([node, 0], range._start) === interfaces_1.BoundaryPosition.After &&
BoundaryPointAlgorithm_1.boundaryPoint_position([node, TreeAlgorithm_1.tree_nodeLength(node)], range._end) === interfaces_1.BoundaryPosition.Before);
}
exports.range_isContained = range_isContained;
/**
* Determines if a node is partially contained in a range.
*
* @param node - a node
* @param range - a range
*/
function range_isPartiallyContained(node, range) {
/**
* A node is partially contained in a live range if it’s an inclusive
* ancestor of the live range’s start node but not its end node,
* or vice versa.
*/
var startCheck = TreeAlgorithm_1.tree_isAncestorOf(range._startNode, node, true);
var endCheck = TreeAlgorithm_1.tree_isAncestorOf(range._endNode, node, true);
return (startCheck && !endCheck) || (!startCheck && endCheck);
}
exports.range_isPartiallyContained = range_isPartiallyContained;
/**
* Sets the start boundary point of a range.
*
* @param range - a range
* @param node - a node
* @param offset - an offset into node
*/
function range_setTheStart(range, node, offset) {
/**
* 1. If node is a doctype, then throw an "InvalidNodeTypeError" DOMException.
* 2. If offset is greater than node’s length, then throw an "IndexSizeError"
* DOMException.
* 3. Let bp be the boundary point (node, offset).
* 4. If these steps were invoked as "set the start"
* 4.1. If bp is after the range’s end, or if range’s root is not equal to
* node’s root, set range’s end to bp.
* 4.2. Set range’s start to bp.
*/
if (util_1.Guard.isDocumentTypeNode(node)) {
throw new DOMException_1.InvalidNodeTypeError();
}
if (offset > TreeAlgorithm_1.tree_nodeLength(node)) {
throw new DOMException_1.IndexSizeError();
}
var bp = [node, offset];
if (range_root(range) !== TreeAlgorithm_1.tree_rootNode(node) ||
BoundaryPointAlgorithm_1.boundaryPoint_position(bp, range._end) === interfaces_1.BoundaryPosition.After) {
range._end = bp;
}
range._start = bp;
}
exports.range_setTheStart = range_setTheStart;
/**
* Sets the end boundary point of a range.
*
* @param range - a range
* @param node - a node
* @param offset - an offset into node
*/
function range_setTheEnd(range, node, offset) {
/**
* 1. If node is a doctype, then throw an "InvalidNodeTypeError" DOMException.
* 2. If offset is greater than node’s length, then throw an "IndexSizeError"
* DOMException.
* 3. Let bp be the boundary point (node, offset).
* 4. If these steps were invoked as "set the end"
* 4.1. If bp is before the range’s start, or if range’s root is not equal
* to node’s root, set range’s start to bp.
* 4.2. Set range’s end to bp.
*/
if (util_1.Guard.isDocumentTypeNode(node)) {
throw new DOMException_1.InvalidNodeTypeError();
}
if (offset > TreeAlgorithm_1.tree_nodeLength(node)) {
throw new DOMException_1.IndexSizeError();
}
var bp = [node, offset];
if (range_root(range) !== TreeAlgorithm_1.tree_rootNode(node) ||
BoundaryPointAlgorithm_1.boundaryPoint_position(bp, range._start) === interfaces_1.BoundaryPosition.Before) {
range._start = bp;
}
range._end = bp;
}
exports.range_setTheEnd = range_setTheEnd;
/**
* Selects a node.
*
* @param range - a range
* @param node - a node
*/
function range_select(node, range) {
/**
* 1. Let parent be node’s parent.
* 2. If parent is null, then throw an "InvalidNodeTypeError" DOMException.
*/
var parent = node._parent;
if (parent === null)
throw new DOMException_1.InvalidNodeTypeError();
/**
* 3. Let index be node’s index.
* 4. Set range’s start to boundary point (parent, index).
* 5. Set range’s end to boundary point (parent, index plus 1).
*/
var index = TreeAlgorithm_1.tree_index(node);
range._start = [parent, index];
range._end = [parent, index + 1];
}
exports.range_select = range_select;
/**
* EXtracts the contents of range as a document fragment.
*
* @param range - a range
*/
function range_extract(range) {
var e_1, _a, e_2, _b, e_3, _c;
/**
* 1. Let fragment be a new DocumentFragment node whose node document is
* range’s start node’s node document.
* 2. If range is collapsed, then return fragment.
*/
var fragment = CreateAlgorithm_1.create_documentFragment(range._startNode._nodeDocument);
if (range_collapsed(range))
return fragment;
/**
* 3. Let original start node, original start offset, original end node,
* and original end offset be range’s start node, start offset, end node,
* and end offset, respectively.
*/
var originalStartNode = range._startNode;
var originalStartOffset = range._startOffset;
var originalEndNode = range._endNode;
var originalEndOffset = range._endOffset;
/**
* 4. If original start node is original end node, and they are a Text,
* ProcessingInstruction, or Comment node:
* 4.1. Let clone be a clone of original start node.
* 4.2. Set the data of clone to the result of substringing data with node
* original start node, offset original start offset, and count original end
* offset minus original start offset.
* 4.3. Append clone to fragment.
* 4.4. Replace data with node original start node, offset original start
* offset, count original end offset minus original start offset, and data
* the empty string.
* 4.5. Return fragment.
*/
if (originalStartNode === originalEndNode &&
util_1.Guard.isCharacterDataNode(originalStartNode)) {
var clone = NodeAlgorithm_1.node_clone(originalStartNode);
clone._data = CharacterDataAlgorithm_1.characterData_substringData(originalStartNode, originalStartOffset, originalEndOffset - originalStartOffset);
MutationAlgorithm_1.mutation_append(clone, fragment);
CharacterDataAlgorithm_1.characterData_replaceData(originalStartNode, originalStartOffset, originalEndOffset - originalStartOffset, '');
return fragment;
}
/**
* 5. Let common ancestor be original start node.
* 6. While common ancestor is not an inclusive ancestor of original end
* node, set common ancestor to its own parent.
*/
var commonAncestor = originalStartNode;
while (!TreeAlgorithm_1.tree_isAncestorOf(originalEndNode, commonAncestor, true)) {
if (commonAncestor._parent === null) {
throw new Error("Parent node is null.");
}
commonAncestor = commonAncestor._parent;
}
/**
* 7. Let first partially contained child be null.
* 8. If original start node is not an inclusive ancestor of original end
* node, set first partially contained child to the first child of common
* ancestor that is partially contained in range.
*/
var firstPartiallyContainedChild = null;
if (!TreeAlgorithm_1.tree_isAncestorOf(originalEndNode, originalStartNode, true)) {
try {
for (var _d = __values(commonAncestor._children), _e = _d.next(); !_e.done; _e = _d.next()) {
var node = _e.value;
if (range_isPartiallyContained(node, range)) {
firstPartiallyContainedChild = node;
break;
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
}
finally { if (e_1) throw e_1.error; }
}
}
/**
* 9. Let last partially contained child be null.
* 10. If original end node is not an inclusive ancestor of original start
* node, set last partially contained child to the last child of common
* ancestor that is partially contained in range.
*/
var lastPartiallyContainedChild = null;
if (!TreeAlgorithm_1.tree_isAncestorOf(originalStartNode, originalEndNode, true)) {
var children = __spread(commonAncestor._children);
for (var i = children.length - 1; i > 0; i--) {
var node = children[i];
if (range_isPartiallyContained(node, range)) {
lastPartiallyContainedChild = node;
break;
}
}
}
/**
* 11. Let contained children be a list of all children of common ancestor
* that are contained in range, in tree order.
* 12. If any member of contained children is a doctype, then throw a
* "HierarchyRequestError" DOMException.
*/
var containedChildren = [];
try {
for (var _f = __values(commonAncestor._children), _g = _f.next(); !_g.done; _g = _f.next()) {
var child = _g.value;
if (range_isContained(child, range)) {
if (util_1.Guard.isDocumentTypeNode(child)) {
throw new DOMException_1.HierarchyRequestError();
}
containedChildren.push(child);
}
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (_g && !_g.done && (_b = _f.return)) _b.call(_f);
}
finally { if (e_2) throw e_2.error; }
}
var newNode;
var newOffset;
if (TreeAlgorithm_1.tree_isAncestorOf(originalEndNode, originalStartNode, true)) {
/**
* 13. If original start node is an inclusive ancestor of original end node,
* set new node to original start node and new offset to original start
* offset.
*/
newNode = originalStartNode;
newOffset = originalStartOffset;
}
else {
/**
* 14. Otherwise:
* 14.1. Let reference node equal original start node.
* 14.2. While reference node’s parent is not null and is not an inclusive
* ancestor of original end node, set reference node to its parent.
* 14.3. Set new node to the parent of reference node, and new offset to
* one plus reference node’s index.
*/
var referenceNode = originalStartNode;
while (referenceNode._parent !== null &&
!TreeAlgorithm_1.tree_isAncestorOf(originalEndNode, referenceNode._parent)) {
referenceNode = referenceNode._parent;
}
/* istanbul ignore next */
if (referenceNode._parent === null) {
/**
* If reference node’s parent is null, it would be the root of range,
* so would be an inclusive ancestor of original end node, and we could
* not reach this point.
*/
throw new Error("Parent node is null.");
}
newNode = referenceNode._parent;
newOffset = 1 + TreeAlgorithm_1.tree_index(referenceNode);
}
if (util_1.Guard.isCharacterDataNode(firstPartiallyContainedChild)) {
/**
* 15. If first partially contained child is a Text, ProcessingInstruction,
* or Comment node:
* 15.1. Let clone be a clone of original start node.
* 15.2. Set the data of clone to the result of substringing data with
* node original start node, offset original start offset, and count
* original start node’s length minus original start offset.
* 15.3. Append clone to fragment.
* 15.4. Replace data with node original start node, offset original
* start offset, count original start node’s length minus original start
* offset, and data the empty string.
*/
var clone = NodeAlgorithm_1.node_clone(originalStartNode);
clone._data = CharacterDataAlgorithm_1.characterData_substringData(originalStartNode, originalStartOffset, TreeAlgorithm_1.tree_nodeLength(originalStartNode) - originalStartOffset);
MutationAlgorithm_1.mutation_append(clone, fragment);
CharacterDataAlgorithm_1.characterData_replaceData(originalStartNode, originalStartOffset, TreeAlgorithm_1.tree_nodeLength(originalStartNode) - originalStartOffset, '');
}
else if (firstPartiallyContainedChild !== null) {
/**
* 16. Otherwise, if first partially contained child is not null:
* 16.1. Let clone be a clone of first partially contained child.
* 16.2. Append clone to fragment.
* 16.3. Let subrange be a new live range whose start is (original start
* node, original start offset) and whose end is (first partially
* contained child, first partially contained child’s length).
* 16.4. Let subfragment be the result of extracting subrange.
* 16.5. Append subfragment to clone.
*/
var clone = NodeAlgorithm_1.node_clone(firstPartiallyContainedChild);
MutationAlgorithm_1.mutation_append(clone, fragment);
var subrange = CreateAlgorithm_1.create_range([originalStartNode, originalStartOffset], [firstPartiallyContainedChild, TreeAlgorithm_1.tree_nodeLength(firstPartiallyContainedChild)]);
var subfragment = range_extract(subrange);
MutationAlgorithm_1.mutation_append(subfragment, clone);
}
try {
/**
* 17. For each contained child in contained children, append contained
* child to fragment.
*/
for (var containedChildren_1 = __values(containedChildren), containedChildren_1_1 = containedChildren_1.next(); !containedChildren_1_1.done; containedChildren_1_1 = containedChildren_1.next()) {
var child = containedChildren_1_1.value;
MutationAlgorithm_1.mutation_append(child, fragment);
}
}
catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally {
try {
if (containedChildren_1_1 && !containedChildren_1_1.done && (_c = containedChildren_1.return)) _c.call(containedChildren_1);
}
finally { if (e_3) throw e_3.error; }
}
if (util_1.Guard.isCharacterDataNode(lastPartiallyContainedChild)) {
/**
* 18. If last partially contained child is a Text, ProcessingInstruction,
* or Comment node:
* 18.1. Let clone be a clone of original end node.
* 18.2. Set the data of clone to the result of substringing data with
* node original end node, offset 0, and count original end offset.
* 18.3. Append clone to fragment.
* 18.4. Replace data with node original end node, offset 0, count
* original end offset, and data the empty string.
*/
var clone = NodeAlgorithm_1.node_clone(originalEndNode);
clone._data = CharacterDataAlgorithm_1.characterData_substringData(originalEndNode, 0, originalEndOffset);
MutationAlgorithm_1.mutation_append(clone, fragment);
CharacterDataAlgorithm_1.characterData_replaceData(originalEndNode, 0, originalEndOffset, '');
}
else if (lastPartiallyContainedChild !== null) {
/**
* 19. Otherwise, if last partially contained child is not null:
* 19.1. Let clone be a clone of last partially contained child.
* 19.2. Append clone to fragment.
* 19.3. Let subrange be a new live range whose start is (last partially
* contained child, 0) and whose end is (original end node, original
* end offset).
* 19.4. Let subfragment be the result of extracting subrange.
* 19.5. Append subfragment to clone.
*/
var clone = NodeAlgorithm_1.node_clone(lastPartiallyContainedChild);
MutationAlgorithm_1.mutation_append(clone, fragment);
var subrange = CreateAlgorithm_1.create_range([lastPartiallyContainedChild, 0], [originalEndNode, originalEndOffset]);
var subfragment = range_extract(subrange);
MutationAlgorithm_1.mutation_append(subfragment, clone);
}
/**
* 20. Set range’s start and end to (new node, new offset).
*/
range._start = [newNode, newOffset];
range._end = [newNode, newOffset];
/**
* 21. Return fragment.
*/
return fragment;
}
exports.range_extract = range_extract;
/**
* Clones the contents of range as a document fragment.
*
* @param range - a range
*/
function range_cloneTheContents(range) {
var e_4, _a, e_5, _b, e_6, _c;
/**
* 1. Let fragment be a new DocumentFragment node whose node document
* is range’s start node’s node document.
* 2. If range is collapsed, then return fragment.
*/
var fragment = CreateAlgorithm_1.create_documentFragment(range._startNode._nodeDocument);
if (range_collapsed(range))
return fragment;
/**
* 3. Let original start node, original start offset, original end node,
* and original end offset be range’s start node, start offset, end node,
* and end offset, respectively.
* 4. If original start node is original end node, and they are a Text,
* ProcessingInstruction, or Comment node:
* 4.1. Let clone be a clone of original start node.
* 4.2. Set the data of clone to the result of substringing data with node
* original start node, offset original start offset, and count original end
* offset minus original start offset.
* 4.3. Append clone to fragment.
* 4.5. Return fragment.
*/
var originalStartNode = range._startNode;
var originalStartOffset = range._startOffset;
var originalEndNode = range._endNode;
var originalEndOffset = range._endOffset;
if (originalStartNode === originalEndNode &&
util_1.Guard.isCharacterDataNode(originalStartNode)) {
var clone = NodeAlgorithm_1.node_clone(originalStartNode);
clone._data = CharacterDataAlgorithm_1.characterData_substringData(originalStartNode, originalStartOffset, originalEndOffset - originalStartOffset);
MutationAlgorithm_1.mutation_append(clone, fragment);
}
/**
* 5. Let common ancestor be original start node.
* 6. While common ancestor is not an inclusive ancestor of original end
* node, set common ancestor to its own parent.
*/
var commonAncestor = originalStartNode;
while (!TreeAlgorithm_1.tree_isAncestorOf(originalEndNode, commonAncestor, true)) {
if (commonAncestor._parent === null) {
throw new Error("Parent node is null.");
}
commonAncestor = commonAncestor._parent;
}
/**
* 7. Let first partially contained child be null.
* 8. If original start node is not an inclusive ancestor of original end
* node, set first partially contained child to the first child of common
* ancestor that is partially contained in range.
*/
var firstPartiallyContainedChild = null;
if (!TreeAlgorithm_1.tree_isAncestorOf(originalEndNode, originalStartNode, true)) {
try {
for (var _d = __values(commonAncestor._children), _e = _d.next(); !_e.done; _e = _d.next()) {
var node = _e.value;
if (range_isPartiallyContained(node, range)) {
firstPartiallyContainedChild = node;
break;
}
}
}
catch (e_4_1) { e_4 = { error: e_4_1 }; }
finally {
try {
if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
}
finally { if (e_4) throw e_4.error; }
}
}
/**
* 9. Let last partially contained child be null.
* 10. If original end node is not an inclusive ancestor of original start
* node, set last partially contained child to the last child of common
* ancestor that is partially contained in range.
*/
var lastPartiallyContainedChild = null;
if (!TreeAlgorithm_1.tree_isAncestorOf(originalStartNode, originalEndNode, true)) {
var children = __spread(commonAncestor._children);
for (var i = children.length - 1; i > 0; i--) {
var node = children[i];
if (range_isPartiallyContained(node, range)) {
lastPartiallyContainedChild = node;
break;
}
}
}
/**
* 11. Let contained children be a list of all children of common ancestor
* that are contained in range, in tree order.
* 12. If any member of contained children is a doctype, then throw a
* "HierarchyRequestError" DOMException.
*/
var containedChildren = [];
try {
for (var _f = __values(commonAncestor._children), _g = _f.next(); !_g.done; _g = _f.next()) {
var child = _g.value;
if (range_isContained(child, range)) {
if (util_1.Guard.isDocumentTypeNode(child)) {
throw new DOMException_1.HierarchyRequestError();
}
containedChildren.push(child);
}
}
}
catch (e_5_1) { e_5 = { error: e_5_1 }; }
finally {
try {
if (_g && !_g.done && (_b = _f.return)) _b.call(_f);
}
finally { if (e_5) throw e_5.error; }
}
if (util_1.Guard.isCharacterDataNode(firstPartiallyContainedChild)) {
/**
* 13. If first partially contained child is a Text, ProcessingInstruction,
* or Comment node:
* 13.1. Let clone be a clone of original start node.
* 13.2. Set the data of clone to the result of substringing data with
* node original start node, offset original start offset, and count
* original start node’s length minus original start offset.
* 13.3. Append clone to fragment.
*/
var clone = NodeAlgorithm_1.node_clone(originalStartNode);
clone._data = CharacterDataAlgorithm_1.characterData_substringData(originalStartNode, originalStartOffset, TreeAlgorithm_1.tree_nodeLength(originalStartNode) - originalStartOffset);
MutationAlgorithm_1.mutation_append(clone, fragment);
}
else if (firstPartiallyContainedChild !== null) {
/**
* 14. Otherwise, if first partially contained child is not null:
* 14.1. Let clone be a clone of first partially contained child.
* 14.2. Append clone to fragment.
* 14.3. Let subrange be a new live range whose start is (original start
* node, original start offset) and whose end is (first partially
* contained child, first partially contained child’s length).
* 14.4. Let subfragment be the result of cloning the contents of
* subrange.
* 14.5. Append subfragment to clone.
*/
var clone = NodeAlgorithm_1.node_clone(firstPartiallyContainedChild);
MutationAlgorithm_1.mutation_append(clone, fragment);
var subrange = CreateAlgorithm_1.create_range([originalStartNode, originalStartOffset], [firstPartiallyContainedChild, TreeAlgorithm_1.tree_nodeLength(firstPartiallyContainedChild)]);
var subfragment = range_cloneTheContents(subrange);
MutationAlgorithm_1.mutation_append(subfragment, clone);
}
try {
/**
* 15. For each contained child in contained children, append contained
* child to fragment.
* 15.1. Let clone be a clone of contained child with the clone children
* flag set.
* 15.2. Append clone to fragment.
*/
for (var containedChildren_2 = __values(containedChildren), containedChildren_2_1 = containedChildren_2.next(); !containedChildren_2_1.done; containedChildren_2_1 = containedChildren_2.next()) {
var child = containedChildren_2_1.value;
var clone = NodeAlgorithm_1.node_clone(child);
MutationAlgorithm_1.mutation_append(clone, fragment);
}
}
catch (e_6_1) { e_6 = { error: e_6_1 }; }
finally {
try {
if (containedChildren_2_1 && !containedChildren_2_1.done && (_c = containedChildren_2.return)) _c.call(containedChildren_2);
}
finally { if (e_6) throw e_6.error; }
}
if (util_1.Guard.isCharacterDataNode(lastPartiallyContainedChild)) {
/**
* 16. If last partially contained child is a Text, ProcessingInstruction,
* or Comment node:
* 16.1. Let clone be a clone of original end node.
* 16.2. Set the data of clone to the result of substringing data with
* node original end node, offset 0, and count original end offset.
* 16.3. Append clone to fragment.
*/
var clone = NodeAlgorithm_1.node_clone(originalEndNode);
clone._data = CharacterDataAlgorithm_1.characterData_substringData(originalEndNode, 0, originalEndOffset);
MutationAlgorithm_1.mutation_append(clone, fragment);
}
else if (lastPartiallyContainedChild !== null) {
/**
* 17. Otherwise, if last partially contained child is not null:
* 17.1. Let clone be a clone of last partially contained child.
* 17.2. Append clone to fragment.
* 17.3. Let subrange be a new live range whose start is (last partially
* contained child, 0) and whose end is (original end node, original
* end offset).
* 17.4. Let subfragment be the result of cloning the contents of subrange.
* 17.5. Append subfragment to clone.
*/
var clone = NodeAlgorithm_1.node_clone(lastPartiallyContainedChild);
fragment.append(clone);
var subrange = CreateAlgorithm_1.create_range([lastPartiallyContainedChild, 0], [originalEndNode, originalEndOffset]);
var subfragment = range_extract(subrange);
MutationAlgorithm_1.mutation_append(subfragment, clone);
}
/**
* 18. Return fragment.
*/
return fragment;
}
exports.range_cloneTheContents = range_cloneTheContents;
/**
* Inserts a node into a range at the start boundary point.
*
* @param node - node to insert
* @param range - a range
*/
function range_insert(node, range) {
var e_7, _a;
/**
* 1. If range’s start node is a ProcessingInstruction or Comment node, is a
* Text node whose parent is null, or is node, then throw a
* "HierarchyRequestError" DOMException.
*/
if (util_1.Guard.isProcessingInstructionNode(range._startNode) ||
util_1.Guard.isCommentNode(range._startNode) ||
(util_1.Guard.isTextNode(range._startNode) && range._startNode._parent === null) ||
range._startNode === node) {
throw new DOMException_1.HierarchyRequestError();
}
/**
* 2. Let referenceNode be null.
* 3. If range’s start node is a Text node, set referenceNode to that Text
* node.
* 4. Otherwise, set referenceNode to the child of start node whose index is
* start offset, and null if there is no such child.
*/
var referenceNode = null;
if (util_1.Guard.isTextNode(range._startNode)) {
referenceNode = range._startNode;
}
else {
var index = 0;
try {
for (var _b = __values(range._startNode._children), _c = _b.next(); !_c.done; _c = _b.next()) {
var child = _c.value;
if (index === range._startOffset) {
referenceNode = child;
break;
}
index++;
}
}
catch (e_7_1) { e_7 = { error: e_7_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_7) throw e_7.error; }
}
}
/**
* 5. Let parent be range’s start node if referenceNode is null, and
* referenceNode’s parent otherwise.
*/
var parent;
if (referenceNode === null) {
parent = range._startNode;
}
else {
if (referenceNode._parent === null) {
throw new Error("Parent node is null.");
}
parent = referenceNode._parent;
}
/**
* 6. Ensure pre-insertion validity of node into parent before referenceNode.
*/
MutationAlgorithm_1.mutation_ensurePreInsertionValidity(node, parent, referenceNode);
/**
* 7. If range’s start node is a Text node, set referenceNode to the result
* of splitting it with offset range’s start offset.
*/
if (util_1.Guard.isTextNode(range._startNode)) {
referenceNode = TextAlgorithm_1.text_split(range._startNode, range._startOffset);
}
/**
* 8. If node is referenceNode, set referenceNode to its next sibling.
*/
if (node === referenceNode) {
referenceNode = node._nextSibling;
}
/**
* 9. If node’s parent is not null, remove node from its parent.
*/
if (node._parent !== null) {
MutationAlgorithm_1.mutation_remove(node, node._parent);
}
/**
* 10. Let newOffset be parent’s length if referenceNode is null, and
* referenceNode’s index otherwise.
*/
var newOffset = (referenceNode === null ?
TreeAlgorithm_1.tree_nodeLength(parent) : TreeAlgorithm_1.tree_index(referenceNode));
/**
* 11. Increase newOffset by node’s length if node is a DocumentFragment
* node, and one otherwise.
*/
if (util_1.Guard.isDocumentFragmentNode(node)) {
newOffset += TreeAlgorithm_1.tree_nodeLength(node);
}
else {
newOffset++;
}
/**
* 12. Pre-insert node into parent before referenceNode.
*/
MutationAlgorithm_1.mutation_preInsert(node, parent, referenceNode);
/**
* 13. If range is collapsed, then set range’s end to (parent, newOffset).
*/
if (range_collapsed(range)) {
range._end = [parent, newOffset];
}
}
exports.range_insert = range_insert;
/**
* Traverses through all contained nodes of a range.
*
* @param range - a range
*/
function range_getContainedNodes(range) {
var _a;
return _a = {},
_a[Symbol.iterator] = function () {
var container = range.commonAncestorContainer;
var currentNode = TreeAlgorithm_1.tree_getFirstDescendantNode(container);
return {
next: function () {
while (currentNode && !range_isContained(currentNode, range)) {
currentNode = TreeAlgorithm_1.tree_getNextDescendantNode(container, currentNode);
}
if (currentNode === null) {
return { done: true, value: null };
}
else {
var result = { done: false, value: currentNode };
currentNode = TreeAlgorithm_1.tree_getNextDescendantNode(container, currentNode);
return result;
}
}
};
},
_a;
}
exports.range_getContainedNodes = range_getContainedNodes;
/**
* Traverses through all partially contained nodes of a range.
*
* @param range - a range
*/
function range_getPartiallyContainedNodes(range) {
var _a;
return _a = {},
_a[Symbol.iterator] = function () {
var container = range.commonAncestorContainer;
var currentNode = TreeAlgorithm_1.tree_getFirstDescendantNode(container);
return {
next: function () {
while (currentNode && !range_isPartiallyContained(currentNode, range)) {
currentNode = TreeAlgorithm_1.tree_getNextDescendantNode(container, currentNode);
}
if (currentNode === null) {
return { done: true, value: null };
}
else {
var result = { done: false, value: currentNode };
currentNode = TreeAlgorithm_1.tree_getNextDescendantNode(container, currentNode);
return result;
}
}
};
},
_a;
}
exports.range_getPartiallyContainedNodes = range_getPartiallyContainedNodes;
//# sourceMappingURL=RangeAlgorithm.js.map