summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--js/post-hover.js4
-rw-r--r--js/quick-post-controls.js2
-rw-r--r--js/quote-selection.js116
-rw-r--r--js/show-backlinks.js2
-rw-r--r--js/show-op.js2
5 files changed, 121 insertions, 5 deletions
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 <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();
+ }
+ });
+});
+
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+)$/))