##// END OF EJS Templates
Insert line break before post reflink when replying to a post after entering some text into the form
neko259 -
r1696:d1918b48 default
parent child Browse files
Show More
@@ -1,163 +1,168 b''
1 /*
1 /*
2 @licstart The following is the entire license notice for the
2 @licstart The following is the entire license notice for the
3 JavaScript code in this page.
3 JavaScript code in this page.
4
4
5
5
6 Copyright (C) 2013 neko259
6 Copyright (C) 2013 neko259
7
7
8 The JavaScript code in this page is free software: you can
8 The JavaScript code in this page is free software: you can
9 redistribute it and/or modify it under the terms of the GNU
9 redistribute it and/or modify it under the terms of the GNU
10 General Public License (GNU GPL) as published by the Free Software
10 General Public License (GNU GPL) as published by the Free Software
11 Foundation, either version 3 of the License, or (at your option)
11 Foundation, either version 3 of the License, or (at your option)
12 any later version. The code is distributed WITHOUT ANY WARRANTY;
12 any later version. The code is distributed WITHOUT ANY WARRANTY;
13 without even the implied warranty of MERCHANTABILITY or FITNESS
13 without even the implied warranty of MERCHANTABILITY or FITNESS
14 FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
14 FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
15
15
16 As additional permission under GNU GPL version 3 section 7, you
16 As additional permission under GNU GPL version 3 section 7, you
17 may distribute non-source (e.g., minimized or compacted) forms of
17 may distribute non-source (e.g., minimized or compacted) forms of
18 that code without the copy of the GNU GPL normally required by
18 that code without the copy of the GNU GPL normally required by
19 section 4, provided you include this license notice and a URL
19 section 4, provided you include this license notice and a URL
20 through which recipients can access the Corresponding Source.
20 through which recipients can access the Corresponding Source.
21
21
22 @licend The above is the entire license notice
22 @licend The above is the entire license notice
23 for the JavaScript code in this page.
23 for the JavaScript code in this page.
24 */
24 */
25
25
26 var CLOSE_BUTTON = '#form-close-button';
26 var CLOSE_BUTTON = '#form-close-button';
27 var REPLY_TO_MSG = '.reply-to-message';
27 var REPLY_TO_MSG = '.reply-to-message';
28 var REPLY_TO_MSG_ID = '#reply-to-message-id';
28 var REPLY_TO_MSG_ID = '#reply-to-message-id';
29
29
30 var $html = $("html, body");
30 var $html = $("html, body");
31
31
32 function moveCaretToEnd(el) {
32 function moveCaretToEnd(el) {
33 if (typeof el.selectionStart == "number") {
33 if (typeof el.selectionStart == "number") {
34 el.selectionStart = el.selectionEnd = el.value.length;
34 el.selectionStart = el.selectionEnd = el.value.length;
35 } else if (typeof el.createTextRange != "undefined") {
35 } else if (typeof el.createTextRange != "undefined") {
36 el.focus();
36 el.focus();
37 var range = el.createTextRange();
37 var range = el.createTextRange();
38 range.collapse(false);
38 range.collapse(false);
39 range.select();
39 range.select();
40 }
40 }
41 }
41 }
42
42
43 function getForm() {
43 function getForm() {
44 return $('.post-form-w');
44 return $('.post-form-w');
45 }
45 }
46
46
47 function resetFormPosition() {
47 function resetFormPosition() {
48 var form = getForm();
48 var form = getForm();
49 form.insertAfter($('.thread'));
49 form.insertAfter($('.thread'));
50
50
51 $(CLOSE_BUTTON).hide();
51 $(CLOSE_BUTTON).hide();
52 $(REPLY_TO_MSG).hide();
52 $(REPLY_TO_MSG).hide();
53 }
53 }
54
54
55 function showFormAfter(blockToInsertAfter) {
55 function showFormAfter(blockToInsertAfter) {
56 var form = getForm();
56 var form = getForm();
57 form.insertAfter(blockToInsertAfter);
57 form.insertAfter(blockToInsertAfter);
58
58
59 $(CLOSE_BUTTON).show();
59 $(CLOSE_BUTTON).show();
60 form.show();
60 form.show();
61 $(REPLY_TO_MSG_ID).text(blockToInsertAfter.attr('id'));
61 $(REPLY_TO_MSG_ID).text(blockToInsertAfter.attr('id'));
62 $(REPLY_TO_MSG).show();
62 $(REPLY_TO_MSG).show();
63 }
63 }
64
64
65 function addQuickReply(postId) {
65 function addQuickReply(postId) {
66 // If we click "reply" on the same post, it means "cancel"
66 // If we click "reply" on the same post, it means "cancel"
67 if (getForm().prev().attr('id') == postId) {
67 if (getForm().prev().attr('id') == postId) {
68 resetFormPosition();
68 resetFormPosition();
69 } else {
69 } else {
70 var blockToInsert = null;
70 var blockToInsert = null;
71 var textAreaJq = $('textarea');
71 var textAreaJq = $('textarea');
72 var postLinkRaw = '[post]' + postId + '[/post]'
72 var postLinkRaw = '[post]' + postId + '[/post]'
73 var textToAdd = '';
73 var textToAdd = '';
74
74
75 if (postId != null) {
75 if (postId != null) {
76 var post = $('#' + postId);
76 var post = $('#' + postId);
77
77
78 // If this is not OP, add reflink to the post. If there already is
78 // If this is not OP, add reflink to the post. If there already is
79 // the same reflink, don't add it again.
79 // the same reflink, don't add it again.
80 if (!post.is(':first-child') && textAreaJq.val().indexOf(postLinkRaw) < 0) {
80 var postText = textAreaJq.val();
81 if (!post.is(':first-child') && postText.indexOf(postLinkRaw) < 0) {
82 // Insert line break if none is present.
83 if (postText.length > 0 && !postText.endsWith('\n') && !postText.endsWith('\r')) {
84 textToAdd += '\n';
85 }
81 textToAdd += postLinkRaw + '\n';
86 textToAdd += postLinkRaw + '\n';
82 }
87 }
83
88
84 textAreaJq.val(textAreaJq.val()+ textToAdd);
89 textAreaJq.val(textAreaJq.val()+ textToAdd);
85 blockToInsert = post;
90 blockToInsert = post;
86 } else {
91 } else {
87 blockToInsert = $('.thread');
92 blockToInsert = $('.thread');
88 }
93 }
89 showFormAfter(blockToInsert);
94 showFormAfter(blockToInsert);
90
95
91 textAreaJq.focus();
96 textAreaJq.focus();
92
97
93 var textarea = document.getElementsByTagName('textarea')[0];
98 var textarea = document.getElementsByTagName('textarea')[0];
94 moveCaretToEnd(textarea);
99 moveCaretToEnd(textarea);
95 }
100 }
96 }
101 }
97
102
98 function addQuickQuote() {
103 function addQuickQuote() {
99 var textAreaJq = $('textarea');
104 var textAreaJq = $('textarea');
100
105
101 var quoteButton = $("#quote-button");
106 var quoteButton = $("#quote-button");
102 var postId = quoteButton.attr('data-post-id');
107 var postId = quoteButton.attr('data-post-id');
103 if (postId != null && getForm().prev().attr('id') != postId) {
108 if (postId != null && getForm().prev().attr('id') != postId) {
104 addQuickReply(postId);
109 addQuickReply(postId);
105 }
110 }
106
111
107 var textToAdd = '';
112 var textToAdd = '';
108 var selection = window.getSelection().toString();
113 var selection = window.getSelection().toString();
109 if (selection.length == 0) {
114 if (selection.length == 0) {
110 selection = quoteButton.attr('data-text');
115 selection = quoteButton.attr('data-text');
111 }
116 }
112 if (selection.length > 0) {
117 if (selection.length > 0) {
113 textToAdd += '[quote]' + selection + '[/quote]\n';
118 textToAdd += '[quote]' + selection + '[/quote]\n';
114 }
119 }
115
120
116 textAreaJq.val(textAreaJq.val() + textToAdd);
121 textAreaJq.val(textAreaJq.val() + textToAdd);
117
122
118 textAreaJq.focus();
123 textAreaJq.focus();
119
124
120 var textarea = document.getElementsByTagName('textarea')[0];
125 var textarea = document.getElementsByTagName('textarea')[0];
121 moveCaretToEnd(textarea);
126 moveCaretToEnd(textarea);
122 }
127 }
123
128
124 function scrollToBottom() {
129 function scrollToBottom() {
125 $html.animate({scrollTop: $html.height()}, "fast");
130 $html.animate({scrollTop: $html.height()}, "fast");
126 }
131 }
127
132
128 function showQuoteButton() {
133 function showQuoteButton() {
129 var selection = window.getSelection().getRangeAt(0).getBoundingClientRect();
134 var selection = window.getSelection().getRangeAt(0).getBoundingClientRect();
130 var quoteButton = $("#quote-button");
135 var quoteButton = $("#quote-button");
131 if (selection.width > 0) {
136 if (selection.width > 0) {
132 // quoteButton.offset({ top: selection.top - selection.height, left: selection.left });
137 // quoteButton.offset({ top: selection.top - selection.height, left: selection.left });
133 quoteButton.css({top: selection.top + $(window).scrollTop() - 30, left: selection.left});
138 quoteButton.css({top: selection.top + $(window).scrollTop() - 30, left: selection.left});
134 quoteButton.show();
139 quoteButton.show();
135
140
136 var text = window.getSelection().toString();
141 var text = window.getSelection().toString();
137 quoteButton.attr('data-text', text);
142 quoteButton.attr('data-text', text);
138
143
139 var rect = window.getSelection().getRangeAt(0).getBoundingClientRect();
144 var rect = window.getSelection().getRangeAt(0).getBoundingClientRect();
140 var element = $(document.elementFromPoint(rect.x, rect.y));
145 var element = $(document.elementFromPoint(rect.x, rect.y));
141 var postId = null;
146 var postId = null;
142 if (element.hasClass('post')) {
147 if (element.hasClass('post')) {
143 postId = element.attr('id');
148 postId = element.attr('id');
144 } else {
149 } else {
145 var postParent = element.parents('.post');
150 var postParent = element.parents('.post');
146 if (postParent.length > 0) {
151 if (postParent.length > 0) {
147 postId = postParent.attr('id');
152 postId = postParent.attr('id');
148 }
153 }
149 }
154 }
150 quoteButton.attr('data-post-id', postId);
155 quoteButton.attr('data-post-id', postId);
151 } else {
156 } else {
152 quoteButton.hide();
157 quoteButton.hide();
153 }
158 }
154 }
159 }
155
160
156 $(document).ready(function() {
161 $(document).ready(function() {
157 $('body').on('mouseup', function() {
162 $('body').on('mouseup', function() {
158 showQuoteButton();
163 showQuoteButton();
159 });
164 });
160 $("#quote-button").click(function() {
165 $("#quote-button").click(function() {
161 addQuickQuote();
166 addQuickQuote();
162 })
167 })
163 }); No newline at end of file
168 });
General Comments 0
You need to be logged in to leave comments. Login now