all files / common/utils/ selection.js

95.35% Statements 82/86
89.36% Branches 42/47
100% Functions 9/9
95.35% Lines 82/86
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129   10689× 10689× 10670×   19×   266× 266× 266× 266× 266× 266× 266×     2038× 2038×     2038×   2608×           2038× 2038× 2038× 2038× 1808× 1808× 1808× 1691× 1691× 1691×   117×   2038× 347× 347×   2038× 1946× 1946× 505×     1441×   1946× 1946× 1946×     1104× 1104× 1104× 1104×       1104×   3436× 3436×   3430× 3430× 3430× 525×   2905×                   5810× 5810× 5810× 16811× 16811× 16811× 16811× 16811×           5810×   156× 156× 322× 322×   318×   152×      
define(["require", "exports", "./block"], function (require, exports, block_1) {
    "use strict";
    Object.defineProperty(exports, "__esModule", { value: true });
    function getSelectedRange() {
        var selection = window.getSelection();
        if (selection && selection.rangeCount > 0) {
            return selection.getRangeAt(0);
        }
        return null;
    }
    exports.getSelectedRange = getSelectedRange;
    function setSelectionRange(element, start, end) {
        var range = document.createRange();
        var selection = window.getSelection();
        Eif (selection) {
            range.setStart(element, start);
            range.setEnd(element, end);
            selection.removeAllRanges();
            selection.addRange(range);
        }
    }
    exports.setSelectionRange = setSelectionRange;
    function setCursorPosition(element, position) {
        var selection = window.getSelection();
        Iif (!selection || !element) {
            return;
        }
        var treeWalker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT, {
            acceptNode: function (node) {
                return node.nodeType === Node.TEXT_NODE ||
                    (node.nodeType === Node.ELEMENT_NODE && node.childNodes.length === 0)
                    ? NodeFilter.FILTER_ACCEPT
                    : NodeFilter.FILTER_SKIP;
            }
        });
        var currentPosition = 0;
        var targetNode;
        var targetOffset = 0;
        while (treeWalker.nextNode()) {
            var node = treeWalker.currentNode;
            var contentLength = node.textContent.length || 0;
            if (currentPosition + contentLength >= position) {
                targetNode = node;
                targetOffset = position - currentPosition;
                break;
            }
            currentPosition += contentLength;
        }
        if (!targetNode) {
            targetNode = element;
            targetOffset = element.childNodes.length;
        }
        if (document.contains(targetNode)) {
            var range = document.createRange();
            if (targetNode.nodeType === Node.ELEMENT_NODE && targetNode.childNodes.length === 0) {
                range.setStart(targetNode, 0);
            }
            else {
                range.setStart(targetNode, Math.min(targetOffset, targetNode.textContent.length || 0));
            }
            range.collapse(true);
            selection.removeAllRanges();
            selection.addRange(range);
        }
    }
    exports.setCursorPosition = setCursorPosition;
    function getTextOffset(node, within) {
        var offset = 0;
        var walker = document.createTreeWalker(within, NodeFilter.SHOW_TEXT, null);
        var current = walker.nextNode();
        while (current && current !== node) {
            offset += current.textContent.length || 0;
            current = walker.nextNode();
        }
        return offset;
    }
    exports.getTextOffset = getTextOffset;
    function captureSelectionState() {
        var range = getSelectedRange();
        if (!range) {
            return null;
        }
        var startBlock = block_1.getParentBlock(range.startContainer);
        var endBlock = block_1.getParentBlock(range.endContainer);
        if (!startBlock || !endBlock) {
            return null;
        }
        return {
            startBlockId: startBlock.id,
            endBlockId: endBlock.id,
            startContainerPath: getPathFromBlock(startBlock, range.startContainer),
            endContainerPath: getPathFromBlock(endBlock, range.endContainer),
            startOffset: range.startOffset,
            endOffset: range.endOffset,
            isCollapsed: range.collapsed
        };
    }
    exports.captureSelectionState = captureSelectionState;
    function getPathFromBlock(blockElement, targetNode) {
        var path = [];
        var currentNode = targetNode;
        while (currentNode && currentNode !== blockElement) {
            var parent_1 = currentNode.parentNode;
            Eif (parent_1) {
                var index = Array.prototype.indexOf.call(parent_1.childNodes, currentNode);
                path.unshift(index);
                currentNode = parent_1;
            }
            else {
                break;
            }
        }
        return path;
    }
    exports.getPathFromBlock = getPathFromBlock;
    function getNodeFromPath(blockElement, path) {
        var currentNode = blockElement;
        for (var _i = 0, path_1 = path; _i < path_1.length; _i++) {
            var index = path_1[_i];
            if (!currentNode.childNodes || index >= currentNode.childNodes.length) {
                return null;
            }
            currentNode = currentNode.childNodes[parseInt(index.toString(), 10)];
        }
        return currentNode;
    }
    exports.getNodeFromPath = getNodeFromPath;
});