|
1 | 1 | const ANSI_BACKGROUND_OFFSET = 10; |
2 | 2 |
|
| 3 | +const wrapAnsi16 = (offset = 0) => code => `\u001B[${code + offset}m`; |
| 4 | + |
3 | 5 | const wrapAnsi256 = (offset = 0) => code => `\u001B[${38 + offset};5;${code}m`; |
4 | 6 |
|
5 | 7 | const wrapAnsi16m = (offset = 0) => (red, green, blue) => `\u001B[${38 + offset};2;${red};${green};${blue}m`; |
@@ -93,8 +95,10 @@ function assembleStyles() { |
93 | 95 | styles.color.close = '\u001B[39m'; |
94 | 96 | styles.bgColor.close = '\u001B[49m'; |
95 | 97 |
|
| 98 | + styles.color.ansi = wrapAnsi16(); |
96 | 99 | styles.color.ansi256 = wrapAnsi256(); |
97 | 100 | styles.color.ansi16m = wrapAnsi16m(); |
| 101 | + styles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET); |
98 | 102 | styles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET); |
99 | 103 | styles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET); |
100 | 104 |
|
@@ -149,6 +153,58 @@ function assembleStyles() { |
149 | 153 | hexToAnsi256: { |
150 | 154 | value: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)), |
151 | 155 | enumerable: false |
| 156 | + }, |
| 157 | + ansi256ToAnsi: { |
| 158 | + value: code => { |
| 159 | + if (code < 8) { |
| 160 | + return 30 + code; |
| 161 | + } |
| 162 | + |
| 163 | + if (code < 16) { |
| 164 | + return 90 + (code - 8); |
| 165 | + } |
| 166 | + |
| 167 | + let red; |
| 168 | + let green; |
| 169 | + let blue; |
| 170 | + |
| 171 | + if (code >= 232) { |
| 172 | + red = (((code - 232) * 10) + 8) / 255; |
| 173 | + green = red; |
| 174 | + blue = red; |
| 175 | + } else { |
| 176 | + code -= 16; |
| 177 | + |
| 178 | + const remainder = code % 36; |
| 179 | + |
| 180 | + red = Math.floor(code / 36) / 5; |
| 181 | + green = Math.floor(remainder / 6) / 5; |
| 182 | + blue = (remainder % 6) / 5; |
| 183 | + } |
| 184 | + |
| 185 | + const value = Math.max(red, green, blue) * 2; |
| 186 | + |
| 187 | + if (value === 0) { |
| 188 | + return 30; |
| 189 | + } |
| 190 | + |
| 191 | + let result = 30 + ((Math.round(blue) << 2) | (Math.round(green) << 1) | Math.round(red)); |
| 192 | + |
| 193 | + if (value === 2) { |
| 194 | + result += 60; |
| 195 | + } |
| 196 | + |
| 197 | + return result; |
| 198 | + }, |
| 199 | + enumerable: false |
| 200 | + }, |
| 201 | + rgbToAnsi: { |
| 202 | + value: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)), |
| 203 | + enumerable: false |
| 204 | + }, |
| 205 | + hexToAnsi: { |
| 206 | + value: hex => styles.ansi256ToAnsi(styles.hexToAnsi256(hex)), |
| 207 | + enumerable: false |
152 | 208 | } |
153 | 209 | }); |
154 | 210 |
|
|
0 commit comments