module Strings::Pad

Responsible for text padding

Constants

LINE_BREAK
NEWLINE
SPACE

Public Class Methods

display_width(string) click to toggle source

Calculate visible string width

@return [Integer]

@api private

# File lib/strings/pad.rb, line 91
def display_width(string)
  Unicode::DisplayWidth.of(Strings::ANSI.sanitize(string))
end
max_line_length(text, separator) click to toggle source

Determine maximum length for all multiline content

@param [String] text @param [String] separator

@return [Integer]

@api private

# File lib/strings/pad.rb, line 80
def max_line_length(text, separator)
  lines = text.split(separator, -1)
  display_width(lines.max_by { |line| display_width(line) } || "")
end
pad(text, padding, fill: SPACE, separator: nil) click to toggle source

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 34
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
pad_around(text, padding, fill: SPACE) click to toggle source

Apply padding to left and right side of string

@param [String] text

@return [String]

@api private

# File lib/strings/pad.rb, line 67
def pad_around(text, padding, fill: SPACE)
  fill * padding.left + text + fill * padding.right
end

Private Instance Methods

display_width(string) click to toggle source

Calculate visible string width

@return [Integer]

@api private

# File lib/strings/pad.rb, line 91
def display_width(string)
  Unicode::DisplayWidth.of(Strings::ANSI.sanitize(string))
end
max_line_length(text, separator) click to toggle source

Determine maximum length for all multiline content

@param [String] text @param [String] separator

@return [Integer]

@api private

# File lib/strings/pad.rb, line 80
def max_line_length(text, separator)
  lines = text.split(separator, -1)
  display_width(lines.max_by { |line| display_width(line) } || "")
end
pad(text, padding, fill: SPACE, separator: nil) click to toggle source

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 34
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
pad_around(text, padding, fill: SPACE) click to toggle source

Apply padding to left and right side of string

@param [String] text

@return [String]

@api private

# File lib/strings/pad.rb, line 67
def pad_around(text, padding, fill: SPACE)
  fill * padding.left + text + fill * padding.right
end