Вторая версия редактора ГитЖС в виде интегрированной среды разработки | Second version of GitJS editor in the form of an integrated development environment
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.

354 lines
10KB

  1. const ИМЯ = "Редактор | Editor";
  2. // // // //
  3. ЗадатьВременноеСодержимое = function(мир)
  4. {
  5. мир.временноеСодержимое = {};
  6. };
  7. // // // //
  8. ЗадатьКнопкуСохранения = function(мир)
  9. {
  10. var кнопка = мир.макет.элементы.действие
  11. .replace("${название}", "💾")
  12. .replace(/\$\{id\}/g, `${мир.макет.константы.сохранить}`)
  13. ;
  14. $(`#${мир.макет.константы.действия}`).append(кнопка);
  15. $(`#${мир.макет.константы.сохранить}-ссылка`).click(function() {
  16. мир.уведомить("выбрали сохранить");
  17. });
  18. };
  19. // // // //
  20. НастроитьОтслеживаниеРедактирования = function(мир)
  21. {
  22. мир.отслеживатьРедактирование = true;
  23. мир.редактор.session.on("change", function(delta) {
  24. if (мир.отслеживатьРедактирование)
  25. {
  26. мир.уведомить("редактирование");
  27. }
  28. });
  29. };
  30. // // // //
  31. ВыбратьУказанныйФайл = function(мир)
  32. {
  33. мир.номерВыбранногоФайла = мир.файлы.indexOf(мир.файл);
  34. мир.уведомить("выбрали файл");
  35. }
  36. // // // //
  37. ВыбратьПервыйФайл = function(мир)
  38. {
  39. мир.номерВыбранногоФайла = 0;
  40. мир.уведомить("выбрали файл");
  41. }
  42. // // // //
  43. ПроверитьНаличиеУказанногоФайла = function(мир)
  44. {
  45. if (
  46. мир.файл &&
  47. мир.файлы.includes(мир.файл)
  48. ) {
  49. мир.уведомить("указанный файл существует");
  50. }
  51. else
  52. {
  53. мир.уведомить("указанный файл не существует");
  54. }
  55. };
  56. // // // //
  57. НастроитьAce = function(мир)
  58. {
  59. мир.редактор = window.ace.edit("редактор");
  60. мир.редактор.session.setMode("ace/mode/javascript");
  61. };
  62. // // // //
  63. ОтслеживатьВыборФайла = function(мир)
  64. {
  65. var id = мир.макет.константы.файл;
  66. for (var номер in мир.файлы)
  67. {
  68. const номерФайла = номер;
  69. $(`#${id}-${номер}-ссылка`).click(function() {
  70. мир.номерВыбранногоФайла = номерФайла;
  71. мир.уведомить("выбрали файл");
  72. });
  73. }
  74. };
  75. // // // //
  76. ЗадатьСписокФайлов = function(мир)
  77. {
  78. var м = мир.редактируемыйМодуль;
  79. мир.файлы = Object.keys(м.структура).sort();
  80. var содержимое = "";
  81. var заголовок = мир.макет.элементы.заголовокМеню.replace("${название}", "📦 " + м.имя);
  82. содержимое += заголовок;
  83. var id = мир.макет.константы.файл;
  84. for (var номер in мир.файлы)
  85. {
  86. var файл = мир.файлы[номер];
  87. содержимое += мир.макет.элементы.пунктМеню
  88. .replace("${название}", файл)
  89. .replace(/\$\{id\}/g, `${id}-${номер}`)
  90. ;
  91. }
  92. $(`#${мир.макет.константы.меню}`).html(содержимое);
  93. };
  94. // // // //
  95. УведомитьОбОшибкеЗагрузкиСодержимогоРедактируемогоМодуля = function(мир)
  96. {
  97. var сообщение = "ОШИБКА Не удалось загрузить редактируемый модуль из хранилища бразуера | ERROR The module to be edited couldn't be loaded from the browser's storage";
  98. console.error(сообщение);
  99. console.error(мир.указатель);
  100. $(`#${мир.макет.константы.содержимое}`).html(`
  101. <div class="ошибка">
  102. <p>${сообщение}</p>
  103. <p>${мир.указатель}</p>
  104. </div>
  105. `);
  106. };
  107. // // // //
  108. ЗагрузитьСодержимоеРедактируемогоМодуля = function(мир)
  109. {
  110. // Пропускаем загрузку, если содержимое уже присутствует.
  111. if (мир.редактируемыйМодуль.содержимое)
  112. {
  113. мир.уведомить("загрузили содержимое");
  114. return;
  115. }
  116. // Загружаем содержимое.
  117. мир.модули.загрузилиСодержимоеСохранённогоМодуля.подписатьРаз(function() {
  118. мир.уведомить("загрузили содержимое");
  119. });
  120. мир.модули.неЗагрузилиСодержимоеСохранённогоМодуля.подписатьРаз(function() {
  121. мир.уведомить("не загрузили содержимое");
  122. });
  123. мир.модули.загрузитьСодержимоеСохранённогоМодуля(мир.указатель);
  124. };
  125. // // // //
  126. ПродолжитьЗагрузку = мир =>
  127. {
  128. мир.уведомить("загрузили содержимое");
  129. };
  130. // // // //
  131. ЗадатьПараметрМодуляРедактором = function(мир)
  132. {
  133. задатьПараметрВСтрокеПоиска("📦", мир.редактируемыйМодуль.указатель);
  134. };
  135. // // // //
  136. НазначитьРедактируемымМодульРедактора = function(мир)
  137. {
  138. мир.редактируемыйМодуль = мир.модули.модульПоИмени(ИМЯ);
  139. };
  140. // // // //
  141. ПроверитьНаличиеРедактируемогоМодуля = function(мир)
  142. {
  143. мир.редактируемыйМодуль = мир.модули.модульПоУказателю(мир.указатель);
  144. if (мир.редактируемыйМодуль)
  145. {
  146. мир.уведомить("редактируемый модуль существует");
  147. }
  148. else
  149. {
  150. мир.уведомить("редактируемый модуль не существует");
  151. }
  152. };
  153. // // // //
  154. ЗадатьЗаголовокИВерсию = function(мир)
  155. {
  156. var м = мир.ведущийМодуль;
  157. $(`#${мир.макет.константы.заголовок}`).text(м.имя);
  158. $(`#${мир.макет.константы.версия}`).text(м.версия);
  159. };
  160. // // // //
  161. ОчиститьМакетОтЗаглушек = function(мир)
  162. {
  163. $(`#${мир.макет.константы.заголовок}`).text("");
  164. $(`#${мир.макет.константы.версия}`).text("");
  165. $(`#${мир.макет.константы.действия}`).text("");
  166. $(`#${мир.макет.константы.меню}`).text("");
  167. };
  168. // // // //
  169. УстановитьМакет = function(мир)
  170. {
  171. document.body.innerHTML = мир.макет.структура;
  172. var вид = document.createElement("style");
  173. document.head.appendChild(вид);
  174. вид.innerHTML = мир.макет.вид;
  175. };
  176. // // // //
  177. НастроитьМакет = function(мир)
  178. {
  179. // Вырезаем тело из макета.
  180. var html = мир.макет.структура;
  181. var начало = html.indexOf("<!-- МАКЕТ_НАЧАЛО -->");
  182. var конец = html.indexOf("<!-- МАКЕТ_КОНЕЦ -->");
  183. html = html.substring(начало, конец);
  184. var название = "редактор";
  185. мир.макет.константы = {
  186. "заголовок": `${название}-макет-шапка-заголовок`,
  187. "версия": `${название}-макет-шапка-версия`,
  188. "действия": `${название}-макет-шапка-действия`,
  189. "меню": `${название}-макет-меню`,
  190. "файл": `${название}-макет-меню-файл`,
  191. "содержимое": "редактор",
  192. "сохранить": `${название}-макет-сохранить`,
  193. };
  194. // Заменяем константы в макете.
  195. for (var константа in мир.макет.константы)
  196. {
  197. var старое = "${" + константа + "}";
  198. var новое = мир.макет.константы[константа];
  199. html = html.replace(старое, новое);
  200. }
  201. мир.макет.структура = html;
  202. };
  203. // // // //
  204. ЗагрузитьМакет = function(мир)
  205. {
  206. var м = мир.ведущийМодуль;
  207. var json = JSON.parse(м.содержимое["/макет|template.json"]);
  208. мир.макет = {
  209. "структура": м.содержимое["/макет|template.html"],
  210. "вид": м.содержимое["/макет|template.css"],
  211. "элементы": json,
  212. };
  213. };
  214. // // // //
  215. ЗадатьВедущийМодуль = function(мир)
  216. {
  217. // Редактор является ведущим модулем.
  218. мир.ведущийМодуль = мир.модули.модульПоИмени(ИМЯ);
  219. };
  220. // // // //
  221. РазобратьПараметры = function(мир)
  222. {
  223. мир.указатель = null;
  224. мир.файл = null;
  225. var параметры = new URLSearchParams(window.location.search);
  226. for (var имя of параметры.keys())
  227. {
  228. var значение = decodeURI(параметры.get(имя));
  229. var имя = decodeURI(имя);
  230. if (имя == "📦")
  231. {
  232. мир.указатель = значение;
  233. }
  234. else if (имя == "📁")
  235. {
  236. мир.файл = значение;
  237. }
  238. }
  239. };
  240. // // // //
  241. ВывестиРазобранныеПараметры = function(мир)
  242. {
  243. console.debug(`
  244. Разобранные параметры редактора:
  245. * 📦: '${мир.указатель}'
  246. * 📁: '${мир.файл}'
  247. `);
  248. };