diff --git a/Gemfile b/Gemfile index e91c56902b5e1..acee230d23c1b 100644 --- a/Gemfile +++ b/Gemfile @@ -46,6 +46,7 @@ end # AP gem "RedCloth", ">= 4.2.2" +gem "bluecloth", ">= 2.0.7" group :documentation do gem 'rdoc', '2.1' diff --git a/actionpack/lib/action_view/helpers/text_helper.rb b/actionpack/lib/action_view/helpers/text_helper.rb index 19f55143bfb2c..8f63845d4991e 100644 --- a/actionpack/lib/action_view/helpers/text_helper.rb +++ b/actionpack/lib/action_view/helpers/text_helper.rb @@ -298,8 +298,8 @@ def textilize_without_paragraph(text, *options) # # markdown('![The ROR logo](http://rubyonrails.com/images/rails.png "Ruby on Rails")') # # => '

The ROR logo

' - def markdown(text, options = {}) - text = sanitize(text) unless options[:safe] + def markdown(text, *options) + text = sanitize(text) unless text.html_safe? || options.delete(:safe) (text.blank? ? "" : BlueCloth.new(text).to_html).html_safe end diff --git a/actionpack/test/template/text_helper_test.rb b/actionpack/test/template/text_helper_test.rb index 8c4711451e3d1..64f1d46413f44 100644 --- a/actionpack/test/template/text_helper_test.rb +++ b/actionpack/test/template/text_helper_test.rb @@ -7,6 +7,12 @@ $stderr.puts "Skipping textilize tests. `gem install RedCloth` to enable." end +begin + require 'bluecloth' +rescue LoadError + $stderr.puts "Skipping markdown tests. 'gem install bluecloth' to enable." +end + class TextHelperTest < ActionView::TestCase tests ActionView::Helpers::TextHelper include TestingSandbox @@ -726,4 +732,34 @@ def test_textilize_without_paragraph_with_hard_breaks assert_equal("This is one scary world.
\n True.", textilize_without_paragraph("This is one scary world.\n True.")) end end + + if defined? BlueCloth + def test_markdown_should_be_html_safe + assert markdown("We are using __Markdown__ now!").html_safe? + end + + def test_markdown + assert_equal("

We are using Markdown now!

", markdown("We are using __Markdown__ now!")) + end + + def test_markdown_with_blank + assert_equal("", markdown("")) + end + + def test_markdown_should_sanitize_unsafe_input + assert_equal("

This is worded strongly

", markdown("This is worded strongly")) + end + + def test_markdown_should_not_sanitize_input_if_safe_option + assert_equal("

This is worded strongly

", markdown("This is worded strongly", :safe)) + end + + def test_markdown_should_not_sanitize_safe_input + assert_equal("

This is worded strongly

", markdown("This is worded strongly".html_safe)) + end + + def test_markdown_with_hard_breaks + assert_equal("

This is one scary world.

\n\n

True.

", markdown("This is one scary world.\n\nTrue.")) + end + end end