@ansi-tools/parser 1.0.12 → 1.0.13

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.
Files changed (48) hide show
  1. package/dist/constants.d.ts +56 -0
  2. package/dist/constants.d.ts.map +1 -0
  3. package/dist/constants.js +55 -0
  4. package/dist/escaped.d.ts +6 -10
  5. package/dist/escaped.d.ts.map +1 -0
  6. package/dist/escaped.js +4 -275
  7. package/dist/index.d.ts +5 -7
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +3 -3
  10. package/dist/parse.d.ts +4 -0
  11. package/dist/parse.d.ts.map +1 -0
  12. package/dist/parse.escaped.d.ts +3 -0
  13. package/dist/parse.escaped.d.ts.map +1 -0
  14. package/dist/parse.escaped.js +5 -0
  15. package/dist/parse.js +109 -0
  16. package/dist/parsers/apc.d.ts +3 -0
  17. package/dist/parsers/apc.d.ts.map +1 -0
  18. package/dist/parsers/apc.js +6 -0
  19. package/dist/parsers/csi.d.ts +3 -0
  20. package/dist/parsers/csi.d.ts.map +1 -0
  21. package/dist/parsers/csi.js +63 -0
  22. package/dist/parsers/dcs.d.ts +3 -0
  23. package/dist/parsers/dcs.d.ts.map +1 -0
  24. package/dist/parsers/dcs.js +26 -0
  25. package/dist/parsers/esc.d.ts +3 -0
  26. package/dist/parsers/esc.d.ts.map +1 -0
  27. package/dist/parsers/esc.js +8 -0
  28. package/dist/parsers/osc.d.ts +3 -0
  29. package/dist/parsers/osc.d.ts.map +1 -0
  30. package/dist/parsers/osc.js +28 -0
  31. package/dist/parsers/pm.d.ts +3 -0
  32. package/dist/parsers/pm.d.ts.map +1 -0
  33. package/dist/parsers/pm.js +6 -0
  34. package/dist/parsers/sos.d.ts +3 -0
  35. package/dist/parsers/sos.d.ts.map +1 -0
  36. package/dist/parsers/sos.js +6 -0
  37. package/dist/tokenize.d.ts +4 -0
  38. package/dist/tokenize.d.ts.map +1 -0
  39. package/dist/tokenize.escaped.d.ts +4 -0
  40. package/dist/tokenize.escaped.d.ts.map +1 -0
  41. package/dist/tokenize.escaped.js +295 -0
  42. package/dist/tokenize.js +314 -0
  43. package/dist/types.d.ts +23 -0
  44. package/dist/types.d.ts.map +1 -0
  45. package/dist/types.js +1 -0
  46. package/package.json +27 -28
  47. package/dist/parse-BCjxFvJh.js +0 -530
  48. package/dist/parse-BzJl6pBN.d.ts +0 -85
