editor.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  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. var url_pattern = new RegExp('^(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$','i');
  67. function is_url(str) {
  68. return url_pattern.test($.trim(str));
  69. }
  70. function extractor(query) {
  71. var result = /([^\s]+)$/.exec(query);
  72. if(result && result[1])
  73. return result[1].trim();
  74. return '';
  75. }
  76. // Small and nice editor functionality
  77. $(function() {
  78. function textarea(ev) {
  79. return $(ev).parents('.editor-editable').find('textarea');
  80. }
  81. function textareaId(ev) {
  82. return textarea(ev).attr('id');
  83. }
  84. $('.editor-tools').fadeIn(600);
  85. $('.editor-zen-on').css('display', 'block');
  86. $('.editor-editable').each(function() {
  87. // Do we have emojis?
  88. if (ed_emojis.length > 1) {
  89. $(this).find('textarea').atwho({
  90. at: ":",
  91. tpl: ed_emoji_tpl,
  92. data: ed_emojis_list
  93. });
  94. }
  95. });
  96. // Handle buttons
  97. $('.editor-zen-on a').click(function() {
  98. var overlay = $('.zen-overlay');
  99. var overlay_textarea = overlay.find('textarea');
  100. overlay_textarea.val(textarea(this).val());
  101. overlay_textarea.data('org', '#' + textareaId(this));
  102. overlay_textarea.data('pos', $('body').scrollTop());
  103. overlay.show();
  104. $('#wrap').hide();
  105. return false;
  106. });
  107. $('.editor-bold').click(function() {
  108. makeWrap(textareaId(this), '**', '**');
  109. return false;
  110. });
  111. $('.editor-emphasis').click(function() {
  112. makeWrap(textareaId(this), '*', '*');
  113. return false;
  114. });
  115. $('.editor-link').click(function() {
  116. var selection = $.trim(getSelectionText(textareaId(this)));
  117. if (is_url(selection)) {
  118. var link_url = $.trim(prompt(ed_lang_enter_link_url, selection));
  119. selection = false;
  120. } else {
  121. var link_url = $.trim(prompt(ed_lang_enter_link_url));
  122. }
  123. if (is_url(link_url)) {
  124. if (selection) {
  125. var link_label = $.trim(prompt(ed_lang_enter_link_label, selection));
  126. } else {
  127. var link_label = $.trim(prompt(ed_lang_enter_link_label));
  128. }
  129. if (link_label.length > 0) {
  130. makeReplace(textareaId(this), '[' + link_label + '](' + link_url + ')');
  131. } else {
  132. makeReplace(textareaId(this), '<' + link_url + '>');
  133. }
  134. }
  135. return false;
  136. });
  137. $('.editor-image').click(function() {
  138. var selection = $.trim(getSelectionText(textareaId(this)));
  139. if (is_url(selection)) {
  140. var image_url = $.trim(prompt(ed_lang_enter_image_url, selection));
  141. selection = false;
  142. } else {
  143. var image_url = $.trim(prompt(ed_lang_enter_image_url));
  144. }
  145. if (is_url(image_url)) {
  146. if (selection) {
  147. var image_label = $.trim(prompt(ed_lang_enter_image_label, selection));
  148. } else {
  149. var image_label = $.trim(prompt(ed_lang_enter_image_label));
  150. }
  151. if (image_label.length > 0) {
  152. makeReplace(textareaId(this), '![' + image_label + '](' + image_url + ')');
  153. } else {
  154. makeReplace(textareaId(this), '!(' + image_url + ')');
  155. }
  156. }
  157. return false;
  158. });
  159. $('.editor-hr').click(function() {
  160. makeReplace(textareaId(this), '\r\n\r\n- - - - -\r\n\r\n');
  161. return false;
  162. });
  163. $('.editor-zen-off a').click(function() {
  164. var overlay = $('.zen-overlay');
  165. var overlay_textarea = overlay.find('textarea');
  166. var scrooltop = overlay.find('textarea').data('pos');
  167. $(overlay.find('textarea').data('org')).val(overlay.find('textarea').val());
  168. $('#wrap').show();
  169. $('html, body').scrollTop(scrooltop);
  170. overlay.hide();
  171. return false;
  172. });
  173. $('.editor-insert-attachment').click(function() {
  174. var insertion_code = $(this).data('attachment-md');
  175. makeReplace(textareaId(this), insertion_code);
  176. });
  177. });