@ribajs/core
Version:
Core module of Riba.js
72 lines (59 loc) • 1.7 kB
text/typescript
import { Tokens } from "./types/index.js";
import { BINDING, TEXT } from "./constants/parser.js";
/**
* Template parser and tokenizer for {{ mustache-style }} text content bindings.
* Parses the template and returns a set of tokens, separating static portions
* of text from binding declarations.
* @param template
* @param delimiters
*/
export function parseTemplate(template: string, delimiters: string[]) {
let tokens: Tokens[] | null = null;
const length = template.length;
let index = 0;
let lastIndex = 0;
const open = delimiters[0];
const close = delimiters[1];
while (lastIndex < length) {
index = template.indexOf(open, lastIndex);
if (index < 0) {
if (tokens) {
tokens.push({
type: TEXT,
value: template.slice(lastIndex),
});
}
break;
} else {
tokens = tokens || [];
if (index > 0 && lastIndex < index) {
tokens.push({
type: TEXT,
value: template.slice(lastIndex, index),
});
}
lastIndex = index + open.length;
index = template.indexOf(close, lastIndex);
if (index < 0) {
const substring = template.slice(lastIndex - open.length);
const lastToken = tokens[tokens.length - 1];
if (lastToken && lastToken.type === TEXT) {
lastToken.value += substring;
} else {
tokens.push({
type: TEXT,
value: substring,
});
}
break;
}
const value = template.slice(lastIndex, index).trim();
tokens.push({
type: BINDING,
value,
});
lastIndex = index + close.length;
}
}
return tokens;
}