@ansi-tools/parser 1.0.7 → 1.0.9

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,4 +1,4 @@
1
- import { APC, APC_OPEN, BACKSLASH, BELL, CODE, CODE_TYPES, CONTROL_CODE, CSI, CSI_OPEN, DCS, DCS_OPEN, DEC_OPEN, ESC, OSC, OSC_OPEN, PM, PM_OPEN, PRIVATE_OPENERS, SOS, SOS_OPEN, ST, STRING_OPENERS, TEXT, TOKEN, TOKEN_TYPES, parser } from "./parse-Nkb7K322.js";
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";
2
2
 
3
3
  //#region src/parse.escaped.d.ts
4
4
  declare function parse(input: string): CODE[];
@@ -7,4 +7,4 @@ declare function parse(input: string): CODE[];
7
7
  declare function tokenizer(input: string): Generator<TOKEN>;
8
8
  declare function tokenize(input: string): TOKEN[];
9
9
  //#endregion
10
- export { APC, APC_OPEN, BACKSLASH, BELL, CODE, CODE_TYPES, CONTROL_CODE, CSI, CSI_OPEN, DCS, DCS_OPEN, DEC_OPEN, ESC, OSC, OSC_OPEN, PM, PM_OPEN, PRIVATE_OPENERS, SOS, SOS_OPEN, ST, STRING_OPENERS, TEXT, TOKEN, TOKEN_TYPES, parse, parser, tokenize, tokenizer };
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 };
package/dist/escaped.js CHANGED
@@ -1,15 +1,29 @@
1
- import { APC, APC_OPEN, BACKSLASH, BELL, CODE_TYPES, CSI, CSI_OPEN, DCS, DCS_OPEN, DEC_OPEN, ESC, OSC, OSC_OPEN, PM, PM_OPEN, PRIVATE_OPENERS, SOS, SOS_OPEN, ST, STRING_OPENERS, TOKEN_TYPES, parser } from "./parse-CYNZDD06.js";
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";
2
2
 
3
3
  //#region src/tokenize.escaped.ts
4
4
  const CSI_ESCAPED = "\\u009b";
5
+ const CSI_ESCAPED_HEX = "\\x9b";
5
6
  const ABANDONED = "ABANDONED";
6
7
  const INTRODUCERS = [
7
8
  ["\\u001b", 6],
8
9
  [CSI_ESCAPED, 6],
10
+ [CSI_ESCAPED_HEX, 4],
9
11
  ["\\x1b", 4],
10
12
  ["\\033", 4],
11
13
  ["\\e", 2]
12
14
  ];
15
+ const INTERRUPTERS_ESCAPED = [
16
+ ["\\x18", 4],
17
+ ["\\x1a", 4],
18
+ ["\\u0018", 6],
19
+ ["\\u001a", 6]
20
+ ];
21
+ const INTERRUPTER_LOOKUP = /* @__PURE__ */ new Map();
22
+ for (const [sequence, len] of INTERRUPTERS_ESCAPED) {
23
+ const secondChar = sequence[1];
24
+ if (!INTERRUPTER_LOOKUP.has(secondChar)) INTERRUPTER_LOOKUP.set(secondChar, []);
25
+ INTERRUPTER_LOOKUP.get(secondChar)?.push([sequence, len]);
26
+ }
13
27
  const INTRODUCER_LOOKUP = /* @__PURE__ */ new Map();
14
28
  const INTRODUCER_FIRST_CHAR_CACHE = /* @__PURE__ */ new Map();
