UNPKG

react-native-advanced-input-mask

Version:

Text input mask for React Native on iOS, Android and web. Synchronous and easy formatting without hustle

229 lines (228 loc) 8.02 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.Mask = void 0; var _CaretString = _interopRequireDefault(require("../model/CaretString")); var _EOLState = _interopRequireDefault(require("../model/state/EOLState")); var _FixedState = _interopRequireDefault(require("../model/state/FixedState")); var _FreeState = _interopRequireDefault(require("../model/state/FreeState")); var _OptionalValueState = _interopRequireDefault(require("../model/state/OptionalValueState")); var _ValueState = _interopRequireDefault(require("../model/state/ValueState")); var _types = require("../model/types"); var _AutocompletionStack = _interopRequireDefault(require("./AutocompletionStack")); var _CaretStringIterator = _interopRequireDefault(require("./CaretStringIterator")); var _Compiler = _interopRequireDefault(require("./Compiler")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } class Mask { static cache = new Map(); constructor(format, customNotations = []) { this.initialState = new _Compiler.default(customNotations).compile(format); } static getOrCreate(format, customNotations) { const cachedMask = Mask.cache.get(format); if (!cachedMask) { const newMask = new Mask(format, customNotations); Mask.cache.set(format, newMask); return newMask; } return cachedMask; } static isValid(format, customNotations) { try { this.getOrCreate(format, customNotations); return true; } catch (e) { return false; } } apply(text) { const iterator = this.makeIterator(text); let affinity = 0; let extractedValue = ""; let modifiedString = ""; let modifiedCaretPosition = text.caretPosition; let state = this.initialState; const autocompletionStack = new _AutocompletionStack.default(); let insertionAffectsCaret = iterator.insertionAffectsCaret(); let deletionAffectsCaret = iterator.deletionAffectsCaret(); let character = iterator.next(); while (character !== null) { const next = state.accept(character); if (next) { if (deletionAffectsCaret) { autocompletionStack.push(state.autocomplete()); } state = next.state; if (next.insert) { modifiedString += next.insert; } if (next.value) { extractedValue += next.value; } if (next.pass) { insertionAffectsCaret = iterator.insertionAffectsCaret(); deletionAffectsCaret = iterator.deletionAffectsCaret(); character = iterator.next(); affinity += 1; } else { if (insertionAffectsCaret && next.insert) { modifiedCaretPosition += 1; } affinity -= 1; } } else { if (deletionAffectsCaret) { modifiedCaretPosition -= 1; } insertionAffectsCaret = iterator.insertionAffectsCaret(); deletionAffectsCaret = iterator.deletionAffectsCaret(); character = iterator.next(); affinity -= 1; } } while (text.caretGravity.autocomplete && insertionAffectsCaret) { const next = state.autocomplete(); if (!next) { break; } state = next.state; if (next.insert) { modifiedString += next.insert; modifiedCaretPosition += 1; } if (next.value) { extractedValue += next.value; } } let tailState = state; let tail = ""; while (text.caretGravity.autoskip && !autocompletionStack.empty()) { const skip = autocompletionStack.pop(); if (modifiedString.length === modifiedCaretPosition) { if (skip.insert && skip.insert === modifiedString.slice(-1)) { modifiedString = modifiedString.slice(0, -1); modifiedCaretPosition -= 1; } if (skip.value && skip.value === extractedValue.slice(-1)) { extractedValue = extractedValue.slice(0, -1); } } else { if (skip.insert) { modifiedCaretPosition -= 1; } } tailState = skip.state; tail = skip.insert ? skip.insert : tail; } const tailPlaceholder = this.appendPlaceholder(tailState, tail); const result = { formattedText: new _CaretString.default(modifiedString, modifiedCaretPosition, text.caretGravity), extractedValue, affinity, complete: this.noMandatoryCharactersLeftAfterState(state), tailPlaceholder, reversed() { return { formattedText: this.formattedText.reversed(), extractedValue: this.extractedValue.split("").reverse().join(""), affinity: this.affinity, complete: this.complete, tailPlaceholder: this.tailPlaceholder.split("").reverse().join(""), reversed: this.reversed }; } }; return result; } makeIterator(text) { return new _CaretStringIterator.default(text); } placeholder = () => this.appendPlaceholder(this.initialState, ""); acceptableTextLength() { let state = this.initialState; let length = 0; while (state && !(state instanceof _EOLState.default)) { if (state instanceof _FixedState.default || state instanceof _FreeState.default || state instanceof _ValueState.default) { length += 1; } state = state.child; } return length; } totalTextLength() { let state = this.initialState; let length = 0; while (state && !(state instanceof _EOLState.default)) { if (state instanceof _FixedState.default || state instanceof _FreeState.default || state instanceof _ValueState.default || state instanceof _OptionalValueState.default) { length += 1; } state = state.child; } return length; } acceptableValueLength() { let state = this.initialState; let length = 0; while (state && !(state instanceof _EOLState.default)) { if (state instanceof _FixedState.default || state instanceof _ValueState.default) { length += 1; } state = state.child; } return length; } totalValueLength() { let state = this.initialState; let length = 0; while (state && !(state instanceof _EOLState.default)) { if (state instanceof _FixedState.default || state instanceof _ValueState.default || state instanceof _OptionalValueState.default) { length += 1; } state = state.child; } return length; } appendPlaceholder(state, placeholder) { if (!state) { return placeholder; } if (state instanceof _EOLState.default) { return placeholder; } if (state instanceof _FreeState.default || state instanceof _FixedState.default) { return this.appendPlaceholder(state.child, placeholder + state.ownCharacter); } if (state instanceof _ValueState.default || state instanceof _OptionalValueState.default) { if ("name" in state.stateType) { switch (state.stateType.name) { case _types.StateName.alphaNumeric: return this.appendPlaceholder(state.child, placeholder + "-"); case _types.StateName.literal: return this.appendPlaceholder(state.child, placeholder + "a"); case _types.StateName.numeric: return this.appendPlaceholder(state.child, placeholder + "0"); case "ellipsis": return placeholder; } } return this.appendPlaceholder(state.child, placeholder + state.stateType.character); } return placeholder; } noMandatoryCharactersLeftAfterState(state) { if (state instanceof _EOLState.default) { return true; } if (state instanceof _ValueState.default) { return state.isElliptical; } if (state instanceof _FixedState.default) { return false; } return this.noMandatoryCharactersLeftAfterState(state.nextState()); } } exports.Mask = Mask; var _default = exports.default = Mask; //# sourceMappingURL=Mask.js.map