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 lines
3.1KB

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