Commit 9e8067ca authored by Max Kanat-Alexander's avatar Max Kanat-Alexander

Bug 551468: Stop word-wrapping comments on the server

r=glob, a=mkanat
parent f2a3931c
...@@ -295,7 +295,7 @@ use constant LIST_OF_BUGS => 1; ...@@ -295,7 +295,7 @@ use constant LIST_OF_BUGS => 1;
# How many of the user's most recent searches to save. # How many of the user's most recent searches to save.
use constant SAVE_NUM_SEARCHES => 10; use constant SAVE_NUM_SEARCHES => 10;
# The column length for displayed (and wrapped) bug comments. # The column width for comment textareas and comments in bugmails.
use constant COMMENT_COLS => 80; use constant COMMENT_COLS => 80;
# Used in _check_comment(). Gives the max length allowed for a comment. # Used in _check_comment(). Gives the max length allowed for a comment.
use constant MAX_COMMENT_LENGTH => 65535; use constant MAX_COMMENT_LENGTH => 65535;
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
* Contributor(s): Frédéric Buclin <LpSolit@gmail.com> * Contributor(s): Frédéric Buclin <LpSolit@gmail.com>
* Max Kanat-Alexander <mkanat@bugzilla.org> * Max Kanat-Alexander <mkanat@bugzilla.org>
* Edmund Wong <ewong@pw-wspx.org> * Edmund Wong <ewong@pw-wspx.org>
* Anthony Pipkin <a.pipkin@yahoo.com>
*/ */
function updateCommentPrivacy(checkbox, id) { function updateCommentPrivacy(checkbox, id) {
...@@ -76,6 +77,53 @@ function expand_comment(link, comment) { ...@@ -76,6 +77,53 @@ function expand_comment(link, comment) {
YAHOO.util.Dom.removeClass(comment, 'collapsed'); YAHOO.util.Dom.removeClass(comment, 'collapsed');
} }
function wrapReplyText(text) {
// This is -3 to account for "\n> "
var maxCol = BUGZILLA.constant.COMMENT_COLS - 3;
var text_lines = text.split("\n");
var wrapped_lines = new Array();
for (var i = 0; i < text_lines.length; i++) {
var paragraph = text_lines[i];
// Don't wrap already-quoted text.
if (paragraph.indexOf('>') == 0) {
wrapped_lines.push('> ' + paragraph);
continue;
}
var replace_lines = new Array();
while (paragraph.length > maxCol) {
var testLine = paragraph.substring(0, maxCol);
var pos = testLine.search(/\s\S*$/);
if (pos < 1) {
// Try to find some ASCII punctuation that's reasonable
// to break on.
var punct = '\\-\\./,!;:';
var punctRe = new RegExp('[' + punct + '][^' + punct + ']+$');
pos = testLine.search(punctRe) + 1;
// Try to find some CJK Punctuation that's reasonable
// to break on.
if (pos == 0)
pos = testLine.search(/[\u3000\u3001\u3002\u303E\u303F]/) + 1;
// If we can't find any break point, we simply break long
// words. This makes long, punctuation-less CJK text wrap,
// even if it wraps incorrectly.
if (pos == 0) pos = maxCol;
}
var wrapped_line = paragraph.substring(0, pos);
replace_lines.push(wrapped_line);
paragraph = paragraph.substring(pos);
// Strip whitespace from the start of the line
paragraph = paragraph.replace(/^\s+/, '');
}
replace_lines.push(paragraph);
wrapped_lines.push("> " + replace_lines.join("\n> "));
}
return wrapped_lines.join("\n");
}
/* This way, we are sure that browsers which do not support JS /* This way, we are sure that browsers which do not support JS
* won't display this link */ * won't display this link */
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
* Contributor(s): Marc Schumann <wurblzap@gmail.com> * Contributor(s): Marc Schumann <wurblzap@gmail.com>
*/ */
.bz_comment_text, .uneditable_textarea { .bz_comment_text, .uneditable_textarea, tbody.file pre {
white-space: pre; white-space: pre;
word-wrap: break-word; word-wrap: break-word;
} }
......
...@@ -73,9 +73,6 @@ table.file_table { ...@@ -73,9 +73,6 @@ table.file_table {
tbody.file pre { tbody.file pre {
display: inline; display: inline;
white-space: pre-wrap; /* CSS 3 & CSS 2.1 */
white-space: -moz-pre-wrap; /* Gecko < 1.9.1 */
white-space: -o-pre-wrap; /* Opera 7 */
font-size: 0.9em; font-size: 0.9em;
} }
......
...@@ -293,9 +293,8 @@ div#docslinks { ...@@ -293,9 +293,8 @@ div#docslinks {
margin-bottom: 2em; margin-bottom: 2em;
} }
/* The rules for these classes make international text wrap correctly, /* tbody.file pre is for the Diff view of attachments. */
even for languages like Japanese that have no spaces. */ .bz_comment_text, .uneditable_textarea, tbody.file pre {
.bz_comment_text, .uneditable_textarea {
font-family: monospace; font-family: monospace;
/* Note that these must all be on separate lines or they stop /* Note that these must all be on separate lines or they stop
working in Konqueror. */ working in Konqueror. */
......
...@@ -51,7 +51,7 @@ ...@@ -51,7 +51,7 @@
<p> <p>
Your comment was:<br> Your comment was:<br>
<blockquote><pre class="bz_comment_text"> <blockquote><pre class="bz_comment_text">
[% cgi.param("comment") FILTER wrap_comment FILTER html %] [% cgi.param("comment") FILTER html %]
</pre></blockquote> </pre></blockquote>
</p> </p>
[% END %] [% END %]
......
...@@ -102,7 +102,7 @@ ...@@ -102,7 +102,7 @@
[% BLOCK a_comment %] [% BLOCK a_comment %]
[% RETURN IF comment.is_private AND ! user.is_insider %] [% RETURN IF comment.is_private AND ! user.is_insider %]
[% comment_text = comment.body_full({ wrap => 1 }) %] [% comment_text = comment.body_full %]
[% RETURN IF comment_text == '' AND (comment.work_time - 0) != 0 AND !user.is_timetracker %] [% RETURN IF comment_text == '' AND (comment.work_time - 0) != 0 AND !user.is_timetracker %]
<div id="c[% count %]" class="bz_comment[% " bz_private" IF comment.is_private %] <div id="c[% count %]" class="bz_comment[% " bz_private" IF comment.is_private %]
......
...@@ -52,17 +52,7 @@ ...@@ -52,17 +52,7 @@
/* pre id="comment_name_N" */ /* pre id="comment_name_N" */
var text_elem = document.getElementById('comment_text_'+id); var text_elem = document.getElementById('comment_text_'+id);
var text = getText(text_elem); var text = getText(text_elem);
replytext = prefix + wrapReplyText(text);
/* make sure we split on all newlines -- IE or Moz use \r and \n
* respectively.
*/
text = text.split(/\r|\n/);
for (var i=0; i < text.length; i++) {
replytext += "> " + text[i] + "\n";
}
replytext = prefix + replytext + "\n";
[% ELSIF user.settings.quote_replies.value == 'simple_reply' %] [% ELSIF user.settings.quote_replies.value == 'simple_reply' %]
replytext = prefix; replytext = prefix;
[% END %] [% END %]
......
...@@ -206,8 +206,7 @@ ...@@ -206,8 +206,7 @@
</script> </script>
[% END %] [% END %]
[% ELSIF field.type == constants.FIELD_TYPE_TEXTAREA %] [% ELSIF field.type == constants.FIELD_TYPE_TEXTAREA %]
<div class="uneditable_textarea">[% value FILTER wrap_comment(60) <div class="uneditable_textarea">[% value FILTER html %]</div>
FILTER html %]</div>
[% ELSIF field.type == constants.FIELD_TYPE_BUG_ID %] [% ELSIF field.type == constants.FIELD_TYPE_BUG_ID %]
[% IF value %] [% IF value %]
[% value FILTER bug_link(value, use_alias => 1) FILTER none %] [% value FILTER bug_link(value, use_alias => 1) FILTER none %]
......
...@@ -67,7 +67,7 @@ ...@@ -67,7 +67,7 @@
<p> <p>
Your comment was:<br> Your comment was:<br>
<blockquote><pre class="bz_comment_text"> <blockquote><pre class="bz_comment_text">
[% cgi.param("comment") FILTER wrap_comment FILTER html %] [% cgi.param("comment") FILTER html %]
</pre></blockquote> </pre></blockquote>
</p> </p>
[% END %] [% END %]
......
...@@ -189,7 +189,9 @@ ...@@ -189,7 +189,9 @@
cookiepath: '[% Param('cookiepath') FILTER js %]', cookiepath: '[% Param('cookiepath') FILTER js %]',
maxusermatches: [% Param('maxusermatches') FILTER js %] maxusermatches: [% Param('maxusermatches') FILTER js %]
}, },
constant: {
COMMENT_COLS: [% constants.COMMENT_COLS FILTER js %]
},
string: { string: {
[%# Please keep these in alphabetical order. %] [%# Please keep these in alphabetical order. %]
......
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
<p> <p>
<pre class="bz_comment_text"> <pre class="bz_comment_text">
[%- cgi.param("text") FILTER wrap_comment FILTER quoteUrls FILTER html -%] [%- cgi.param("text") FILTER quoteUrls FILTER html -%]
</pre> </pre>
</p> </p>
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
<p> <p>
<pre class="bz_comment_text"> <pre class="bz_comment_text">
[%- cgi.param("text") FILTER wrap_comment FILTER quoteUrls -%] [%- cgi.param("text") FILTER quoteUrls -%]
</pre> </pre>
</p> </p>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment