summaryrefslogtreecommitdiff
path: root/js/quote-selection.js
diff options
context:
space:
mode:
authorMichael Save <savetheinternet@tinyboard.org>2012-08-27 23:01:08 +1000
committerMichael Save <savetheinternet@tinyboard.org>2012-08-27 23:01:08 +1000
commit9fbf24dca5a04d137c01a6418d41e01d65f8405b (patch)
tree61a62bb369be6f1fbd785cfbcb3d11eb231885c2 /js/quote-selection.js
parent34e9e671b3a071d4569a25a3f690989a5f04de9b (diff)
p.body changed to div.body
Diffstat (limited to 'js/quote-selection.js')
-rw-r--r--js/quote-selection.js116
1 files changed, 116 insertions, 0 deletions
diff --git a/js/quote-selection.js b/js/quote-selection.js
new file mode 100644
index 00000000..0c5b7e7d
--- /dev/null
+++ b/js/quote-selection.js
@@ -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();
+ }
+ });
+});
+