module Strings::Pad
Responsible for text padding
Constants
- LINE_BREAK
- NEWLINE
- SPACE
Public Class Methods
Calculate visible string width
@return [Integer]
@api private
# File lib/strings/pad.rb, line 90 def display_width(string) Unicode::DisplayWidth.of(Strings::ANSI.sanitize(string)) end
Determine maximum length for all multiline content
@param [String] text @param [String] separator
@return [Integer]
@api private
# File lib/strings/pad.rb, line 79 def max_line_length(text, separator) lines = text.split(separator, -1) display_width(lines.max_by { |line| display_width(line) } || "") end
Apply padding to multiline text with ANSI codes
@param [String] text
the text to pad out
@param [Integer, Array] padding
the padding to apply to text
@example
text = "Ignorance is the parent of fear." Strings::Pad.pad(text, [1, 2], fill: "*") # => # "************************************\n" # "**Ignorance is the parent of fear.**\n" # "************************************\n"
@return [String]
@api private
# File lib/strings/pad.rb, line 33 def pad(text, padding, fill: SPACE, separator: nil) padding = Strings::Padder.parse(padding) text_copy = text.dup sep = separator || text[LINE_BREAK] || NEWLINE line_width = max_line_length(text, sep) output = [] filler_line = fill * line_width padding.top.times do output << pad_around(filler_line, padding, fill: fill) end text_copy.split(sep).each do |line| line = line.empty? ? filler_line : line output << pad_around(line, padding, fill: fill) end padding.bottom.times do output << pad_around(filler_line, padding, fill: fill) end output.join(sep) end
Apply padding to left and right side of string
@param [String] text
@return [String]
@api private
# File lib/strings/pad.rb, line 66 def pad_around(text, padding, fill: SPACE) fill * padding.left + text + fill * padding.right end
Private Instance Methods
Calculate visible string width
@return [Integer]
@api private
# File lib/strings/pad.rb, line 90 def display_width(string) Unicode::DisplayWidth.of(Strings::ANSI.sanitize(string)) end
Determine maximum length for all multiline content
@param [String] text @param [String] separator
@return [Integer]
@api private
# File lib/strings/pad.rb, line 79 def max_line_length(text, separator) lines = text.split(separator, -1) display_width(lines.max_by { |line| display_width(line) } || "") end
Apply padding to multiline text with ANSI codes
@param [String] text
the text to pad out
@param [Integer, Array] padding
the padding to apply to text
@example
text = "Ignorance is the parent of fear." Strings::Pad.pad(text, [1, 2], fill: "*") # => # "************************************\n" # "**Ignorance is the parent of fear.**\n" # "************************************\n"
@return [String]
@api private
# File lib/strings/pad.rb, line 33 def pad(text, padding, fill: SPACE, separator: nil) padding = Strings::Padder.parse(padding) text_copy = text.dup sep = separator || text[LINE_BREAK] || NEWLINE line_width = max_line_length(text, sep) output = [] filler_line = fill * line_width padding.top.times do output << pad_around(filler_line, padding, fill: fill) end text_copy.split(sep).each do |line| line = line.empty? ? filler_line : line output << pad_around(line, padding, fill: fill) end padding.bottom.times do output << pad_around(filler_line, padding, fill: fill) end output.join(sep) end
Apply padding to left and right side of string
@param [String] text
@return [String]
@api private
# File lib/strings/pad.rb, line 66 def pad_around(text, padding, fill: SPACE) fill * padding.left + text + fill * padding.right end