| 
									
										
										
										
											2016-08-26 16:04:47 +02:00
										 |  |  | module Tty | 
					
						
							|  |  |  |   module_function | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def strip_ansi(string) | 
					
						
							|  |  |  |     string.gsub(/\033\[\d+(;\d+)*m/, "") | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def width | 
					
						
							| 
									
										
										
										
											2017-06-07 06:57:44 +01:00
										 |  |  |     width = `/bin/stty size 2>/dev/null`.split[1] | 
					
						
							|  |  |  |     width ||= `/usr/bin/tput cols 2>/dev/null`.split[0] | 
					
						
							|  |  |  |     width ||= 80
 | 
					
						
							|  |  |  |     width.to_i | 
					
						
							| 
									
										
										
										
											2016-08-26 16:04:47 +02:00
										 |  |  |   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 |