aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack
diff options
context:
space:
mode:
authorDavid Heinemeier Hansson <david@loudthinking.com>2005-10-26 13:26:04 +0000
committerDavid Heinemeier Hansson <david@loudthinking.com>2005-10-26 13:26:04 +0000
commit4e9bc0f02ddd7d90740e289e565d7f4ebd6e2c1d (patch)
treeb113d96d79d9dc8cf962833e976b9543073a8acc /actionpack
parent82f1e19e4c493920e692309d15f66677ac8063e5 (diff)
downloadrails-4e9bc0f02ddd7d90740e289e565d7f4ebd6e2c1d.tar.gz
rails-4e9bc0f02ddd7d90740e289e565d7f4ebd6e2c1d.tar.bz2
rails-4e9bc0f02ddd7d90740e289e565d7f4ebd6e2c1d.zip
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
Diffstat (limited to 'actionpack')
-rw-r--r--actionpack/CHANGELOG2
-rw-r--r--actionpack/lib/action_view/helpers/text_helper.rb22
-rw-r--r--actionpack/test/template/text_helper_test.rb9
3 files changed, 33 insertions, 0 deletions
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("<p>This <u>is<u> a <a href='test.html'><strong>test</strong></a>.</p>"))
+ 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(
+ %{<title>This is <b>a <a href="" target="_blank">test</a></b>.</title>\n\n<!-- it has a comment -->\n\n<p>It no <b>longer <strong>contains <em>any <strike>HTML</strike></em>.</strong></b></p>\n}))
+ assert_equal("This has a here.", strip_tags("This has a <!-- comment --> here."))
+ end
+
end