]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 1059723: Reply button should become AJAX-based
authorKoosha KM <koosha.khajeh@gmail.com>
Tue, 14 Oct 2014 20:42:46 +0000 (20:42 +0000)
committerDavid Lawrence <dkl@mozilla.com>
Tue, 14 Oct 2014 20:42:46 +0000 (20:42 +0000)
r=dkl,a=sgreen

Bugzilla/Markdown.pm
Bugzilla/Template.pm
skins/standard/global.css
template/en/default/bug/comments.html.tmpl

index 5f1a7d955beea33594e776540fbcb6986486b166..3023d98e24a5bac08f574643d94554c0d15e762c 100644 (file)
@@ -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]*&gt;[ \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]*&gt;[ \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) = @_;
 
index ca467577f37b3b09e7fafc0cbf7b8032c4b81ae5..660767afdb219cddc5047fb4d0d05d0381438c18 100644 (file)
@@ -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~^(&gt;.+)$~<span class="quote">$1</span >~mg;
-    $text =~ s~</span >\n<span class="quote">~\n~g;
-
+    unless ($for_markdown) {
+        # Color quoted text
+        $text =~ s~^(&gt;.+)$~<span class="quote">$1</span >~mg;
+        $text =~ s~</span >\n<span class="quote">~\n~g;
+    }
     # mailto:
     # Use |<nothing> so that $1 is defined regardless
     # &#64; is the encoded '@' character.
index 45aeb263478af10529c0e3a02781765ba1c5048a..28c406b1d14ae6378de764c36927dedf437a9d2e 100644 (file)
     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. */
index 8f5742feeb77eb1de6750e657a81f8d22911ef30..617f494713c07415bd01798331d5c3e4961cf97d 100644 (file)
 <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;
 
       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>
 
               [% 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 %]