editor.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. "use strict";
  2. function do_insert_data(name, data, monaco_name) {
  3. if(!document.getElementById(monaco_name)) {
  4. // https://stackoverflow.com/questions/11076975/insert-text-into-textarea-at-cursor-position-javascript
  5. if(document.selection) {
  6. document.getElementById(name).focus();
  7. let sel = document.selection.createRange();
  8. sel.text = data;
  9. } else if(
  10. document.getElementById(name).selectionStart ||
  11. document.getElementById(name).selectionStart == '0'
  12. ) {
  13. let startPos = document.getElementById(name).selectionStart;
  14. let endPos = document.getElementById(name).selectionEnd;
  15. let myPos = document.getElementById(name).value;
  16. document.getElementById(name).value = myPos.substring(0, startPos) + data + myPos.substring(endPos, myPos.length);
  17. } else {
  18. document.getElementById(name).value += data;
  19. }
  20. } else {
  21. let selection = editor.getSelection();
  22. let id = { major: 1, minor: 1 };
  23. let text = data;
  24. let op = {
  25. identifier: id,
  26. range: selection,
  27. text: text,
  28. forceMoveMarkers: true
  29. };
  30. editor.executeEdits("my-source", [op]);
  31. }
  32. }
  33. // 아직 개편이 더 필요함
  34. function do_paste_image(name, monaco_name) {
  35. window.addEventListener('DOMContentLoaded', async function() {
  36. let set = await opennamu_get_main_skin_set("main_css_image_paste");
  37. if(set === 'use') {
  38. let textarea;
  39. if(
  40. document.getElementById(monaco_name) !== null &&
  41. document.getElementById(monaco_name) !== undefined
  42. ) {
  43. textarea = document.getElementById(monaco_name);
  44. } else {
  45. textarea = document.getElementById(name);
  46. }
  47. if(textarea) {
  48. textarea.addEventListener("paste", pasteListener);
  49. }
  50. }
  51. });
  52. }
  53. function pasteListener(e) {
  54. // find file
  55. if(e.clipboardData && e.clipboardData.items) {
  56. const items = e.clipboardData.items;
  57. const formData = new FormData();
  58. let haveImageInClipboard = false;
  59. let file_name = '';
  60. for(let i = 0; i < items.length; i++) {
  61. if(items[i].type.indexOf("image") !== -1) {
  62. const file = items[i].getAsFile();
  63. const customName = prompt("파일 이름 (확장자 제외)");
  64. if(!customName) {
  65. return alert("파일 이름 없음");
  66. }
  67. file_name = customName + ".png";
  68. const customFile = new File([file], file_name, { type: file.type });
  69. formData.append("f_data[]", customFile);
  70. haveImageInClipboard = true;
  71. e.preventDefault();
  72. break;
  73. }
  74. }
  75. if(!haveImageInClipboard) {
  76. return;
  77. }
  78. // send to server
  79. fetch("/upload", {
  80. method: "POST",
  81. body: formData,
  82. }).then((res) => {
  83. if (res.status === 200 || res.status === 201) {
  84. const url = res.url;
  85. alert(
  86. '업로드 완료 : ' +
  87. '[[파일:' + file_name + ']]'
  88. );
  89. } else {
  90. console.error("[ERROR] PasteUpload Fail :", res.statusText);
  91. if(res.status === 400) {
  92. alert("파일 이름 중복");
  93. } else if(res.status === 401) {
  94. alert("권한 부족");
  95. } else {
  96. alert("업로드 실패");
  97. }
  98. }
  99. }).catch((err) => {
  100. console.error("오류 내역 :", JSON.stringify(err), err);
  101. alert("업로드 실패");
  102. });
  103. }
  104. }