HTML.ts 968 B

123456789101112131415161718192021222324252627282930313233
  1. import { directive } from "../../../model/Directive";
  2. import { evaluateLater } from "../../../model/Evaluator";
  3. import { effect } from "../../../model/Reactivity";
  4. import { PupperNode } from "../Node";
  5. import dom2vdom from "@pupperjs/dom2vdom";
  6. import h from "virtual-dom/h";
  7. /**
  8. * @directive x-html
  9. * @description Sets an element inner HTML.
  10. */
  11. directive("html", async (node, { expression, scope }) => {
  12. const evaluate = evaluateLater(expression);
  13. await effect(async () => {
  14. try {
  15. const html = await evaluate(scope) as string;
  16. const evaluatedNode = dom2vdom(html, h) as VirtualDOM.VTree;
  17. node.appendChild(
  18. new PupperNode(evaluatedNode, node.parent, node.renderer)
  19. );
  20. node.removeAttribute("x-html");
  21. node.setDirty();
  22. } catch(e) {
  23. console.warn("[pupperjs] failed to set inner HTML:");
  24. console.error(e);
  25. }
  26. });
  27. });