The TextHelper Module provides a set of methods for filtering, formatting and transforming strings that can reduce the amount of inline Ruby code in your views. These helper methods extend ActionView making them callable within your template files as shown in the following example which truncates the title of each post to 10 characters.
<% @posts.each do |post| %> # post == 'This is my title' Title: <%= truncate(post.title, 10) %> <% end %> => Title: This is my...
- A
- C
- E
- H
- M
- P
- R
- S
- T
- W
VERBOTEN_TAGS | = | %w(form script plaintext) unless defined?(VERBOTEN_TAGS) |
VERBOTEN_ATTRS | = | /^on/i unless defined?(VERBOTEN_ATTRS) |
AUTO_LINK_RE | = | %r{ ( # leading text <\w+.*?>| # leading HTML tag, or [^=!:'"/]| # leading punctuation, or ^ # beginning of line ) ( (?:https?://)| # protocol spec, or (?:www\.) # www.* ) ( [-\w]+ # subdomain or domain (?:\.[-\w]+)* # remaining subdomains or domain (?::\d+)? # port (?:/(?:(?:[~\w\+%-]|(?:[,.;:][^\s$]))+)?)* # path (?:\?[\w\+%&=.;-]+)? # query string (?:\#[\w\-]*)? # trailing anchor ) ([[:punct:]]|\s|<|$) # trailing text }x unless const_defined?(:AUTO_LINK_RE) |
Turns all urls and email addresses into clickable links. The
link
parameter will limit what should be linked. You can add
html attributes to the links using href_options
. Options for
link
are :all
(default),
:email_addresses
, and :urls
.
auto_link("Go to http://www.rubyonrails.org and say hello to david@loudthinking.com") => Go to <a href="http://www.rubyonrails.org">http:/%rwww.rubyonrails.org</a> and say hello to <a href="mailto:david@loudthinking.com">david@loudthinking.com<%ra>
If a block is given, each url and email address is yielded and the result is used as the link text.
auto_link(post.body, :all, :target => '_blank') do |text| truncate(text, 15) end
Source: show
# File rails/actionpack/lib/action_view/helpers/text_helper.rb, line 178 def auto_link(text, link = :all, href_options = {}, &block) return '' if text.blank? case link when :all then auto_link_urls(auto_link_email_addresses(text, &block), href_options, &block) when :email_addresses then auto_link_email_addresses(text, &block) when :urls then auto_link_urls(text, href_options, &block) end end
The preferred method of outputting text in your views is to use the <%= “text” %> eRuby syntax. The regular puts and print methods do not operate as expected in an eRuby code block. If you absolutely must output text within a code block, you can use the concat method.
<% concat "hello", binding %>
is equivalent to using:
<%= "hello" %>
Source: show
# File rails/actionpack/lib/action_view/helpers/text_helper.rb, line 25 def concat(string, binding) eval("_erbout", binding).concat(string) end
Creates a Cycle object whose to_s method cycles through elements of an array every time it is called. This can be used for example, to alternate classes for table rows:
<% @items.each do |item| %> <tr class="<%= cycle("even", "odd") -%>"> <td>item</td> </tr> <% end %>
You can use named cycles to allow nesting in loops. Passing a Hash as the
last parameter with a :name
key will create a named cycle. You
can manually reset a cycle by calling #reset_cycle and passing
the name of the cycle.
<% @items.each do |item| %> <tr class="<%= cycle("even", "odd", :name => "row_class") <td> <% item.values.each do |value| %> <span style="color:<%= cycle("red", "green", "blue", :name => "colors") -%>"> value </span> <% end %> <% reset_cycle("colors") %> </td> </tr> <% end %>
Source: show
# File rails/actionpack/lib/action_view/helpers/text_helper.rb, line 302 def cycle(first_value, *values) if (values.last.instance_of? Hash) params = values.pop name = params[:name] else name = "default" end values.unshift(first_value) cycle = get_cycle(name) if (cycle.nil? || cycle.values != values) cycle = set_cycle(name, Cycle.new(*values)) end return cycle.to_s end
Extracts an excerpt from text
that matches the first instance
of phrase
. The radius
expands the excerpt on
each side of phrase
by the number of characters defined in
radius
. If the excerpt radius overflows the beginning or end
of the text
, then the excerpt_string
will be
prepended/appended accordingly. If the phrase
isn’t found,
nil is returned.
excerpt('This is an example', 'an', 5) => "...s is an examp..." excerpt('This is an example', 'is', 5) => "This is an..."
Source: show
# File rails/actionpack/lib/action_view/helpers/text_helper.rb, line 62 def excerpt(text, phrase, radius = 100, excerpt_string = "...") if text.nil? || phrase.nil? then return end phrase = Regexp.escape(phrase) if found_pos = text.chars =~ %r(#{phrase})/ start_pos = [ found_pos - radius, 0 ].max end_pos = [ found_pos + phrase.chars.length + radius, text.chars.length ].min prefix = start_pos > 0 ? excerpt_string : "" postfix = end_pos < text.chars.length ? excerpt_string : "" prefix + text.chars[start_pos..end_pos].strip + postfix else nil end end
Highlights phrase
everywhere it is found in text
by inserting it into a highlighter
string. The highlighter can
be specialized by passing highlighter
as a single-quoted
string with 1 where the phrase is to be inserted.
highlight('You searched for: rails', 'rails') => You searched for: <strong class="highlight">rails<%rstrong>
Source: show
# File rails/actionpack/lib/action_view/helpers/text_helper.rb, line 46 def highlight(text, phrase, highlighter = '<strong class="highlight">\1</strong>') if phrase.blank? then return text end text.gsub(%r(#{Regexp.escape(phrase)})/, highlighter) unless text.nil? end
Returns the text with all the Markdown codes turned into HTML tags. This method is only available if BlueCloth is available.
Source: show
# File rails/actionpack/lib/action_view/helpers/text_helper.rb, line 144 def markdown(text) text.blank? ? "" : BlueCloth.new(text).to_html end
Attempts to pluralize the singular
word unless
count
is 1. If plural
is supplied, it will use
that when count is > 1, if the ActiveSupport Inflector is loaded, it will use the Inflector to determine the plural form,
otherwise it will just add an ‘s’ to the singular
word.
pluralize(1, 'person') => 1 person pluralize(2, 'person') => 2 people pluralize(3, 'person', 'users') => 3 users
Source: show
# File rails/actionpack/lib/action_view/helpers/text_helper.rb, line 87 def pluralize(count, singular, plural = nil) "#{count} " + if count == 1 || count == '1' singular elsif plural plural elsif Object.const_defined?("Inflector") Inflector.pluralize(singular) else singular + "s" end end
Resets a cycle so that it starts from the first element the next time it
is called. Pass in name
to reset a named cycle.
Source: show
# File rails/actionpack/lib/action_view/helpers/text_helper.rb, line 320 def reset_cycle(name = "default") cycle = get_cycle(name) cycle.reset unless cycle.nil? end
Sanitizes the html
by converting <form> and
<script> tags into regular text, and removing all “onxxx” attributes
(so that arbitrary Javascript cannot be executed). It also removes href=
and src= attributes that start with “javascript:”. You can modify what gets
sanitized by defining VERBOTEN_TAGS and VERBOTEN_ATTRS before this Module is loaded.
sanitize('<script> do_nasty_stuff() </script>') => <script> do_nasty_stuff() <%rscript> sanitize('<a href="javascript: sucker();">Click here for $100</a>') => <a>Click here for $100</a>
Source: show
# File rails/actionpack/lib/action_view/helpers/text_helper.rb, line 221 def sanitize(html) # only do this if absolutely necessary if html.index("<") tokenizer = HTML::Tokenizer.new(html) new_text = "" while token = tokenizer.next node = HTML::Node.parse(nil, 0, 0, token, false) new_text << case node when HTML::Tag if VERBOTEN_TAGS.include?(node.name) node.to_s.gsub(%r</, "<") else if node.closing != :close node.attributes.delete_if { |attr,v| attr =~ VERBOTEN_ATTRS } %w(href src).each do |attr| node.attributes.delete attr if node.attributes[attr] =~ %r^javascript:/ end end node.to_s end else node.to_s.gsub(%r</, "<") end end html = new_text end html end
Returns text
transformed into HTML using simple formatting rules. Two or more
consecutive newlines(\n\n
) are considered as a paragraph and
wrapped in <p>
tags. One
newline (\n
) is considered as a linebreak and a <br
/>
tag is appended. This method does not remove the newlines from
the text
.
Source: show
# File rails/actionpack/lib/action_view/helpers/text_helper.rb, line 156 def simple_format(text) content_tag 'p', text.to_s. gsub(%r\r\n?/, "\n"). # \r\n and \r -> \n gsub(%r\n\n+/, "</p>\n\n<p>"). # 2+ newline -> paragraph gsub(%r([^\n]\n)(?=[^\n])/, '\1<br />') # 1 newline -> br end
Strips link tags from text
leaving just the link label.
strip_links('<a href="http://www.rubyonrails.org">Ruby on Rails</a>') => Ruby on Rails
Source: show
# File rails/actionpack/lib/action_view/helpers/text_helper.rb, line 191 def strip_links(text) text.gsub(%r<a\b.*?>(.*?)<\/a>/i, '\1') end
Strips all HTML tags from the
html
, including comments. This uses the html-scanner
tokenizer and so its HTML parsing ability is
limited by that of html-scanner.
Source: show
Returns the text with all the Textile codes turned into HTML tags. This method is only available if RedCloth is available.
Source: show
# File rails/actionpack/lib/action_view/helpers/text_helper.rb, line 114 def textilize(text) if text.blank? "" else textilized = RedCloth.new(text, [ :hard_breaks ]) textilized.hard_breaks = true if textilized.respond_to?("hard_breaks=") textilized.to_html end end
Returns the text with all the Textile codes turned into HTML tags, but without the bounding <p> tag that RedCloth adds. This method is only available if RedCloth is available.
Source: show
# File rails/actionpack/lib/action_view/helpers/text_helper.rb, line 128 def textilize_without_paragraph(text) textiled = textilize(text) if textiled[0..2] == "<p>" then textiled = textiled[3..-1] end if textiled[-4..-1] == "</p>" then textiled = textiled[0..-5] end return textiled end
If text
is longer than length
, text
will be truncated to the length of length
and the last three
characters will be replaced with the truncate_string
.
truncate("Once upon a time in a world far far away", 14) => Once upon a...
Source: show
# File rails/actionpack/lib/action_view/helpers/text_helper.rb, line 34 def truncate(text, length = 30, truncate_string = "...") if text.nil? then return end l = length - truncate_string.chars.length text.chars.length > length ? text.chars[0...l] + truncate_string : text end
Wraps the text
into lines no longer than
line_width
width. This method breaks on the first whitespace
character that does not exceed line_width
.
word_wrap('Once upon a time', 4) => Once\nupon\na\ntime
Source: show
# File rails/actionpack/lib/action_view/helpers/text_helper.rb, line 104 def word_wrap(text, line_width = 80) text.gsub(%r\n/, "\n\n").gsub(%r(.{1,#{line_width}})(\s+|$)/, "\\1\n").strip end