aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib
diff options
context:
space:
mode:
authorJeremy Kemper <jeremy@bitsweat.net>2008-01-07 00:12:53 +0000
committerJeremy Kemper <jeremy@bitsweat.net>2008-01-07 00:12:53 +0000
commit607511c1e0937e3248ceb29456e87bb4b6e86765 (patch)
treebc237a45626147f8d7b5de36bed45d6007b349a0 /actionpack/lib
parent3b13a09e89f4edaf07e77fea6b0fd529485c1ead (diff)
downloadrails-607511c1e0937e3248ceb29456e87bb4b6e86765.tar.gz
rails-607511c1e0937e3248ceb29456e87bb4b6e86765.tar.bz2
rails-607511c1e0937e3248ceb29456e87bb4b6e86765.zip
Ruby 1.9 compat: truncate and excerpt helpers
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@8584 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'actionpack/lib')
-rw-r--r--actionpack/lib/action_view/helpers/text_helper.rb136
1 files changed, 84 insertions, 52 deletions
diff --git a/actionpack/lib/action_view/helpers/text_helper.rb b/actionpack/lib/action_view/helpers/text_helper.rb
index 709b07f381..d6dbcfbbea 100644
--- a/actionpack/lib/action_view/helpers/text_helper.rb
+++ b/actionpack/lib/action_view/helpers/text_helper.rb
@@ -29,26 +29,37 @@ module ActionView
eval(ActionView::Base.erb_variable, binding) << string
end
- # If +text+ is longer than +length+, +text+ will be truncated to the length of
- # +length+ (defaults to 30) and the last characters will be replaced with the +truncate_string+
- # (defaults to "...").
- #
- # ==== Examples
- # truncate("Once upon a time in a world far far away", 14)
- # # => Once upon a...
- #
- # truncate("Once upon a time in a world far far away")
- # # => Once upon a time in a world f...
- #
- # truncate("And they found that many people were sleeping better.", 25, "(clipped)")
- # # => And they found that many (clipped)
- #
- # truncate("And they found that many people were sleeping better.", 15, "... (continued)")
- # # => And they found... (continued)
- 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).to_s
+ if RUBY_VERSION < '1.9'
+ # If +text+ is longer than +length+, +text+ will be truncated to the length of
+ # +length+ (defaults to 30) and the last characters will be replaced with the +truncate_string+
+ # (defaults to "...").
+ #
+ # ==== Examples
+ # truncate("Once upon a time in a world far far away", 14)
+ # # => Once upon a...
+ #
+ # truncate("Once upon a time in a world far far away")
+ # # => Once upon a time in a world f...
+ #
+ # truncate("And they found that many people were sleeping better.", 25, "(clipped)")
+ # # => And they found that many (clipped)
+ #
+ # truncate("And they found that many people were sleeping better.", 15, "... (continued)")
+ # # => And they found... (continued)
+ def truncate(text, length = 30, truncate_string = "...")
+ if text
+ l = length - truncate_string.chars.length
+ chars = text.chars
+ (chars.length > length ? chars[0...l] + truncate_string : text).to_s
+ end
+ end
+ else
+ def truncate(text, length = 30, truncate_string = "...") #:nodoc:
+ if text
+ l = length - truncate_string.length
+ (text.length > length ? text[0...l] + truncate_string : text).to_s
+ end
+ end
end
# Highlights one or more +phrases+ everywhere in +text+ by inserting it into
@@ -77,41 +88,62 @@ module ActionView
end
end
- # Extracts an excerpt from +text+ that matches the first instance of +phrase+.
- # The +radius+ expands the excerpt on each side of the first occurrence of +phrase+ by the number of characters
- # defined in +radius+ (which defaults to 100). 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.
- #
- # ==== Examples
- # excerpt('This is an example', 'an', 5)
- # # => "...s is an examp..."
- #
- # excerpt('This is an example', 'is', 5)
- # # => "This is an..."
- #
- # excerpt('This is an example', 'is')
- # # => "This is an example"
- #
- # excerpt('This next thing is an example', 'ex', 2)
- # # => "...next t..."
- #
- # excerpt('This is also an example', 'an', 8, '<chop> ')
- # # => "<chop> is also an example"
- def excerpt(text, phrase, radius = 100, excerpt_string = "...")
- if text.nil? || phrase.nil? then return end
- phrase = Regexp.escape(phrase)
+ if RUBY_VERSION < '1.9'
+ # Extracts an excerpt from +text+ that matches the first instance of +phrase+.
+ # The +radius+ expands the excerpt on each side of the first occurrence of +phrase+ by the number of characters
+ # defined in +radius+ (which defaults to 100). 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.
+ #
+ # ==== Examples
+ # excerpt('This is an example', 'an', 5)
+ # # => "...s is an examp..."
+ #
+ # excerpt('This is an example', 'is', 5)
+ # # => "This is an..."
+ #
+ # excerpt('This is an example', 'is')
+ # # => "This is an example"
+ #
+ # excerpt('This next thing is an example', 'ex', 2)
+ # # => "...next t..."
+ #
+ # excerpt('This is also an example', 'an', 8, '<chop> ')
+ # # => "<chop> is also an example"
+ def excerpt(text, phrase, radius = 100, excerpt_string = "...")
+ if text && phrase
+ phrase = Regexp.escape(phrase)
- if found_pos = text.chars =~ /(#{phrase})/i
- start_pos = [ found_pos - radius, 0 ].max
- end_pos = [ found_pos + phrase.chars.length + radius, text.chars.length ].min
+ if found_pos = text.chars =~ /(#{phrase})/i
+ 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 = start_pos > 0 ? excerpt_string : ""
+ postfix = end_pos < text.chars.length ? excerpt_string : ""
- prefix + text.chars[start_pos..end_pos].strip + postfix
- else
- nil
+ prefix + text.chars[start_pos..end_pos].strip + postfix
+ else
+ nil
+ end
+ end
+ end
+ else
+ def excerpt(text, phrase, radius = 100, excerpt_string = "...") #:nodoc:
+ if text && phrase
+ phrase = Regexp.escape(phrase)
+
+ if found_pos = text =~ /(#{phrase})/i
+ start_pos = [ found_pos - radius, 0 ].max
+ end_pos = [ found_pos + phrase.length + radius, text.length ].min
+
+ prefix = start_pos > 0 ? excerpt_string : ""
+ postfix = end_pos < text.length ? excerpt_string : ""
+
+ prefix + text[start_pos..end_pos].strip + postfix
+ else
+ nil
+ end
+ end
end
end