upfront-editable
Version:
Friendly contenteditable API
56 lines (42 loc) • 1.54 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.textNodesUnder = textNodesUnder;
exports.getTextNodeAndRelativeOffset = getTextNodeAndRelativeOffset;
exports.getTotalCharCount = getTotalCharCount;
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _nodeIterator = _interopRequireDefault(require("../node-iterator"));
function textNodesUnder(node) {
var iterator = new _nodeIterator["default"](node, 'getNextTextNode');
return (0, _toConsumableArray2["default"])(iterator);
} // NOTE: if there is only one text node, then just that node and
// the abs offset are returned
function getTextNodeAndRelativeOffset(_ref) {
var textNodes = _ref.textNodes,
absOffset = _ref.absOffset;
var cumulativeOffset = 0;
var relativeOffset = 0;
var targetNode;
for (var i = 0; i < textNodes.length; i++) {
var node = textNodes[i];
if (absOffset <= cumulativeOffset + node.textContent.length) {
targetNode = node;
relativeOffset = absOffset - cumulativeOffset;
break;
}
cumulativeOffset += node.textContent.length;
}
return {
node: targetNode,
relativeOffset: relativeOffset
};
}
function getTotalCharCount(element) {
var textNodes = textNodesUnder(element);
var reducer = function reducer(acc, node) {
return acc + node.textContent.length;
};
return textNodes.reduce(reducer, 0);
}