Skip to content

Instantly share code, notes, and snippets.

@SergProduction
Created September 13, 2019 13:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save SergProduction/d8a0afb44d2175febc0926fe9d85c1fd to your computer and use it in GitHub Desktop.
Save SergProduction/d8a0afb44d2175febc0926fe9d85c1fd to your computer and use it in GitHub Desktop.
const multiSplit = (str, delimeters) => {
let right = str;
const result = [];
for (let i = 0; i < delimeters.length; i++) {
const indexDel = right.indexOf(delimeters[i]);
if (indexDel === -1) continue;
result.push(right.slice(0, indexDel));
right = right.slice(indexDel + 1);
}
result.push(right);
return result;
};
const maskParse = () => {
let isDel = false;
let prevValue = "";
return (mask, validate, value) => {
isDel = prevValue.length > value.length;
const delimeters = validate.filter(m => !(m instanceof RegExp));
const regexps = validate.filter(m => m instanceof RegExp);
const target = multiSplit(value, delimeters);
const masks = multiSplit(mask, delimeters);
const isValid = target.every((partText, i) => regexps[i].test(partText));
if (isValid) {
const valueWithMask = target.reduce((acc, part, i) => {
if (part.length === masks[i].length && isDel === true && i === target.length-1) {
return acc + part.slice(0, -1)
}
else if (part.length === masks[i].length) {
return delimeters[i] !== undefined
? acc + part + delimeters[i]
: acc + part
}
else {
return acc + part
}
}, '')
prevValue = valueWithMask
return [
true,
valueWithMask
]
}
return [
false,
value
];
};
};
const ms = maskParse();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment