module Strings::Align
Responsible for text alignment
Constants
- LINE_BREAK
- NEWLINE
- SPACE
Public Class Methods
Aligns text within the width.
If the text is greater than the width then unmodified string is returned.
@param [String] text
the text to align lines of
@param [Integer] width
the maximum width to align to
@example
text = "the madness of men" Strings::Align.align(text, 22, direction: :left) # => "the madness of men " Strings::Align.align(text, 22, direction: :center) # => " the madness of men " Strings::Align(text, 22, direction: :right) # => " the madness of men" Strings::Align.align(text, 22, direction: :center, fill: "*") # => "***the madness of men***"
@api public
# File lib/strings/align.rb, line 38 def align(text, width, direction: :left, **options) return text if width.nil? method = to_alignment(direction) send(method, text, width, **options) end
Centers text within the width
@return [String]
@api public
# File lib/strings/align.rb, line 85 def align_center(text, width, fill: SPACE, separator: nil) return text if width.nil? sep = separator || text[LINE_BREAK] || NEWLINE each_line(text, sep) do |line| width_diff = width - display_width(line) if width_diff > 0 right_count = (width_diff.to_f / 2).ceil left_count = width_diff - right_count [fill * left_count, line, fill * right_count].join else line end end end
Aligns text to the left at given length
@return [String]
@api public
# File lib/strings/align.rb, line 65 def align_left(text, width, fill: SPACE, separator: nil) return if width.nil? sep = separator || text[LINE_BREAK] || NEWLINE each_line(text, sep) do |line| width_diff = width - display_width(line) if width_diff > 0 line + fill * width_diff else line end end end
Aligns text to the right at given length
@return [String]
@api public
# File lib/strings/align.rb, line 107 def align_right(text, width, fill: SPACE, separator: nil) return text if width.nil? sep = separator || text[LINE_BREAK] || NEWLINE each_line(text, sep) do |line| width_diff = width - display_width(line) if width_diff > 0 fill * width_diff + line else line end end end
Visible width of a string
@api private
# File lib/strings/align.rb, line 141 def display_width(string) Unicode::DisplayWidth.of(Strings::ANSI.sanitize(string)) end
Enumerate text line by line
@param [String] text
@return [String]
@api private
# File lib/strings/align.rb, line 129 def each_line(text, separator) lines = text.split(separator) return yield(text) if text.empty? lines.reduce([]) do |aligned, line| aligned << yield(line) end.join(separator) end
Convert direction to method name
@api private
# File lib/strings/align.rb, line 49 def to_alignment(direction) case direction.to_sym when :left then :align_left when :right then :align_right when :center then :align_center else raise ArgumentError, "Unknown alignment `#{direction}`." end end
Private Instance Methods
Aligns text within the width.
If the text is greater than the width then unmodified string is returned.
@param [String] text
the text to align lines of
@param [Integer] width
the maximum width to align to
@example
text = "the madness of men" Strings::Align.align(text, 22, direction: :left) # => "the madness of men " Strings::Align.align(text, 22, direction: :center) # => " the madness of men " Strings::Align(text, 22, direction: :right) # => " the madness of men" Strings::Align.align(text, 22, direction: :center, fill: "*") # => "***the madness of men***"
@api public
# File lib/strings/align.rb, line 38 def align(text, width, direction: :left, **options) return text if width.nil? method = to_alignment(direction) send(method, text, width, **options) end
Centers text within the width
@return [String]
@api public
# File lib/strings/align.rb, line 85 def align_center(text, width, fill: SPACE, separator: nil) return text if width.nil? sep = separator || text[LINE_BREAK] || NEWLINE each_line(text, sep) do |line| width_diff = width - display_width(line) if width_diff > 0 right_count = (width_diff.to_f / 2).ceil left_count = width_diff - right_count [fill * left_count, line, fill * right_count].join else line end end end
Aligns text to the left at given length
@return [String]
@api public
# File lib/strings/align.rb, line 65 def align_left(text, width, fill: SPACE, separator: nil) return if width.nil? sep = separator || text[LINE_BREAK] || NEWLINE each_line(text, sep) do |line| width_diff = width - display_width(line) if width_diff > 0 line + fill * width_diff else line end end end
Aligns text to the right at given length
@return [String]
@api public
# File lib/strings/align.rb, line 107 def align_right(text, width, fill: SPACE, separator: nil) return text if width.nil? sep = separator || text[LINE_BREAK] || NEWLINE each_line(text, sep) do |line| width_diff = width - display_width(line) if width_diff > 0 fill * width_diff + line else line end end end
Visible width of a string
@api private
# File lib/strings/align.rb, line 141 def display_width(string) Unicode::DisplayWidth.of(Strings::ANSI.sanitize(string)) end
Enumerate text line by line
@param [String] text
@return [String]
@api private
# File lib/strings/align.rb, line 129 def each_line(text, separator) lines = text.split(separator) return yield(text) if text.empty? lines.reduce([]) do |aligned, line| aligned << yield(line) end.join(separator) end
Convert direction to method name
@api private
# File lib/strings/align.rb, line 49 def to_alignment(direction) case direction.to_sym when :left then :align_left when :right then :align_right when :center then :align_center else raise ArgumentError, "Unknown alignment `#{direction}`." end end