format-string-by-pattern
Version:
A module that formats a string based on a pattern
66 lines • 2.57 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
function shouldAppendLastSeparator(current, pattern, lastSeparator) {
return current.length + 1 === pattern.length && pattern.endsWith(lastSeparator);
}
function getFormattedString(pattern, value) {
if (!value) {
return value;
}
var cleanValue = String(value).replace(/[^\da-zA-Z\n|]/g, '');
var blockSizes = pattern
.split(/[^\da-zA-Z\n|]/g)
.filter(Boolean)
.map(function (b) { return b.length; });
var separators = pattern.split(/[\da-zA-Z\n|]/g).filter(Boolean);
var firstSeparator = separators[0];
var lastSeparator = separators[separators.length - 1];
if (pattern.startsWith(firstSeparator)) {
var afterReduce_1 = separators.reduce(function (acc, cur, index) {
var curBlockSize = blockSizes[index];
var beforeSlice = acc.value.slice(0, curBlockSize);
var afterSlice = acc.value.slice(curBlockSize);
var nextResult = beforeSlice ? acc.result.concat(cur, beforeSlice) : acc.result;
return {
result: nextResult,
value: afterSlice,
};
}, {
result: '',
value: cleanValue,
});
var res_1 = afterReduce_1.result.slice(0, pattern.length);
if (shouldAppendLastSeparator(res_1, pattern, lastSeparator)) {
return res_1.concat(lastSeparator);
}
return res_1;
}
var afterReduce = blockSizes.reduce(function (acc, cur, index) {
var curSeparator = separators[index] || '';
var replace = "$1" + curSeparator + "$2";
var curSlice = cur + acc.prevSlice + acc.prevSeparator.length;
var curRegex = new RegExp("(.{" + curSlice + "})(.)");
var curValue = acc.value.replace(curRegex, replace);
return {
prevSeparator: curSeparator,
prevSlice: curSlice,
value: curValue,
};
}, {
prevSeparator: '',
prevSlice: 0,
value: cleanValue,
});
var res = afterReduce.value.slice(0, pattern.length);
if (shouldAppendLastSeparator(res, pattern, lastSeparator)) {
return res.concat(lastSeparator);
}
return res;
}
function formatStringByPattern(pattern, value) {
return value === undefined
? function (curriedValue) { return getFormattedString(pattern, curriedValue); }
: getFormattedString(pattern, value);
}
exports.default = formatStringByPattern;
//# sourceMappingURL=index.js.map