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.

129 lines
4.7KB

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