UNPKG

eslint-plugin-logical-properties

Version:
96 lines (95 loc) 2.81 kB
export const stringToTemplate = (input) => { let toParse = input; let index = toParse.indexOf(' '); const quasis = []; const expressions = []; const queue = []; let queuePointer = quasis; let toClose = 0; let justAddedExpression = false; const matchSegment = (current) => { if (/[(){}]/.test(current) || toClose !== 0) { if (queuePointer === quasis && queue.length > 0) { quasis.push(queue.join(' ')); queue.length = 0; } queuePointer = expressions; if (quasis.length === 0 || justAddedExpression) { quasis.push(''); } justAddedExpression = false; const open = current.match(/([({])/g)?.length ?? 0; const closed = current.match(/([)}])/g)?.length ?? 0; toClose = toClose + open - closed; queue.push(current); if (toClose === 0) { expressions.push(queue.join(' ')); queue.length = 0; justAddedExpression = true; } } else { if (queuePointer === expressions && queue.length > 0) { expressions.push(queue.join(' ')); queue.length = 0; } queuePointer = quasis; queue.push(current); } }; while (index >= 0) { const current = toParse.slice(0, index); matchSegment(current); toParse = toParse.slice(index + 1); index = toParse.indexOf(' '); } if (toParse.length > 0) { matchSegment(toParse); } if (queue.length > 0) { if (queuePointer === quasis) { quasis.push(queue.join(' ')); } else { expressions.push(queue.join(' ')); } } if (quasis.length === expressions.length) { quasis.push(''); } return { quasis, expressions, }; }; export const getToken = (index = 0) => { const tag = `<!token-${index}>`; return tag; }; export const tokenizeString = (input) => { const quasis = [...input.quasis]; const expressions = [...input.expressions]; const pieces = []; let pointer = quasis; const tokens = []; while (quasis.length + expressions.length) { const current = pointer.shift(); if (pointer === quasis) { pieces.push(current); pointer = expressions; } else { const tag = getToken(tokens.length); pieces.push(tag); tokens.push([tag, current]); pointer = quasis; } } const result = pieces.join(' ') .trim() .replaceAll(/(\s)\s+/g, '$1'); return { output: result, tokens, }; };