constants.go 5.97 KB
Newer Older
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 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
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