editor.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. // Basic editor functions
  2. function storeCaret(ftext) {
  3. if (ftext.createTextRange) {
  4. ftext.caretPos = document.selection.createRange().duplicate();
  5. }
  6. }
  7. function SelectionRange(start, end) {
  8. this.start = start;
  9. this.end = end;
  10. }
  11. function getSelection(textId) {
  12. ctrl = document.getElementById(textId);
  13. if (document.selection) {
  14. ctrl.focus();
  15. var range = document.selection.createRange();
  16. var length = range.text.length;
  17. range.moveStart('character', -ctrl.value.length);
  18. return new SelectionRange(range.text.length - length, range.text.length);
  19. } else if (ctrl.selectionStart || ctrl.selectionStart == '0') {
  20. return new SelectionRange(ctrl.selectionStart, ctrl.selectionEnd);
  21. }
  22. }
  23. function getSelectionText(textId) {
  24. var ctrl = document.getElementById(textId);
  25. var text = ctrl.value;
  26. myRange = getSelection(textId);
  27. return $.trim(text.substring(myRange.start, myRange.end));
  28. }
  29. function setSelection(textId, SelectionRange) {
  30. ctrl = document.getElementById(textId);
  31. if (ctrl.setSelectionRange) {
  32. ctrl.focus();
  33. ctrl.setSelectionRange(SelectionRange.start, SelectionRange.end);
  34. } else if (ctrl.createTextRange) {
  35. var range = ctrl.createTextRange();
  36. range.collapse(true);
  37. range.moveStart('character', SelectionRange.start);
  38. range.moveEnd('character', SelectionRange.end);
  39. range.select();
  40. }
  41. }
  42. function _makeWrap(textId, myRange, wrap_start, wrap_end) {
  43. var ctrl = document.getElementById(textId);
  44. var text = ctrl.value;
  45. var startText = text.substring(0, myRange.start) + wrap_start;
  46. var middleText = text.substring(myRange.start, myRange.end);
  47. var endText = wrap_end + text.substring(myRange.end);
  48. ctrl.value = startText + middleText + endText;
  49. setSelection(textId, new SelectionRange(startText.length, startText.length + middleText.length));
  50. }
  51. function makeWrap(textId, wrap_start, wrap_end) {
  52. _makeWrap(textId, getSelection(textId), wrap_start, wrap_end);
  53. }
  54. function _makeReplace(textId, myRange, replacement) {
  55. var ctrl = document.getElementById(textId);
  56. var text = ctrl.value;
  57. var startText = text.substring(0, myRange.start);
  58. var middleText = text.substring(myRange.start, myRange.end);
  59. var endText = text.substring(myRange.end);
  60. ctrl.value = text.substring(0, myRange.start) + replacement + text.substring(myRange.end);
  61. setSelection(textId, new SelectionRange(startText.length + middleText.length, startText.length + middleText.length));
  62. }
  63. function makeReplace(textId, replacement) {
  64. _makeReplace(textId, getSelection(textId), replacement);
  65. }
  66. function extractor(query) {
  67. var result = /([^\s]+)$/.exec(query);
  68. if(result && result[1])
  69. return result[1].trim();
  70. return '';
  71. }
  72. // Small and nice editor functionality
  73. $(function() {
  74. $('.editor-tools').fadeIn(600);
  75. $('.editor').each(function() {
  76. // Get textarea stuff
  77. var textarea = $(this).find('textarea');
  78. var textarea_id = $(textarea).attr('id');
  79. // Do we have emojis?
  80. if (1==2 && ed_emojis.length > 1) {
  81. var mode = 0;
  82. var open = -1;
  83. $(textarea).focusout(function() {
  84. mode = 0;
  85. open = -1;
  86. });
  87. $(textarea).keyup(function() {
  88. text = $(textarea).val();
  89. cursor = getSelection(textarea_id).start;
  90. if (cursor > 0) {
  91. // Read typed character and previous character
  92. input = text.substring(cursor - 1, cursor);
  93. if (cursor > 1) {
  94. pre = text.substring(cursor - 2, cursor - 1);
  95. } else {
  96. pre = '';
  97. }
  98. // Act accordingly to current mode
  99. if (mode == 0) {
  100. if (input == ':' && !pre.match(/^[A-Za-z0-9]+$/i)) {
  101. // Test passed, mode 1 engaged!
  102. mode = 1;
  103. open = cursor;
  104. }
  105. } else if (mode == 1) {
  106. // Inside emoji mode, we are helping user enter emoji input
  107. if (cursor > open && !input.match(/^(\+|\-|[_A-Za-z0-9])+$/i)) {
  108. // Emoji fail
  109. mode = 0;
  110. }
  111. }
  112. }
  113. });
  114. }
  115. // Handle buttons
  116. $('.editor-bold').click(function() {
  117. makeWrap(textarea_id, '**', '**');
  118. return false;
  119. });
  120. $('.editor-emphasis').click(function() {
  121. makeWrap(textarea_id, '*', '*');
  122. return false;
  123. });
  124. $('.editor-link').click(function() {
  125. var link_url = $.trim(prompt(ed_lang_enter_link_url));
  126. if (link_url.length > 0) {
  127. link_url = link_url.toLowerCase();
  128. var pattern = /^(("[\w-+\s]+")|([\w-+]+(?:\.[\w-+]+)*)|("[\w-+\s]+")([\w-+]+(?:\.[\w-+]+)*))(@((?:[\w-+]+\.)*\w[\w-+]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][\d]\.|1[\d]{2}\.|[\d]{1,2}\.))((25[0-5]|2[0-4][\d]|1[\d]{2}|[\d]{1,2})\.){2}(25[0-5]|2[0-4][\d]|1[\d]{2}|[\d]{1,2})\]?$)/i;
  129. if (!pattern.test(link_url)) {
  130. if (link_url.indexOf("http://") != 0 && link_url.indexOf("https://") != 0 && link_url.indexOf("ftp://") != 0) {
  131. link_url = "http://" + link_url;
  132. }
  133. }
  134. var link_label = $.trim(prompt(ed_lang_enter_link_label, $.trim(getSelectionText(get_textarea(this).attr('id')))));
  135. if (link_label.length > 0) {
  136. makeReplace(textarea_id, '[' + link_label + '](' + link_url + ')');
  137. } else {
  138. makeReplace(textarea_id, '<' + link_url + '>');
  139. }
  140. }
  141. return false;
  142. });
  143. $('.editor-image').click(function() {
  144. var image_url = $.trim(prompt(ed_lang_enter_image_url, $.trim(getSelectionText(get_textarea(this).attr('id')))));
  145. if (image_url.length > 0) {
  146. var image_label = $.trim(prompt(ed_lang_enter_image_label));
  147. if (image_label.length > 0) {
  148. makeReplace(textarea_id, '![' + image_label + '](' + image_url + ')');
  149. } else {
  150. makeReplace(textarea_id, '!(' + image_url + ')');
  151. }
  152. }
  153. return false;
  154. });
  155. $('.editor-hr').click(function() {
  156. makeReplace(textarea_id, '\r\n\r\n- - - - -\r\n\r\n');
  157. return false;
  158. });
  159. });
  160. });