Module: Charming::UI::Truncate

Defined in:
lib/charming/presentation/ui/truncate.rb

Overview

Truncate cuts ANSI-styled text down to a display width, marking the cut with a trailing ellipsis. Styling active at the cut is preserved and terminated, and multi-column glyphs are never split (matching ANSISlicer).

Constant Summary collapse

ELLIPSIS =
""

Class Method Summary collapse

Class Method Details

.tail(text, width, ellipsis: ELLIPSIS) ⇒ Object

Truncates each line of text to width display columns, appending ellipsis to lines that overflow. Lines that fit are returned unchanged.



15
16
17
# File 'lib/charming/presentation/ui/truncate.rb', line 15

def tail(text, width, ellipsis: ELLIPSIS)
  text.to_s.lines(chomp: true).map { |line| tail_line(line, width, ellipsis) }.join("\n")
end

.tail_line(line, width, ellipsis) ⇒ Object



19
20
21
22
23
24
25
26
# File 'lib/charming/presentation/ui/truncate.rb', line 19

def tail_line(line, width, ellipsis)
  return line if Width.measure(line) <= width

  ellipsis_width = Width.measure(ellipsis)
  return ANSISlicer.slice(line, 0, width) if ellipsis_width >= width

  ANSISlicer.slice(line, 0, width - ellipsis_width) + ellipsis
end