blah.html 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. class OPTABLE {
  2. PushRoot(self, edit) {
  3. const id = edit.root;
  4. const node = self.nodes[id];
  5. self.stack.push(node);
  6. }
  7. AppendChild(self, edit) {
  8. // todo: prevent merging of text nodes
  9. const node = self.pop();
  10. self.top().appendChild(node);
  11. }
  12. ReplaceWith(self, edit) {
  13. const newNode = self.pop();
  14. const oldNode = self.pop();
  15. oldNode.replaceWith(newNode);
  16. self.stack.push(newNode);
  17. }
  18. Remove(self, edit) {
  19. const node = self.stack.pop();
  20. node.remove();
  21. }
  22. RemoveAllChildren(self, edit) {
  23. // todo - we never actually call this one
  24. }
  25. CreateTextNode(self, edit) {
  26. self.stack.push(document.createTextNode(edit.text));
  27. }
  28. CreateElement(self, edit) {
  29. const tagName = edit.tag;
  30. console.log(`creating element! ${edit}`);
  31. self.stack.push(document.createElement(tagName));
  32. }
  33. CreateElementNs(self, edit) {
  34. self.stack.push(document.createElementNS(edit.ns, edit.tag));
  35. }
  36. CreatePlaceholder(self, edit) {
  37. self.stack.push(document.createElement("pre"));
  38. }
  39. NewEventListener(self, edit) {
  40. // todo
  41. }
  42. RemoveEventListener(self, edit) {
  43. // todo
  44. }
  45. SetText(self, edit) {
  46. self.top().textContent = edit.text;
  47. }
  48. SetAttribute(self, edit) {
  49. const name = edit.field;
  50. const value = edit.value;
  51. const node = self.top(self.stack);
  52. node.setAttribute(name, value);
  53. // Some attributes are "volatile" and don't work through `setAttribute`.
  54. if ((name === "value", self)) {
  55. node.value = value;
  56. }
  57. if ((name === "checked", self)) {
  58. node.checked = true;
  59. }
  60. if ((name === "selected", self)) {
  61. node.selected = true;
  62. }
  63. }
  64. RemoveAttribute(self, edit) {
  65. const name = edit.field;
  66. const node = self.top(self.stack);
  67. node.removeAttribute(name);
  68. // Some attributes are "volatile" and don't work through `removeAttribute`.
  69. if ((name === "value", self)) {
  70. node.value = null;
  71. }
  72. if ((name === "checked", self)) {
  73. node.checked = false;
  74. }
  75. if ((name === "selected", self)) {
  76. node.selected = false;
  77. }
  78. }
  79. }
  80. // const op_table = new OPTABLE();
  81. // const interpreter = new Interpreter(window.document.body);
  82. // function EditListReceived(rawEditList) {
  83. // let editList = JSON.parse(rawEditList);
  84. // console.warn("hnelllo");
  85. // editList.forEach(function (edit, index) {
  86. // console.log(edit);
  87. // op_table[edit.type](interpreter, edit);
  88. // });
  89. // }
  90. // async function rinalize() {
  91. // console.log("initialize...");
  92. // let edits = await rpc.call("initiate");
  93. // console.error(edits);
  94. // }