diff options
-rw-r--r-- | Bugzilla/Markdown.pm | 32 | ||||
-rw-r--r-- | Bugzilla/Template.pm | 12 | ||||
-rw-r--r-- | skins/standard/global.css | 9 | ||||
-rw-r--r-- | template/en/default/bug/comments.html.tmpl | 50 |
4 files changed, 93 insertions, 10 deletions
diff --git a/Bugzilla/Markdown.pm b/Bugzilla/Markdown.pm index 5f1a7d955..3023d98e2 100644 --- a/Bugzilla/Markdown.pm +++ b/Bugzilla/Markdown.pm @@ -75,7 +75,7 @@ sub _Markdown { my $self = shift; my $text = shift; - $text = Bugzilla::Template::quoteUrls($text); + $text = Bugzilla::Template::quoteUrls($text, undef, undef, undef, undef, 1); return $self->SUPER::_Markdown($text, @_); } @@ -392,6 +392,36 @@ sub _DoCodeBlocks { return $text; } +sub _DoBlockQuotes { + my ($self, $text) = @_; + + $text =~ s{ + ( # Wrap whole match in $1 + (?: + ^[ \t]*>[ \t]? # '>' at the start of a line + .+\n # rest of the first line + (?:.+\n)* # subsequent consecutive lines + \n* # blanks + )+ + ) + }{ + my $bq = $1; + $bq =~ s/^[ \t]*>[ \t]?//gm; # trim one level of quoting + $bq =~ s/^[ \t]+$//mg; # trim whitespace-only lines + $bq = $self->_RunBlockGamut($bq, {wrap_in_p_tags => 1}); # recurse + $bq =~ s/^/ /mg; + # These leading spaces screw with <pre> content, so we need to fix that: + $bq =~ s{(\s*<pre>.+?</pre>)}{ + my $pre = $1; + $pre =~ s/^ //mg; + $pre; + }egs; + "<blockquote>\n$bq\n</blockquote>\n\n"; + }egmx; + + return $text; +} + sub _EncodeCode { my ($self, $text) = @_; diff --git a/Bugzilla/Template.pm b/Bugzilla/Template.pm index ca467577f..660767afd 100644 --- a/Bugzilla/Template.pm +++ b/Bugzilla/Template.pm @@ -148,10 +148,11 @@ sub get_format { # If you want to modify this routine, read the comments carefully sub quoteUrls { - my ($text, $bug, $comment, $user, $bug_link_func) = @_; + my ($text, $bug, $comment, $user, $bug_link_func, $for_markdown) = @_; return $text unless $text; $user ||= Bugzilla->user; $bug_link_func ||= \&get_bug_link; + $for_markdown ||= 0; # We use /g for speed, but uris can have other things inside them # (http://foo/bug#3 for example). Filtering that out filters valid @@ -222,10 +223,11 @@ sub quoteUrls { $text = html_quote($text); - # Color quoted text - $text =~ s~^(>.+)$~<span class="quote">$1</span >~mg; - $text =~ s~</span >\n<span class="quote">~\n~g; - + unless ($for_markdown) { + # Color quoted text + $text =~ s~^(>.+)$~<span class="quote">$1</span >~mg; + $text =~ s~</span >\n<span class="quote">~\n~g; + } # mailto: # Use |<nothing> so that $1 is defined regardless # @ is the encoded '@' character. diff --git a/skins/standard/global.css b/skins/standard/global.css index 45aeb2634..28c406b1d 100644 --- a/skins/standard/global.css +++ b/skins/standard/global.css @@ -243,6 +243,15 @@ textarea { font-family: monospace; } + + blockquote { + border-left: 0.2em solid #CCC; + color: #65379C; + padding: 0; + margin-left: 0.5em; + margin-bottom: -1em; + white-space: pre; + } /* generic (end) */ /* Links that control whether or not something is visible. */ diff --git a/template/en/default/bug/comments.html.tmpl b/template/en/default/bug/comments.html.tmpl index 8f5742fee..617f49471 100644 --- a/template/en/default/bug/comments.html.tmpl +++ b/template/en/default/bug/comments.html.tmpl @@ -14,13 +14,16 @@ <script type="text/javascript"> <!-- /* Adds the reply text to the 'comment' textarea */ - function replyToComment(id, real_id, name) { + function replyToComment(id, real_id, name, text) { var prefix = "(In reply to " + name + " from comment #" + id + ")\n"; var replytext = ""; [% IF user.settings.quote_replies.value == 'quoted_reply' %] /* pre id="comment_name_N" */ - var text_elem = document.getElementById('comment_text_'+id); - var text = getText(text_elem); + + if (text == null) { + var text_elem = document.getElementById('comment_text_'+id); + text = getText(text_elem); + } replytext = prefix + wrapReplyText(text); [% ELSIF user.settings.quote_replies.value == 'simple_reply' %] replytext = prefix; @@ -41,6 +44,39 @@ textarea.focus(); } + + function replyToMarkdownComment(id, real_id, name) { + var textarea = document.getElementById('comment'); + var comment = textarea.value; + textarea.value += "Fetching comment..."; + YAHOO.util.Connect.setDefaultPostHeader('application/json', true); + YAHOO.util.Connect.asyncRequest('POST', 'jsonrpc.cgi', + { + success: function(res) { + var data = YAHOO.lang.JSON.parse(res.responseText); + if (!data.error) { + textarea.value = comment; + var text = data.result.comments[real_id].text; + replyToComment(id, real_id, name, text); + } else { + replyToComment(id, real_id, name, null); + } + }, + failure: function(res) { + /* On failure, quote the comment as plain-text */ + replyToComment(id, real_id, name, null); + } + }, + YAHOO.lang.JSON.stringify({ + version: "1.1", + method: "Bug.comments", + params: { + Bugzilla_api_token: BUGZILLA.api_token, + comment_ids: [real_id], + } + }) + ); + } //--> </script> @@ -126,7 +162,13 @@ [% END %] [<a class="bz_reply_link" href="#add_comment" [% IF user.settings.quote_replies.value != 'off' %] - onclick="replyToComment('[% comment.count %]', '[% comment.id %]', '[% comment.author.name || comment.author.nick FILTER html FILTER js %]'); return false;" + onclick=" + [% IF feature_enabled('jsonrpc') && comment.is_markdown %] + replyToMarkdownComment('[% comment.count %]', '[% comment.id %]', '[% comment.author.name || comment.author.nick FILTER html FILTER js %]'); return false;" + [% ELSE %] + replyToComment('[% comment.count %]', '[% comment.id %]', '[% comment.author.name || comment.author.nick FILTER html FILTER js %]', null); return false;" + + [% END %] [% END %] >reply</a>] [% END %] |