]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 1059684: markdown text should not be rendered within a <pre> tag
authorDavid Lawrence <dkl@mozilla.com>
Tue, 28 Oct 2014 03:01:01 +0000 (03:01 +0000)
committerDavid Lawrence <dkl@mozilla.com>
Tue, 28 Oct 2014 03:01:01 +0000 (03:01 +0000)
r=glob,a=glob

Bugzilla/Markdown.pm
Bugzilla/User.pm
js/field.js
process_bug.cgi
skins/standard/global.css
template/en/default/bug/comment.html.tmpl
template/en/default/bug/comments.html.tmpl

index 3023d98e24a5bac08f574643d94554c0d15e762c..353c2ff6aef74881b38d85532f33cb4a147f80a7 100644 (file)
@@ -99,7 +99,7 @@ sub _RunSpanGamut {
     $text = $self->_EncodeAmpsAndAngles($text);
     $text = $self->_DoItalicsAndBold($text);
 
-    $text =~ s/ {2,}\n/ <br$self->{empty_element_suffix}\n/g;
+    $text =~ s/\n/<br$self->{empty_element_suffix}\n/g;
 
     return $text;
 }
@@ -323,13 +323,6 @@ sub _DoItalicsAndBold {
     return $text;
 }
 
-# Override this function to ignore 'wrap_in_p_tags' from
-# the caller and to not generate <p> tags around the output.
-sub _FormParagraphs {
-    my ($self, $text) = @_;
-    return $self->SUPER::_FormParagraphs($text, { wrap_in_p_tags => 0 });
-}
-
 sub _DoStrikethroughs {
     my ($self, $text) = @_;
 
index acedc65f2a38d9fa49bd247eedf30b703ce86483..fa26743661829c0d46c725dd855d28dccd7ddd1f 100644 (file)
@@ -632,6 +632,14 @@ sub is_bug_ignored {
     return (grep {$_->{'id'} == $bug_id} @{$self->bugs_ignored}) ? 1 : 0;
 }
 
+sub use_markdown {
+    my ($self, $comment) = @_;
+    return Bugzilla->feature('markdown')
+           && $self->settings->{use_markdown}->{is_enabled}
+           && $self->settings->{use_markdown}->{value} eq 'on'
+           && (!defined $comment || $comment->is_markdown);
+}
+
 ##########################
 # Saved Recent Bug Lists #
 ##########################
@@ -2623,6 +2631,12 @@ C<string> The current summary of the bug.
 Returns true if the user does not want email notifications for the
 specified bug ID, else returns false.
 
+=item C<use_markdown>
+
+Returns true if the user has set their preferences to use Markdown
+for rendering comments. If an optional C<comment> object is passed
+then it returns true if the comment has markdown enabled.
+
 =back
 
 =head2 Saved Recent Bug Lists
index 1cd58a69ac9963d56f4d0ee9e566ad29b45e65ea..c24603988f04c28d4f5d1356e0719136bdf9eba8 100644 (file)
@@ -984,18 +984,32 @@ function initDirtyFieldTracking() {
 
 var last_comment_text = '';
 var last_markdown_cb_value = null;
+var comment_textarea_width = null;
+var comment_textarea_height = null;
 
-function show_comment_preview(bug_id) {
+function refresh_markdown_preview (bug_id) {
+    if (!YAHOO.util.Dom.hasClass('comment_preview_tab', 'active_comment_tab'))
+        return;
+    show_comment_preview(bug_id, 1);
+}
+
+function show_comment_preview(bug_id, refresh) {
     var Dom = YAHOO.util.Dom;
     var comment = document.getElementById('comment');
     var preview = document.getElementById('comment_preview');
     var markdown_cb = document.getElementById('use_markdown');
 
     if (!comment || !preview) return;
-    if (Dom.hasClass('comment_preview_tab', 'active_comment_tab')) return;
+    if (Dom.hasClass('comment_preview_tab', 'active_comment_tab') && !refresh)
+        return;
 
-    preview.style.width = (comment.clientWidth - 4) + 'px';
-    preview.style.height = comment.offsetHeight + 'px';
+    if (!comment_textarea_width) {
+        comment_textarea_width = (comment.clientWidth - 4) + 'px';
+        comment_textarea_height = comment.offsetHeight + 'px';
+    }
+
+    preview.style.width = comment_textarea_width;
+    preview.style.height = comment_textarea_height;
 
     var comment_tab = document.getElementById('comment_tab');
     Dom.addClass(comment, 'bz_default_hidden');
@@ -1029,6 +1043,12 @@ function show_comment_preview(bug_id) {
                 document.getElementById('comment_preview_text').innerHTML = data.result.html;
                 Dom.addClass('comment_preview_loading', 'bz_default_hidden');
                 Dom.removeClass('comment_preview_text', 'bz_default_hidden');
+                if (markdown_cb.checked) {
+                    Dom.removeClass('comment_preview_text', 'comment_preview_pre');
+                }
+                else {
+                    Dom.addClass('comment_preview_text', 'comment_preview_pre');
+                }
                 last_comment_text = comment.value;
                 last_markdown_cb_value = markdown_cb.checked;
             }
index b47a3b1cfce4fc888c7d3fe9a0672b3d64289a29..b3d9799602afa9758b2f9ffe9481a310ffed6a10 100755 (executable)
@@ -233,8 +233,8 @@ if (should_set('keywords')) {
     $set_all_fields{keywords}->{$action} = $cgi->param('keywords');
 }
 if (should_set('comment')) {
-    my $is_markdown = ($user->settings->{use_markdown}->{is_enabled} &&
-                            $cgi->param('use_markdown')) ? 1 : 0;
+    my $is_markdown = ($user->use_markdown
+                       && $cgi->param('use_markdown') eq '1') ? 1 : 0;
 
     $set_all_fields{comment} = {
         body        => scalar $cgi->param('comment'),
index 28c406b1d14ae6378de764c36927dedf437a9d2e..60e06af7383a5ec0962163e80bb4c226022cfc0b 100644 (file)
@@ -319,7 +319,7 @@ div#docslinks {
 }
 
 /* tbody.file pre is for the Diff view of attachments. */
-.bz_comment_text, .uneditable_textarea, tbody.file pre {
+pre.bz_comment_text, .uneditable_textarea, tbody.file pre {
      font-family: monospace;
      white-space: pre-wrap;
 }
@@ -732,6 +732,10 @@ input.required, select.required, span.required_explanation {
     width: auto;
 }
 
+.comment_preview_pre {
+    white-space: pre;
+}
+
 #comment_preview_loading {
     font-style: italic;
 }
index b748b71fd16f50928186bddf6fa36c46f0507f78..76054f92ab2749fc375d5a104a8d86f2509b0612 100644 (file)
   <div id="comment_preview" class="bz_default_hidden bz_comment">
     <div id="comment_preview_loading" class="bz_default_hidden">Generating Preview...</div>
     <div id="comment_preview_error" class="bz_default_hidden"></div>
-    <pre id="comment_preview_text" class="bz_comment_text"></pre>
+    <div id="comment_preview_text" class="bz_comment_text"></div>
   </div>
 [% END %]
 
-[% IF feature_enabled('markdown') AND  user.settings.use_markdown.value == 'on' %]
+[% IF user.use_markdown %]
   <div id="comment_markdown">
-    <input type="checkbox" name="use_markdown" id="use_markdown" value="1"
-    [% "checked=\"checked\"" IF user.settings.use_markdown.value == 'on' %] >
+    <input type="checkbox" name="use_markdown"
+           id="use_markdown" value="1" checked="checked"
+           onchange="refresh_markdown_preview([% bug.id FILTER none %])">
     <label id="use_markdown_label" for="use_markdown">Use Markdown for this [% terms.comment %]</label>
     (<a href="page.cgi?id=markdown.html" target="_blank" title="View Markdown Syntax Guide">help</a>)
   </div>
index 617f494713c07415bd01798331d5c3e4961cf97d..3895691d75d29be77d6d21a3771e1c3ecb458f24 100644 (file)
 [%# Don't indent the <pre> block, since then the spaces are displayed in the
   # generated HTML
   #%]
-<pre class="bz_comment_text[% " collapsed" IF comment.collapsed %]"
+<[% user.use_markdown(comment) ? "div" : "pre" %] class="bz_comment_text[% " collapsed" IF comment.collapsed %]"
   [% IF mode == "edit" || comment.collapsed %]
     id="comment_text_[% comment.count FILTER none %]"
   [% END %]>
   [%- comment_text FILTER markdown(bug, comment) -%]
-</pre>
+</[% user.use_markdown(comment) ? "div" : "pre" %]>
     [% Hook.process('a_comment-end', 'bug/comments.html.tmpl') %]
     </div>
 [% END %]