選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

100.редактор.js 4.3KB

3年前
3年前
3年前
3年前
3年前
3年前
3年前
3年前
3年前
3年前
3年前
3年前
3年前
3年前
3年前
3年前
3年前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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.в64(содержимое);
  24. var из = this.из64(в);
  25. /**/console.debug("ИГР в/из", в, из);
  26. /**/console.debug("ИГР-01 содержимое:", содержимое);
  27. var байты1 = new TextEncoder("utf-8").encode(содержимое);
  28. /**/console.debug("ИГР-02 байты1:", байты1);
  29. var архив1 = pako.deflate(байты1, { to: 'string' });
  30. /**/console.debug("ИГР-03 архив1:", архив1);
  31. var z64 = base64js.fromByteArray(архив1);
  32. /**/console.debug("ИГР-04 z64:", z64);
  33. var архив2 = base64js.toByteArray(z64);
  34. /**/console.debug("ИГР-05 архив2:", архив2);
  35. var байты2 = pako.inflate(архив2);
  36. /**/console.debug("ИГР-06 байты2:", байты2);
  37. var текст = new TextDecoder("utf-8").decode(байты2);
  38. /**/console.debug("ИГР-07 текст", текст);
  39. };
  40. this.установитьAce = function()
  41. {
  42. var область = document.getElementById(имяОбласти);
  43. this.ace = window.ace.edit(имяОбласти);
  44. this.ace.session.setMode("ace/mode/javascript");
  45. }
  46. this.улавливатьЗавершениеРедактирования = function()
  47. {
  48. var тут = this;
  49. this.ace.session.on("change", function(дельта) {
  50. const билет = тут.uuid();
  51. тут.билет = билет;
  52. setTimeout(
  53. function()
  54. {
  55. if (билет == тут.билет)
  56. {
  57. события.уведомить("завершили редактирование");
  58. }
  59. },
  60. 1000
  61. );
  62. });
  63. };
  64. this.проверитьКорректностьКода = function()
  65. {
  66. try
  67. {
  68. eval(this.ace.session.getValue());
  69. события.уведомить("код корректен");
  70. }
  71. catch (ошибка)
  72. {
  73. события.уведомить("код некорректен");
  74. }
  75. };
  76. this.в64 = function(строка)
  77. {
  78. var байты = new TextEncoder("utf-8").encode(строка);
  79. return base64js.fromByteArray(байты);
  80. };
  81. this.из64 = function(шифр)
  82. {
  83. var байты = base64js.toByteArray(шифр);
  84. return new TextDecoder("utf-8").decode(байты);
  85. };
  86. /*
  87. this.вZ64 = function(строка)
  88. {
  89. var байты = new TextEncoder("utf-8").encode(строка);
  90. var архив = pako.deflate(байты, { to: 'string' });
  91. var ret = this.в64(архив);
  92. return ret
  93. };
  94. this.изZ64 = function(шифр)
  95. {
  96. //var архив = this.из64(шифр);
  97. var архив = base64js.toByteArray(шифр);
  98. var байты = null;
  99. try {
  100. байты = pako.inflate(архив);
  101. } catch (err) {
  102. console.error(err);
  103. }
  104. var ret = new TextDecoder("utf-8").decode(байты);
  105. return ret;
  106. };
  107. */
  108. this.uuid = function()
  109. {
  110. // https://stackoverflow.com/a/2117523
  111. return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(
  112. /[xy]/g,
  113. function(c)
  114. {
  115. var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
  116. return v.toString(16);
  117. }
  118. );
  119. };
  120. // Конструктор.
  121. this.создать();
  122. }