tovnode.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import { addNS } from "./h";
  2. import { vnode } from "./vnode";
  3. import { htmlDomApi } from "./htmldomapi";
  4. export function toVNode(node, domApi) {
  5. const api = domApi !== undefined ? domApi : htmlDomApi;
  6. let text;
  7. if (api.isElement(node)) {
  8. const id = node.id ? "#" + node.id : "";
  9. const cn = node.getAttribute("class");
  10. const c = cn ? "." + cn.split(" ").join(".") : "";
  11. const sel = api.tagName(node).toLowerCase() + id + c;
  12. const attrs = {};
  13. const dataset = {};
  14. const data = {};
  15. const children = [];
  16. let name;
  17. let i, n;
  18. const elmAttrs = node.attributes;
  19. const elmChildren = node.childNodes;
  20. for (i = 0, n = elmAttrs.length; i < n; i++) {
  21. name = elmAttrs[i].nodeName;
  22. if (name[0] === "d" &&
  23. name[1] === "a" &&
  24. name[2] === "t" &&
  25. name[3] === "a" &&
  26. name[4] === "-") {
  27. dataset[name.slice(5)] = elmAttrs[i].nodeValue || "";
  28. }
  29. else if (name !== "id" && name !== "class") {
  30. attrs[name] = elmAttrs[i].nodeValue;
  31. }
  32. }
  33. for (i = 0, n = elmChildren.length; i < n; i++) {
  34. children.push(toVNode(elmChildren[i], domApi));
  35. }
  36. if (Object.keys(attrs).length > 0)
  37. data.attrs = attrs;
  38. if (Object.keys(dataset).length > 0)
  39. data.dataset = dataset;
  40. if (sel[0] === "s" &&
  41. sel[1] === "v" &&
  42. sel[2] === "g" &&
  43. (sel.length === 3 || sel[3] === "." || sel[3] === "#")) {
  44. addNS(data, children, sel);
  45. }
  46. return vnode(sel, data, children, undefined, node);
  47. }
  48. else if (api.isText(node)) {
  49. text = api.getTextContent(node);
  50. return vnode(undefined, undefined, undefined, text, node);
  51. }
  52. else if (api.isComment(node)) {
  53. text = api.getTextContent(node);
  54. return vnode("!", {}, [], text, node);
  55. }
  56. else {
  57. return vnode("", {}, [], undefined, node);
  58. }
  59. }
  60. //# sourceMappingURL=tovnode.js.map