Michael Save
12 years ago
5 changed files with 121 additions and 5 deletions
@ -0,0 +1,116 @@ |
|||
/* |
|||
* quote-selection.js |
|||
* |
|||
* Released under the MIT license |
|||
* Copyright (c) 2012 Michael Save <savetheinternet@tinyboard.org> |
|||
* |
|||
* Usage: |
|||
* $config['additional_javascript'][] = 'js/jquery.min.js'; |
|||
* $config['additional_javascript'][] = 'js/quote-selection.js'; |
|||
* |
|||
*/ |
|||
|
|||
$(document).ready(function(){ |
|||
if (!window.getSelection) |
|||
return; |
|||
|
|||
$.fn.selectRange = function(start, end) { |
|||
return this.each(function() { |
|||
if (this.setSelectionRange) { |
|||
this.focus(); |
|||
this.setSelectionRange(start, end); |
|||
} else if (this.createTextRange) { |
|||
var range = this.createTextRange(); |
|||
range.collapse(true); |
|||
range.moveEnd('character', end); |
|||
range.moveStart('character', start); |
|||
range.select(); |
|||
} |
|||
}); |
|||
}; |
|||
|
|||
var altKey = false; |
|||
var ctrlKey = false; |
|||
|
|||
$(document).keyup(function(e) { |
|||
if (e.altKey) |
|||
altKey = false; |
|||
else if (e.ctrlKey) |
|||
ctrlKey = false; |
|||
}); |
|||
|
|||
$(document).keydown(function(e) { |
|||
if (e.altKey) |
|||
altKey = true; |
|||
else if (e.ctrlKey) |
|||
ctrlKey = true; |
|||
|
|||
if (altKey || ctrlKey) { |
|||
console.log('CTRL/ALT used. Ignoring'); |
|||
return; |
|||
} |
|||
|
|||
if (e.keyCode < 48 || e.keyCode > 90) |
|||
return; |
|||
|
|||
var selection = window.getSelection(); |
|||
var $post = $(selection.anchorNode).parents('.post'); |
|||
if ($post.length == 0) { |
|||
console.log('Start of selection was not post div', $(selection.anchorNode).parent()); |
|||
return; |
|||
} |
|||
|
|||
var postID = $post.find('.post_no:eq(1)').text(); |
|||
|
|||
if (postID != $(selection.focusNode).parents('.post').find('.post_no:eq(1)').text()) { |
|||
console.log('Selection left post div', $(selection.focusNode).parent()); |
|||
return; |
|||
} |
|||
|
|||
; |
|||
var selectedText = selection.toString(); |
|||
console.log('Selected text: ' + selectedText.replace(/\n/g, '\\n').replace(/\r/g, '\\r')); |
|||
|
|||
if ($('body').hasClass('debug')) |
|||
alert(selectedText); |
|||
|
|||
if (selectedText.length == 0) |
|||
return; |
|||
|
|||
var body = $('textarea#body')[0]; |
|||
|
|||
var last_quote = body.value.match(/[\S.]*(^|[\S\s]*)>>(\d+)/); |
|||
if (last_quote) |
|||
last_quote = last_quote[2]; |
|||
|
|||
/* to solve some bugs on weird browsers, we need to replace \r\n with \n and then undo that after */ |
|||
var quote = (last_quote != postID ? '>>' + postID + '\r\n' : '') + $.trim(selectedText).replace(/\r\n/g, '\n').replace(/^/mg, '>').replace(/\n/g, '\r\n') + '\r\n'; |
|||
|
|||
console.log('Deselecting text'); |
|||
selection.removeAllRanges(); |
|||
|
|||
if (document.selection) { |
|||
// IE
|
|||
body.focus(); |
|||
var sel = document.selection.createRange(); |
|||
sel.text = quote; |
|||
body.focus(); |
|||
} else if (body.selectionStart || body.selectionStart == '0') { |
|||
// Mozilla
|
|||
var start = body.selectionStart; |
|||
var end = body.selectionEnd; |
|||
|
|||
if (!body.value.substring(0, start).match(/(^|\n)$/)) { |
|||
quote = '\r\n\r\n' + quote; |
|||
} |
|||
|
|||
body.value = body.value.substring(0, start) + quote + body.value.substring(end, body.value.length); |
|||
$(body).selectRange(start + quote.length, start + quote.length); |
|||
} else { |
|||
// ???
|
|||
body.value += quote; |
|||
body.focus(); |
|||
} |
|||
}); |
|||
}); |
|||
|
Loading…
Reference in new issue