index.html 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <!-- <link href="https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css" rel="stylesheet" /> -->
  5. <script>
  6. class Interpreter {
  7. constructor(root) {
  8. this.stack = [root];
  9. this.listeners = {};
  10. this.lastNodeWasText = false;
  11. this.nodes = {
  12. 0: root
  13. };
  14. }
  15. top() {
  16. return this.stack[this.stack.length - 1];
  17. }
  18. pop() {
  19. return this.stack.pop();
  20. }
  21. }
  22. class OPTABLE {
  23. PushRoot(self, edit) {
  24. const id = edit.root;
  25. const node = self.nodes[id];
  26. self.stack.push(node);
  27. }
  28. AppendChildren(self, edit) {
  29. let root = self.stack[self.stack.length - (edit.many + 1)];
  30. for (let i = 0; i < edit.many; i++) {
  31. console.log("popping ", i, edit.many);
  32. let node = self.pop();
  33. root.appendChild(node);
  34. }
  35. }
  36. ReplaceWith(self, edit) {
  37. let root = self.stack[self.stack.length - (edit.many + 1)];
  38. let els = [];
  39. for (let i = 0; i < edit.many; i++) {
  40. els.push(self.pop());
  41. }
  42. root.replaceWith(...els);
  43. }
  44. Remove(self, edit) {
  45. const node = self.stack.pop();
  46. node.remove();
  47. }
  48. RemoveAllChildren(self, edit) {
  49. }
  50. CreateTextNode(self, edit) {
  51. self.stack.push(document.createTextNode(edit.text));
  52. }
  53. CreateElement(self, edit) {
  54. const tagName = edit.tag;
  55. console.log(`creating element: `, edit);
  56. self.stack.push(document.createElement(tagName));
  57. }
  58. CreateElementNs(self, 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. }
  67. RemoveEventListener(self, edit) {
  68. }
  69. SetText(self, edit) {
  70. self.top().textContent = edit.text;
  71. }
  72. SetAttribute(self, edit) {
  73. const name = edit.field;
  74. const value = edit.value;
  75. const node = self.top(self.stack);
  76. node.setAttribute(name, value);
  77. if ((name === "value", self)) {
  78. node.value = value;
  79. }
  80. if ((name === "checked", self)) {
  81. node.checked = true;
  82. }
  83. if ((name === "selected", self)) {
  84. node.selected = true;
  85. }
  86. }
  87. RemoveAttribute(self, edit) {
  88. const name = edit.field;
  89. const node = self.top(self.stack);
  90. node.removeAttribute(name);
  91. if ((name === "value", self)) {
  92. node.value = null;
  93. }
  94. if ((name === "checked", self)) {
  95. node.checked = false;
  96. }
  97. if ((name === "selected", self)) {
  98. node.selected = false;
  99. }
  100. }
  101. }
  102. function EditListReceived(rawEditList) {
  103. let editList = JSON.parse(rawEditList);
  104. console.warn("hnelllo");
  105. editList.forEach(function (edit, index) {
  106. console.log(edit);
  107. op_table[edit.type](interpreter, edit);
  108. });
  109. }
  110. const op_table = new OPTABLE();
  111. async function initialize() {
  112. const reply = await rpc.call('initiate');
  113. const interpreter = new Interpreter(window.document.getElementById("app").firstChild);
  114. console.log(reply);
  115. for (let x = 0; x < reply.length; x++) {
  116. let edit = reply[x];
  117. console.log(edit);
  118. op_table[edit.type](interpreter, edit);
  119. }
  120. console.log("stack completed: ", interpreter.stack);
  121. }
  122. console.log("initializing...");
  123. initialize();
  124. </script>
  125. </head>
  126. <body>
  127. <div id="app">
  128. _
  129. </div>
  130. </body>
  131. </html>