mirror of
				https://github.com/k3s-io/kubernetes.git
				synced 2025-10-31 13:50:01 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			189 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			189 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package ansiterm
 | |
| 
 | |
| const LogEnv = "DEBUG_TERMINAL"
 | |
| 
 | |
| // ANSI constants
 | |
| // References:
 | |
| // -- http://www.ecma-international.org/publications/standards/Ecma-048.htm
 | |
| // -- http://man7.org/linux/man-pages/man4/console_codes.4.html
 | |
| // -- http://manpages.ubuntu.com/manpages/intrepid/man4/console_codes.4.html
 | |
| // -- http://en.wikipedia.org/wiki/ANSI_escape_code
 | |
| // -- http://vt100.net/emu/dec_ansi_parser
 | |
| // -- http://vt100.net/emu/vt500_parser.svg
 | |
| // -- http://invisible-island.net/xterm/ctlseqs/ctlseqs.html
 | |
| // -- http://www.inwap.com/pdp10/ansicode.txt
 | |
| const (
 | |
| 	// ECMA-48 Set Graphics Rendition
 | |
| 	// Note:
 | |
| 	// -- Constants leading with an underscore (e.g., _ANSI_xxx) are unsupported or reserved
 | |
| 	// -- Fonts could possibly be supported via SetCurrentConsoleFontEx
 | |
| 	// -- Windows does not expose the per-window cursor (i.e., caret) blink times
 | |
| 	ANSI_SGR_RESET              = 0
 | |
| 	ANSI_SGR_BOLD               = 1
 | |
| 	ANSI_SGR_DIM                = 2
 | |
| 	_ANSI_SGR_ITALIC            = 3
 | |
| 	ANSI_SGR_UNDERLINE          = 4
 | |
| 	_ANSI_SGR_BLINKSLOW         = 5
 | |
| 	_ANSI_SGR_BLINKFAST         = 6
 | |
| 	ANSI_SGR_REVERSE            = 7
 | |
| 	_ANSI_SGR_INVISIBLE         = 8
 | |
| 	_ANSI_SGR_LINETHROUGH       = 9
 | |
| 	_ANSI_SGR_FONT_00           = 10
 | |
| 	_ANSI_SGR_FONT_01           = 11
 | |
| 	_ANSI_SGR_FONT_02           = 12
 | |
| 	_ANSI_SGR_FONT_03           = 13
 | |
| 	_ANSI_SGR_FONT_04           = 14
 | |
| 	_ANSI_SGR_FONT_05           = 15
 | |
| 	_ANSI_SGR_FONT_06           = 16
 | |
| 	_ANSI_SGR_FONT_07           = 17
 | |
| 	_ANSI_SGR_FONT_08           = 18
 | |
| 	_ANSI_SGR_FONT_09           = 19
 | |
| 	_ANSI_SGR_FONT_10           = 20
 | |
| 	_ANSI_SGR_DOUBLEUNDERLINE   = 21
 | |
| 	ANSI_SGR_BOLD_DIM_OFF       = 22
 | |
| 	_ANSI_SGR_ITALIC_OFF        = 23
 | |
| 	ANSI_SGR_UNDERLINE_OFF      = 24
 | |
| 	_ANSI_SGR_BLINK_OFF         = 25
 | |
| 	_ANSI_SGR_RESERVED_00       = 26
 | |
| 	ANSI_SGR_REVERSE_OFF        = 27
 | |
| 	_ANSI_SGR_INVISIBLE_OFF     = 28
 | |
| 	_ANSI_SGR_LINETHROUGH_OFF   = 29
 | |
| 	ANSI_SGR_FOREGROUND_BLACK   = 30
 | |
| 	ANSI_SGR_FOREGROUND_RED     = 31
 | |
| 	ANSI_SGR_FOREGROUND_GREEN   = 32
 | |
| 	ANSI_SGR_FOREGROUND_YELLOW  = 33
 | |
| 	ANSI_SGR_FOREGROUND_BLUE    = 34
 | |
| 	ANSI_SGR_FOREGROUND_MAGENTA = 35
 | |
| 	ANSI_SGR_FOREGROUND_CYAN    = 36
 | |
| 	ANSI_SGR_FOREGROUND_WHITE   = 37
 | |
| 	_ANSI_SGR_RESERVED_01       = 38
 | |
| 	ANSI_SGR_FOREGROUND_DEFAULT = 39
 | |
| 	ANSI_SGR_BACKGROUND_BLACK   = 40
 | |
| 	ANSI_SGR_BACKGROUND_RED     = 41
 | |
| 	ANSI_SGR_BACKGROUND_GREEN   = 42
 | |
| 	ANSI_SGR_BACKGROUND_YELLOW  = 43
 | |
| 	ANSI_SGR_BACKGROUND_BLUE    = 44
 | |
| 	ANSI_SGR_BACKGROUND_MAGENTA = 45
 | |
| 	ANSI_SGR_BACKGROUND_CYAN    = 46
 | |
| 	ANSI_SGR_BACKGROUND_WHITE   = 47
 | |
| 	_ANSI_SGR_RESERVED_02       = 48
 | |
| 	ANSI_SGR_BACKGROUND_DEFAULT = 49
 | |
| 	// 50 - 65: Unsupported
 | |
| 
 | |
| 	ANSI_MAX_CMD_LENGTH = 4096
 | |
| 
 | |
| 	MAX_INPUT_EVENTS = 128
 | |
| 	DEFAULT_WIDTH    = 80
 | |
| 	DEFAULT_HEIGHT   = 24
 | |
| 
 | |
| 	ANSI_BEL              = 0x07
 | |
| 	ANSI_BACKSPACE        = 0x08
 | |
| 	ANSI_TAB              = 0x09
 | |
| 	ANSI_LINE_FEED        = 0x0A
 | |
| 	ANSI_VERTICAL_TAB     = 0x0B
 | |
| 	ANSI_FORM_FEED        = 0x0C
 | |
| 	ANSI_CARRIAGE_RETURN  = 0x0D
 | |
| 	ANSI_ESCAPE_PRIMARY   = 0x1B
 | |
| 	ANSI_ESCAPE_SECONDARY = 0x5B
 | |
| 	ANSI_OSC_STRING_ENTRY = 0x5D
 | |
| 	ANSI_COMMAND_FIRST    = 0x40
 | |
| 	ANSI_COMMAND_LAST     = 0x7E
 | |
| 	DCS_ENTRY             = 0x90
 | |
| 	CSI_ENTRY             = 0x9B
 | |
| 	OSC_STRING            = 0x9D
 | |
| 	ANSI_PARAMETER_SEP    = ";"
 | |
| 	ANSI_CMD_G0           = '('
 | |
| 	ANSI_CMD_G1           = ')'
 | |
| 	ANSI_CMD_G2           = '*'
 | |
| 	ANSI_CMD_G3           = '+'
 | |
| 	ANSI_CMD_DECPNM       = '>'
 | |
| 	ANSI_CMD_DECPAM       = '='
 | |
| 	ANSI_CMD_OSC          = ']'
 | |
| 	ANSI_CMD_STR_TERM     = '\\'
 | |
| 
 | |
| 	KEY_CONTROL_PARAM_2 = ";2"
 | |
| 	KEY_CONTROL_PARAM_3 = ";3"
 | |
| 	KEY_CONTROL_PARAM_4 = ";4"
 | |
| 	KEY_CONTROL_PARAM_5 = ";5"
 | |
| 	KEY_CONTROL_PARAM_6 = ";6"
 | |
| 	KEY_CONTROL_PARAM_7 = ";7"
 | |
| 	KEY_CONTROL_PARAM_8 = ";8"
 | |
| 	KEY_ESC_CSI         = "\x1B["
 | |
| 	KEY_ESC_N           = "\x1BN"
 | |
| 	KEY_ESC_O           = "\x1BO"
 | |
| 
 | |
| 	FILL_CHARACTER = ' '
 | |
| )
 | |
