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.

111 lines
3.4KB

  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 z64 = this.вZ64(содержимое);
  24. /**/console.debug("ИГР z64:", z64);
  25. /**/console.debug("ИГР обратно:", this.изZ64(z64));
  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.в64 = function(строка)
  64. {
  65. var байты = new TextEncoder("utf-8").encode(строка);
  66. return base64js.fromByteArray(байты);
  67. };
  68. this.вZ64 = function(строка)
  69. {
  70. var байты = new TextEncoder("utf-8").encode(строка);
  71. var сжатиеZip = window.pako.deflate(байты, {to: 'string'});
  72. return this.в64(сжатиеZip);
  73. };
  74. this.из64 = function(шифр)
  75. {
  76. var байты = base64js.toByteArray(шифр);
  77. return new TextDecoder("utf-8").decode(байты);
  78. };
  79. this.изZ64 = function(шифр)
  80. {
  81. var сжатиеZip = this.из64(шифр);
  82. var байты = window.pako.inflate(сжатиеZip)
  83. return new TextDecoder("utf-8").decode(байты);
  84. };
  85. this.uuid = function()
  86. {
  87. // https://stackoverflow.com/a/2117523
  88. return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(
  89. /[xy]/g,
  90. function(c)
  91. {
  92. var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
  93. return v.toString(16);
  94. }
  95. );
  96. };
  97. // Конструктор.
  98. this.создать();
  99. }