From 9fbf24dca5a04d137c01a6418d41e01d65f8405b Mon Sep 17 00:00:00 2001 From: Michael Save Date: Mon, 27 Aug 2012 23:01:08 +1000 Subject: [PATCH] p.body changed to div.body --- js/post-hover.js | 4 +- js/quick-post-controls.js | 2 +- js/quote-selection.js | 116 ++++++++++++++++++++++++++++++++++++++ js/show-backlinks.js | 2 +- js/show-op.js | 2 +- 5 files changed, 121 insertions(+), 5 deletions(-) create mode 100644 js/quote-selection.js diff --git a/js/post-hover.js b/js/post-hover.js index f358f7ff..2f25540b 100644 --- a/js/post-hover.js +++ b/js/post-hover.js @@ -109,11 +109,11 @@ onready(function(){ }); }; - $('p.body a:not([rel="nofollow"])').each(init_hover); + $('div.body a:not([rel="nofollow"])').each(init_hover); // allow to work with auto-reload.js, etc. $(document).bind('new_post', function(e, post) { - $(post).find('p.body a:not([rel="nofollow"])').each(init_hover); + $(post).find('div.body a:not([rel="nofollow"])').each(init_hover); }); }); diff --git a/js/quick-post-controls.js b/js/quick-post-controls.js index 9e6566c6..0c164bbb 100644 --- a/js/quick-post-controls.js +++ b/js/quick-post-controls.js @@ -58,7 +58,7 @@ $(document).ready(function(){ post_form.find('input[type="password"]').val(localStorage.password); if(thread) { - post_form.prependTo($(this).parent().parent().find('p.body')); + post_form.prependTo($(this).parent().parent().find('div.body')); } else { post_form.appendTo($(this).parent().parent()); //post_form.insertBefore($(this)); 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 + * + * 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(); + } + }); +}); + diff --git a/js/show-backlinks.js b/js/show-backlinks.js index 8875cf60..e6e17e4f 100644 --- a/js/show-backlinks.js +++ b/js/show-backlinks.js @@ -16,7 +16,7 @@ onready(function(){ var showBackLinks = function() { var reply_id = $(this).attr('id').replace(/^reply_/, ''); - $(this).find('p.body a:not([rel="nofollow"])').each(function() { + $(this).find('div.body a:not([rel="nofollow"])').each(function() { var id, post, $mentioned; if(id = $(this).text().match(/^>>(\d+)$/)) diff --git a/js/show-op.js b/js/show-op.js index d948ca3b..7235e721 100644 --- a/js/show-op.js +++ b/js/show-op.js @@ -23,7 +23,7 @@ $(document).ready(function(){ OP = $('div.post.op a.post_no:eq(1)').text(); } - $(this).find('p.body a:not([rel="nofollow"])').each(function() { + $(this).find('div.body a:not([rel="nofollow"])').each(function() { var postID; if(postID = $(this).text().match(/^>>(\d+)$/))