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
JavaScript
"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