|
| 1 | +package ansiterm |
| 2 | + |
| 3 | +const LogEnv = "DEBUG_TERMINAL" |
| 4 | + |
| 5 | +// ANSI constants |
| 6 | +// References: |
| 7 | +// -- http://www.ecma-international.org/publications/standards/Ecma-048.htm |
| 8 | +// -- http://man7.org/linux/man-pages/man4/console_codes.4.html |
| 9 | +// -- http://manpages.ubuntu.com/manpages/intrepid/man4/console_codes.4.html |
| 10 | +// -- http://en.wikipedia.org/wiki/ANSI_escape_code |
| 11 | +// -- http://vt100.net/emu/dec_ansi_parser |
| 12 | +// -- http://vt100.net/emu/vt500_parser.svg |
| 13 | +// -- http://invisible-island.net/xterm/ctlseqs/ctlseqs.html |
| 14 | +// -- http://www.inwap.com/pdp10/ansicode.txt |
| 15 | +const ( |
| 16 | + // ECMA-48 Set Graphics Rendition |
| 17 | + // Note: |
| 18 | + // -- Constants leading with an underscore (e.g., _ANSI_xxx) are unsupported or reserved |
| 19 | + // -- Fonts could possibly be supported via SetCurrentConsoleFontEx |
| 20 | + // -- Windows does not expose the per-window cursor (i.e., caret) blink times |
| 21 | + ANSI_SGR_RESET = 0 |
| 22 | + ANSI_SGR_BOLD = 1 |
| 23 | + ANSI_SGR_DIM = 2 |
| 24 | + _ANSI_SGR_ITALIC = 3 |
| 25 | + ANSI_SGR_UNDERLINE = 4 |
| 26 | + _ANSI_SGR_BLINKSLOW = 5 |
| 27 | + _ANSI_SGR_BLINKFAST = 6 |
| 28 | + ANSI_SGR_REVERSE = 7 |
| 29 | + _ANSI_SGR_INVISIBLE = 8 |
| 30 | + _ANSI_SGR_LINETHROUGH = 9 |
| 31 | + _ANSI_SGR_FONT_00 = 10 |
| 32 | + _ANSI_SGR_FONT_01 = 11 |
| 33 | + _ANSI_SGR_FONT_02 = 12 |
| 34 | + _ANSI_SGR_FONT_03 = 13 |
| 35 | + _ANSI_SGR_FONT_04 = 14 |
| 36 | + _ANSI_SGR_FONT_05 = 15 |
| 37 | + _ANSI_SGR_FONT_06 = 16 |
| 38 | + _ANSI_SGR_FONT_07 = 17 |
| 39 | + _ANSI_SGR_FONT_08 = 18 |
| 40 | + _ANSI_SGR_FONT_09 = 19 |
| 41 | + _ANSI_SGR_FONT_10 = 20 |
| 42 | + _ANSI_SGR_DOUBLEUNDERLINE = 21 |
| 43 | + ANSI_SGR_BOLD_DIM_OFF = 22 |
| 44 | + _ANSI_SGR_ITALIC_OFF = 23 |
| 45 | + ANSI_SGR_UNDERLINE_OFF = 24 |
| 46 | + _ANSI_SGR_BLINK_OFF = 25 |
| 47 | + _ANSI_SGR_RESERVED_00 = 26 |
| 48 | + ANSI_SGR_REVERSE_OFF = 27 |
| 49 | + _ANSI_SGR_INVISIBLE_OFF = 28 |
| 50 | + _ANSI_SGR_LINETHROUGH_OFF = 29 |
| 51 | + ANSI_SGR_FOREGROUND_BLACK = 30 |
| 52 | + ANSI_SGR_FOREGROUND_RED = 31 |
| 53 | + ANSI_SGR_FOREGROUND_GREEN = 32 |
| 54 | + ANSI_SGR_FOREGROUND_YELLOW = 33 |
| 55 | + ANSI_SGR_FOREGROUND_BLUE = 34 |
| 56 | + ANSI_SGR_FOREGROUND_MAGENTA = 35 |
| 57 | + ANSI_SGR_FOREGROUND_CYAN = 36 |
| 58 | + ANSI_SGR_FOREGROUND_WHITE = 37 |
| 59 | + _ANSI_SGR_RESERVED_01 = 38 |
| 60 | + ANSI_SGR_FOREGROUND_DEFAULT = 39 |
| 61 | + ANSI_SGR_BACKGROUND_BLACK = 40 |
| 62 | + ANSI_SGR_BACKGROUND_RED = 41 |
| 63 | + ANSI_SGR_BACKGROUND_GREEN = 42 |
| 64 | + ANSI_SGR_BACKGROUND_YELLOW = 43 |
| 65 | + ANSI_SGR_BACKGROUND_BLUE = 44 |
| 66 | + ANSI_SGR_BACKGROUND_MAGENTA = 45 |
| 67 | + ANSI_SGR_BACKGROUND_CYAN = 46 |
| 68 | + ANSI_SGR_BACKGROUND_WHITE = 47 |
| 69 | + _ANSI_SGR_RESERVED_02 = 48 |
| 70 | + ANSI_SGR_BACKGROUND_DEFAULT = 49 |
| 71 | + // 50 - 65: Unsupported |
| 72 | + |
| 73 | + ANSI_MAX_CMD_LENGTH = 4096 |
| 74 | + |
| 75 | + MAX_INPUT_EVENTS = 128 |
| 76 | + DEFAULT_WIDTH = 80 |
| 77 | + DEFAULT_HEIGHT = 24 |
| 78 | + |
| 79 | + ANSI_BEL = 0x07 |
| 80 | + ANSI_BACKSPACE = 0x08 |
| 81 | + ANSI_TAB = 0x09 |
| 82 | + ANSI_LINE_FEED = 0x0A |
| 83 | + ANSI_VERTICAL_TAB = 0x0B |
| 84 | + ANSI_FORM_FEED = 0x0C |
| 85 | + ANSI_CARRIAGE_RETURN = 0x0D |
| 86 | + ANSI_ESCAPE_PRIMARY = 0x1B |
| 87 | + ANSI_ESCAPE_SECONDARY = 0x5B |
| 88 | + ANSI_OSC_STRING_ENTRY = 0x5D |
| 89 | + ANSI_COMMAND_FIRST = 0x40 |
| 90 | + ANSI_COMMAND_LAST = 0x7E |
| 91 | + DCS_ENTRY = 0x90 |
| 92 | + CSI_ENTRY = 0x9B |
| 93 | + OSC_STRING = 0x9D |
| 94 | + ANSI_PARAMETER_SEP = ";" |
| 95 | + ANSI_CMD_G0 = '(' |
| 96 | + ANSI_CMD_G1 = ')' |
| 97 | + ANSI_CMD_G2 = '*' |
| 98 | + ANSI_CMD_G3 = '+' |
| 99 | + ANSI_CMD_DECPNM = '>' |
| 100 | + ANSI_CMD_DECPAM = '=' |
| 101 | + ANSI_CMD_OSC = ']' |
| 102 | + ANSI_CMD_STR_TERM = '\\' |
| 103 | + |
| 104 | + KEY_CONTROL_PARAM_2 = ";2" |
| 105 | + KEY_CONTROL_PARAM_3 = ";3" |
| 106 | + KEY_CONTROL_PARAM_4 = ";4" |
| 107 | + KEY_CONTROL_PARAM_5 = ";5" |
| 108 | + KEY_CONTROL_PARAM_6 = ";6" |
| 109 | + KEY_CONTROL_PARAM_7 = ";7" |
| 110 | + KEY_CONTROL_PARAM_8 = ";8" |
| 111 | + KEY_ESC_CSI = "\x1B[" |
| 112 | + KEY_ESC_N = "\x1BN" |
| 113 | + KEY_ESC_O = "\x1BO" |
| 114 | + |
| 115 | + FILL_CHARACTER = ' ' |
| 116 | +) |
| 117 | + |
| 118 | +func getByteRange(start byte, end byte) []byte { |
| 119 | + bytes := make([]byte, 0, 32) |
| 120 | + for i := start; i <= end; i++ { |
| 121 | + bytes = append(bytes, byte(i)) |
| 122 | + } |
| 123 | + |
| 124 | + return bytes |
| 125 | +} |
| 126 | + |
| 127 | +var toGroundBytes = getToGroundBytes() |
| 128 | +var executors = getExecuteBytes() |
| 129 | + |
| 130 | +// SPACE 20+A0 hex Always and everywhere a blank space |
| 131 | +// Intermediate 20-2F hex !"#$%&'()*+,-./ |
| 132 | +var intermeds = getByteRange(0x20, 0x2F) |
| 133 | + |
| 134 | +// Parameters 30-3F hex 0123456789:;<=>? |
| 135 | +// CSI Parameters 30-39, 3B hex 0123456789; |
| 136 | +var csiParams = getByteRange(0x30, 0x3F) |
| 137 | + |
| 138 | +var csiCollectables = append(getByteRange(0x30, 0x39), getByteRange(0x3B, 0x3F)...) |
| 139 | + |
| 140 | +// Uppercase 40-5F hex @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ |
| 141 | +var upperCase = getByteRange(0x40, 0x5F) |
| 142 | + |
| 143 | +// Lowercase 60-7E hex `abcdefghijlkmnopqrstuvwxyz{|}~ |
| 144 | +var lowerCase = getByteRange(0x60, 0x7E) |
| 145 | + |
| 146 | +// Alphabetics 40-7E hex (all of upper and lower case) |
| 147 | +var alphabetics = append(upperCase, lowerCase...) |
| 148 | + |
| 149 | +var printables = getByteRange(0x20, 0x7F) |
| 150 | + |
| 151 | +var escapeIntermediateToGroundBytes = getByteRange(0x30, 0x7E) |
| 152 | +var escapeToGroundBytes = getEscapeToGroundBytes() |
| 153 | + |
| 154 | +// See http://www.vt100.net/emu/vt500_parser.png for description of the complex |
| 155 | +// byte ranges below |
| 156 | + |
| 157 | +func getEscapeToGroundBytes() []byte { |
| 158 | + escapeToGroundBytes := getByteRange(0x30, 0x4F) |
| 159 | + escapeToGroundBytes = append(escapeToGroundBytes, getByteRange(0x51, 0x57)...) |
| 160 | + escapeToGroundBytes = append(escapeToGroundBytes, 0x59) |
| 161 | + escapeToGroundBytes = append(escapeToGroundBytes, 0x5A) |
| 162 | + escapeToGroundBytes = append(escapeToGroundBytes, 0x5C) |
| 163 | + escapeToGroundBytes = append(escapeToGroundBytes, getByteRange(0x60, 0x7E)...) |
| 164 | + return escapeToGroundBytes |
| 165 | +} |
| 166 | + |
| 167 | +func getExecuteBytes() []byte { |
| 168 | + executeBytes := getByteRange(0x00, 0x17) |
| 169 | + executeBytes = append(executeBytes, 0x19) |
| 170 | + executeBytes = append(executeBytes, getByteRange(0x1C, 0x1F)...) |
| 171 | + return executeBytes |
| 172 | +} |
| 173 | + |
| 174 | +func getToGroundBytes() []byte { |
| 175 | + groundBytes := []byte{0x18} |
| 176 | + groundBytes = append(groundBytes, 0x1A) |
| 177 | + groundBytes = append(groundBytes, getByteRange(0x80, 0x8F)...) |
| 178 | + groundBytes = append(groundBytes, getByteRange(0x91, 0x97)...) |
| 179 | + groundBytes = append(groundBytes, 0x99) |
| 180 | + groundBytes = append(groundBytes, 0x9A) |
| 181 | + groundBytes = append(groundBytes, 0x9C) |
| 182 | + return groundBytes |
| 183 | +} |
| 184 | + |
| 185 | +// Delete 7F hex Always and everywhere ignored |
| 186 | +// C1 Control 80-9F hex 32 additional control characters |
| 187 | +// G1 Displayable A1-FE hex 94 additional displayable characters |
| 188 | +// Special A0+FF hex Same as SPACE and DELETE |
0 commit comments