UNPKG

very-small-parser

Version:

A very small Markdown, HTML, and CSS parser.

50 lines (49 loc) 1.78 kB
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);