@@ -0,0 +1,3 @@
1
+ import type { CODE, TOKEN } from "../types.ts";
2
+ export declare function parseDCS(introducer: TOKEN, dataTokens: TOKEN[], final: TOKEN | undefined): CODE;
3
+ //# sourceMappingURL=dcs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dcs.d.ts","sourceRoot":"","sources":["../../src/parsers/dcs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAU/C,wBAAgB,QAAQ,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,GAAG,SAAS,GAAG,IAAI,CAiB/F"}
@@ -0,0 +1,26 @@
1
+ import { CODE_TYPES, PARAM_SEPARATOR } from "../constants.js";
2
+ const DCS_PATTERNS = new Map([
3
+ ["$q", 2],
4
+ ["+q", 2],
5
+ ["+p", 2],
6
+ ["|", 1],
7
+ ["{", 1],
8
+ ]);
9
+ export function parseDCS(introducer, dataTokens, final) {
10
+ const data = dataTokens.map(t => t.raw).join("");
11
+ const raw = introducer.raw + data + (final?.raw ?? "");
12
+ if (!data)
13
+ return { type: CODE_TYPES.DCS, pos: introducer.pos, raw, command: "", params: [] };
14
+ for (const [pattern, length] of DCS_PATTERNS) {
15
+ if (data.startsWith(pattern)) {
16
+ const remainder = data.slice(length);
17
+ const params = [];
18
+ if (remainder) {
19
+ for (const part of remainder.split(PARAM_SEPARATOR))
20
+ params.push(part || "-1");
21
+ }
22
+ return { type: CODE_TYPES.DCS, pos: introducer.pos, raw, command: pattern, params };
23
+ }
24
+ }
25
+ return { type: CODE_TYPES.DCS, pos: introducer.pos, raw, command: "", params: [data] };
26
+ }
@@ -0,0 +1,3 @@
1
+ import type { CODE, TOKEN } from "../types.ts";
2
+ export declare function parseESC(introducer: TOKEN, dataTokens: TOKEN[], final?: TOKEN): CODE;
3
+ //# sourceMappingURL=esc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"esc.d.ts","sourceRoot":"","sources":["../../src/parsers/esc.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAE/C,wBAAgB,QAAQ,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAMpF"}
@@ -0,0 +1,8 @@
1
+ import { CODE_TYPES } from "../constants.js";
2
+ export function parseESC(introducer, dataTokens, final) {
3
+ const data = dataTokens.map(t => t.raw).join("");
4
+ const command = introducer.intermediate || (dataTokens[0]?.raw ?? final?.raw ?? "");
5
+ const params = introducer.intermediate ? (final?.raw ? [final.raw] : []) : [];
6
+ const raw = introducer.raw + data + (final?.raw ?? "");
7
+ return { type: CODE_TYPES.ESC, pos: introducer.pos, raw, command, params };
8
+ }
@@ -0,0 +1,3 @@
1
+ import type { CODE, TOKEN } from "../types.ts";
2
+ export declare function parseOSC(introducer: TOKEN, dataTokens: TOKEN[], final: TOKEN | undefined): CODE;
3
+ //# sourceMappingURL=osc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"osc.d.ts","sourceRoot":"","sources":["../../src/parsers/osc.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAE/C,wBAAgB,QAAQ,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,GAAG,SAAS,GAAG,IAAI,CA2B/F"}
@@ -0,0 +1,28 @@
1
+ import { CODE_TYPES } from "../constants.js";
2
+ export function parseOSC(introducer, dataTokens, final) {
3
+ const data = dataTokens.map(t => t.raw).join("");
4
+ const raw = introducer.raw + data + (final?.raw || "");
5
+ const semicolonIndex = data.indexOf(";");
6
+ if (semicolonIndex === -1) {
7
+ return { type: CODE_TYPES.OSC, pos: introducer.pos, raw, command: data, params: [] };
8
+ }
9
+ const command = data.slice(0, semicolonIndex);
10
+ const remainder = data.slice(semicolonIndex + 1);
11
+ if (command === "1337")
12
+ return { type: CODE_TYPES.OSC, pos: introducer.pos, raw, command, params: [remainder] };
13
+ const params = [];
14
+ if (remainder) {
15
+ let current = "";
16
+ for (let i = 0; i < remainder.length; i++) {
17
+ if (remainder[i] === ";") {
18
+ params.push(current);
19
+ current = "";
20
+ }
21
+ else {
22
+ current += remainder[i];
23
+ }
24
+ }
25
+ params.push(current);
26
+ }
27
+ return { type: CODE_TYPES.OSC, pos: introducer.pos, raw, command, params };
28
+ }
@@ -0,0 +1,3 @@
1
+ import type { CODE, TOKEN } from "../types.ts";
2
+ export declare function parsePM(introducer: TOKEN, dataTokens: TOKEN[], final: TOKEN | undefined): CODE;
3
+ //# sourceMappingURL=pm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pm.d.ts","sourceRoot":"","sources":["../../src/parsers/pm.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAE/C,wBAAgB,OAAO,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,GAAG,SAAS,GAAG,IAAI,CAI9F"}
@@ -0,0 +1,6 @@
1
+ import { CODE_TYPES } from "../constants.js";
2
+ export function parsePM(introducer, dataTokens, final) {
3
+ const data = dataTokens.map((t) => t.raw).join("");
4
+ const raw = introducer.raw + data + (final?.raw || "");
5
+ return { type: CODE_TYPES.STRING, pos: introducer.pos, raw, command: "PM", params: data ? [data] : [] };
6
+ }
@@ -0,0 +1,3 @@
1
+ import type { CODE, TOKEN } from "../types.ts";
2
+ export declare function parseSOS(introducer: TOKEN, dataTokens: TOKEN[], final: TOKEN | undefined): CODE;
3
+ //# sourceMappingURL=sos.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sos.d.ts","sourceRoot":"","sources":["../../src/parsers/sos.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAE/C,wBAAgB,QAAQ,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,GAAG,SAAS,GAAG,IAAI,CAI/F"}
@@ -0,0 +1,6 @@
1
+ import { CODE_TYPES } from "../constants.js";
2
+ export function parseSOS(introducer, dataTokens, final) {
3
+ const data = dataTokens.map((t) => t.raw).join("");
4
+ const raw = introducer.raw + data + (final?.raw || "");
5
+ return { type: CODE_TYPES.STRING, pos: introducer.pos, raw, command: "SOS", params: data ? [data] : [] };
6
+ }
@@ -0,0 +1,4 @@
1
+ import type { TOKEN } from "./types.ts";
2
+ export declare function tokenizer(input: string): IterableIterator<TOKEN>;
3
+ export declare function tokenize(input: string): TOKEN[];
4
+ //# sourceMappingURL=tokenize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenize.d.ts","sourceRoot":"","sources":["../src/tokenize.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAoBxC,wBAAiB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAsIjE;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,CA8I/C"}
@@ -0,0 +1,4 @@
1
+ import type { TOKEN } from "./types.ts";
2
+ export declare function tokenizer(input: string): IterableIterator<TOKEN>;
3
+ export declare function tokenize(input: string): TOKEN[];
4
+ //# sourceMappingURL=tokenize.escaped.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenize.escaped.d.ts","sourceRoot":"","sources":["../src/tokenize.escaped.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAgDxC,wBAAiB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAsPjE;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,CAE/C"}
@@ -0,0 +1,295 @@
1
+ import { BACKSLASH, BACKSLASH_CODE, CSI, CSI_CODE, CSI_OPEN_CODE, ESC, ESC_CODE, OSC, OSC_CODE, OSC_OPEN_CODE, STRING_OPENERS, TOKEN_TYPES, } from "./constants.js";
2
+ const debug = false;
3
+ const CSI_ESCAPED = "\\u009b";
4
+ const CSI_ESCAPED_HEX = "\\x9b";
5
+ const ABANDONED = "ABANDONED";
6
+ const INTRODUCERS = [
7
+ ["\\u001b", 6],
8
+ [CSI_ESCAPED, 6],
9
+ [CSI_ESCAPED_HEX, 4],
10
+ ["\\x1b", 4],
11
+ ["\\033", 4],
12
+ ["\\e", 2],
13
+ ];
14
+ const INTERRUPTERS_ESCAPED = [
15
+ ["\\x18", 4],
16
+ ["\\x1a", 4],
17
+ ["\\u0018", 6],
18
+ ["\\u001a", 6],
19
+ ];
20
+ const INTERRUPTER_LOOKUP = new Map();
21
+ for (const [sequence, len] of INTERRUPTERS_ESCAPED) {
22
+ const secondChar = sequence[1];
23
+ if (!INTERRUPTER_LOOKUP.has(secondChar))
24
+ INTERRUPTER_LOOKUP.set(secondChar, []);
25
+ INTERRUPTER_LOOKUP.get(secondChar)?.push([sequence, len]);
26
+ }
27
+ const INTRODUCER_LOOKUP = new Map();
28
+ const INTRODUCER_FIRST_CHAR_CACHE = new Map();
29
+ for (const [sequence, len] of INTRODUCERS) {
30
+ const secondChar = sequence[1];
31
+ if (!INTRODUCER_LOOKUP.has(secondChar))
32
+ INTRODUCER_LOOKUP.set(secondChar, []);
33
+ INTRODUCER_LOOKUP.get(secondChar)?.push([sequence, len]);
34
+ INTRODUCER_FIRST_CHAR_CACHE.set(sequence, true);
35
+ }
36
+ function emit(token) {
37
+ if (debug)
38
+ console.log("token", token);
39
+ return token;
40
+ }
41
+ export function* tokenizer(input) {
42
+ const l = input.length;
43
+ let i = 0;
44
+ let state = "GROUND";
45
+ let currentCode;
46
+ let backslashIndex = input.indexOf(BACKSLASH_CODE);
47
+ function setState(next, code) {
48
+ if (debug)
49
+ console.log(`state ${state} → ${next}`);
50
+ state = next;
51
+ currentCode = code;
52
+ }
53
+ while (i < l) {
54
+ if (state === "GROUND") {
55
+ const textStart = i;
56
+ while (i < l) {
57
+ if (backslashIndex === -1) {
58
+ i = l;
59
+ break;
60
+ }
61
+ if (backslashIndex < i) {
62
+ backslashIndex = input.indexOf(BACKSLASH_CODE, i);
63
+ }
64
+ if (backslashIndex === -1) {
65
+ i = l;
66
+ break;
67
+ }
68
+ let isIntroducer = false;
69
+ const candidates = INTRODUCER_LOOKUP.get(input[backslashIndex + 1]);
70
+ if (candidates) {
71
+ for (const [seq, len] of candidates) {
72
+ if (backslashIndex + len > l)
73
+ continue;
74
+ const matched = input.startsWith(seq, backslashIndex);
75
+ if (matched) {
76
+ isIntroducer = true;
77
+ break;
78
+ }
79
+ }
80
+ }
81
+ if (isIntroducer) {
82
+ i = backslashIndex;
83
+ break;
84
+ }
85
+ else {
86
+ i = backslashIndex + 1;
87
+ }
88
+ }
89
+ if (i > textStart) {
90
+ yield emit({ type: TOKEN_TYPES.TEXT, pos: textStart, raw: input.substring(textStart, i) });
91
+ }
92
+ if (i < l) {
93
+ const candidates = INTRODUCER_LOOKUP.get(input[i + 1]);
94
+ if (candidates) {
95
+ let isMatch = false;
96
+ for (const [seq, len] of candidates) {
97
+ if (i + len > l)
98
+ continue;
99
+ const isSeqMatch = input.startsWith(seq, i);
100
+ if (isSeqMatch) {
101
+ isMatch = true;
102
+ if (seq === CSI_ESCAPED || seq === CSI_ESCAPED_HEX) {
103
+ yield emit({ type: TOKEN_TYPES.INTRODUCER, pos: i, raw: seq, code: CSI_CODE });
104
+ i += len;
105
+ setState("SEQUENCE", CSI);
106
+ }
107
+ else {
108
+ const next = input[i + len];
109
+ if (next === CSI_OPEN_CODE) {
110
+ yield emit({ type: TOKEN_TYPES.INTRODUCER, pos: i, raw: seq + next, code: CSI_CODE });
111
+ i += len + 1;
112
+ setState("SEQUENCE", CSI);
113
+ }
114
+ else if (next === OSC_OPEN_CODE) {
115
+ yield emit({ type: TOKEN_TYPES.INTRODUCER, pos: i, raw: seq + next, code: OSC_CODE });
116
+ i += len + 1;
117
+ setState("SEQUENCE", OSC);
118
+ }
119
+ else if (STRING_OPENERS.has(next)) {
120
+ yield emit({ type: TOKEN_TYPES.INTRODUCER, pos: i, raw: seq + next, code: next });
121
+ i += len + 1;
122
+ setState("SEQUENCE", next.charCodeAt(0));
123
+ }
124
+ else if (next) {
125
+ let j = i + len;
126
+ while (j < l && input.charCodeAt(j) >= 0x20 && input.charCodeAt(j) <= 0x2f)
127
+ j++;
128
+ if (j < l) {
129
+ const is = input.slice(i + len, j);
130
+ if (is)
131
+ yield emit({
132
+ type: TOKEN_TYPES.INTRODUCER,
133
+ pos: i,
134
+ raw: seq + is,
135
+ code: ESC_CODE,
136
+ intermediate: is,
137
+ });
138
+ else
139
+ yield emit({ type: TOKEN_TYPES.INTRODUCER, pos: i, raw: seq, code: ESC_CODE });
140
+ i = j;
141
+ setState("SEQUENCE", ESC);
142
+ }
143
+ else {
144
+ i = j;
145
+ }
146
+ }
147
+ else {
148
+ i += len;
149
+ }
150
+ }
151
+ break;
152
+ }
153
+ }
154
+ if (!isMatch) {
155
+ i++;
156
+ }
157
+ }
158
+ else {
159
+ i++;
160
+ }
161
+ }
162
+ }
163
+ else if (state === "SEQUENCE") {
164
+ let terminator = "";
165
+ let terminatorPos = -1;
166
+ const pos = i;
167
+ while (!terminator && i < l) {
168
+ if (input.charCodeAt(i) === BACKSLASH) {
169
+ const next = input[i + 1];
170
+ if (next) {
171
+ const interrupters = INTERRUPTER_LOOKUP.get(next);
172
+ if (interrupters) {
173
+ for (const [seq, len] of interrupters) {
174
+ if (i + len <= l) {
175
+ let matched = true;
176
+ for (let k = 0; k < len; k++) {
177
+ if (input[i + k] !== seq[k]) {
178
+ matched = false;
179
+ break;
180
+ }
181
+ }
182
+ if (matched) {
183
+ terminator = ABANDONED;
184
+ terminatorPos = i;
185
+ i += len;
186
+ break;
187
+ }
188
+ }
189
+ }
190
+ }
191
+ }
192
+ if (terminator)
193
+ break;
194
+ if (currentCode !== CSI && currentCode !== ESC) {
195
+ if (next === "a" && i + 2 <= l) {
196
+ if (currentCode === OSC && input[i + 1] === "a") {
197
+ terminator = "\\a";
198
+ terminatorPos = i;
199
+ i += 2;
200
+ }
201
+ }
202
+ else if (next === "x") {
203
+ if (i + 4 <= l) {
204
+ const char3 = input[i + 2];
205
+ const char4 = input[i + 3];
206
+ if (char3 === "0" && char4 === "7" && currentCode === OSC) {
207
+ terminator = "\\x07";
208
+ terminatorPos = i;
209
+ i += 4;
210
+ }
211
+ else if (char3 === "9" && char4 === "c") {
212
+ terminator = "\\x9c";
213
+ terminatorPos = i;
214
+ i += 4;
215
+ }
216
+ else if (char3 === "1" &&
217
+ char4 === "b" &&
218
+ i + 6 <= l &&
219
+ input.charCodeAt(i + 4) === BACKSLASH &&
220
+ input.charCodeAt(i + 5) === BACKSLASH) {
221
+ terminator = "\\x1b\\\\";
222
+ terminatorPos = i;
223
+ i += 6;
224
+ }
225
+ }
226
+ }
227
+ else if (next === "u" && currentCode === OSC && i + 6 <= l) {
228
+ if (input[i + 2] === "0" && input[i + 3] === "0" && input[i + 4] === "0" && input[i + 5] === "7") {
229
+ terminator = "\\u0007";
230
+ terminatorPos = i;
231
+ i += 6;
232
+ }
233
+ }
234
+ else if (next === "e" && i + 4 <= l) {
235
+ if (input.charCodeAt(i + 2) === BACKSLASH && input.charCodeAt(i + 3) === BACKSLASH) {
236
+ terminator = "\\e\\\\";
237
+ terminatorPos = i;
238
+ i += 4;
239
+ }
240
+ }
241
+ }
242
+ if (!terminator) {
243
+ if (next) {
244
+ const candidates = INTRODUCER_LOOKUP.get(next);
245
+ if (candidates) {
246
+ for (const [seq, len] of candidates) {
247
+ if (i + len > l)
248
+ continue;
249
+ let matched = true;
250
+ for (let k = 0; k < len && matched; k += 2) {
251
+ matched = input[i + k] === seq[k];
252
+ if (matched && k + 1 < len) {
253
+ matched = input[i + k + 1] === seq[k + 1];
254
+ }
255
+ }
256
+ if (matched) {
257
+ terminator = ABANDONED;
258
+ terminatorPos = i;
259
+ break;
260
+ }
261
+ }
262
+ }
263
+ }
264
+ }
265
+ }
266
+ else if (currentCode === CSI) {
267
+ const charCode = input.charCodeAt(i);
268
+ if (charCode >= 0x40 && charCode <= 0x7e) {
269
+ terminator = input[i];
270
+ terminatorPos = i;
271
+ i++;
272
+ }
273
+ }
274
+ else if (currentCode === ESC) {
275
+ terminator = input[i];
276
+ terminatorPos = i;
277
+ i++;
278
+ }
279
+ if (!terminator) {
280
+ i++;
281
+ }
282
+ }
283
+ if (terminatorPos > pos) {
284
+ yield emit({ type: TOKEN_TYPES.DATA, pos, raw: input.substring(pos, terminatorPos) });
285
+ }
286
+ if (terminator && terminator !== ABANDONED) {
287
+ yield emit({ type: TOKEN_TYPES.FINAL, pos: terminatorPos, raw: terminator });
288
+ }
289
+ setState("GROUND");
290
+ }
291
+ }
292
+ }
293
+ export function tokenize(input) {
294
+ return Array.from(tokenizer(input));
295
+ }