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.

100.Редактор.js 4.4KB

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