aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib/active_support/multibyte/handlers
diff options
context:
space:
mode:
authorMichael Koziarski <michael@koziarski.com>2007-08-05 00:48:00 +0000
committerMichael Koziarski <michael@koziarski.com>2007-08-05 00:48:00 +0000
commitfe3e03e7708c576d5b09fb161e68d715796eae67 (patch)
treea6f276261009c7b503ef268190231aeccd3e240f /activesupport/lib/active_support/multibyte/handlers
parent4b6411008675dbbfb7da4dfb6ef73c5528c196d1 (diff)
downloadrails-fe3e03e7708c576d5b09fb161e68d715796eae67.tar.gz
rails-fe3e03e7708c576d5b09fb161e68d715796eae67.tar.bz2
rails-fe3e03e7708c576d5b09fb161e68d715796eae67.zip
Add ljust, rjust and center to utf8-handler. Closes #9165 [manfred]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@7272 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'activesupport/lib/active_support/multibyte/handlers')
-rw-r--r--activesupport/lib/active_support/multibyte/handlers/utf8_handler.rb66
1 files changed, 66 insertions, 0 deletions
diff --git a/activesupport/lib/active_support/multibyte/handlers/utf8_handler.rb b/activesupport/lib/active_support/multibyte/handlers/utf8_handler.rb
index 02fc7b3e2b..6ca043ae21 100644
--- a/activesupport/lib/active_support/multibyte/handlers/utf8_handler.rb
+++ b/activesupport/lib/active_support/multibyte/handlers/utf8_handler.rb
@@ -178,6 +178,45 @@ module ActiveSupport::Multibyte::Handlers #:nodoc:
str.replace(result.pack('U*'))
end
+ # Works just like String#rjust, only integer specifies characters instead of bytes.
+ #
+ # Example:
+ #
+ # "¾ cup".chars.rjust(8).to_s
+ # #=> " ¾ cup"
+ #
+ # "¾ cup".chars.rjust(8, " ").to_s # Use non-breaking whitespace
+ # #=> "   ¾ cup"
+ def rjust(str, integer, padstr=' ')
+ justify(str, integer, :right, padstr)
+ end
+
+ # Works just like String#ljust, only integer specifies characters instead of bytes.
+ #
+ # Example:
+ #
+ # "¾ cup".chars.rjust(8).to_s
+ # #=> "¾ cup "
+ #
+ # "¾ cup".chars.rjust(8, " ").to_s # Use non-breaking whitespace
+ # #=> "¾ cup   "
+ def ljust(str, integer, padstr=' ')
+ justify(str, integer, :left, padstr)
+ end
+
+ # Works just like String#center, only integer specifies characters instead of bytes.
+ #
+ # Example:
+ #
+ # "¾ cup".chars.center(8).to_s
+ # #=> " ¾ cup "
+ #
+ # "¾ cup".chars.center(8, " ").to_s # Use non-breaking whitespace
+ # #=> " ¾ cup  "
+ def center(str, integer, padstr=' ')
+ justify(str, integer, :center, padstr)
+ end
+
# Does Unicode-aware rstrip
def rstrip(str)
str.gsub(UNICODE_TRAILERS_PAT, '')
@@ -380,6 +419,33 @@ module ActiveSupport::Multibyte::Handlers #:nodoc:
unpacked.flatten
end
+ # Justifies a string in a certain way. Valid values for <tt>way</tt> are <tt>:right</tt>, <tt>:left</tt> and
+ # <tt>:center</tt>. Is primarily used as a helper method by <tt>rjust</tt>, <tt>ljust</tt> and <tt>center</tt>.
+ def justify(str, integer, way, padstr=' ')
+ raise ArgumentError, "zero width padding" if padstr.length == 0
+ padsize = integer - size(str)
+ padsize = padsize > 0 ? padsize : 0
+ case way
+ when :right
+ str.dup.insert(0, padding(padsize, padstr))
+ when :left
+ str.dup.insert(-1, padding(padsize, padstr))
+ when :center
+ lpad = padding((padsize / 2.0).floor, padstr)
+ rpad = padding((padsize / 2.0).ceil, padstr)
+ str.dup.insert(0, lpad).insert(-1, rpad)
+ end
+ end
+
+ # Generates a padding string of a certain size.
+ def padding(padsize, padstr=' ')
+ if padsize != 0
+ slice(padstr * ((padsize / size(padstr)) + 1), 0, padsize)
+ else
+ ''
+ end
+ end
+
# Convert characters to a different case
def to_case(way, str)
u_unpack(str).map do |codepoint|