From 4e9bc0f02ddd7d90740e289e565d7f4ebd6e2c1d Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 26 Oct 2005 13:26:04 +0000 Subject: Added TextHelper#strip_tags for removing HTML tags from a string (using HTMLTokenizer) (closes #2229) [marcin@junkheap.net] git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@2750 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- actionpack/CHANGELOG | 2 ++ actionpack/lib/action_view/helpers/text_helper.rb | 22 ++++++++++++++++++++++ actionpack/test/template/text_helper_test.rb | 9 +++++++++ 3 files changed, 33 insertions(+) (limited to 'actionpack') diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index 79dc1a5580..26503aef8e 100644 --- a/actionpack/CHANGELOG +++ b/actionpack/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Added TextHelper#strip_tags for removing HTML tags from a string (using HTMLTokenizer) #2229 [marcin@junkheap.net] + * Added a reader for flash.now, so it's possible to do stuff like flash.now[:alert] ||= 'New if not set' #2422 [Caio Chassot] diff --git a/actionpack/lib/action_view/helpers/text_helper.rb b/actionpack/lib/action_view/helpers/text_helper.rb index 4ead8a816f..e19ba8a66c 100644 --- a/actionpack/lib/action_view/helpers/text_helper.rb +++ b/actionpack/lib/action_view/helpers/text_helper.rb @@ -202,6 +202,28 @@ module ActionView html end + # Strips all HTML tags from the input, including comments. This uses the html-scanner + # tokenizer and so it's HTML parsing ability is limited by that of html-scanner. + # + # Returns the tag free text. + def strip_tags(html) + if html.index("<") + text = "" + tokenizer = HTML::Tokenizer.new(html) + + while token = tokenizer.next + node = HTML::Node.parse(nil, 0, 0, token, false) + # result is only the content of any Text nodes + text << node.to_s if node.class == HTML::Text + end + # strip any comments, and if they have a newline at the end (ie. line with + # only a comment) strip that too + text.gsub(/[\n]?/m, "") + else + html # already plain text + end + end + # Returns a Cycle object whose to_s value cycles through items of an # array every time it is called. This can be used to alternate classes # for table rows: diff --git a/actionpack/test/template/text_helper_test.rb b/actionpack/test/template/text_helper_test.rb index 3eb70eadae..ef6c837c9f 100644 --- a/actionpack/test/template/text_helper_test.rb +++ b/actionpack/test/template/text_helper_test.rb @@ -268,4 +268,13 @@ class TextHelperTest < Test::Unit::TestCase assert_equal(%w{Specialized Fuji Giant}, @cycles) end + def test_strip_tags + assert_equal("This is a test.", strip_tags("

This is a test.

")) + assert_equal("This is a test.", strip_tags("This is a test.")) + assert_equal( + %{This is a test.\n\n\nIt no longer contains any HTML.\n}, strip_tags( + %{This is <b>a <a href="" target="_blank">test</a></b>.\n\n\n\n

It no longer contains any HTML.

\n})) + assert_equal("This has a here.", strip_tags("This has a here.")) + end + end -- cgit v1.2.3