aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/utils/tty.rb
blob: 642a33b912951dd8be9ce3516d3b96be86bceef5 (plain)
1
2
3
4
5
6
7
8
9
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
module Tty
  module_function

  def strip_ansi(string)
    string.gsub(/\033\[\d+(;\d+)*m/, "")
  end

  def width
    (`/bin/stty size`.split[1] || 80).to_i
  end

  def truncate(string)
    (w = width).zero? ? string.to_s : string.to_s[0, w - 4]
  end

  COLOR_CODES = {
    red: 31,
    green: 32,
    yellow: 33,
    blue: 34,
    magenta: 35,
    cyan: 36,
    default: 39,
  }.freeze

  STYLE_CODES = {
    reset: 0,
    bold: 1,
    italic: 3,
    underline: 4,
    strikethrough: 9,
    no_underline: 24,
  }.freeze

  CODES = COLOR_CODES.merge(STYLE_CODES).freeze

  def append_to_escape_sequence(code)
    @escape_sequence ||= []
    @escape_sequence << code
    self
  end

  def current_escape_sequence
    return "" if @escape_sequence.nil?
    "\033[#{@escape_sequence.join(";")}m"
  end

  def reset_escape_sequence!
    @escape_sequence = nil
  end

  CODES.each do |name, code|
    define_singleton_method(name) do
      append_to_escape_sequence(code)
    end
  end

  def to_s
    return "" unless $stdout.tty?
    current_escape_sequence
  ensure
    reset_escape_sequence!
  end
end