128 行
4.6KB

  1. function Редактор(события, имяРедактора)
  2. {
  3. this.создать = function()
  4. {
  5. this.первоначальныйЗаголовок = document.title;
  6. this.установитьAce();
  7. this.улавливатьЗавершениеРедактирования();
  8. this.задатьКодПриЗапуске();
  9. события.подписать(this);
  10. };
  11. this.задатьКодПриЗапуске = function()
  12. {
  13. var z64 = мир.параметрыЗапуска()["z64"];
  14. if (z64)
  15. {
  16. var код = мир.изZ64(z64);
  17. this.ace.session.setValue(код);
  18. }
  19. };
  20. this.запуститьОтдельно = function()
  21. {
  22. var содержимое = this.ace.session.getValue();
  23. var z64 = мир.вZ64(содержимое);
  24. var путь = window.location.pathname + "/../игра.html?z64=" + z64;
  25. window.open(путь);
  26. };
  27. this.исполнитьКод = function()
  28. {
  29. var содержимое = this.ace.session.getValue();
  30. var z64 = мир.вZ64(содержимое);
  31. // Исполняем явно код лишь первый раз.
  32. var проигрыватель = document.getElementById("проигрыватель");
  33. if (!проигрыватель.src)
  34. {
  35. проигрыватель.src = "игра.html?z64=" + z64;
  36. }
  37. // После запуска уведомляем iframe о новом коде без перезагрузки.
  38. else
  39. {
  40. window.frames.проигрыватель.postMessage(z64, "*");
  41. }
  42. };
  43. this.обновитьАдреснуюСтрокуИЗаголовок = function()
  44. {
  45. var содержимое = this.ace.session.getValue();
  46. var z64 = мир.вZ64(содержимое);
  47. var путь = window.location.pathname + "?z64=" + z64;
  48. history.pushState(null, "", путь);
  49. document.title = `${this.первоначальныйЗаголовок} ${z64.length}:${z64.slice(z64.length - 5)}`;
  50. };
  51. this.обработатьСобытие = function(событие)
  52. {
  53. if (событие == "завершили редактирование")
  54. {
  55. this.обновитьАдреснуюСтрокуИЗаголовок();
  56. this.проверитьКорректностьКода();
  57. }
  58. else if (событие == "код корректен")
  59. {
  60. this.исполнитьКод();
  61. }
  62. else if (событие == "перезапустить")
  63. {
  64. this.перезапуститьКод();
  65. }
  66. else if (событие == "запустить отдельно")
  67. {
  68. this.запуститьОтдельно();
  69. }
  70. };
  71. this.перезапуститьКод = function()
  72. {
  73. var содержимое = this.ace.session.getValue();
  74. var z64 = мир.вZ64(содержимое);
  75. var проигрыватель = document.getElementById("проигрыватель");
  76. проигрыватель.src = "игра.html?z64=" + z64;
  77. };
  78. this.проверитьКорректностьКода = function()
  79. {
  80. try
  81. {
  82. eval(this.ace.session.getValue());
  83. события.уведомить("код корректен");
  84. }
  85. catch (ошибка)
  86. {
  87. события.уведомить("код некорректен");
  88. }
  89. };
  90. this.улавливатьЗавершениеРедактирования = function()
  91. {
  92. var тут = this;
  93. this.ace.session.on("change", function(дельта) {
  94. const билет = мир.uuid();
  95. тут.билет = билет;
  96. setTimeout(
  97. function()
  98. {
  99. if (билет == тут.билет)
  100. {
  101. события.уведомить("завершили редактирование");
  102. }
  103. },
  104. 300
  105. );
  106. });
  107. };
  108. this.установитьAce = function()
  109. {
  110. var область = document.getElementById(имяРедактора);
  111. this.ace = window.ace.edit(имяРедактора);
  112. this.ace.session.setMode("ace/mode/javascript");
  113. this.ace.session.setUseWrapMode(true);
  114. };
  115. // Конструктор.
  116. this.создать();
  117. }