very-small-parser
Version:
A very small Markdown, HTML, and CSS parser.
50 lines (49 loc) • 1.78 kB
JavaScript
const isTest = process.env.NODE_ENV !== 'production';
export const token = (value, type, children, overrides, len = value.length) => {
const tok = { type, len };
if (isTest)
tok.raw = value;
if (children)
tok.children = children;
if (overrides)
Object.assign(tok, overrides);
return tok;
};
export const loop0 = (parser, tokenizer, src) => {
const children = [];
const end = src.length;
let remaining = src;
let length = 0;
while (length < end) {
const tok = tokenizer(parser, remaining);
if (!tok)
break;
if (tok.type)
children.push(tok);
length += tok.len || 0;
remaining = remaining.slice(tok.len);
}
return [children, length];
};
export const loop = (parser, tokenizer, src) => loop0(parser, tokenizer, src)[0];
export const first = (tokenizers) => {
const length = tokenizers.length;
return (parser, src) => {
for (let i = 0; i < length; i++) {
const tokenizer = tokenizers[i];
const tok = tokenizer(parser, src);
if (tok)
return tok;
}
return;
};
};
export const regexParser = (type, reg, childrenMatchIndex) => (parser, value) => {
const matches = value.match(reg);
return matches ? token(matches[0], type, parser.parse(matches[childrenMatchIndex])) : void 0;
};
export const rep = (search, replace, str) => str.replace(search, replace);
export const repAll = (search, replace, str) => str.replaceAll(search, replace);
const textarea = typeof document === 'object' ? document.createElement('textarea') : void 0;
/** Decode HTML entities. */
export const dhe = (html) => (textarea ? ((textarea.innerHTML = html), textarea.value) : html);