| 
 | |
| func getByteRange(start byte, end byte) []byte {
 | |
| 	bytes := make([]byte, 0, 32)
 | |
| 	for i := start; i <= end; i++ {
 | |
| 		bytes = append(bytes, byte(i))
 | |
| 	}
 | |
| 
 | |
| 	return bytes
 | |
| }
 | |
| 
 | |
| var toGroundBytes = getToGroundBytes()
 | |
| var executors = getExecuteBytes()
 | |
| 
 | |
| // SPACE		  20+A0 hex  Always and everywhere a blank space
 | |
| // Intermediate	  20-2F hex   !"#$%&'()*+,-./
 | |
| var intermeds = getByteRange(0x20, 0x2F)
 | |
| 
 | |
| // Parameters	  30-3F hex  0123456789:;<=>?
 | |
| // CSI Parameters 30-39, 3B hex 0123456789;
 | |
| var csiParams = getByteRange(0x30, 0x3F)
 | |
| 
 | |
| var csiCollectables = append(getByteRange(0x30, 0x39), getByteRange(0x3B, 0x3F)...)
 | |
| 
 | |
| // Uppercase	  40-5F hex  @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
 | |
| var upperCase = getByteRange(0x40, 0x5F)
 | |
| 
 | |
| // Lowercase	  60-7E hex  `abcdefghijlkmnopqrstuvwxyz{|}~
 | |
