class KatexExpressionShim extends HTMLElement {
    static observedAttributes = ["expression", "katex-options"];
    targetSpan;

    constructor() {
        super();
    }

    doRender() {
        if (!this.targetSpan) return;

        const options = this.hasAttribute("katex-options") ?
            this.getAttribute("katex-options") : {};
        katex.render(
            this.getAttribute("expression"),
            this.targetSpan,
            JSON.parse(options)
        );
    }

    connectedCallback() {
        this.targetSpan = document.createElement('span');
        this.appendChild(this.targetSpan);
        this.doRender();
    }

    attributeChangedCallback(name, oldValue, newValue) {
        this.doRender();
    }
}
customElements.define("katex-expression", KatexExpressionShim);
