You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

99 lines
3.4KB

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