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.

95 lines
2.8KB

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