very-small-parser
Version:
A very small Markdown, HTML, and CSS parser.
61 lines (60 loc) • 2.15 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.dhe = exports.repAll = exports.rep = exports.regexParser = exports.first = exports.loop = exports.loop0 = exports.token = void 0;
const isTest = process.env.NODE_ENV !== 'production';
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;
};
exports.token = token;
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];
};
exports.loop0 = loop0;
const loop = (parser, tokenizer, src) => (0, exports.loop0)(parser, tokenizer, src)[0];
exports.loop = loop;
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;
};
};
exports.first = first;
const regexParser = (type, reg, childrenMatchIndex) => (parser, value) => {
const matches = value.match(reg);
return matches ? (0, exports.token)(matches[0], type, parser.parse(matches[childrenMatchIndex])) : void 0;
};
exports.regexParser = regexParser;
const rep = (search, replace, str) => str.replace(search, replace);
exports.rep = rep;
const repAll = (search, replace, str) => str.replaceAll(search, replace);
exports.repAll = repAll;
const textarea = typeof document === 'object' ? document.createElement('textarea') : void 0;
/** Decode HTML entities. */
const dhe = (html) => (textarea ? ((textarea.innerHTML = html), textarea.value) : html);
exports.dhe = dhe;
;