Module: Prompts::TextUtils

Included in:
Box, Paragraph
Defined in:
lib/prompts/text_utils.rb

Constant Summary collapse

ANSI_REGEX =
/\e\[[0-9;]*[a-zA-Z]/

Instance Method Summary collapse

Instance Method Details

#format_line(line, available_width, alignment, prefix, suffix) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/prompts/text_utils.rb', line 36

def format_line(line, available_width, alignment, prefix, suffix)
  line_width = Unicode::DisplayWidth.of(strip_ansi(line), 1, {}, emoji: true)
  padding = [available_width - line_width, 0].max

  case alignment
  when :none
    prefix + line + suffix
  when :left
    prefix + line + (SPACE * padding) + suffix
  when :right
    prefix + (SPACE * padding) + line + suffix
  when :center
    left_padding = padding / 2
    right_padding = padding - left_padding
    prefix + (SPACE * left_padding) + line + (SPACE * right_padding) + suffix
  end
end

#strip_ansi(text) ⇒ Object



54
55
56
# File 'lib/prompts/text_utils.rb', line 54

def strip_ansi(text)
  text.gsub(ANSI_REGEX, EMPTY)
end

#wrap_text(text, width:, line_prefix: EMPTY, line_suffix: EMPTY, alignment: :left) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/prompts/text_utils.rb', line 10

def wrap_text(text, width:, line_prefix: EMPTY, line_suffix: EMPTY, alignment: :left)
  words = text.scan(Regexp.union(/\S+/, ANSI_REGEX))
  lines = []
  line = +EMPTY
  line_width = 0
  prefix_width = Unicode::DisplayWidth.of(strip_ansi(line_prefix), 1, {}, emoji: true)
  suffix_width = Unicode::DisplayWidth.of(strip_ansi(line_suffix), 1, {}, emoji: true)
  available_width = width - prefix_width - suffix_width

  words.each do |word|
    word_width = Unicode::DisplayWidth.of(strip_ansi(word), 1, {}, emoji: true)

    if (line_width + word_width) > available_width
      lines << format_line(line.rstrip, available_width, alignment, line_prefix, line_suffix)
      line = +EMPTY
      line_width = 0
    end

    line << word + SPACE
    line_width += word_width + 1
  end

  lines << format_line(line.rstrip, available_width, alignment, line_prefix, line_suffix)
  lines
end