Home Reference Source Repository

src/parse.js

import htmlparser from 'htmlparser2';

/**
 * @param {string} html
 * @param {Node} node
 */
export default function parse(html, node) {
    const stack = [node];
    const last = () => stack.length === 0 ? null : stack[stack.length - 1];

    const document = node.ownerDocument;

    const parser = new htmlparser.Parser({
        onopentagname(name) {
            const elt = document.createElement(name);
            stack.push(elt);
        },

        onattribute(name, value) {
            last().setAttribute(name, value);
        },

        ontext(text) {
            last().appendChild(document.createTextNode(text));
        },

        onclosetag(name) {
            const elt = stack.pop();
            last().appendChild(elt);
        },

        oncomment(data) {
            last().appendChild(document.createComment(data));
        },
    }, { recognizeSelfClosing: true });
    parser.write(html);
    parser.end();
}