123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- // Basic editor functions
- function storeCaret(ftext) {
- if (ftext.createTextRange) {
- ftext.caretPos = document.selection.createRange().duplicate();
- }
- }
- function SelectionRange(start, end) {
- this.start = start;
- this.end = end;
- }
- function getSelection(textId) {
- ctrl = document.getElementById(textId);
- if (document.selection) {
- ctrl.focus();
- var range = document.selection.createRange();
- var length = range.text.length;
- range.moveStart('character', -ctrl.value.length);
- return new SelectionRange(range.text.length - length, range.text.length);
- } else if (ctrl.selectionStart || ctrl.selectionStart == '0') {
- return new SelectionRange(ctrl.selectionStart, ctrl.selectionEnd);
- }
- }
- function getSelectionText(textId) {
- var ctrl = document.getElementById(textId);
- var text = ctrl.value;
- myRange = getSelection(textId);
- return $.trim(text.substring(myRange.start, myRange.end));
- }
- function setSelection(textId, SelectionRange) {
- ctrl = document.getElementById(textId);
- if (ctrl.setSelectionRange) {
- ctrl.focus();
- ctrl.setSelectionRange(SelectionRange.start, SelectionRange.end);
- } else if (ctrl.createTextRange) {
- var range = ctrl.createTextRange();
- range.collapse(true);
- range.moveStart('character', SelectionRange.start);
- range.moveEnd('character', SelectionRange.end);
- range.select();
- }
- }
- function _makeWrap(textId, myRange, wrap_start, wrap_end) {
- var ctrl = document.getElementById(textId);
- var text = ctrl.value;
- var startText = text.substring(0, myRange.start) + wrap_start;
- var middleText = text.substring(myRange.start, myRange.end);
- var endText = wrap_end + text.substring(myRange.end);
- ctrl.value = startText + middleText + endText;
- setSelection(textId, new SelectionRange(startText.length, startText.length + middleText.length));
- }
- function makeWrap(textId, wrap_start, wrap_end) {
- _makeWrap(textId, getSelection(textId), wrap_start, wrap_end);
- }
- function _makeReplace(textId, myRange, replacement) {
- var ctrl = document.getElementById(textId);
- var text = ctrl.value;
- var startText = text.substring(0, myRange.start);
- var middleText = text.substring(myRange.start, myRange.end);
- var endText = text.substring(myRange.end);
- ctrl.value = text.substring(0, myRange.start) + replacement + text.substring(myRange.end);
- setSelection(textId, new SelectionRange(startText.length + middleText.length, startText.length + middleText.length));
- }
- function makeReplace(textId, replacement) {
- _makeReplace(textId, getSelection(textId), replacement);
- }
- function extractor(query) {
- var result = /([^\s]+)$/.exec(query);
- if(result && result[1])
- return result[1].trim();
- return '';
- }
- // Small and nice editor functionality
- $(function() {
- $('.editor-tools').fadeIn(600);
- $('.editor').each(function() {
- // Get textarea stuff
- var textarea = $(this).find('textarea');
- var textarea_id = $(textarea).attr('id');
-
- // Do we have emojis?
- if (1==2 && ed_emojis.length > 1) {
- var mode = 0;
- var open = -1;
- $(textarea).focusout(function() {
- mode = 0;
- open = -1;
- });
- $(textarea).keyup(function() {
- text = $(textarea).val();
- cursor = getSelection(textarea_id).start;
- if (cursor > 0) {
- // Read typed character and previous character
- input = text.substring(cursor - 1, cursor);
- if (cursor > 1) {
- pre = text.substring(cursor - 2, cursor - 1);
- } else {
- pre = '';
- }
- // Act accordingly to current mode
- if (mode == 0) {
- if (input == ':' && !pre.match(/^[A-Za-z0-9]+$/i)) {
- // Test passed, mode 1 engaged!
- mode = 1;
- open = cursor;
- }
- } else if (mode == 1) {
- // Inside emoji mode, we are helping user enter emoji input
- if (cursor > open && !input.match(/^(\+|\-|[_A-Za-z0-9])+$/i)) {
- // Emoji fail
- mode = 0;
- }
- }
- }
- });
- }
- // Handle buttons
- $('.editor-bold').click(function() {
- makeWrap(textarea_id, '**', '**');
- return false;
- });
-
- $('.editor-emphasis').click(function() {
- makeWrap(textarea_id, '*', '*');
- return false;
- });
-
- $('.editor-link').click(function() {
- var link_url = $.trim(prompt(ed_lang_enter_link_url));
- if (link_url.length > 0) {
- link_url = link_url.toLowerCase();
- 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;
- if (!pattern.test(link_url)) {
- if (link_url.indexOf("http://") != 0 && link_url.indexOf("https://") != 0 && link_url.indexOf("ftp://") != 0) {
- link_url = "http://" + link_url;
- }
- }
- var link_label = $.trim(prompt(ed_lang_enter_link_label, $.trim(getSelectionText(get_textarea(this).attr('id')))));
- if (link_label.length > 0) {
- makeReplace(textarea_id, '[' + link_label + '](' + link_url + ')');
- } else {
- makeReplace(textarea_id, '<' + link_url + '>');
- }
- }
- return false;
- });
-
- $('.editor-image').click(function() {
- var image_url = $.trim(prompt(ed_lang_enter_image_url, $.trim(getSelectionText(get_textarea(this).attr('id')))));
- if (image_url.length > 0) {
- var image_label = $.trim(prompt(ed_lang_enter_image_label));
- if (image_label.length > 0) {
- makeReplace(textarea_id, '');
- } else {
- makeReplace(textarea_id, '!(' + image_url + ')');
- }
- }
- return false;
- });
-
- $('.editor-hr').click(function() {
- makeReplace(textarea_id, '\r\n\r\n- - - - -\r\n\r\n');
- return false;
- });
- });
- });
|