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
This commit is contained in:
Michael Koziarski
2007-08-05 00:48:00 +00:00
parent 4b64110086
commit fe3e03e770
3 changed files with 119 additions and 0 deletions

View File

@@ -1,5 +1,7 @@
*SVN*
* Add ljust, rjust and center to utf8-handler. Closes #9165 [manfred]
* Fix Time#advance bug when trying to advance a year from leap day. Closes #8655 [gbuesing]
* Add support for []= on ActiveSupport::Multibyte::Chars. Closes #9142. [ewan, manfred]

View File

@@ -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|

View File

@@ -233,6 +233,57 @@ module UTF8HandlingTest
assert_equal "Κλη αααα!", s
end
def test_rjust
s = "Καη"
assert_raises(ArgumentError) { @handler.rjust(s, 10, '') }
assert_raises(ArgumentError) { @handler.rjust(s) }
assert_equal "Καη", @handler.rjust(s, -3)
assert_equal "Καη", @handler.rjust(s, 0)
assert_equal "Καη", @handler.rjust(s, 3)
assert_equal " Καη", @handler.rjust(s, 5)
assert_equal " Καη", @handler.rjust(s, 7)
assert_equal "----Καη", @handler.rjust(s, 7, '-')
assert_equal "ααααΚαη", @handler.rjust(s, 7, 'α')
assert_equal "abaΚαη", @handler.rjust(s, 6, 'ab')
assert_equal "αηαΚαη", @handler.rjust(s, 6, 'αη')
end
def test_ljust
s = "Καη"
assert_raises(ArgumentError) { @handler.ljust(s, 10, '') }
assert_raises(ArgumentError) { @handler.ljust(s) }
assert_equal "Καη", @handler.ljust(s, -3)
assert_equal "Καη", @handler.ljust(s, 0)
assert_equal "Καη", @handler.ljust(s, 3)
assert_equal "Καη ", @handler.ljust(s, 5)
assert_equal "Καη ", @handler.ljust(s, 7)
assert_equal "Καη----", @handler.ljust(s, 7, '-')
assert_equal "Καηαααα", @handler.ljust(s, 7, 'α')
assert_equal "Καηaba", @handler.ljust(s, 6, 'ab')
assert_equal "Καηαηα", @handler.ljust(s, 6, 'αη')
end
def test_center
s = "Καη"
assert_raises(ArgumentError) { @handler.center(s, 10, '') }
assert_raises(ArgumentError) { @handler.center(s) }
assert_equal "Καη", @handler.center(s, -3)
assert_equal "Καη", @handler.center(s, 0)
assert_equal "Καη", @handler.center(s, 3)
assert_equal "Καη ", @handler.center(s, 4)
assert_equal " Καη ", @handler.center(s, 5)
assert_equal " Καη ", @handler.center(s, 6)
assert_equal "--Καη--", @handler.center(s, 7, '-')
assert_equal "--Καη---", @handler.center(s, 8, '-')
assert_equal "ααΚαηαα", @handler.center(s, 7, 'α')
assert_equal "ααΚαηααα", @handler.center(s, 8, 'α')
assert_equal "aΚαηab", @handler.center(s, 6, 'ab')
assert_equal "abΚαηab", @handler.center(s, 7, 'ab')
assert_equal "ababΚαηabab", @handler.center(s, 11, 'ab')
assert_equal "αΚαηαη", @handler.center(s, 6, 'αη')
assert_equal "αηΚαηαη", @handler.center(s, 7, 'αη')
end
def test_strip
# A unicode aware version of strip should strip all 26 types of whitespace. This includes the NO BREAK SPACE
# aka BOM (byte order mark). The byte order mark has no place in UTF-8 because it's used to detect LE and BE.