index.html 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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. }
  49. CreateTextNode(self, edit) {
  50. self.stack.push(document.createTextNode(edit.text));
  51. }
  52. CreateElement(self, edit) {
  53. const tagName = edit.tag;
  54. console.log(`creating element: `, edit);
  55. self.stack.push(document.createElement(tagName));
  56. }
  57. CreateElementNs(self, edit) {
  58. self.stack.push(document.createElementNS(edit.ns, edit.tag));
  59. }
  60. CreatePlaceholder(self, edit) {
  61. const a = `self.stack.push(document.createElement("pre"))`;
  62. self.stack.push(document.createComment("vroot"));
  63. }
  64. NewEventListener(self, edit) {
  65. }
  66. RemoveEventListener(self, edit) {
  67. }
  68. SetText(self, edit) {
  69. self.top().textContent = edit.text;
  70. }
  71. SetAttribute(self, edit) {
  72. const name = edit.field;
  73. const value = edit.value;
  74. const node = self.top(self.stack);
  75. node.setAttribute(name, value);
  76. if ((name === "value", self)) {
  77. node.value = value;
  78. }
  79. if ((name === "checked", self)) {
  80. node.checked = true;
  81. }
  82. if ((name === "selected", self)) {
  83. node.selected = true;
  84. }
  85. }
  86. RemoveAttribute(self, edit) {
  87. const name = edit.field;
  88. const node = self.top(self.stack);
  89. node.removeAttribute(name);
  90. if ((name === "value", self)) {
  91. node.value = null;
  92. }
  93. if ((name === "checked", self)) {
  94. node.checked = false;
  95. }
  96. if ((name === "selected", self)) {
  97. node.selected = false;
  98. }
  99. }
  100. }
  101. const op_table = new OPTABLE();
  102. async function initialize() {
  103. const reply = await rpc.call('initiate');
  104. const interpreter = new Interpreter(window.document.getElementById("_dioxusroot"));
  105. console.log(reply);
  106. for (let x = 0; x < reply.length; x++) {
  107. let edit = reply[x];
  108. console.log(edit);
  109. op_table[edit.type](interpreter, edit);
  110. }
  111. console.log("stack completed: ", interpreter.stack);
  112. }
  113. console.log("initializing...");
  114. initialize();
  115. </script>
  116. </head>
  117. <body>
  118. <div id="_dioxusroot">
  119. </div>
  120. </body>
  121. </html>