index.html 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <script>
  5. class Interpreter {
  6. constructor(root) {
  7. this.stack = [root];
  8. this.listeners = {};
  9. this.lastNodeWasText = false;
  10. this.nodes = {
  11. 0: root
  12. };
  13. }
  14. top() {
  15. return this.stack[this.stack.length - 1];
  16. }
  17. pop() {
  18. return this.stack.pop();
  19. }
  20. }
  21. class OPTABLE {
  22. PushRoot(self, edit) {
  23. const id = edit.root;
  24. const node = self.nodes[id];
  25. self.stack.push(node);
  26. }
  27. AppendChildren(self, edit) {
  28. let root = self.stack[self.stack.length - (edit.many + 1)];
  29. for (let i = 0; i < edit.many; i++) {
  30. console.log("popping ", i, edit.many);
  31. let node = self.pop();
  32. root.appendChild(node);
  33. }
  34. }
  35. ReplaceWith(self, edit) {
  36. let root = self.stack[self.stack.length - (edit.many + 1)];
  37. let els = [];
  38. for (let i = 0; i < edit.many; i++) {
  39. els.push(self.pop());
  40. }
  41. root.replaceWith(...els);
  42. }
  43. Remove(self, edit) {
  44. const node = self.stack.pop();
  45. node.remove();
  46. }
  47. RemoveAllChildren(self, edit) {}
  48. CreateTextNode(self, edit) {
  49. self.stack.push(document.createTextNode(edit.text));
  50. }
  51. CreateElement(self, edit) {
  52. const tagName = edit.tag;
  53. console.log(`creating element: `, edit);
  54. self.stack.push(document.createElement(tagName));
  55. }
  56. CreateElementNs(self, edit) {
  57. const tagName = edit.tag;
  58. console.log(`creating namespaced element: `, edit);
  59. self.stack.push(document.createElementNS(edit.ns, edit.tag));
  60. }
  61. CreatePlaceholder(self, edit) {
  62. const a = `self.stack.push(document.createElement("pre"))`;
  63. self.stack.push(document.createComment("vroot"));
  64. }
  65. NewEventListener(self, edit) {}
  66. RemoveEventListener(self, edit) {}
  67. SetText(self, edit) {
  68. self.top().textContent = edit.text;
  69. }
  70. SetAttribute(self, edit) {
  71. const name = edit.field;
  72. const value = edit.value;
  73. const ns = edit.ns;
  74. const node = self.top(self.stack);
  75. if (ns == "style") {
  76. node.style[name] = value;
  77. } else if (ns !== undefined) {
  78. node.setAttributeNS(ns, name, value);
  79. } else {
  80. node.setAttribute(name, value);
  81. }
  82. if ((name === "value", self)) {
  83. node.value = value;
  84. }
  85. if ((name === "checked", self)) {
  86. node.checked = true;
  87. }
  88. if ((name === "selected", self)) {
  89. node.selected = true;
  90. }
  91. }
  92. RemoveAttribute(self, edit) {
  93. const name = edit.field;
  94. const node = self.top(self.stack);
  95. node.removeAttribute(name);
  96. if ((name === "value", self)) {
  97. node.value = null;
  98. }
  99. if ((name === "checked", self)) {
  100. node.checked = false;
  101. }
  102. if ((name === "selected", self)) {
  103. node.selected = false;
  104. }
  105. }
  106. }
  107. const op_table = new OPTABLE();
  108. async function initialize() {
  109. const reply = await rpc.call('initiate');
  110. const interpreter = new Interpreter(window.document.getElementById("_dioxusroot"));
  111. console.log(reply);
  112. for (let x = 0; x < reply.length; x++) {
  113. let edit = reply[x];
  114. console.log(edit);
  115. op_table[edit.type](interpreter, edit);
  116. }
  117. console.log("stack completed: ", interpreter.stack);
  118. }
  119. console.log("initializing...");
  120. initialize();
  121. </script>
  122. </head>
  123. <body>
  124. <div id="_dioxusroot">
  125. </div>
  126. </body>
  127. </html>