diff options
author | David Heinemeier Hansson <david@loudthinking.com> | 2010-06-01 16:38:42 -0500 |
---|---|---|
committer | David Heinemeier Hansson <david@loudthinking.com> | 2010-06-01 16:38:42 -0500 |
commit | d57397c4b62b6474ff8eb55bfd763f5e6dcdcd40 (patch) | |
tree | eb9f14a745aede86baa2b4b4a6259b7bd5234a7a /activesupport/lib/active_support/core_ext | |
parent | ea037ff55791a33d24773efd380b734f733c2815 (diff) | |
download | rails-d57397c4b62b6474ff8eb55bfd763f5e6dcdcd40.tar.gz rails-d57397c4b62b6474ff8eb55bfd763f5e6dcdcd40.tar.bz2 rails-d57397c4b62b6474ff8eb55bfd763f5e6dcdcd40.zip |
Extracted String#truncate from TextHelper#truncate [DHH]
Diffstat (limited to 'activesupport/lib/active_support/core_ext')
-rw-r--r-- | activesupport/lib/active_support/core_ext/string/filters.rb | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/activesupport/lib/active_support/core_ext/string/filters.rb b/activesupport/lib/active_support/core_ext/string/filters.rb index 6fda7efef5..cdd86a836f 100644 --- a/activesupport/lib/active_support/core_ext/string/filters.rb +++ b/activesupport/lib/active_support/core_ext/string/filters.rb @@ -1,3 +1,5 @@ +require 'active_support/core_ext/string/multibyte' + class String # Returns the string, first removing all whitespace on both ends of # the string, and then changing remaining consecutive whitespace @@ -17,4 +19,35 @@ class String gsub!(/\s+/, ' ') self end + + # Truncates a given +text+ after a given <tt>length</tt> if +text+ is longer than <tt>length</tt>. + # The last characters will be replaced with the <tt>:omission</tt> (defaults to "...") + # for a total length not exceeding <tt>:length</tt>. + # + # Pass a <tt>:separator</tt> to truncate +text+ at a natural break. + # + # ==== Examples + # + # "Once upon a time in a world far far away".truncate(30) + # # => Once upon a time in a worl... + # + # "Once upon a time in a world far far away".truncate(30, :separator => ' ') + # # => Once upon a time in a world... + # + # "Once upon a time in a world far far away".truncate(14) + # # => Once upon a... + # + # "And they found that many people were sleeping better.".truncate(25, :omission => "... (continued)") + # # => And they f... (continued) + def truncate(length, options = {}) + text = self.dup + options[:omission] ||= "..." + + length_with_room_for_omission = length - options[:omission].mb_chars.length + chars = text.mb_chars + stop = options[:separator] ? + (chars.rindex(options[:separator].mb_chars, length_with_room_for_omission) || length_with_room_for_omission) : length_with_room_for_omission + + (chars.length > length ? chars[0...stop] + options[:omission] : text).to_s + end end |