@ansi-tools/parser 1.0.9 → 1.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/escaped.d.ts +3 -3
- package/dist/escaped.js +23 -29
- package/dist/index.d.ts +3 -3
- package/dist/index.js +2 -2
- package/dist/parse-BzJl6pBN.d.ts +85 -0
- package/dist/{parse-DmFIqYg6.js → parse-DBLatt5c.js} +65 -55
- package/package.json +5 -5
- package/dist/parse-BLVd8fU0.d.ts +0 -71
package/dist/escaped.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { APC, APC_OPEN, BACKSLASH, BELL, C0_INTERRUPTERS, CAN, CODE, CODE_TYPES, CONTROL_CODE, CSI, CSI_OPEN, DCS, DCS_OPEN, DEC_OPEN, ESC, INTERRUPTERS, OSC, OSC_OPEN, PARAM_SEPARATOR, PM, PM_OPEN, PRIVATE_OPENERS, SOS, SOS_OPEN, ST, STRING_OPENERS, SUB, TEXT, TOKEN, TOKEN_TYPES, parser } from "./parse-
|
|
1
|
+
import { APC, APC_CODE, APC_OPEN, BACKSLASH, BACKSLASH_CODE, BELL, BELL_CODE, C0_INTERRUPTERS, CAN, CAN_CODE, CODE, CODE_TYPES, CONTROL_CODE, CSI, CSI_CODE, CSI_OPEN, CSI_OPEN_CODE, DCS, DCS_CODE, DCS_OPEN, DEC_OPEN, ESC, ESC_CODE, INTERRUPTERS, OSC, OSC_CODE, OSC_OPEN, OSC_OPEN_CODE, PARAM_SEPARATOR, PM, PM_CODE, PM_OPEN, PRIVATE_OPENERS, SOS, SOS_CODE, SOS_OPEN, ST, STRING_OPENERS, ST_CODE, SUB, SUB_CODE, TEXT, TOKEN, TOKEN_TYPES, parser } from "./parse-BzJl6pBN.js";
|
|
2
2
|
|
|
3
3
|
//#region src/parse.escaped.d.ts
|
|
4
4
|
declare function parse(input: string): CODE[];
|
|
5
5
|
//#endregion
|
|
6
6
|
//#region src/tokenize.escaped.d.ts
|
|
7
|
-
declare function tokenizer(input: string):
|
|
7
|
+
declare function tokenizer(input: string): IterableIterator<TOKEN>;
|
|
8
8
|
declare function tokenize(input: string): TOKEN[];
|
|
9
9
|
//#endregion
|
|
10
|
-
export { APC, APC_OPEN, BACKSLASH, BELL, C0_INTERRUPTERS, CAN, CODE, CODE_TYPES, CONTROL_CODE, CSI, CSI_OPEN, DCS, DCS_OPEN, DEC_OPEN, ESC, INTERRUPTERS, OSC, OSC_OPEN, PARAM_SEPARATOR, PM, PM_OPEN, PRIVATE_OPENERS, SOS, SOS_OPEN, ST, STRING_OPENERS, SUB, TEXT, TOKEN, TOKEN_TYPES, parse, parser, tokenize, tokenizer };
|
|
10
|
+
export { APC, APC_CODE, APC_OPEN, BACKSLASH, BACKSLASH_CODE, BELL, BELL_CODE, C0_INTERRUPTERS, CAN, CAN_CODE, type CODE, CODE_TYPES, type CONTROL_CODE, CSI, CSI_CODE, CSI_OPEN, CSI_OPEN_CODE, DCS, DCS_CODE, DCS_OPEN, DEC_OPEN, ESC, ESC_CODE, INTERRUPTERS, OSC, OSC_CODE, OSC_OPEN, OSC_OPEN_CODE, PARAM_SEPARATOR, PM, PM_CODE, PM_OPEN, PRIVATE_OPENERS, SOS, SOS_CODE, SOS_OPEN, ST, STRING_OPENERS, ST_CODE, SUB, SUB_CODE, type TEXT, type TOKEN, TOKEN_TYPES, parse, parser, tokenize, tokenizer };
|
package/dist/escaped.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { APC, APC_OPEN, BACKSLASH, BELL, C0_INTERRUPTERS, CAN, CODE_TYPES, CSI, CSI_OPEN, DCS, DCS_OPEN, DEC_OPEN, ESC, INTERRUPTERS, OSC, OSC_OPEN, PARAM_SEPARATOR, PM, PM_OPEN, PRIVATE_OPENERS, SOS, SOS_OPEN, ST, STRING_OPENERS, SUB, TOKEN_TYPES, parser } from "./parse-
|
|
1
|
+
import { APC, APC_CODE, APC_OPEN, BACKSLASH, BACKSLASH_CODE, BELL, BELL_CODE, C0_INTERRUPTERS, CAN, CAN_CODE, CODE_TYPES, CSI, CSI_CODE, CSI_OPEN, CSI_OPEN_CODE, DCS, DCS_CODE, DCS_OPEN, DEC_OPEN, ESC, ESC_CODE, INTERRUPTERS, OSC, OSC_CODE, OSC_OPEN, OSC_OPEN_CODE, PARAM_SEPARATOR, PM, PM_CODE, PM_OPEN, PRIVATE_OPENERS, SOS, SOS_CODE, SOS_OPEN, ST, STRING_OPENERS, ST_CODE, SUB, SUB_CODE, TOKEN_TYPES, parser } from "./parse-DBLatt5c.js";
|
|
2
2
|
|
|
3
3
|
//#region src/tokenize.escaped.ts
|
|
4
4
|
const CSI_ESCAPED = "\\u009b";
|
|
@@ -40,6 +40,7 @@ function* tokenizer(input) {
|
|
|
40
40
|
let i = 0;
|
|
41
41
|
let state = "GROUND";
|
|
42
42
|
let currentCode;
|
|
43
|
+
let backslashIndex = input.indexOf(BACKSLASH_CODE);
|
|
43
44
|
function setState(next, code) {
|
|
44
45
|
state = next;
|
|
45
46
|
currentCode = code;
|
|
@@ -47,7 +48,11 @@ function* tokenizer(input) {
|
|
|
47
48
|
while (i < l) if (state === "GROUND") {
|
|
48
49
|
const textStart = i;
|
|
49
50
|
while (i < l) {
|
|
50
|
-
|
|
51
|
+
if (backslashIndex === -1) {
|
|
52
|
+
i = l;
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
if (backslashIndex < i) backslashIndex = input.indexOf(BACKSLASH_CODE, i);
|
|
51
56
|
if (backslashIndex === -1) {
|
|
52
57
|
i = l;
|
|
53
58
|
break;
|
|
@@ -56,12 +61,7 @@ function* tokenizer(input) {
|
|
|
56
61
|
const candidates = INTRODUCER_LOOKUP.get(input[backslashIndex + 1]);
|
|
57
62
|
if (candidates) for (const [seq, len] of candidates) {
|
|
58
63
|
if (backslashIndex + len > l) continue;
|
|
59
|
-
|
|
60
|
-
for (let k = 0; k < len && matched; k += 2) {
|
|
61
|
-
matched = input[backslashIndex + k] === seq[k];
|
|
62
|
-
if (matched && k + 1 < len) matched = input[backslashIndex + k + 1] === seq[k + 1];
|
|
63
|
-
}
|
|
64
|
-
if (matched) {
|
|
64
|
+
if (input.startsWith(seq, backslashIndex)) {
|
|
65
65
|
isIntroducer = true;
|
|
66
66
|
break;
|
|
67
67
|
}
|
|
@@ -82,39 +82,34 @@ function* tokenizer(input) {
|
|
|
82
82
|
let isMatch = false;
|
|
83
83
|
for (const [seq, len] of candidates) {
|
|
84
84
|
if (i + len > l) continue;
|
|
85
|
-
|
|
86
|
-
for (let k = 0; k < len && isSeqMatch; k += 2) {
|
|
87
|
-
isSeqMatch = input[i + k] === seq[k];
|
|
88
|
-
if (isSeqMatch && k + 1 < len) isSeqMatch = input[i + k + 1] === seq[k + 1];
|
|
89
|
-
}
|
|
90
|
-
if (isSeqMatch) {
|
|
85
|
+
if (input.startsWith(seq, i)) {
|
|
91
86
|
isMatch = true;
|
|
92
87
|
if (seq === CSI_ESCAPED || seq === CSI_ESCAPED_HEX) {
|
|
93
88
|
yield emit({
|
|
94
89
|
type: TOKEN_TYPES.INTRODUCER,
|
|
95
90
|
pos: i,
|
|
96
91
|
raw: seq,
|
|
97
|
-
code:
|
|
92
|
+
code: CSI_CODE
|
|
98
93
|
});
|
|
99
94
|
i += len;
|
|
100
95
|
setState("SEQUENCE", CSI);
|
|
101
96
|
} else {
|
|
102
97
|
const next = input[i + len];
|
|
103
|
-
if (next ===
|
|
98
|
+
if (next === CSI_OPEN_CODE) {
|
|
104
99
|
yield emit({
|
|
105
100
|
type: TOKEN_TYPES.INTRODUCER,
|
|
106
101
|
pos: i,
|
|
107
102
|
raw: seq + next,
|
|
108
|
-
code:
|
|
103
|
+
code: CSI_CODE
|
|
109
104
|
});
|
|
110
105
|
i += len + 1;
|
|
111
106
|
setState("SEQUENCE", CSI);
|
|
112
|
-
} else if (next ===
|
|
107
|
+
} else if (next === OSC_OPEN_CODE) {
|
|
113
108
|
yield emit({
|
|
114
109
|
type: TOKEN_TYPES.INTRODUCER,
|
|
115
110
|
pos: i,
|
|
116
111
|
raw: seq + next,
|
|
117
|
-
code:
|
|
112
|
+
code: OSC_CODE
|
|
118
113
|
});
|
|
119
114
|
i += len + 1;
|
|
120
115
|
setState("SEQUENCE", OSC);
|
|
@@ -126,7 +121,7 @@ function* tokenizer(input) {
|
|
|
126
121
|
code: next
|
|
127
122
|
});
|
|
128
123
|
i += len + 1;
|
|
129
|
-
setState("SEQUENCE", next);
|
|
124
|
+
setState("SEQUENCE", next.charCodeAt(0));
|
|
130
125
|
} else if (next) {
|
|
131
126
|
let j = i + len;
|
|
132
127
|
while (j < l && input.charCodeAt(j) >= 32 && input.charCodeAt(j) <= 47) j++;
|
|
@@ -136,14 +131,14 @@ function* tokenizer(input) {
|
|
|
136
131
|
type: TOKEN_TYPES.INTRODUCER,
|
|
137
132
|
pos: i,
|
|
138
133
|
raw: seq + is,
|
|
139
|
-
code:
|
|
134
|
+
code: ESC_CODE,
|
|
140
135
|
intermediate: is
|
|
141
136
|
});
|
|
142
137
|
else yield emit({
|
|
143
138
|
type: TOKEN_TYPES.INTRODUCER,
|
|
144
139
|
pos: i,
|
|
145
140
|
raw: seq,
|
|
146
|
-
code:
|
|
141
|
+
code: ESC_CODE
|
|
147
142
|
});
|
|
148
143
|
i = j;
|
|
149
144
|
setState("SEQUENCE", ESC);
|
|
@@ -162,8 +157,7 @@ function* tokenizer(input) {
|
|
|
162
157
|
const pos = i;
|
|
163
158
|
const code = currentCode;
|
|
164
159
|
while (!terminator && i < l) {
|
|
165
|
-
|
|
166
|
-
if (char === BACKSLASH) {
|
|
160
|
+
if (input.charCodeAt(i) === BACKSLASH) {
|
|
167
161
|
const next = input[i + 1];
|
|
168
162
|
if (next) {
|
|
169
163
|
const interrupters = INTERRUPTER_LOOKUP.get(next);
|
|
@@ -203,7 +197,7 @@ function* tokenizer(input) {
|
|
|
203
197
|
terminator = "\\x9c";
|
|
204
198
|
terminatorPos = i;
|
|
205
199
|
i += 4;
|
|
206
|
-
} else if (char3 === "1" && char4 === "b" && i + 6 <= l && input
|
|
200
|
+
} else if (char3 === "1" && char4 === "b" && i + 6 <= l && input.charCodeAt(i + 4) === BACKSLASH && input.charCodeAt(i + 5) === BACKSLASH) {
|
|
207
201
|
terminator = "\\x1b\\\\";
|
|
208
202
|
terminatorPos = i;
|
|
209
203
|
i += 6;
|
|
@@ -216,7 +210,7 @@ function* tokenizer(input) {
|
|
|
216
210
|
i += 6;
|
|
217
211
|
}
|
|
218
212
|
} else if (next === "e" && i + 4 <= l) {
|
|
219
|
-
if (input
|
|
213
|
+
if (input.charCodeAt(i + 2) === BACKSLASH && input.charCodeAt(i + 3) === BACKSLASH) {
|
|
220
214
|
terminator = "\\e\\\\";
|
|
221
215
|
terminatorPos = i;
|
|
222
216
|
i += 4;
|
|
@@ -244,12 +238,12 @@ function* tokenizer(input) {
|
|
|
244
238
|
} else if (code === CSI) {
|
|
245
239
|
const charCode = input.charCodeAt(i);
|
|
246
240
|
if (charCode >= 64 && charCode <= 126) {
|
|
247
|
-
terminator =
|
|
241
|
+
terminator = input[i];
|
|
248
242
|
terminatorPos = i;
|
|
249
243
|
i++;
|
|
250
244
|
}
|
|
251
245
|
} else if (code === ESC) {
|
|
252
|
-
terminator =
|
|
246
|
+
terminator = input[i];
|
|
253
247
|
terminatorPos = i;
|
|
254
248
|
i++;
|
|
255
249
|
}
|
|
@@ -282,4 +276,4 @@ function parse(input) {
|
|
|
282
276
|
}
|
|
283
277
|
|
|
284
278
|
//#endregion
|
|
285
|
-
export { APC, APC_OPEN, BACKSLASH, BELL, C0_INTERRUPTERS, CAN, CODE_TYPES, CSI, CSI_OPEN, DCS, DCS_OPEN, DEC_OPEN, ESC, INTERRUPTERS, OSC, OSC_OPEN, PARAM_SEPARATOR, PM, PM_OPEN, PRIVATE_OPENERS, SOS, SOS_OPEN, ST, STRING_OPENERS, SUB, TOKEN_TYPES, parse, parser, tokenize, tokenizer };
|
|
279
|
+
export { APC, APC_CODE, APC_OPEN, BACKSLASH, BACKSLASH_CODE, BELL, BELL_CODE, C0_INTERRUPTERS, CAN, CAN_CODE, CODE_TYPES, CSI, CSI_CODE, CSI_OPEN, CSI_OPEN_CODE, DCS, DCS_CODE, DCS_OPEN, DEC_OPEN, ESC, ESC_CODE, INTERRUPTERS, OSC, OSC_CODE, OSC_OPEN, OSC_OPEN_CODE, PARAM_SEPARATOR, PM, PM_CODE, PM_OPEN, PRIVATE_OPENERS, SOS, SOS_CODE, SOS_OPEN, ST, STRING_OPENERS, ST_CODE, SUB, SUB_CODE, TOKEN_TYPES, parse, parser, tokenize, tokenizer };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { APC, APC_OPEN, BACKSLASH, BELL, C0_INTERRUPTERS, CAN, CODE, CODE_TYPES, CONTROL_CODE, CSI, CSI_OPEN, DCS, DCS_OPEN, DEC_OPEN, ESC, INTERRUPTERS, OSC, OSC_OPEN, PARAM_SEPARATOR, PM, PM_OPEN, PRIVATE_OPENERS, SOS, SOS_OPEN, ST, STRING_OPENERS, SUB, TEXT, TOKEN, TOKEN_TYPES, parse, parser } from "./parse-
|
|
1
|
+
import { APC, APC_CODE, APC_OPEN, BACKSLASH, BACKSLASH_CODE, BELL, BELL_CODE, C0_INTERRUPTERS, CAN, CAN_CODE, CODE, CODE_TYPES, CONTROL_CODE, CSI, CSI_CODE, CSI_OPEN, CSI_OPEN_CODE, DCS, DCS_CODE, DCS_OPEN, DEC_OPEN, ESC, ESC_CODE, INTERRUPTERS, OSC, OSC_CODE, OSC_OPEN, OSC_OPEN_CODE, PARAM_SEPARATOR, PM, PM_CODE, PM_OPEN, PRIVATE_OPENERS, SOS, SOS_CODE, SOS_OPEN, ST, STRING_OPENERS, ST_CODE, SUB, SUB_CODE, TEXT, TOKEN, TOKEN_TYPES, parse, parser } from "./parse-BzJl6pBN.js";
|
|
2
2
|
|
|
3
3
|
//#region src/tokenize.d.ts
|
|
4
|
-
declare function tokenizer(input: string):
|
|
4
|
+
declare function tokenizer(input: string): IterableIterator<TOKEN>;
|
|
5
5
|
declare function tokenize(input: string): TOKEN[];
|
|
6
6
|
//#endregion
|
|
7
|
-
export { APC, APC_OPEN, BACKSLASH, BELL, C0_INTERRUPTERS, CAN, CODE, CODE_TYPES, CONTROL_CODE, CSI, CSI_OPEN, DCS, DCS_OPEN, DEC_OPEN, ESC, INTERRUPTERS, OSC, OSC_OPEN, PARAM_SEPARATOR, PM, PM_OPEN, PRIVATE_OPENERS, SOS, SOS_OPEN, ST, STRING_OPENERS, SUB, TEXT, TOKEN, TOKEN_TYPES, parse, parser, tokenize, tokenizer };
|
|
7
|
+
export { APC, APC_CODE, APC_OPEN, BACKSLASH, BACKSLASH_CODE, BELL, BELL_CODE, C0_INTERRUPTERS, CAN, CAN_CODE, type CODE, CODE_TYPES, type CONTROL_CODE, CSI, CSI_CODE, CSI_OPEN, CSI_OPEN_CODE, DCS, DCS_CODE, DCS_OPEN, DEC_OPEN, ESC, ESC_CODE, INTERRUPTERS, OSC, OSC_CODE, OSC_OPEN, OSC_OPEN_CODE, PARAM_SEPARATOR, PM, PM_CODE, PM_OPEN, PRIVATE_OPENERS, SOS, SOS_CODE, SOS_OPEN, ST, STRING_OPENERS, ST_CODE, SUB, SUB_CODE, type TEXT, type TOKEN, TOKEN_TYPES, parse, parser, tokenize, tokenizer };
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { APC, APC_OPEN, BACKSLASH, BELL, C0_INTERRUPTERS, CAN, CODE_TYPES, CSI, CSI_OPEN, DCS, DCS_OPEN, DEC_OPEN, ESC, INTERRUPTERS, OSC, OSC_OPEN, PARAM_SEPARATOR, PM, PM_OPEN, PRIVATE_OPENERS, SOS, SOS_OPEN, ST, STRING_OPENERS, SUB, TOKEN_TYPES, parse, parser, tokenize, tokenizer } from "./parse-
|
|
1
|
+
import { APC, APC_CODE, APC_OPEN, BACKSLASH, BACKSLASH_CODE, BELL, BELL_CODE, C0_INTERRUPTERS, CAN, CAN_CODE, CODE_TYPES, CSI, CSI_CODE, CSI_OPEN, CSI_OPEN_CODE, DCS, DCS_CODE, DCS_OPEN, DEC_OPEN, ESC, ESC_CODE, INTERRUPTERS, OSC, OSC_CODE, OSC_OPEN, OSC_OPEN_CODE, PARAM_SEPARATOR, PM, PM_CODE, PM_OPEN, PRIVATE_OPENERS, SOS, SOS_CODE, SOS_OPEN, ST, STRING_OPENERS, ST_CODE, SUB, SUB_CODE, TOKEN_TYPES, parse, parser, tokenize, tokenizer } from "./parse-DBLatt5c.js";
|
|
2
2
|
|
|
3
|
-
export { APC, APC_OPEN, BACKSLASH, BELL, C0_INTERRUPTERS, CAN, CODE_TYPES, CSI, CSI_OPEN, DCS, DCS_OPEN, DEC_OPEN, ESC, INTERRUPTERS, OSC, OSC_OPEN, PARAM_SEPARATOR, PM, PM_OPEN, PRIVATE_OPENERS, SOS, SOS_OPEN, ST, STRING_OPENERS, SUB, TOKEN_TYPES, parse, parser, tokenize, tokenizer };
|
|
3
|
+
export { APC, APC_CODE, APC_OPEN, BACKSLASH, BACKSLASH_CODE, BELL, BELL_CODE, C0_INTERRUPTERS, CAN, CAN_CODE, CODE_TYPES, CSI, CSI_CODE, CSI_OPEN, CSI_OPEN_CODE, DCS, DCS_CODE, DCS_OPEN, DEC_OPEN, ESC, ESC_CODE, INTERRUPTERS, OSC, OSC_CODE, OSC_OPEN, OSC_OPEN_CODE, PARAM_SEPARATOR, PM, PM_CODE, PM_OPEN, PRIVATE_OPENERS, SOS, SOS_CODE, SOS_OPEN, ST, STRING_OPENERS, ST_CODE, SUB, SUB_CODE, TOKEN_TYPES, parse, parser, tokenize, tokenizer };
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
//#region src/constants.d.ts
|
|
2
|
+
declare const BELL = 7;
|
|
3
|
+
declare const BELL_CODE: string;
|
|
4
|
+
declare const CAN = 24;
|
|
5
|
+
declare const CAN_CODE: string;
|
|
6
|
+
declare const SUB = 26;
|
|
7
|
+
declare const SUB_CODE: string;
|
|
8
|
+
declare const ESC = 27;
|
|
9
|
+
declare const ESC_CODE: string;
|
|
10
|
+
declare const BACKSLASH = 92;
|
|
11
|
+
declare const BACKSLASH_CODE: string;
|
|
12
|
+
declare const DCS = 144;
|
|
13
|
+
declare const DCS_CODE: string;
|
|
14
|
+
declare const SOS = 152;
|
|
15
|
+
declare const SOS_CODE: string;
|
|
16
|
+
declare const CSI = 155;
|
|
17
|
+
declare const CSI_CODE: string;
|
|
18
|
+
declare const ST = 156;
|
|
19
|
+
declare const ST_CODE: string;
|
|
20
|
+
declare const OSC = 157;
|
|
21
|
+
declare const OSC_CODE: string;
|
|
22
|
+
declare const PM = 158;
|
|
23
|
+
declare const PM_CODE: string;
|
|
24
|
+
declare const APC = 159;
|
|
25
|
+
declare const APC_CODE: string;
|
|
26
|
+
declare const CSI_OPEN: number;
|
|
27
|
+
declare const CSI_OPEN_CODE: string;
|
|
28
|
+
declare const OSC_OPEN: number;
|
|
29
|
+
declare const OSC_OPEN_CODE: string;
|
|
30
|
+
declare const DEC_OPEN: number;
|
|
31
|
+
declare const PRIVATE_OPENERS: Set<string>;
|
|
32
|
+
declare const DCS_OPEN = "P";
|
|
33
|
+
declare const APC_OPEN = "_";
|
|
34
|
+
declare const SOS_OPEN = "^";
|
|
35
|
+
declare const PM_OPEN = "X";
|
|
36
|
+
declare const STRING_OPENERS: Set<string>;
|
|
37
|
+
declare const INTERRUPTERS: Set<number>;
|
|
38
|
+
declare const C0_INTERRUPTERS: Set<number>;
|
|
39
|
+
declare const PARAM_SEPARATOR: RegExp;
|
|
40
|
+
declare const TOKEN_TYPES: {
|
|
41
|
+
readonly TEXT: "TEXT";
|
|
42
|
+
readonly INTRODUCER: "INTRODUCER";
|
|
43
|
+
readonly DATA: "DATA";
|
|
44
|
+
readonly FINAL: "FINAL";
|
|
45
|
+
};
|
|
46
|
+
declare const CODE_TYPES: {
|
|
47
|
+
readonly CSI: "CSI";
|
|
48
|
+
readonly DCS: "DCS";
|
|
49
|
+
readonly DEC: "DEC";
|
|
50
|
+
readonly ESC: "ESC";
|
|
51
|
+
readonly OSC: "OSC";
|
|
52
|
+
readonly PRIVATE: "PRIVATE";
|
|
53
|
+
readonly SGR: "SGR";
|
|
54
|
+
readonly STRING: "STRING";
|
|
55
|
+
readonly TEXT: "TEXT";
|
|
56
|
+
};
|
|
57
|
+
//#endregion
|
|
58
|
+
//#region src/types.d.ts
|
|
59
|
+
type TOKEN = {
|
|
60
|
+
type: keyof typeof TOKEN_TYPES;
|
|
61
|
+
pos: number;
|
|
62
|
+
raw: string;
|
|
63
|
+
code?: string;
|
|
64
|
+
intermediate?: string;
|
|
65
|
+
};
|
|
66
|
+
type CONTROL_CODE_TYPE = Exclude<keyof typeof CODE_TYPES, TEXT["type"]>;
|
|
67
|
+
type CONTROL_CODE = {
|
|
68
|
+
type: CONTROL_CODE_TYPE;
|
|
69
|
+
command: string;
|
|
70
|
+
raw: string;
|
|
71
|
+
params: string[];
|
|
72
|
+
pos: number;
|
|
73
|
+
};
|
|
74
|
+
type TEXT = {
|
|
75
|
+
type: "TEXT";
|
|
76
|
+
raw: string;
|
|
77
|
+
pos: number;
|
|
78
|
+
};
|
|
79
|
+
type CODE = CONTROL_CODE | TEXT;
|
|
80
|
+
//#endregion
|
|
81
|
+
//#region src/parse.d.ts
|
|
82
|
+
declare function parser(tokens: IterableIterator<TOKEN>): IterableIterator<CODE>;
|
|
83
|
+
declare function parse(input: string): CODE[];
|
|
84
|
+
//#endregion
|
|
85
|
+
export { APC, APC_CODE, APC_OPEN, BACKSLASH, BACKSLASH_CODE, BELL, BELL_CODE, C0_INTERRUPTERS, CAN, CAN_CODE, CODE, CODE_TYPES, CONTROL_CODE, CSI, CSI_CODE, CSI_OPEN, CSI_OPEN_CODE, DCS, DCS_CODE, DCS_OPEN, DEC_OPEN, ESC, ESC_CODE, INTERRUPTERS, OSC, OSC_CODE, OSC_OPEN, OSC_OPEN_CODE, PARAM_SEPARATOR, PM, PM_CODE, PM_OPEN, PRIVATE_OPENERS, SOS, SOS_CODE, SOS_OPEN, ST, STRING_OPENERS, ST_CODE, SUB, SUB_CODE, TEXT, TOKEN, TOKEN_TYPES, parse, parser };
|
|
@@ -1,19 +1,33 @@
|
|
|
1
1
|
//#region src/constants.ts
|
|
2
|
-
const BELL =
|
|
3
|
-
const
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
const
|
|
2
|
+
const BELL = 7;
|
|
3
|
+
const BELL_CODE = String.fromCharCode(BELL);
|
|
4
|
+
const CAN = 24;
|
|
5
|
+
const CAN_CODE = String.fromCharCode(CAN);
|
|
6
|
+
const SUB = 26;
|
|
7
|
+
const SUB_CODE = String.fromCharCode(SUB);
|
|
8
|
+
const ESC = 27;
|
|
9
|
+
const ESC_CODE = String.fromCharCode(ESC);
|
|
10
|
+
const BACKSLASH = 92;
|
|
11
|
+
const BACKSLASH_CODE = String.fromCharCode(BACKSLASH);
|
|
12
|
+
const DCS = 144;
|
|
13
|
+
const DCS_CODE = String.fromCharCode(DCS);
|
|
14
|
+
const SOS = 152;
|
|
15
|
+
const SOS_CODE = String.fromCharCode(SOS);
|
|
16
|
+
const CSI = 155;
|
|
17
|
+
const CSI_CODE = String.fromCharCode(CSI);
|
|
18
|
+
const ST = 156;
|
|
19
|
+
const ST_CODE = String.fromCharCode(ST);
|
|
20
|
+
const OSC = 157;
|
|
21
|
+
const OSC_CODE = String.fromCharCode(OSC);
|
|
22
|
+
const PM = 158;
|
|
23
|
+
const PM_CODE = String.fromCharCode(PM);
|
|
24
|
+
const APC = 159;
|
|
25
|
+
const APC_CODE = String.fromCharCode(APC);
|
|
26
|
+
const CSI_OPEN = "[".charCodeAt(0);
|
|
27
|
+
const CSI_OPEN_CODE = String.fromCharCode(CSI_OPEN);
|
|
28
|
+
const OSC_OPEN = "]".charCodeAt(0);
|
|
29
|
+
const OSC_OPEN_CODE = String.fromCharCode(OSC_OPEN);
|
|
30
|
+
const DEC_OPEN = "?".charCodeAt(0);
|
|
17
31
|
const PRIVATE_OPENERS = new Set([
|
|
18
32
|
"<",
|
|
19
33
|
"=",
|
|
@@ -262,15 +276,6 @@ function parseSOS(introducer, dataTokens, final) {
|
|
|
262
276
|
|
|
263
277
|
//#endregion
|
|
264
278
|
//#region src/tokenize.ts
|
|
265
|
-
const INTRODUCERS = new Set([
|
|
266
|
-
ESC,
|
|
267
|
-
CSI,
|
|
268
|
-
OSC,
|
|
269
|
-
DCS,
|
|
270
|
-
APC,
|
|
271
|
-
PM,
|
|
272
|
-
SOS
|
|
273
|
-
]);
|
|
274
279
|
function emit$1(token) {
|
|
275
280
|
return token;
|
|
276
281
|
}
|
|
@@ -284,10 +289,13 @@ function* tokenizer(input) {
|
|
|
284
289
|
}
|
|
285
290
|
while (i < input.length) if (state === "GROUND") {
|
|
286
291
|
const textStart = i;
|
|
292
|
+
let charCode = input.charCodeAt(i);
|
|
293
|
+
let char = input[i];
|
|
287
294
|
while (i < input.length) {
|
|
288
|
-
|
|
289
|
-
if (INTRODUCERS.has(char)) break;
|
|
295
|
+
if (charCode === ESC || charCode === CSI || charCode === OSC || charCode === DCS || charCode === APC || charCode === PM || charCode === SOS) break;
|
|
290
296
|
i++;
|
|
297
|
+
charCode = input.charCodeAt(i);
|
|
298
|
+
char = input[i];
|
|
291
299
|
}
|
|
292
300
|
if (i > textStart) yield emit$1({
|
|
293
301
|
type: TOKEN_TYPES.TEXT,
|
|
@@ -295,8 +303,7 @@ function* tokenizer(input) {
|
|
|
295
303
|
raw: input.substring(textStart, i)
|
|
296
304
|
});
|
|
297
305
|
if (i < input.length) {
|
|
298
|
-
|
|
299
|
-
if (char === CSI || char === OSC || char === DCS || char === APC || char === PM || char === SOS) {
|
|
306
|
+
if (charCode === CSI || charCode === OSC || charCode === DCS || charCode === APC || charCode === PM || charCode === SOS) {
|
|
300
307
|
yield emit$1({
|
|
301
308
|
type: TOKEN_TYPES.INTRODUCER,
|
|
302
309
|
pos: i,
|
|
@@ -304,24 +311,25 @@ function* tokenizer(input) {
|
|
|
304
311
|
code: char
|
|
305
312
|
});
|
|
306
313
|
i++;
|
|
307
|
-
setState("SEQUENCE",
|
|
308
|
-
} else if (
|
|
314
|
+
setState("SEQUENCE", charCode);
|
|
315
|
+
} else if (charCode === ESC) {
|
|
309
316
|
const next = input[i + 1];
|
|
310
|
-
|
|
317
|
+
const nextCode = input.charCodeAt(i + 1);
|
|
318
|
+
if (nextCode === CSI_OPEN) {
|
|
311
319
|
yield emit$1({
|
|
312
320
|
type: TOKEN_TYPES.INTRODUCER,
|
|
313
321
|
pos: i,
|
|
314
322
|
raw: char + next,
|
|
315
|
-
code:
|
|
323
|
+
code: CSI_CODE
|
|
316
324
|
});
|
|
317
325
|
i += 2;
|
|
318
326
|
setState("SEQUENCE", CSI);
|
|
319
|
-
} else if (
|
|
327
|
+
} else if (nextCode === OSC_OPEN) {
|
|
320
328
|
yield emit$1({
|
|
321
329
|
type: TOKEN_TYPES.INTRODUCER,
|
|
322
330
|
pos: i,
|
|
323
331
|
raw: char + next,
|
|
324
|
-
code:
|
|
332
|
+
code: OSC_CODE
|
|
325
333
|
});
|
|
326
334
|
i += 2;
|
|
327
335
|
setState("SEQUENCE", OSC);
|
|
@@ -333,7 +341,7 @@ function* tokenizer(input) {
|
|
|
333
341
|
code: next
|
|
334
342
|
});
|
|
335
343
|
i += 2;
|
|
336
|
-
setState("SEQUENCE",
|
|
344
|
+
setState("SEQUENCE", nextCode);
|
|
337
345
|
} else if (next) {
|
|
338
346
|
let j = i + 1;
|
|
339
347
|
while (j < input.length && input.charCodeAt(j) >= 32 && input.charCodeAt(j) <= 47) j++;
|
|
@@ -343,14 +351,14 @@ function* tokenizer(input) {
|
|
|
343
351
|
type: TOKEN_TYPES.INTRODUCER,
|
|
344
352
|
pos: i,
|
|
345
353
|
raw: char + is,
|
|
346
|
-
code:
|
|
354
|
+
code: ESC_CODE,
|
|
347
355
|
intermediate: is
|
|
348
356
|
});
|
|
349
357
|
else yield emit$1({
|
|
350
358
|
type: TOKEN_TYPES.INTRODUCER,
|
|
351
359
|
pos: i,
|
|
352
360
|
raw: char,
|
|
353
|
-
code:
|
|
361
|
+
code: ESC_CODE
|
|
354
362
|
});
|
|
355
363
|
i = j;
|
|
356
364
|
setState("SEQUENCE", ESC);
|
|
@@ -363,18 +371,18 @@ function* tokenizer(input) {
|
|
|
363
371
|
const code = currentCode;
|
|
364
372
|
let data = "";
|
|
365
373
|
if (code === CSI) while (i < input.length) {
|
|
374
|
+
const charCode = input.charCodeAt(i);
|
|
366
375
|
const char = input[i];
|
|
367
|
-
if (INTERRUPTERS.has(
|
|
376
|
+
if (INTERRUPTERS.has(charCode)) {
|
|
368
377
|
if (data) yield emit$1({
|
|
369
378
|
type: TOKEN_TYPES.DATA,
|
|
370
379
|
pos,
|
|
371
380
|
raw: data
|
|
372
381
|
});
|
|
373
382
|
setState("GROUND");
|
|
374
|
-
if (C0_INTERRUPTERS.has(
|
|
383
|
+
if (C0_INTERRUPTERS.has(charCode)) i++;
|
|
375
384
|
break;
|
|
376
385
|
}
|
|
377
|
-
const charCode = char.charCodeAt(0);
|
|
378
386
|
if (charCode >= 64 && charCode <= 126) {
|
|
379
387
|
if (data) yield emit$1({
|
|
380
388
|
type: TOKEN_TYPES.DATA,
|
|
@@ -395,10 +403,11 @@ function* tokenizer(input) {
|
|
|
395
403
|
}
|
|
396
404
|
else if (code === ESC) {
|
|
397
405
|
if (i < input.length) {
|
|
406
|
+
const charCode = input.charCodeAt(i);
|
|
398
407
|
const char = input[i];
|
|
399
|
-
if (INTERRUPTERS.has(
|
|
408
|
+
if (INTERRUPTERS.has(charCode)) {
|
|
400
409
|
setState("GROUND");
|
|
401
|
-
if (C0_INTERRUPTERS.has(
|
|
410
|
+
if (C0_INTERRUPTERS.has(charCode)) i++;
|
|
402
411
|
} else {
|
|
403
412
|
yield emit$1({
|
|
404
413
|
type: TOKEN_TYPES.FINAL,
|
|
@@ -411,10 +420,11 @@ function* tokenizer(input) {
|
|
|
411
420
|
}
|
|
412
421
|
} else if (code) while (i < input.length) {
|
|
413
422
|
const char = input[i];
|
|
423
|
+
const charCode = char.charCodeAt(0);
|
|
414
424
|
let terminator;
|
|
415
|
-
if (
|
|
416
|
-
else if (
|
|
417
|
-
else if (
|
|
425
|
+
if (charCode === ESC && input.charCodeAt(i + 1) === BACKSLASH) terminator = ESC_CODE + BACKSLASH_CODE;
|
|
426
|
+
else if (charCode === ST) terminator = ST_CODE;
|
|
427
|
+
else if (charCode === BELL && code === OSC) terminator = BELL_CODE;
|
|
418
428
|
if (terminator) {
|
|
419
429
|
if (data) yield emit$1({
|
|
420
430
|
type: TOKEN_TYPES.DATA,
|
|
@@ -430,14 +440,14 @@ function* tokenizer(input) {
|
|
|
430
440
|
setState("GROUND");
|
|
431
441
|
break;
|
|
432
442
|
}
|
|
433
|
-
if (INTERRUPTERS.has(
|
|
443
|
+
if (INTERRUPTERS.has(charCode)) {
|
|
434
444
|
if (data) yield emit$1({
|
|
435
445
|
type: TOKEN_TYPES.DATA,
|
|
436
446
|
pos,
|
|
437
447
|
raw: data
|
|
438
448
|
});
|
|
439
449
|
setState("GROUND");
|
|
440
|
-
if (C0_INTERRUPTERS.has(
|
|
450
|
+
if (C0_INTERRUPTERS.has(charCode)) i++;
|
|
441
451
|
break;
|
|
442
452
|
}
|
|
443
453
|
data += char;
|
|
@@ -485,29 +495,29 @@ function* parser(tokens) {
|
|
|
485
495
|
current = tokens.next();
|
|
486
496
|
}
|
|
487
497
|
switch (introducer.code) {
|
|
488
|
-
case
|
|
498
|
+
case CSI_CODE:
|
|
489
499
|
yield emit(parseCSI(introducer, data, final));
|
|
490
500
|
break;
|
|
491
|
-
case
|
|
501
|
+
case OSC_CODE:
|
|
492
502
|
yield emit(parseOSC(introducer, data, final));
|
|
493
503
|
break;
|
|
494
|
-
case
|
|
504
|
+
case DCS_CODE:
|
|
495
505
|
case DCS_OPEN:
|
|
496
506
|
yield emit(parseDCS(introducer, data, final));
|
|
497
507
|
break;
|
|
498
|
-
case
|
|
508
|
+
case APC_CODE:
|
|
499
509
|
case APC_OPEN:
|
|
500
510
|
yield emit(parseAPC(introducer, data, final));
|
|
501
511
|
break;
|
|
502
|
-
case
|
|
512
|
+
case PM_CODE:
|
|
503
513
|
case PM_OPEN:
|
|
504
514
|
yield emit(parsePM(introducer, data, final));
|
|
505
515
|
break;
|
|
506
|
-
case
|
|
516
|
+
case SOS_CODE:
|
|
507
517
|
case SOS_OPEN:
|
|
508
518
|
yield emit(parseSOS(introducer, data, final));
|
|
509
519
|
break;
|
|
510
|
-
case
|
|
520
|
+
case ESC_CODE:
|
|
511
521
|
yield emit(parseESC(introducer, data, final));
|
|
512
522
|
break;
|
|
513
523
|
}
|
|
@@ -519,4 +529,4 @@ function parse(input) {
|
|
|
519
529
|
}
|
|
520
530
|
|
|
521
531
|
//#endregion
|
|
522
|
-
export { APC, APC_OPEN, BACKSLASH, BELL, C0_INTERRUPTERS, CAN, CODE_TYPES, CSI, CSI_OPEN, DCS, DCS_OPEN, DEC_OPEN, ESC, INTERRUPTERS, OSC, OSC_OPEN, PARAM_SEPARATOR, PM, PM_OPEN, PRIVATE_OPENERS, SOS, SOS_OPEN, ST, STRING_OPENERS, SUB, TOKEN_TYPES, parse, parser, tokenize, tokenizer };
|
|
532
|
+
export { APC, APC_CODE, APC_OPEN, BACKSLASH, BACKSLASH_CODE, BELL, BELL_CODE, C0_INTERRUPTERS, CAN, CAN_CODE, CODE_TYPES, CSI, CSI_CODE, CSI_OPEN, CSI_OPEN_CODE, DCS, DCS_CODE, DCS_OPEN, DEC_OPEN, ESC, ESC_CODE, INTERRUPTERS, OSC, OSC_CODE, OSC_OPEN, OSC_OPEN_CODE, PARAM_SEPARATOR, PM, PM_CODE, PM_OPEN, PRIVATE_OPENERS, SOS, SOS_CODE, SOS_OPEN, ST, STRING_OPENERS, ST_CODE, SUB, SUB_CODE, TOKEN_TYPES, parse, parser, tokenize, tokenizer };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ansi-tools/parser",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.11",
|
|
4
4
|
"description": "Tokenize and parse strings containing ANSI escape sequences and control codes",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"prebuild": "pnpm type-check && pnpm test",
|
|
24
24
|
"build": "tsdown --dts src/index.ts src/escaped.ts",
|
|
25
25
|
"dev": "tsdown --dts src/index.ts src/escaped.ts --watch",
|
|
26
|
-
"test": "node --test",
|
|
26
|
+
"test": "node --import ./test/assertions.ts --test",
|
|
27
27
|
"type-check": "tsc",
|
|
28
28
|
"prepack": "pnpm build"
|
|
29
29
|
},
|
|
@@ -45,8 +45,8 @@
|
|
|
45
45
|
"directory": "packages/parser"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
|
-
"@types/node": "^24.
|
|
49
|
-
"tsdown": "^0.
|
|
50
|
-
"typescript": "^5.
|
|
48
|
+
"@types/node": "^24.6.1",
|
|
49
|
+
"tsdown": "^0.15.6",
|
|
50
|
+
"typescript": "^5.9.3"
|
|
51
51
|
}
|
|
52
52
|
}
|
package/dist/parse-BLVd8fU0.d.ts
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
//#region src/constants.d.ts
|
|
2
|
-
declare const BELL: string;
|
|
3
|
-
declare const CAN: string;
|
|
4
|
-
declare const SUB: string;
|
|
5
|
-
declare const ESC: string;
|
|
6
|
-
declare const BACKSLASH: string;
|
|
7
|
-
declare const DCS: string;
|
|
8
|
-
declare const SOS: string;
|
|
9
|
-
declare const CSI: string;
|
|
10
|
-
declare const ST: string;
|
|
11
|
-
declare const OSC: string;
|
|
12
|
-
declare const PM: string;
|
|
13
|
-
declare const APC: string;
|
|
14
|
-
declare const CSI_OPEN = "[";
|
|
15
|
-
declare const OSC_OPEN = "]";
|
|
16
|
-
declare const DEC_OPEN = "?";
|
|
17
|
-
declare const PRIVATE_OPENERS: Set<string>;
|
|
18
|
-
declare const DCS_OPEN = "P";
|
|
19
|
-
declare const APC_OPEN = "_";
|
|
20
|
-
declare const SOS_OPEN = "^";
|
|
21
|
-
declare const PM_OPEN = "X";
|
|
22
|
-
declare const STRING_OPENERS: Set<string>;
|
|
23
|
-
declare const INTERRUPTERS: Set<string>;
|
|
24
|
-
declare const C0_INTERRUPTERS: Set<string>;
|
|
25
|
-
declare const PARAM_SEPARATOR: RegExp;
|
|
26
|
-
declare const TOKEN_TYPES: {
|
|
27
|
-
readonly TEXT: "TEXT";
|
|
28
|
-
readonly INTRODUCER: "INTRODUCER";
|
|
29
|
-
readonly DATA: "DATA";
|
|
30
|
-
readonly FINAL: "FINAL";
|
|
31
|
-
};
|
|
32
|
-
declare const CODE_TYPES: {
|
|
33
|
-
readonly CSI: "CSI";
|
|
34
|
-
readonly DCS: "DCS";
|
|
35
|
-
readonly DEC: "DEC";
|
|
36
|
-
readonly ESC: "ESC";
|
|
37
|
-
readonly OSC: "OSC";
|
|
38
|
-
readonly PRIVATE: "PRIVATE";
|
|
39
|
-
readonly SGR: "SGR";
|
|
40
|
-
readonly STRING: "STRING";
|
|
41
|
-
readonly TEXT: "TEXT";
|
|
42
|
-
};
|
|
43
|
-
//#endregion
|
|
44
|
-
//#region src/types.d.ts
|
|
45
|
-
type TOKEN = {
|
|
46
|
-
type: keyof typeof TOKEN_TYPES;
|
|
47
|
-
pos: number;
|
|
48
|
-
raw: string;
|
|
49
|
-
code?: string;
|
|
50
|
-
intermediate?: string;
|
|
51
|
-
};
|
|
52
|
-
type CONTROL_CODE_TYPE = Exclude<keyof typeof CODE_TYPES, TEXT["type"]>;
|
|
53
|
-
type CONTROL_CODE = {
|
|
54
|
-
type: CONTROL_CODE_TYPE;
|
|
55
|
-
command: string;
|
|
56
|
-
raw: string;
|
|
57
|
-
params: string[];
|
|
58
|
-
pos: number;
|
|
59
|
-
};
|
|
60
|
-
type TEXT = {
|
|
61
|
-
type: "TEXT";
|
|
62
|
-
raw: string;
|
|
63
|
-
pos: number;
|
|
64
|
-
};
|
|
65
|
-
type CODE = CONTROL_CODE | TEXT;
|
|
66
|
-
//#endregion
|
|
67
|
-
//#region src/parse.d.ts
|
|
68
|
-
declare function parser(tokens: Generator<TOKEN>): Generator<CODE>;
|
|
69
|
-
declare function parse(input: string): CODE[];
|
|
70
|
-
//#endregion
|
|
71
|
-
export { APC, APC_OPEN, BACKSLASH, BELL, C0_INTERRUPTERS, CAN, CODE, CODE_TYPES, CONTROL_CODE, CSI, CSI_OPEN, DCS, DCS_OPEN, DEC_OPEN, ESC, INTERRUPTERS, OSC, OSC_OPEN, PARAM_SEPARATOR, PM, PM_OPEN, PRIVATE_OPENERS, SOS, SOS_OPEN, ST, STRING_OPENERS, SUB, TEXT, TOKEN, TOKEN_TYPES, parse, parser };
|