@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 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-BLVd8fU0.js";
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): Generator<TOKEN>;
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-DmFIqYg6.js";
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
- const backslashIndex = input.indexOf(BACKSLASH, i);
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
- let matched = true;
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
- let isSeqMatch = true;
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: CSI
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 === CSI_OPEN) {
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: CSI
103
+ code: CSI_CODE
109
104
  });
110
105
  i += len + 1;
111
106
  setState("SEQUENCE", CSI);
112
- } else if (next === OSC_OPEN) {
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: OSC
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: ESC,
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: ESC
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
- const char = input[i];
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[i + 4] === BACKSLASH && input[i + 5] === BACKSLASH) {
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[i + 2] === BACKSLASH && input[i + 3] === BACKSLASH) {
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 = char;
241
+ terminator = input[i];
248
242
  terminatorPos = i;
249
243
  i++;
250
244
  }
251
245
  } else if (code === ESC) {
252
- terminator = char;
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-BLVd8fU0.js";
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): Generator<TOKEN>;
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-DmFIqYg6.js";
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 = String.fromCharCode(7);
3
- const CAN = String.fromCharCode(24);
4
- const SUB = String.fromCharCode(26);
5
- const ESC = String.fromCharCode(27);
6
- const BACKSLASH = String.fromCharCode(92);
7
- const DCS = String.fromCharCode(144);
8
- const SOS = String.fromCharCode(152);
9
- const CSI = String.fromCharCode(155);
10
- const ST = String.fromCharCode(156);
11
- const OSC = String.fromCharCode(157);
12
- const PM = String.fromCharCode(158);
13
- const APC = String.fromCharCode(159);
14
- const CSI_OPEN = "[";
15
- const OSC_OPEN = "]";
16
- const DEC_OPEN = "?";
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
- const char = input[i];
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
- const char = input[i];
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", char);
308
- } else if (char === ESC) {
314
+ setState("SEQUENCE", charCode);
315
+ } else if (charCode === ESC) {
309
316
  const next = input[i + 1];
310
- if (next === CSI_OPEN) {
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: CSI
323
+ code: CSI_CODE
316
324
  });
317
325
  i += 2;
318
326
  setState("SEQUENCE", CSI);
319
- } else if (next === OSC_OPEN) {
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: OSC
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", next);
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: ESC,
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: ESC
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(char)) {
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(char)) i++;
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(char)) {
408
+ if (INTERRUPTERS.has(charCode)) {
400
409
  setState("GROUND");
401
- if (C0_INTERRUPTERS.has(char)) i++;
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 (char === ESC && input[i + 1] === BACKSLASH) terminator = ESC + BACKSLASH;
416
- else if (char === ST) terminator = ST;
417
- else if (char === BELL && code === OSC) terminator = BELL;
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(char)) {
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(char)) i++;
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 CSI:
498
+ case CSI_CODE:
489
499
  yield emit(parseCSI(introducer, data, final));
490
500
  break;
491
- case OSC:
501
+ case OSC_CODE:
492
502
  yield emit(parseOSC(introducer, data, final));
493
503
  break;
494
- case DCS:
504
+ case DCS_CODE:
495
505
  case DCS_OPEN:
496
506
  yield emit(parseDCS(introducer, data, final));
497
507
  break;
498
- case APC:
508
+ case APC_CODE:
499
509
  case APC_OPEN:
500
510
  yield emit(parseAPC(introducer, data, final));
501
511
  break;
502
- case PM:
512
+ case PM_CODE:
503
513
  case PM_OPEN:
504
514
  yield emit(parsePM(introducer, data, final));
505
515
  break;
506
- case SOS:
516
+ case SOS_CODE:
507
517
  case SOS_OPEN:
508
518
  yield emit(parseSOS(introducer, data, final));
509
519
  break;
510
- case ESC:
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.9",
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.0.13",
49
- "tsdown": "^0.12.9",
50
- "typescript": "^5.8.3"
48
+ "@types/node": "^24.6.1",
49
+ "tsdown": "^0.15.6",
50
+ "typescript": "^5.9.3"
51
51
  }
52
52
  }
@@ -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 };