load_editor.js 6.9 KB

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