UNPKG

@uiw/react-md-editor

Version:

A markdown editor with preview, implemented with React.js and TypeScript.

127 lines (100 loc) 3.63 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getBreaksNeededForEmptyLineAfter = getBreaksNeededForEmptyLineAfter; exports.getBreaksNeededForEmptyLineBefore = getBreaksNeededForEmptyLineBefore; exports.getSurroundingWord = getSurroundingWord; exports.selectWord = selectWord; function selectWord(_ref) { var text = _ref.text, selection = _ref.selection; if (text && text.length && selection.start === selection.end) { // the user is pointing to a word return getSurroundingWord(text, selection.start); } return selection; } /** * Gets the number of line-breaks that would have to be inserted before the given 'startPosition' * to make sure there's an empty line between 'startPosition' and the previous text */ function getBreaksNeededForEmptyLineBefore() { var text = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; var startPosition = arguments.length > 1 ? arguments[1] : undefined; if (startPosition === 0) return 0; // rules: // - If we're in the first line, no breaks are needed // - Otherwise there must be 2 breaks before the previous character. Depending on how many breaks exist already, we // may need to insert 0, 1 or 2 breaks var neededBreaks = 2; var isInFirstLine = true; for (var i = startPosition - 1; i >= 0 && neededBreaks >= 0; i--) { switch (text.charCodeAt(i)) { case 32: // blank space continue; case 10: // line break neededBreaks--; isInFirstLine = false; break; default: return neededBreaks; } } return isInFirstLine ? 0 : neededBreaks; } /** * Gets the number of line-breaks that would have to be inserted after the given 'startPosition' * to make sure there's an empty line between 'startPosition' and the next text */ function getBreaksNeededForEmptyLineAfter() { var text = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; var startPosition = arguments.length > 1 ? arguments[1] : undefined; if (startPosition === text.length - 1) return 0; // rules: // - If we're in the first line, no breaks are needed // - Otherwise there must be 2 breaks before the previous character. Depending on how many breaks exist already, we // may need to insert 0, 1 or 2 breaks var neededBreaks = 2; var isInLastLine = true; for (var i = startPosition; i < text.length && neededBreaks >= 0; i++) { switch (text.charCodeAt(i)) { case 32: continue; case 10: { neededBreaks--; isInLastLine = false; break; } default: return neededBreaks; } } return isInLastLine ? 0 : neededBreaks; } function getSurroundingWord(text, position) { if (!text) throw Error("Argument 'text' should be truthy"); var isWordDelimiter = function isWordDelimiter(c) { return c === ' ' || c.charCodeAt(0) === 10; }; // leftIndex is initialized to 0 because if selection is 0, it won't even enter the iteration var start = 0; // rightIndex is initialized to text.length because if selection is equal to text.length it won't even enter the interation var end = text.length; // iterate to the left for (var i = position; i - 1 > -1; i--) { if (isWordDelimiter(text[i - 1])) { start = i; break; } } // iterate to the right for (var _i = position; _i < text.length; _i++) { if (isWordDelimiter(text[_i])) { end = _i; break; } } return { start: start, end: end }; } //# sourceMappingURL=markdownUtils.js.map