vremel
Version:
JavaScript date utility library for Temporal API
74 lines • 2.34 kB
JavaScript
const regex = /''|'(?:''|[^'])+'|([a-zA-Z])\1*/g;
const unbalancedSingleQuotesErrorMessage = "Unbalanced single quotes. Use single quotes for escaping and two single quotes to represent actual single quote.";
function areSingleQuotesBalanced(format) {
let count = 0;
for (const char of format) {
if (char === `'`) {
count++;
}
}
return count % 2 === 0;
}
function unescapeTwoSingleQuotes(format) {
return format.replaceAll(`''`, `'`);
}
/** @internal */
export function replaceToken(pattern, replacer) {
if (!areSingleQuotesBalanced(pattern)) {
throw new Error(unbalancedSingleQuotesErrorMessage);
}
return pattern.replaceAll(regex, (match) => {
if (match === `''`) {
return `'`;
}
if (match.startsWith(`'`) && match.endsWith(`'`)) {
return unescapeTwoSingleQuotes(match.slice(1, match.length - 1));
}
return replacer(match);
});
}
function pushLiteral(tokens, literal) {
const previousToken = tokens[tokens.length - 1];
if (previousToken !== undefined && previousToken.type === "literal") {
previousToken.value += literal;
}
else {
tokens.push({
type: "literal",
value: literal,
});
}
}
/** @internal */
export function tokenize(pattern) {
if (!areSingleQuotesBalanced(pattern)) {
throw new Error(unbalancedSingleQuotesErrorMessage);
}
let lastIndex = 0;
const tokens = [];
for (const match of pattern.matchAll(regex)) {
if (match.index > lastIndex) {
pushLiteral(tokens, pattern.slice(lastIndex, match.index));
}
const fragment = match[0];
if (fragment === `''`) {
pushLiteral(tokens, `'`);
}
else if (fragment.startsWith(`'`) && fragment.endsWith(`'`)) {
pushLiteral(tokens, unescapeTwoSingleQuotes(fragment.slice(1, fragment.length - 1)));
}
else {
tokens.push({
type: "field",
value: fragment,
});
}
lastIndex = match.index + fragment.length;
}
if (lastIndex < pattern.length) {
// rest
pushLiteral(tokens, pattern.slice(lastIndex));
}
return tokens;
}
//# sourceMappingURL=_ldmrDatePattern.js.map