@html-eslint/template-parser
Version:
HTML parser for template literals
96 lines (89 loc) • 2.58 kB
JavaScript
/**
* @import {AnyNode} from "es-html-parser"
* @import {
* TemplateHTMLVisitor,
* TemplateHTMLVisitorKeys
* } from "./types"
*/
const { NodeTypes } = require("es-html-parser");
/** @type {TemplateHTMLVisitorKeys} */
const visitorKeys = {
[]: ["children"],
[]: ["key", "startWrapper", "endWrapper", "value"],
[]: [],
[]: [],
[]: [],
[]: [],
[]: [],
[]: [],
[]: [],
[]: ["open", "close", "value"],
[]: [],
[]: [],
[]: [],
[]: ["open", "close", "attributes"],
[]: ["startWrapper", "value", "endWrapper"],
[]: [],
[]: [],
[]: [],
[]: [],
[]: [],
[]: [],
[]: [],
[]: [],
[]: [],
[]: [],
[]: [],
[]: [
"attributes",
"openStart",
"openEnd",
"close",
"value",
],
[]: [],
[]: [
"attributes",
"openStart",
"openEnd",
"close",
"value",
],
[]: [],
[]: ["openStart", "openEnd", "close", "children", "attributes"],
[]: [],
[]: [],
[]: [],
[]: [],
[]: [],
[]: [],
};
/**
* @param {AnyNode} node
* @param {TemplateHTMLVisitor} visitors
* @param {AnyNode | null} [parent]
*/
function traverse(node, visitors, parent) {
parent = parent || null;
// @ts-ignore
const enterVisitor = visitors[node.type];
// @ts-ignore
node.parent = parent;
enterVisitor && enterVisitor(node);
const nextKeys = visitorKeys[node.type];
nextKeys.forEach((key) => {
// @ts-ignore
const next = node[key];
if (Array.isArray(next)) {
next.forEach((n) => traverse(n, visitors, node));
} else if (next) {
traverse(next, visitors, node);
}
});
// @ts-ignore
const exitVisitor = visitors[`${node.type}:exit`];
exitVisitor && exitVisitor(node);
}
module.exports = {
traverse,
};