editor.js 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. // Basic editor functions
  2. <<<<<<< HEAD
  3. function storeCaret(ftext) {
  4. =======
  5. function storeCaret(ftext) {
  6. >>>>>>> master
  7. if (ftext.createTextRange) {
  8. ftext.caretPos = document.selection.createRange().duplicate();
  9. }
  10. }
  11. function SelectionRange(start, end) {
  12. this.start = start;
  13. this.end = end;
  14. }
  15. function getSelection(textId) {
  16. ctrl = document.getElementById(textId);
  17. if (document.selection) {
  18. ctrl.focus();
  19. var range = document.selection.createRange();
  20. var length = range.text.length;
  21. range.moveStart('character', -ctrl.value.length);
  22. return new SelectionRange(range.text.length - length, range.text.length);
  23. } else if (ctrl.selectionStart || ctrl.selectionStart == '0') {
  24. return new SelectionRange(ctrl.selectionStart, ctrl.selectionEnd);
  25. }
  26. }
  27. function getSelectionText(textId) {
  28. var ctrl = document.getElementById(textId);
  29. var text = ctrl.value;
  30. myRange = getSelection(textId);
  31. return $.trim(text.substring(myRange.start, myRange.end));
  32. }
  33. function setSelection(textId, SelectionRange) {
  34. ctrl = document.getElementById(textId);
  35. if (ctrl.setSelectionRange) {
  36. ctrl.focus();
  37. ctrl.setSelectionRange(SelectionRange.start, SelectionRange.end);
  38. } else if (ctrl.createTextRange) {
  39. var range = ctrl.createTextRange();
  40. range.collapse(true);
  41. range.moveStart('character', SelectionRange.start);
  42. range.moveEnd('character', SelectionRange.end);
  43. range.select();
  44. }
  45. }
  46. function _makeWrap(textId, myRange, wrap_start, wrap_end) {
  47. var ctrl = document.getElementById(textId);
  48. var text = ctrl.value;
  49. var startText = text.substring(0, myRange.start) + wrap_start;
  50. var middleText = text.substring(myRange.start, myRange.end);
  51. var endText = wrap_end + text.substring(myRange.end);
  52. ctrl.value = startText + middleText + endText;
  53. setSelection(textId, new SelectionRange(startText.length, startText.length + middleText.length));
  54. }
  55. function makeWrap(textId, wrap_start, wrap_end) {
  56. _makeWrap(textId, getSelection(textId), wrap_start, wrap_end);
  57. }
  58. function _makeReplace(textId, myRange, replacement) {
  59. var ctrl = document.getElementById(textId);
  60. var text = ctrl.value;
  61. var startText = text.substring(0, myRange.start);
  62. var middleText = text.substring(myRange.start, myRange.end);
  63. var endText = text.substring(myRange.end);
  64. ctrl.value = text.substring(0, myRange.start) + replacement + text.substring(myRange.end);
  65. setSelection(textId, new SelectionRange(startText.length + middleText.length, startText.length + middleText.length));
  66. }
  67. function makeReplace(textId, replacement) {
  68. _makeReplace(textId, getSelection(textId), replacement);
  69. }
  70. 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');
  71. function is_url(str) {
  72. return url_pattern.test($.trim(str));
  73. }
  74. function extractor(query) {
  75. var result = /([^\s]+)$/.exec(query);
  76. if(result && result[1])
  77. return result[1].trim();
  78. return '';
  79. }
  80. // Small and nice editor functionality
  81. $(function() {
  82. <<<<<<< HEAD
  83. function textarea(ev) {
  84. return $(ev).parents('.editor-editable').find('textarea');
  85. }
  86. function textareaId(ev) {
  87. return textarea(ev).attr('id');
  88. }
  89. $('.editor-tools').fadeIn(600);
  90. $('.editor-zen-on').css('display', 'block');
  91. $('.editor-editable').each(function() {
  92. // Do we have emojis?
  93. if (ed_emojis.length > 1) {
  94. $(this).find('textarea').atwho({
  95. at: ":",
  96. tpl: ed_emoji_tpl,
  97. data: ed_emojis_list
  98. });
  99. }
  100. });
  101. // Handle buttons
  102. $('.editor-zen-on a').click(function() {
  103. var overlay = $('.zen-overlay');
  104. var overlay_textarea = overlay.find('textarea');
  105. overlay_textarea.val(textarea(this).val());
  106. overlay_textarea.data('org', '#' + textareaId(this));
  107. overlay_textarea.data('pos', $('body').scrollTop());
  108. overlay.show();
  109. $('#wrap').hide();
  110. return false;
  111. });
  112. $('.editor-bold').click(function() {
  113. makeWrap(textareaId(this), '**', '**');
  114. return false;
  115. });
  116. $('.editor-emphasis').click(function() {
  117. makeWrap(textareaId(this), '*', '*');
  118. return false;
  119. });
  120. $('.editor-link').click(function() {
  121. var selection = $.trim(getSelectionText(textareaId(this)));
  122. if (is_url(selection)) {
  123. var link_url = $.trim(prompt(ed_lang_enter_link_url, selection));
  124. selection = false;
  125. } else {
  126. var link_url = $.trim(prompt(ed_lang_enter_link_url));
  127. }
  128. if (is_url(link_url)) {
  129. if (selection) {
  130. var link_label = $.trim(prompt(ed_lang_enter_link_label, selection));
  131. } else {
  132. var link_label = $.trim(prompt(ed_lang_enter_link_label));
  133. }
  134. if (link_label.length > 0) {
  135. makeReplace(textareaId(this), '[' + link_label + '](' + link_url + ')');
  136. } else {
  137. makeReplace(textareaId(this), '<' + link_url + '>');
  138. }
  139. }
  140. return false;
  141. });
  142. $('.editor-image').click(function() {
  143. var selection = $.trim(getSelectionText(textareaId(this)));
  144. if (is_url(selection)) {
  145. var image_url = $.trim(prompt(ed_lang_enter_image_url, selection));
  146. selection = false;
  147. } else {
  148. var image_url = $.trim(prompt(ed_lang_enter_image_url));
  149. }
  150. if (is_url(image_url)) {
  151. if (selection) {
  152. var image_label = $.trim(prompt(ed_lang_enter_image_label, selection));
  153. } else {
  154. var image_label = $.trim(prompt(ed_lang_enter_image_label));
  155. }
  156. if (image_label.length > 0) {
  157. makeReplace(textareaId(this), '![' + image_label + '](' + image_url + ')');
  158. } else {
  159. makeReplace(textareaId(this), '!(' + image_url + ')');
  160. }
  161. }
  162. return false;
  163. });
  164. $('.editor-hr').click(function() {
  165. makeReplace(textareaId(this), '\r\n\r\n- - - - -\r\n\r\n');
  166. return false;
  167. });
  168. $('.editor-zen-off a').click(function() {
  169. var overlay = $('.zen-overlay');
  170. var overlay_textarea = overlay.find('textarea');
  171. var scrooltop = overlay.find('textarea').data('pos');
  172. $(overlay.find('textarea').data('org')).val(overlay.find('textarea').val());
  173. $('#wrap').show();
  174. $('html, body').scrollTop(scrooltop);
  175. overlay.hide();
  176. return false;
  177. });
  178. $('.editor-insert-attachment').click(function() {
  179. var insertion_code = $(this).data('attachment-md');
  180. makeReplace(textareaId(this), insertion_code);
  181. =======
  182. $('.editor-tools').fadeIn(600);
  183. $('.editor').each(function() {
  184. // Get textarea stuff
  185. var textarea = $(this).find('textarea');
  186. var textarea_id = $(textarea).attr('id');
  187. // Do we have emojis?
  188. if (1==2 && ed_emojis.length > 1) {
  189. var mode = 0;
  190. var open = -1;
  191. $(textarea).focusout(function() {
  192. mode = 0;
  193. open = -1;
  194. });
  195. $(textarea).keyup(function() {
  196. text = $(textarea).val();
  197. cursor = getSelection(textarea_id).start;
  198. if (cursor > 0) {
  199. // Read typed character and previous character
  200. input = text.substring(cursor - 1, cursor);
  201. if (cursor > 1) {
  202. pre = text.substring(cursor - 2, cursor - 1);
  203. } else {
  204. pre = '';
  205. }
  206. // Act accordingly to current mode
  207. if (mode == 0) {
  208. if (input == ':' && !pre.match(/^[A-Za-z0-9]+$/i)) {
  209. // Test passed, mode 1 engaged!
  210. mode = 1;
  211. open = cursor;
  212. }
  213. } else if (mode == 1) {
  214. // Inside emoji mode, we are helping user enter emoji input
  215. if (cursor > open && !input.match(/^(\+|\-|[_A-Za-z0-9])+$/i)) {
  216. // Emoji fail
  217. mode = 0;
  218. }
  219. }
  220. }
  221. });
  222. }
  223. // Handle buttons
  224. $('.editor-bold').click(function() {
  225. makeWrap(textarea_id, '**', '**');
  226. return false;
  227. });
  228. $('.editor-emphasis').click(function() {
  229. makeWrap(textarea_id, '*', '*');
  230. return false;
  231. });
  232. $('.editor-link').click(function() {
  233. var selection = $.trim(getSelectionText(textarea_id));
  234. if (is_url(selection)) {
  235. var link_url = $.trim(prompt(ed_lang_enter_link_url, selection));
  236. selection = false;
  237. } else {
  238. var link_url = $.trim(prompt(ed_lang_enter_link_url));
  239. }
  240. if (is_url(link_url)) {
  241. if (selection) {
  242. var link_label = $.trim(prompt(ed_lang_enter_link_label, selection));
  243. } else {
  244. var link_label = $.trim(prompt(ed_lang_enter_link_label));
  245. }
  246. if (link_label.length > 0) {
  247. makeReplace(textarea_id, '[' + link_label + '](' + link_url + ')');
  248. } else {
  249. makeReplace(textarea_id, '<' + link_url + '>');
  250. }
  251. }
  252. return false;
  253. });
  254. $('.editor-image').click(function() {
  255. var selection = $.trim(getSelectionText(textarea_id));
  256. if (is_url(selection)) {
  257. var image_url = $.trim(prompt(ed_lang_enter_image_url, selection));
  258. selection = false;
  259. } else {
  260. var image_url = $.trim(prompt(ed_lang_enter_image_url));
  261. }
  262. if (is_url(image_url)) {
  263. if (selection) {
  264. var image_label = $.trim(prompt(ed_lang_enter_image_label, selection));
  265. } else {
  266. var image_label = $.trim(prompt(ed_lang_enter_image_label));
  267. }
  268. if (image_label.length > 0) {
  269. makeReplace(textarea_id, '![' + image_label + '](' + image_url + ')');
  270. } else {
  271. makeReplace(textarea_id, '!(' + image_url + ')');
  272. }
  273. }
  274. return false;
  275. });
  276. $('.editor-hr').click(function() {
  277. makeReplace(textarea_id, '\r\n\r\n- - - - -\r\n\r\n');
  278. return false;
  279. });
  280. >>>>>>> master
  281. });
  282. });