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.

85 lines
2.5KB

  1. function Редактор(события, имяОбласти)
  2. {
  3. this.создать = function()
  4. {
  5. this.установитьAce();
  6. this.улавливатьЗавершениеРедактирования();
  7. события.подписать(this);
  8. };
  9. this.обработатьСобытие = function(событие)
  10. {
  11. if (событие == "завершили редактирование")
  12. {
  13. this.проверитьКорректностьКода();
  14. }
  15. };
  16. this.установитьAce = function()
  17. {
  18. var область = document.getElementById(имяОбласти);
  19. this.ace = window.ace.edit(имяОбласти);
  20. this.ace.session.setMode("ace/mode/javascript");
  21. }
  22. this.улавливатьЗавершениеРедактирования = function()
  23. {
  24. var тут = this;
  25. this.ace.session.on("change", function(дельта) {
  26. const билет = тут.uuid();
  27. тут.билет = билет;
  28. setTimeout(
  29. function()
  30. {
  31. if (билет == тут.билет)
  32. {
  33. события.уведомить("завершили редактирование");
  34. }
  35. },
  36. 1000
  37. );
  38. });
  39. };
  40. this.проверитьКорректностьКода = function()
  41. {
  42. try
  43. {
  44. eval(this.ace.session.getValue());
  45. события.уведомить("код корректен");
  46. }
  47. catch (ошибка)
  48. {
  49. события.уведомить("код некорректен");
  50. }
  51. };
  52. this.в64 = function(строка)
  53. {
  54. var байты = new TextEncoder("utf-8").encode(строка);
  55. return base64js.fromByteArray(байты);
  56. };
  57. this.из64 = function(строка)
  58. {
  59. var байты = base64js.toByteArray(строка);
  60. return new TextDecoder("utf-8").decode(байты);
  61. };
  62. this.uuid = function()
  63. {
  64. // https://stackoverflow.com/a/2117523
  65. return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(
  66. /[xy]/g,
  67. function(c)
  68. {
  69. var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
  70. return v.toString(16);
  71. }
  72. );
  73. };
  74. // Конструктор.
  75. this.создать();
  76. }