15
29
  for (const [sequence, len] of INTRODUCERS) {
@@ -75,7 +89,7 @@ function* tokenizer(input) {
75
89
  }
76
90
  if (isSeqMatch) {
77
91
  isMatch = true;
78
- if (seq === CSI_ESCAPED) {
92
+ if (seq === CSI_ESCAPED || seq === CSI_ESCAPED_HEX) {
79
93
  yield emit({
80
94
  type: TOKEN_TYPES.INTRODUCER,
81
95
  pos: i,
@@ -150,8 +164,27 @@ function* tokenizer(input) {
150
164
  while (!terminator && i < l) {
151
165
  const char = input[i];
152
166
  if (char === BACKSLASH) {
167
+ const next = input[i + 1];
168
+ if (next) {
169
+ const interrupters = INTERRUPTER_LOOKUP.get(next);
170
+ if (interrupters) {
171
+ for (const [seq, len] of interrupters) if (i + len <= l) {
172
+ let matched = true;
173
+ for (let k = 0; k < len; k++) if (input[i + k] !== seq[k]) {
174
+ matched = false;
175
+ break;
176
+ }
177
+ if (matched) {
178
+ terminator = ABANDONED;
179
+ terminatorPos = i;
180
+ i += len;
181
+ break;
182
+ }
183
+ }
184
+ }
185
+ }
186
+ if (terminator) break;
153
187
  if (code !== CSI && code !== ESC) {
154
- const next = input[i + 1];
155
188
  if (next === "a" && i + 2 <= l) {
156
189
  if (code === OSC && input[i + 1] === "a") {
157
190
  terminator = "\\a";
@@ -191,7 +224,6 @@ function* tokenizer(input) {
191
224
  }
192
225
  }
193
226
  if (!terminator) {
194
- const next = input[i + 1];
195
227
  if (next) {
196
228
  const candidates = INTRODUCER_LOOKUP.get(next);
197
229
  if (candidates) for (const [seq, len] of candidates) {
@@ -250,4 +282,4 @@ function parse(input) {
250
282
  }
251
283
 
252
284
  //#endregion
253
- export { APC, APC_OPEN, BACKSLASH, BELL, CODE_TYPES, CSI, CSI_OPEN, DCS, DCS_OPEN, DEC_OPEN, ESC, OSC, OSC_OPEN, PM, PM_OPEN, PRIVATE_OPENERS, SOS, SOS_OPEN, ST, STRING_OPENERS, TOKEN_TYPES, parse, parser, tokenize, tokenizer };
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 };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import { APC, APC_OPEN, BACKSLASH, BELL, CODE, CODE_TYPES, CONTROL_CODE, CSI, CSI_OPEN, DCS, DCS_OPEN, DEC_OPEN, ESC, OSC, OSC_OPEN, PM, PM_OPEN, PRIVATE_OPENERS, SOS, SOS_OPEN, ST, STRING_OPENERS, TEXT, TOKEN, TOKEN_TYPES, parse, parser } from "./parse-Nkb7K322.js";
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";
2
2
 
3
3
  //#region src/tokenize.d.ts
4
4
  declare function tokenizer(input: string): Generator<TOKEN>;
5
5
  declare function tokenize(input: string): TOKEN[];
6
6
  //#endregion
7
- export { APC, APC_OPEN, BACKSLASH, BELL, CODE, CODE_TYPES, CONTROL_CODE, CSI, CSI_OPEN, DCS, DCS_OPEN, DEC_OPEN, ESC, OSC, OSC_OPEN, PM, PM_OPEN, PRIVATE_OPENERS, SOS, SOS_OPEN, ST, STRING_OPENERS, TEXT, TOKEN, TOKEN_TYPES, parse, parser, tokenize, tokenizer };
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 };
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- import { APC, APC_OPEN, BACKSLASH, BELL, CODE_TYPES, CSI, CSI_OPEN, DCS, DCS_OPEN, DEC_OPEN, ESC, OSC, OSC_OPEN, PM, PM_OPEN, PRIVATE_OPENERS, SOS, SOS_OPEN, ST, STRING_OPENERS, TOKEN_TYPES, parse, parser, tokenize, tokenizer } from "./parse-CYNZDD06.js";
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";
2
2
 
3
- export { APC, APC_OPEN, BACKSLASH, BELL, CODE_TYPES, CSI, CSI_OPEN, DCS, DCS_OPEN, DEC_OPEN, ESC, OSC, OSC_OPEN, PM, PM_OPEN, PRIVATE_OPENERS, SOS, SOS_OPEN, ST, STRING_OPENERS, TOKEN_TYPES, parse, parser, tokenize, tokenizer };
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 };
@@ -1,5 +1,7 @@
1
1
  //#region src/constants.d.ts
2
2
  declare const BELL: string;
3
+ declare const CAN: string;
4
+ declare const SUB: string;
3
5
  declare const ESC: string;
4
6
  declare const BACKSLASH: string;
5
7
  declare const DCS: string;
@@ -18,6 +20,9 @@ declare const APC_OPEN = "_";
18
20
  declare const SOS_OPEN = "^";
19
21
  declare const PM_OPEN = "X";
20
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;
21
26
  declare const TOKEN_TYPES: {
22
27
  readonly TEXT: "TEXT";
23
28
  readonly INTRODUCER: "INTRODUCER";
@@ -44,8 +49,9 @@ type TOKEN = {
44
49
  code?: string;
45
50
  intermediate?: string;
46
51
  };
52
+ type CONTROL_CODE_TYPE = Exclude<keyof typeof CODE_TYPES, TEXT["type"]>;
47
53
  type CONTROL_CODE = {
48
- type: "CSI" | "DCS" | "DEC" | "ESC" | "OSC" | "SGR" | "STRING" | "PRIVATE";
54
+ type: CONTROL_CODE_TYPE;
49
55
  command: string;
50
56
  raw: string;
51
57
  params: string[];
@@ -62,4 +68,4 @@ type CODE = CONTROL_CODE | TEXT;
62
68
  declare function parser(tokens: Generator<TOKEN>): Generator<CODE>;
63
69
  declare function parse(input: string): CODE[];
64
70
  //#endregion
65
- export { APC, APC_OPEN, BACKSLASH, BELL, CODE, CODE_TYPES, CONTROL_CODE, CSI, CSI_OPEN, DCS, DCS_OPEN, DEC_OPEN, ESC, OSC, OSC_OPEN, PM, PM_OPEN, PRIVATE_OPENERS, SOS, SOS_OPEN, ST, STRING_OPENERS, TEXT, TOKEN, TOKEN_TYPES, parse, parser };
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 };
@@ -1,5 +1,7 @@
1
1
  //#region src/constants.ts
2
2
  const BELL = String.fromCharCode(7);
3
+ const CAN = String.fromCharCode(24);
4
+ const SUB = String.fromCharCode(26);
3
5
  const ESC = String.fromCharCode(27);
4
6
  const BACKSLASH = String.fromCharCode(92);
5
7
  const DCS = String.fromCharCode(144);
@@ -27,6 +29,19 @@ const STRING_OPENERS = new Set([
27
29
  SOS_OPEN,
28
30
  PM_OPEN
29
31
  ]);
32
+ const INTERRUPTERS = new Set([
33
+ CAN,
34
+ SUB,
35
+ ESC,
36
+ CSI,
37
+ OSC,
38
+ DCS,
39
+ APC,
40
+ PM,
41
+ SOS
42
+ ]);
43
+ const C0_INTERRUPTERS = new Set([CAN, SUB]);
44
+ const PARAM_SEPARATOR = /[;:]/;
30
45
  const TOKEN_TYPES = {
31
46
  TEXT: "TEXT",
32
47
  INTRODUCER: "INTRODUCER",
@@ -49,51 +64,57 @@ const CODE_TYPES = {
49
64
  //#region src/parsers/csi.ts
50
65
  function parseCSI(introducer, dataTokens, final) {
51
66
  const data = dataTokens.map((t) => t.raw).join("");
52
- const raw = introducer.raw + data + final.raw;
67
+ const raw = introducer.raw + data + (final?.raw || "");
53
68
  const params = [];
69
+ let type = CODE_TYPES.CSI;
54
70
  let intermediates = "";
71
+ let paramSection = "";
55
72
  if (data) {
56
73
  let i = 0;
57
- let paramSection = "";
58
- while (i < data.length && data.charCodeAt(i) >= 48 && data.charCodeAt(i) <= 63) {
59
- paramSection += data[i];
60
- i++;
74
+ while (i < data.length) {
75
+ const charCode = data.charCodeAt(i);
76
+ if (charCode >= 48 && charCode <= 63) {
77
+ paramSection += data[i];
78
+ i++;
79
+ } else break;
61
80
  }
62
81
  intermediates = data.slice(i);
63
- if (paramSection) {
64
- const parts = paramSection.replace(/:/g, ";").split(";");
65
- for (const part of parts) params.push(part || "-1");
66
- }
67
82
  }
83
+ if (paramSection) for (const part of paramSection.split(PARAM_SEPARATOR)) params.push(part || "0");
68
84
  const command = intermediates + (final?.raw ?? "");
69
- return {
70
- type: CODE_TYPES.CSI,
71
- pos: introducer.pos,
72
- raw,
73
- command,
74
- params
75
- };
76
- }
77
- function parsePrivateCSI(introducer, dataTokens, finalToken) {
78
- const data = dataTokens.map((t) => t.raw).join("");
79
- const raw = introducer.raw + data + (finalToken?.raw ?? "");
80
- const privateIndicator = data[0] || "";
81
- const withoutIndicator = data.slice(1);
82
- const match = withoutIndicator.match(/^([\d;:]*)(.*)/);
83
- const paramsRaw = match?.[1] ?? "";
84
- const intermediates = match?.[2] ?? "";
85
- const command = `${privateIndicator}${intermediates}${finalToken.raw}`;
86
- const params = [];
87
- if (paramsRaw) {
88
- let current = "";
89
- for (let i = 0; i < paramsRaw.length; i++) if (paramsRaw[i] === ";") {
90
- params.push(current || "-1");
91
- current = "";
92
- } else current += paramsRaw[i];
93
- params.push(current || "-1");
85
+ const start = params[0];
86
+ if (start?.startsWith("?")) {
87
+ type = CODE_TYPES.DEC;
88
+ if (start.length > 1) params[0] = start.slice(1);
89
+ else params.shift();
90
+ return {
91
+ type,
92
+ pos: introducer.pos,
93
+ raw,
94
+ command,
95
+ params
96
+ };
94
97
  }
98
+ for (const param of params) if (param && param.length > 0 && PRIVATE_OPENERS.has(param[0])) {
99
+ type = CODE_TYPES.PRIVATE;
100
+ const privateCommand = param[0] + command;
101
+ for (let i = 0; i < params.length; i++) if (params[i] && params[i].length > 0 && PRIVATE_OPENERS.has(params[i][0])) {
102
+ if (params[i].length > 1) params[i] = params[i].slice(1);
103
+ else params.splice(i, 1);
104
+ break;
105
+ }
106
+ return {
107
+ type,
108
+ pos: introducer.pos,
109
+ raw,
110
+ command: privateCommand,
111
+ params
112
+ };
113
+ }
114
+ if (command === "m" && params.length === 5 && params[1] === "2" && (start === "38" || start === "48")) params.splice(2, 0, "0");
115
+ if (command === "r" && params.length === 2 && params[1] === "0") params[1] = "-1";
95
116
  return {
96
- type: CODE_TYPES.PRIVATE,
117
+ type,
97
118
  pos: introducer.pos,
98
119
  raw,
99
120
  command,
@@ -123,14 +144,7 @@ function parseDCS(introducer, dataTokens, final) {
123
144
  for (const [pattern, length] of DCS_PATTERNS) if (data.startsWith(pattern)) {
124
145
  const remainder = data.slice(length);
125
146
  const params = [];
126
- if (remainder) {
127
- let current = "";
128
- for (let i = 0; i < remainder.length; i++) if (remainder[i] === ";") {
129
- params.push(current || "-1");
130
- current = "";
131
- } else current += remainder[i];
132
- params.push(current || "-1");
133
- }
147
+ if (remainder) for (const part of remainder.split(PARAM_SEPARATOR)) params.push(part || "-1");
134
148
  return {
135
149
  type: CODE_TYPES.DCS,
136
150
  pos: introducer.pos,
@@ -148,41 +162,11 @@ function parseDCS(introducer, dataTokens, final) {
148
162
  };
149
163
  }
150
164
 
151
- //#endregion
152
- //#region src/parsers/dec.ts
153
- function parseDEC(introducer, dataTokens, final) {
154
- const data = dataTokens.map((t) => t.raw).join("");
155
- const raw = introducer.raw + data + final.raw;
156
- let i = 0;
157
- let paramsRaw = "";
158
- while (i < data.length && data.charCodeAt(i) >= 48 && data.charCodeAt(i) <= 63) {
159
- paramsRaw += data[i];
160
- i++;
161
- }
162
- const command = data.slice(i) + final.raw;
163
- const params = [];
164
- if (paramsRaw) {
165
- let current = "";
166
- for (let j = 0; j < paramsRaw.length; j++) if (paramsRaw[j] === ";") {
167
- params.push(current || "-1");
168
- current = "";
169
- } else current += paramsRaw[j];
170
- params.push(current || "-1");
171
- }
172
- return {
173
- type: CODE_TYPES.DEC,
174
- pos: introducer.pos,
175
- raw,
176
- command,
177
- params
178
- };
179
- }
180
-
181
165
  //#endregion
182
166
  //#region src/parsers/esc.ts
183
167
  function parseESC(introducer, dataTokens, final) {
184
168
  const data = dataTokens.map((t) => t.raw).join("");
185
- const command = introducer.intermediate || (dataTokens[0]?.raw ?? final?.raw);
169
+ const command = introducer.intermediate || (dataTokens[0]?.raw ?? final?.raw ?? "");
186
170
  const params = introducer.intermediate ? final?.raw ? [final.raw] : [] : [];
187
171
  const raw = introducer.raw + data + (final?.raw ?? "");
188
172
  return {
@@ -198,7 +182,7 @@ function parseESC(introducer, dataTokens, final) {
198
182
  //#region src/parsers/osc.ts
199
183
  function parseOSC(introducer, dataTokens, final) {
200
184
  const data = dataTokens.map((t) => t.raw).join("");
201
- const raw = introducer.raw + data + final.raw;
185
+ const raw = introducer.raw + data + (final?.raw || "");
202
186
  const semicolonIndex = data.indexOf(";");
203
187
  if (semicolonIndex === -1) return {
204
188
  type: CODE_TYPES.OSC,
@@ -238,7 +222,7 @@ function parseOSC(introducer, dataTokens, final) {
238
222
  //#region src/parsers/apc.ts
239
223
  function parseAPC(introducer, dataTokens, final) {
240
224
  const data = dataTokens.map((t) => t.raw).join("");
241
- const raw = introducer.raw + data + final.raw;
225
+ const raw = introducer.raw + data + (final?.raw || "");
242
226
  return {
243
227
  type: CODE_TYPES.STRING,
244
228
  pos: introducer.pos,
@@ -252,7 +236,7 @@ function parseAPC(introducer, dataTokens, final) {
252
236
  //#region src/parsers/pm.ts
253
237
  function parsePM(introducer, dataTokens, final) {
254
238
  const data = dataTokens.map((t) => t.raw).join("");
255
- const raw = introducer.raw + data + final.raw;
239
+ const raw = introducer.raw + data + (final?.raw || "");
256
240
  return {
257
241
  type: CODE_TYPES.STRING,
258
242
  pos: introducer.pos,
@@ -266,7 +250,7 @@ function parsePM(introducer, dataTokens, final) {
266
250
  //#region src/parsers/sos.ts
267
251
  function parseSOS(introducer, dataTokens, final) {
268
252
  const data = dataTokens.map((t) => t.raw).join("");
269
- const raw = introducer.raw + data + final.raw;
253
+ const raw = introducer.raw + data + (final?.raw || "");
270
254
  return {
271
255
  type: CODE_TYPES.STRING,
272
256
  pos: introducer.pos,
@@ -380,13 +364,14 @@ function* tokenizer(input) {
380
364
  let data = "";
381
365
  if (code === CSI) while (i < input.length) {
382
366
  const char = input[i];
383
- if (INTRODUCERS.has(char)) {
367
+ if (INTERRUPTERS.has(char)) {
384
368
  if (data) yield emit$1({
385
369
  type: TOKEN_TYPES.DATA,
386
370
  pos,
387
371
  raw: data
388
372
  });
389
373
  setState("GROUND");
374
+ if (C0_INTERRUPTERS.has(char)) i++;
390
375
  break;
391
376
  }
392
377
  const charCode = char.charCodeAt(0);
@@ -411,8 +396,10 @@ function* tokenizer(input) {
411
396
  else if (code === ESC) {
412
397
  if (i < input.length) {
413
398
  const char = input[i];
414
- if (INTRODUCERS.has(char)) setState("GROUND");
415
- else {
399
+ if (INTERRUPTERS.has(char)) {
400
+ setState("GROUND");
401
+ if (C0_INTERRUPTERS.has(char)) i++;
402
+ } else {
416
403
  yield emit$1({
417
404
  type: TOKEN_TYPES.FINAL,
418
405
  pos: i,
@@ -443,13 +430,14 @@ function* tokenizer(input) {
443
430
  setState("GROUND");
444
431
  break;
445
432
  }
446
- if (INTRODUCERS.has(char)) {
433
+ if (INTERRUPTERS.has(char)) {
447
434
  if (data) yield emit$1({
448
435
  type: TOKEN_TYPES.DATA,
449
436
  pos,
450
437
  raw: data
451
438
  });
452
439
  setState("GROUND");
440
+ if (C0_INTERRUPTERS.has(char)) i++;
453
441
  break;
454
442
  }
455
443
  data += char;
@@ -493,13 +481,12 @@ function* parser(tokens) {
493
481
  current = tokens.next();
494
482
  break;
495
483
  } else if (nextToken.type === TOKEN_TYPES.INTRODUCER) break;
484
+ else if (nextToken.type === TOKEN_TYPES.TEXT) break;
496
485
  current = tokens.next();
497
486
  }
498
- if (final) switch (introducer.code) {
487
+ switch (introducer.code) {
499
488
  case CSI:
500
- if (data[0]?.raw.startsWith(DEC_OPEN)) yield emit(parseDEC(introducer, data, final));
501
- else if (data[0]?.raw && PRIVATE_OPENERS.has(data[0].raw[0])) yield emit(parsePrivateCSI(introducer, data, final));
502
- else yield emit(parseCSI(introducer, data, final));
489
+ yield emit(parseCSI(introducer, data, final));
503
490
  break;
504
491
  case OSC:
505
492
  yield emit(parseOSC(introducer, data, final));
@@ -524,7 +511,6 @@ function* parser(tokens) {
524
511
  yield emit(parseESC(introducer, data, final));
525
512
  break;
526
513
  }
527
- else if (introducer.code === ESC) yield emit(parseESC(introducer, data, void 0));
528
514
  } else current = tokens.next();
529
515
  }
530
516
  }
@@ -533,4 +519,4 @@ function parse(input) {
533
519
  }
534
520
 
535
521
  //#endregion
536
- export { APC, APC_OPEN, BACKSLASH, BELL, CODE_TYPES, CSI, CSI_OPEN, DCS, DCS_OPEN, DEC_OPEN, ESC, OSC, OSC_OPEN, PM, PM_OPEN, PRIVATE_OPENERS, SOS, SOS_OPEN, ST, STRING_OPENERS, TOKEN_TYPES, parse, parser, tokenize, tokenizer };
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 };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ansi-tools/parser",
3
- "version": "1.0.7",
3
+ "version": "1.0.9",
4
4
  "description": "Tokenize and parse strings containing ANSI escape sequences and control codes",
5
5
  "main": "./dist/index.js",
6
6
  "type": "module",