load_editor.js 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. function do_insert_data(name, data, monaco = 0) {
  2. if(monaco === 0) {
  3. // https://stackoverflow.com/questions/11076975/insert-text-into-textarea-at-cursor-position-javascript
  4. if(document.selection) {
  5. document.getElementById(name).focus();
  6. var sel = document.selection.createRange();
  7. sel.text = data;
  8. } else if(
  9. document.getElementById(name).selectionStart ||
  10. document.getElementById(name).selectionStart == '0'
  11. ) {
  12. var startPos = document.getElementById(name).selectionStart;
  13. var endPos = document.getElementById(name).selectionEnd;
  14. var myPos = document.getElementById(name).value;
  15. document.getElementById(name).value = myPos.substring(0, startPos) + data + myPos.substring(endPos, myPos.length);
  16. } else {
  17. document.getElementById(name).value += data;
  18. }
  19. } else {
  20. var selection = editor.getSelection();
  21. var id = { major: 1, minor: 1 };
  22. var text = data;
  23. var op = {
  24. identifier: id,
  25. range: selection,
  26. text: text,
  27. forceMoveMarkers: true
  28. };
  29. editor.executeEdits("my-source", [op]);
  30. }
  31. }
  32. function monaco_to_content() {
  33. try {
  34. document.getElementById('textarea_edit_view').value = window.editor.getValue();
  35. } catch(e) {}
  36. }
  37. function do_not_out() {
  38. window.addEventListener('DOMContentLoaded', function() {
  39. window.onbeforeunload = function() {
  40. monaco_to_content();
  41. section_edit_do();
  42. data = document.getElementById('content').value;
  43. origin = document.getElementById('origin').value;
  44. if(data !== origin) {
  45. return '';
  46. }
  47. }
  48. });
  49. }
  50. function save_stop_exit() {
  51. window.onbeforeunload = function () {}
  52. }
  53. function do_paste_image() {
  54. window.addEventListener('DOMContentLoaded', function() {
  55. if(
  56. document.cookie.match(main_css_regex_data('main_css_image_paste')) &&
  57. document.cookie.match(main_css_regex_data('main_css_image_paste'))[1] === '1'
  58. ) {
  59. const textarea = document.querySelector("textarea");
  60. if (textarea) {
  61. textarea.addEventListener("paste", pasteListener);
  62. }
  63. }
  64. });
  65. }
  66. function pasteListener(e) {
  67. // find file
  68. if(e.clipboardData && e.clipboardData.items) {
  69. const items = e.clipboardData.items;
  70. let haveImageInClipboard = false;
  71. const formData = new FormData();
  72. for(let i = 0; i < items.length; i++) {
  73. if(items[i].type.indexOf("image") !== -1) {
  74. const file = items[i].getAsFile();
  75. const customName = prompt("파일 이름 (확장자 제외)");
  76. if (!customName) {
  77. return alert("파일 이름 없음");
  78. }
  79. var file_name = customName + ".png";
  80. const customFile = new File([file], file_name, { type: file.type });
  81. formData.append("f_data[]", customFile);
  82. haveImageInClipboard = true;
  83. e.preventDefault();
  84. break;
  85. }
  86. }
  87. if(!haveImageInClipboard) {
  88. return;
  89. }
  90. // send to server
  91. fetch("/upload", {
  92. method: "POST",
  93. body: formData,
  94. }).then((res) => {
  95. if (res.status === 200 || res.status === 201) {
  96. const url = res.url;
  97. alert(
  98. '업로드 완료 : ' +
  99. '[[파일:' + file_name + ']]'
  100. );
  101. } else {
  102. console.error("[ERROR] PasteUpload Fail :", res.statusText);
  103. if(res.status === 400) {
  104. alert("파일 이름 중복");
  105. } else if(res.status === 401) {
  106. alert("권한 부족");
  107. } else {
  108. alert("업로드 실패");
  109. }
  110. }
  111. }).catch((err) => {
  112. console.error("오류 내역 :", JSON.stringify(err), err);
  113. alert("업로드 실패");
  114. });
  115. }
  116. }
  117. function load_preview(name) {
  118. var s_data = new FormData();
  119. s_data.append('data', document.getElementById('textarea_edit_view').value);
  120. var url = "/api/w/" + name;
  121. var url_2 = "/api/markup";
  122. var xhr = new XMLHttpRequest();
  123. xhr.open("POST", url, true);
  124. xhr.send(s_data);
  125. var xhr_2 = new XMLHttpRequest();
  126. xhr_2.open("GET", url_2, true);
  127. xhr_2.send();
  128. xhr.onreadystatechange = function() {
  129. if(xhr.readyState === 4 && xhr.status === 200) {
  130. var o_p_data = JSON.parse(xhr.responseText);
  131. document.getElementById('see_preview').innerHTML = o_p_data['data'];
  132. eval(o_p_data['js_data'])
  133. }
  134. }
  135. }
  136. function load_raw_preview(name_1, name_2) {
  137. document.getElementById(name_2).innerHTML = document.getElementById(name_1).value;
  138. }
  139. function section_edit_init() {
  140. var data_server = JSON.parse(
  141. document.getElementById('server_set').innerHTML
  142. );
  143. if(data_server['markup'] === 'namumark') {
  144. var data = document.getElementById('textarea_edit_view').value;
  145. var data_org = data;
  146. var data_section = Number(data_server['section']);
  147. var re_heading = /(^|\n)(={1,6})(#)? ?([^=]+) ?#?={1,6}(\n|$)/;
  148. for(i = 1; data.match(re_heading); i++) {
  149. if(i === data_section) {
  150. var start_point = data.search(re_heading);
  151. if(data[start_point] === '\n') {
  152. start_point += 1;
  153. }
  154. data = data.replace(re_heading, function(x) {
  155. return '.'.repeat(x.length - 1) + '\n';
  156. });
  157. var end_point = data.search(re_heading);
  158. if(end_point === -1) {
  159. end_point = data.length;
  160. }
  161. data = data_org.slice(start_point, end_point);
  162. data = data.replace(/\n$/, '');
  163. document.getElementById('textarea_edit_view').value = data;
  164. data_server['start_point'] = start_point;
  165. data_server['end_point'] = end_point;
  166. document.getElementById('server_set').innerHTML = JSON.stringify(data_server);
  167. break;
  168. } else {
  169. data = data.replace(re_heading, function(x) {
  170. return '.'.repeat(x.length - 1) + '\n';
  171. });
  172. }
  173. }
  174. }
  175. }
  176. function section_edit_do() {
  177. var data_server = JSON.parse(
  178. document.getElementById('server_set').innerHTML
  179. );
  180. if(data_server['start_point'] !== undefined) {
  181. var data = document.getElementById('origin').value;
  182. var data_section = document.getElementById('textarea_edit_view').value;
  183. var start_point = data_server['start_point'];
  184. var end_point = data_server['end_point'];
  185. if(data.length >= end_point) {
  186. var data_new = '';
  187. data_new += data.slice(0, start_point);
  188. data_new += data_section;
  189. data_new += data.slice(end_point, data.length);
  190. document.getElementById('content').value = data_new;
  191. }
  192. } else {
  193. document.getElementById('content').value = document.getElementById('textarea_edit_view').value;
  194. }
  195. }