UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

117 lines (91 loc) 4.13 kB
"use strict"; var fitIntoRange = require("../../core/utils/math").fitIntoRange, escapeRegExp = require("../../core/utils/common").escapeRegExp, number = require("../../localization/number"); var getCaretBoundaries = function getCaretBoundaries(text, format) { var signParts = format.split(";"), sign = number.getSign(text, format); signParts[1] = signParts[1] || "-" + signParts[0]; format = sign < 0 ? signParts[1] : signParts[0]; var clearedFormat = format.replace(/'([^']*)'/g, "$1"), result = /^([^#0\.,]*)([#0\.,]*)([^#0\.,]*)$/.exec(clearedFormat); var startBorder = result[1].length, endBorder = text.length - result[3].length; return { start: startBorder, end: endBorder }; }; var _getDigitCountBeforeIndex = function _getDigitCountBeforeIndex(index, text) { var decimalSeparator = number.getDecimalSeparator(), regExp = new RegExp("[^0-9" + escapeRegExp(decimalSeparator) + "]", "g"), textBeforePosition = text.slice(0, index); return textBeforePosition.replace(regExp, '').length; }; var _reverseText = function _reverseText(text) { return text.split("").reverse().join(""); }; var _getDigitPositionByIndex = function _getDigitPositionByIndex(digitIndex, text) { if (!digitIndex) { return -1; } var regExp = /[0-9]/g, counter = 1, index = null, result = regExp.exec(text); while (result) { index = result.index; if (!digitIndex || counter >= digitIndex) { return index; } counter++; result = regExp.exec(text); } return index === null ? text.length : index; }; var getCaretWithOffset = function getCaretWithOffset(caret, offset) { if (caret.start === undefined) { caret = { start: caret, end: caret }; } return { start: caret.start + offset, end: caret.end + offset }; }; var getCaretAfterFormat = function getCaretAfterFormat(text, formatted, caret, format) { caret = getCaretWithOffset(caret, 0); var point = number.getDecimalSeparator(), pointPosition = text.indexOf(point), newPointPosition = formatted.indexOf(point), textParts = text.split(point), formattedParts = formatted.split(point), isCaretOnFloat = pointPosition !== -1 && caret.start > pointPosition; if (isCaretOnFloat) { var relativeIndex = caret.start - pointPosition - 1, digitsBefore = _getDigitCountBeforeIndex(relativeIndex, textParts[1]), newPosition = formattedParts[1] ? newPointPosition + 1 + _getDigitPositionByIndex(digitsBefore, formattedParts[1]) + 1 : formatted.length; return getCaretInBoundaries(newPosition, formatted, format); } else { var positionFromEnd = textParts[0].length - caret.start, digitsFromEnd = _getDigitCountBeforeIndex(positionFromEnd, _reverseText(textParts[0])), newPositionFromEnd = _getDigitPositionByIndex(digitsFromEnd, _reverseText(formattedParts[0])), newPositionFromBegin = formattedParts[0].length - (newPositionFromEnd + 1); return getCaretInBoundaries(newPositionFromBegin, formatted, format); } }; var isCaretInBoundaries = function isCaretInBoundaries(caret, text, format) { caret = getCaretWithOffset(caret, 0); var boundaries = getCaretInBoundaries(caret, text, format); return caret.start >= boundaries.start && caret.end <= boundaries.end; }; var getCaretInBoundaries = function getCaretInBoundaries(caret, text, format) { caret = getCaretWithOffset(caret, 0); var boundaries = getCaretBoundaries(text, format), adjustedCaret = { start: fitIntoRange(caret.start, boundaries.start, boundaries.end), end: fitIntoRange(caret.end, boundaries.start, boundaries.end) }; return adjustedCaret; }; exports.getCaretBoundaries = getCaretBoundaries; exports.isCaretInBoundaries = isCaretInBoundaries; exports.getCaretWithOffset = getCaretWithOffset; exports.getCaretInBoundaries = getCaretInBoundaries; exports.getCaretAfterFormat = getCaretAfterFormat;