| var lowerCase = getByteRange(0x60, 0x7E)
 | |
| 
 | |
| // Alphabetics	  40-7E hex  (all of upper and lower case)
 | |
| var alphabetics = append(upperCase, lowerCase...)
 | |
| 
 | |
| var printables = getByteRange(0x20, 0x7F)
 | |
| 
 | |
| var escapeIntermediateToGroundBytes = getByteRange(0x30, 0x7E)
 | |
| var escapeToGroundBytes = getEscapeToGroundBytes()
 | |
| 
 | |
| // See http://www.vt100.net/emu/vt500_parser.png for description of the complex
 | |
| // byte ranges below
 | |
| 
 | |
| func getEscapeToGroundBytes() []byte {
 | |
| 	escapeToGroundBytes := getByteRange(0x30, 0x4F)
 | |
| 	escapeToGroundBytes = append(escapeToGroundBytes, getByteRange(0x51, 0x57)...)
 | |
| 	escapeToGroundBytes = append(escapeToGroundBytes, 0x59)
 | |
| 	escapeToGroundBytes = append(escapeToGroundBytes, 0x5A)
 | |
| 	escapeToGroundBytes = append(escapeToGroundBytes, 0x5C)
 | |
| 	escapeToGroundBytes = append(escapeToGroundBytes, getByteRange(0x60, 0x7E)...)
 | |
| 	return escapeToGroundBytes
 | |
| }
 | |
| 
 | |
| func getExecuteBytes() []byte {
 | |
| 	executeBytes := getByteRange(0x00, 0x17)
 | |
| 	executeBytes = append(executeBytes, 0x19)
 | |
| 	executeBytes = append(executeBytes, getByteRange(0x1C, 0x1F)...)
 | |
| 	return executeBytes
 | |
| }
 | |
| 
 | |
| func getToGroundBytes() []byte {
 | |
| 	groundBytes := []byte{0x18}
 | |
| 	groundBytes = append(groundBytes, 0x1A)
 | |
| 	groundBytes = append(groundBytes, getByteRange(0x80, 0x8F)...)
 | |
| 	groundBytes = append(groundBytes, getByteRange(0x91, 0x97)...)
 | |
| 	groundBytes = append(groundBytes, 0x99)
 | |
| 	groundBytes = append(groundBytes, 0x9A)
 | |
| 	groundBytes = append(groundBytes, 0x9C)
 | |
| 	return groundBytes
 | |
| }
 | |
| 
 | |
| // Delete		     7F hex  Always and everywhere ignored
 | |
| // C1 Control	  80-9F hex  32 additional control characters
 | |
| // G1 Displayable A1-FE hex  94 additional displayable characters
 | |
| // Special		  A0+FF hex  Same as SPACE and DELETE
 |