do_editor.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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(document.getElementById(name).selectionStart || document.getElementById(name).selectionStart == '0') {
  8. var startPos = document.getElementById(name).selectionStart;
  9. var endPos = document.getElementById(name).selectionEnd;
  10. var myPos = document.getElementById(name).value;
  11. document.getElementById(name).value = myPos.substring(0, startPos) + data + myPos.substring(endPos, myPos.length);
  12. } else {
  13. document.getElementById(name).value += data;
  14. }
  15. }
  16. function do_not_out() {
  17. window.onbeforeunload = function() {
  18. data = document.getElementById('content').value;
  19. origin = document.getElementById('origin').value;
  20. if(data !== origin) {
  21. return '';
  22. }
  23. }
  24. }
  25. function save_stop_exit() {
  26. window.onbeforeunload = function () { }
  27. }
  28. function do_paste_image() {
  29. window.addEventListener('DOMContentLoaded', function() {
  30. do_not_out();
  31. if(
  32. document.cookie.match(main_css_regex_data('main_css_image_paste')) &&
  33. document.cookie.match(main_css_regex_data('main_css_image_paste'))[1] === '1'
  34. ) {
  35. const textarea = document.querySelector("textarea");
  36. if (textarea) {
  37. textarea.addEventListener("paste", pasteListener);
  38. }
  39. }
  40. });
  41. }
  42. function pasteListener(e) {
  43. // find file
  44. if (e.clipboardData && e.clipboardData.items) {
  45. const items = e.clipboardData.items;
  46. let haveImageInClipboard = false;
  47. const formData = new FormData();
  48. for (let i = 0; i < items.length; i++) {
  49. if (items[i].type.indexOf("image") !== -1) {
  50. const file = items[i].getAsFile();
  51. const customName = prompt("파일 이름을 설정해주세요. (확장자는 생략)");
  52. if (!customName) {
  53. return alert("취소되었습니다.");
  54. }
  55. const customFile = new File([file], customName + ".png", { type: file.type });
  56. formData.append("f_data[]", customFile);
  57. haveImageInClipboard = true;
  58. e.preventDefault();
  59. break;
  60. }
  61. }
  62. if (!haveImageInClipboard) {
  63. return;
  64. }
  65. // send to server
  66. fetch("/upload", {
  67. method: "POST",
  68. body: formData,
  69. }).then((res) => {
  70. if (res.status === 200 || res.status === 201) {
  71. const url = res.url;
  72. alert(
  73. '클립보드의 이미지를 성공적으로 업로드했습니다. 아래 텍스트로 본문에 삽입할 수 있습니다. ' +
  74. '[[' + decodeURIComponent(url.replace(/.*\/w\/file/, "file")) + ']]'
  75. );
  76. } else {
  77. console.error("[ERROR] PasteUpload Fail :", res.statusText);
  78. if(res.status === 400) {
  79. alert("클립보드의 이미지를 업로드하는데 실패했습니다. 파일 이름 중복일 수 있습니다.");
  80. } else if(res.status === 401) {
  81. alert("클립보드의 이미지를 업로드하는데 실패했습니다. 권한 부족일 수 있습니다.");
  82. } else {
  83. alert("클립보드의 이미지를 업로드하는데 실패했습니다.");
  84. }
  85. }
  86. }).catch((err) => {
  87. console.error("[ERROR] PasteUpload Fail :", JSON.stringify(err), err);
  88. alert("클립보드의 이미지를 업로드하는데 실패했습니다. 서버가 응답하지 않습니다.");
  89. });
  90. }
  91. }