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.3KB

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