From: Go MAEDA Date: Thu, 3 Oct 2019 00:09:28 +0000 (+0000) Subject: Render Textile and Markdown attachments on the preview page (#29752). X-Git-Tag: 4.1.0~501 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=3ce678510e96fa0ce5459e6b7731878347f686b2;p=redmine.git Render Textile and Markdown attachments on the preview page (#29752). Patch by Takenori TAKAKI. git-svn-id: http://svn.redmine.org/redmine/trunk@18584 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- diff --git a/app/helpers/attachments_helper.rb b/app/helpers/attachments_helper.rb index 5421731ea..476b93ef3 100644 --- a/app/helpers/attachments_helper.rb +++ b/app/helpers/attachments_helper.rb @@ -86,4 +86,14 @@ module AttachmentsHelper end api.created_on attachment.created_on end + + def render_file_content(attachment, content) + if attachment.is_markdown? + render :partial => 'common/markup', :locals => {:markup_text_formatting => 'markdown', :markup_text => content} + elsif attachment.is_textile? + render :partial => 'common/markup', :locals => {:markup_text_formatting => 'textile', :markup_text => content} + else + render :partial => 'common/file', :locals => {:content => content, :filename => attachment.filename} + end + end end diff --git a/app/models/attachment.rb b/app/models/attachment.rb index 29d1acc79..0cd666499 100644 --- a/app/models/attachment.rb +++ b/app/models/attachment.rb @@ -240,6 +240,14 @@ class Attachment < ActiveRecord::Base Redmine::MimeType.is_type?('text', filename) || Redmine::SyntaxHighlighting.filename_supported?(filename) end + def is_markdown? + Redmine::MimeType.of(filename) == 'text/markdown' + end + + def is_textile? + self.filename =~ /\.textile$/i + end + def is_image? Redmine::MimeType.is_type?('image', filename) end diff --git a/app/views/attachments/file.html.erb b/app/views/attachments/file.html.erb index af5ea78dc..e19b9127e 100644 --- a/app/views/attachments/file.html.erb +++ b/app/views/attachments/file.html.erb @@ -1,4 +1,4 @@ <%= render :layout => 'layouts/file' do %>   - <%= render :partial => 'common/file', :locals => {:content => @content, :filename => @attachment.filename} %> + <%= render_file_content(@attachment, @content) %> <% end %> diff --git a/app/views/common/_markup.html.erb b/app/views/common/_markup.html.erb new file mode 100644 index 000000000..dc6c7f474 --- /dev/null +++ b/app/views/common/_markup.html.erb @@ -0,0 +1,3 @@ +
+ <%= Redmine::WikiFormatting.to_html(markup_text_formatting, Redmine::CodesetUtil.to_utf8_by_setting(markup_text)).html_safe %> +
diff --git a/test/fixtures/files/testfile.md b/test/fixtures/files/testfile.md new file mode 100644 index 000000000..3606a410e --- /dev/null +++ b/test/fixtures/files/testfile.md @@ -0,0 +1,3 @@ +# Header 1 +## Header 2 +### Header 3 diff --git a/test/fixtures/files/testfile.textile b/test/fixtures/files/testfile.textile new file mode 100644 index 000000000..6339de56b --- /dev/null +++ b/test/fixtures/files/testfile.textile @@ -0,0 +1,5 @@ +h1. Header 1 + +h2. Header 2 + +h3. Header 3 diff --git a/test/functional/attachments_controller_test.rb b/test/functional/attachments_controller_test.rb index ff2838931..b9fad5ec2 100644 --- a/test/functional/attachments_controller_test.rb +++ b/test/functional/attachments_controller_test.rb @@ -205,6 +205,38 @@ class AttachmentsControllerTest < Redmine::ControllerTest end end + def test_show_text_file_formated_markdown + set_tmp_attachments_directory + a = Attachment.new(:container => Issue.find(1), + :file => uploaded_test_file('testfile.md', 'text/plain'), + :author => User.find(1)) + assert a.save + assert_equal 'testfile.md', a.filename + + get :show, :params => { + :id => a.id + } + assert_response :success + assert_equal 'text/html', @response.content_type + assert_select 'div.wiki', :html => "

Header 1

\n\n

Header 2

\n\n

Header 3

" + end + + def test_show_text_file_fromated_textile + set_tmp_attachments_directory + a = Attachment.new(:container => Issue.find(1), + :file => uploaded_test_file('testfile.textile', 'text/plain'), + :author => User.find(1)) + assert a.save + assert_equal 'testfile.textile', a.filename + + get :show, :params => { + :id => a.id + } + assert_response :success + assert_equal 'text/html', @response.content_type + assert_select 'div.wiki', :html => "

Header 1

\n\n\n\t

Header 2

\n\n\n\t

Header 3

" + end + def test_show_image @request.session[:user_id] = 2 get :show, :params => {