-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsgr.ts
82 lines (80 loc) · 2.25 KB
/
sgr.ts
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
export type Color = "default" | number | [number, number, number];
export type Sgr = {
reset?: true;
bold?: boolean;
dim?: boolean;
italic?: boolean;
underline?: boolean;
blinking?: boolean;
inverse?: boolean;
conceal?: boolean;
strike?: boolean;
foreground?: Color;
background?: Color;
};
/**
* Parse SGR parameters and return `Sgr` object
*/
export function parseSgr(parameters: string): Sgr {
const sgr: Sgr = {};
const ps: [RegExp, (m: RegExpMatchArray) => void][] = [
[
/^38;2;(\d*);(\d*);(\d*);/,
(m) =>
sgr.foreground = [
Number(m[1] || 0),
Number(m[2] || 0),
Number(m[3] || 0),
],
],
[
/^48;2;(\d*);(\d*);(\d*);/,
(m) =>
sgr.background = [
Number(m[1] || 0),
Number(m[2] || 0),
Number(m[3] || 0),
],
],
[/^38;5;(\d*);/, (m) => sgr.foreground = Number(m[1] || 0)],
[/^48;5;(\d*);/, (m) => sgr.background = Number(m[1] || 0)],
[/^39;/, () => sgr.foreground = "default"],
[/^49;/, () => sgr.background = "default"],
[/^3([0-7]);/, (m) => sgr.foreground = Number(m[1])],
[/^4([0-7]);/, (m) => sgr.background = Number(m[1])],
[/^9([0-7]);/, (m) => sgr.foreground = Number(m[1]) + 8],
[/^10([0-7]);/, (m) => sgr.background = Number(m[1]) + 8],
[/^0?;/, () => sgr.reset = true],
[/^1;/, () => sgr.bold = true],
[/^2;/, () => sgr.dim = true],
[/^3;/, () => sgr.italic = true],
[/^4;/, () => sgr.underline = true],
[/^5;/, () => sgr.blinking = true],
[/^7;/, () => sgr.inverse = true],
[/^8;/, () => sgr.conceal = true],
[/^9;/, () => sgr.strike = true],
[/^22;/, () => {
sgr.bold = false;
sgr.dim = false;
}],
[/^23;/, () => sgr.italic = false],
[/^24;/, () => sgr.underline = false],
[/^25;/, () => sgr.blinking = false],
[/^27;/, () => sgr.inverse = false],
[/^28;/, () => sgr.conceal = false],
[/^29;/, () => sgr.strike = false],
[/^[^;]*;/, () => {}],
];
parameters = `${parameters};`;
while (parameters) {
for (const [p, handler] of ps) {
const m = parameters.match(p);
if (m) {
handler(m);
parameters = parameters.substring(m[0].length);
break;
}
}
}
return sgr;
}