@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.
- package/dist/constants.d.ts +56 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +55 -0
- package/dist/escaped.d.ts +6 -10
- package/dist/escaped.d.ts.map +1 -0
- package/dist/escaped.js +4 -275
- package/dist/index.d.ts +5 -7
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -3
- package/dist/parse.d.ts +4 -0
- package/dist/parse.d.ts.map +1 -0
- package/dist/parse.escaped.d.ts +3 -0
- package/dist/parse.escaped.d.ts.map +1 -0
- package/dist/parse.escaped.js +5 -0
- package/dist/parse.js +109 -0
- package/dist/parsers/apc.d.ts +3 -0
- package/dist/parsers/apc.d.ts.map +1 -0
- package/dist/parsers/apc.js +6 -0
- package/dist/parsers/csi.d.ts +3 -0
- package/dist/parsers/csi.d.ts.map +1 -0
- package/dist/parsers/csi.js +63 -0
- package/dist/parsers/dcs.d.ts +3 -0
- package/dist/parsers/dcs.d.ts.map +1 -0
- package/dist/parsers/dcs.js +26 -0
- package/dist/parsers/esc.d.ts +3 -0
- package/dist/parsers/esc.d.ts.map +1 -0
- package/dist/parsers/esc.js +8 -0
- package/dist/parsers/osc.d.ts +3 -0
- package/dist/parsers/osc.d.ts.map +1 -0
- package/dist/parsers/osc.js +28 -0
- package/dist/parsers/pm.d.ts +3 -0
- package/dist/parsers/pm.d.ts.map +1 -0
- package/dist/parsers/pm.js +6 -0
- package/dist/parsers/sos.d.ts +3 -0
- package/dist/parsers/sos.d.ts.map +1 -0
- package/dist/parsers/sos.js +6 -0
- package/dist/tokenize.d.ts +4 -0
- package/dist/tokenize.d.ts.map +1 -0
- package/dist/tokenize.escaped.d.ts +4 -0
- package/dist/tokenize.escaped.d.ts.map +1 -0
- package/dist/tokenize.escaped.js +295 -0
- package/dist/tokenize.js +314 -0
- package/dist/types.d.ts +23 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +1 -0
- package/package.json +27 -28
- package/dist/parse-BCjxFvJh.js +0 -530
- package/dist/parse-BzJl6pBN.d.ts +0 -85
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export declare const BELL = 7;
|
|
2
|
+
export declare const BELL_CODE: string;
|
|
3
|
+
export declare const CAN = 24;
|
|
4
|
+
export declare const CAN_CODE: string;
|
|
5
|
+
export declare const SUB = 26;
|
|
6
|
+
export declare const SUB_CODE: string;
|
|
7
|
+
export declare const ESC = 27;
|
|
8
|
+
export declare const ESC_CODE: string;
|
|
9
|
+
export declare const BACKSLASH = 92;
|
|
10
|
+
export declare const BACKSLASH_CODE: string;
|
|
11
|
+
export declare const DCS = 144;
|
|
12
|
+
export declare const DCS_CODE: string;
|
|
13
|
+
export declare const SOS = 152;
|
|
14
|
+
export declare const SOS_CODE: string;
|
|
15
|
+
export declare const CSI = 155;
|
|
16
|
+
export declare const CSI_CODE: string;
|
|
17
|
+
export declare const ST = 156;
|
|
18
|
+
export declare const ST_CODE: string;
|
|
19
|
+
export declare const OSC = 157;
|
|
20
|
+
export declare const OSC_CODE: string;
|
|
21
|
+
export declare const PM = 158;
|
|
22
|
+
export declare const PM_CODE: string;
|
|
23
|
+
export declare const APC = 159;
|
|
24
|
+
export declare const APC_CODE: string;
|
|
25
|
+
export declare const CSI_OPEN: number;
|
|
26
|
+
export declare const CSI_OPEN_CODE: string;
|
|
27
|
+
export declare const OSC_OPEN: number;
|
|
28
|
+
export declare const OSC_OPEN_CODE: string;
|
|
29
|
+
export declare const DEC_OPEN: number;
|
|
30
|
+
export declare const PRIVATE_OPENERS: Set<string>;
|
|
31
|
+
export declare const DCS_OPEN = "P";
|
|
32
|
+
export declare const APC_OPEN = "_";
|
|
33
|
+
export declare const SOS_OPEN = "^";
|
|
34
|
+
export declare const PM_OPEN = "X";
|
|
35
|
+
export declare const STRING_OPENERS: Set<string>;
|
|
36
|
+
export declare const INTERRUPTERS: Set<number>;
|
|
37
|
+
export declare const C0_INTERRUPTERS: Set<number>;
|
|
38
|
+
export declare const PARAM_SEPARATOR: RegExp;
|
|
39
|
+
export declare const TOKEN_TYPES: {
|
|
40
|
+
readonly TEXT: "TEXT";
|
|
41
|
+
readonly INTRODUCER: "INTRODUCER";
|
|
42
|
+
readonly DATA: "DATA";
|
|
43
|
+
readonly FINAL: "FINAL";
|
|
44
|
+
};
|
|
45
|
+
export declare const CODE_TYPES: {
|
|
46
|
+
readonly CSI: "CSI";
|
|
47
|
+
readonly DCS: "DCS";
|
|
48
|
+
readonly DEC: "DEC";
|
|
49
|
+
readonly ESC: "ESC";
|
|
50
|
+
readonly OSC: "OSC";
|
|
51
|
+
readonly PRIVATE: "PRIVATE";
|
|
52
|
+
readonly SGR: "SGR";
|
|
53
|
+
readonly STRING: "STRING";
|
|
54
|
+
readonly TEXT: "TEXT";
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,IAAI,CAAC;AACtB,eAAO,MAAM,SAAS,QAA4B,CAAC;AACnD,eAAO,MAAM,GAAG,KAAK,CAAC;AACtB,eAAO,MAAM,QAAQ,QAA2B,CAAC;AACjD,eAAO,MAAM,GAAG,KAAK,CAAC;AACtB,eAAO,MAAM,QAAQ,QAA2B,CAAC;AACjD,eAAO,MAAM,GAAG,KAAK,CAAC;AACtB,eAAO,MAAM,QAAQ,QAA2B,CAAC;AACjD,eAAO,MAAM,SAAS,KAAK,CAAC;AAC5B,eAAO,MAAM,cAAc,QAAiC,CAAC;AAC7D,eAAO,MAAM,GAAG,MAAM,CAAC;AACvB,eAAO,MAAM,QAAQ,QAA2B,CAAC;AACjD,eAAO,MAAM,GAAG,MAAM,CAAC;AACvB,eAAO,MAAM,QAAQ,QAA2B,CAAC;AACjD,eAAO,MAAM,GAAG,MAAM,CAAC;AACvB,eAAO,MAAM,QAAQ,QAA2B,CAAC;AACjD,eAAO,MAAM,EAAE,MAAM,CAAC;AACtB,eAAO,MAAM,OAAO,QAA0B,CAAC;AAC/C,eAAO,MAAM,GAAG,MAAM,CAAC;AACvB,eAAO,MAAM,QAAQ,QAA2B,CAAC;AACjD,eAAO,MAAM,EAAE,MAAM,CAAC;AACtB,eAAO,MAAM,OAAO,QAA0B,CAAC;AAC/C,eAAO,MAAM,GAAG,MAAM,CAAC;AACvB,eAAO,MAAM,QAAQ,QAA2B,CAAC;AAEjD,eAAO,MAAM,QAAQ,QAAoB,CAAC;AAC1C,eAAO,MAAM,aAAa,QAAgC,CAAC;AAC3D,eAAO,MAAM,QAAQ,QAAoB,CAAC;AAC1C,eAAO,MAAM,aAAa,QAAgC,CAAC;AAC3D,eAAO,MAAM,QAAQ,QAAoB,CAAC;AAC1C,eAAO,MAAM,eAAe,aAA2B,CAAC;AAExD,eAAO,MAAM,QAAQ,MAAM,CAAC;AAC5B,eAAO,MAAM,QAAQ,MAAM,CAAC;AAC5B,eAAO,MAAM,QAAQ,MAAM,CAAC;AAC5B,eAAO,MAAM,OAAO,MAAM,CAAC;AAC3B,eAAO,MAAM,cAAc,aAAmD,CAAC;AAE/E,eAAO,MAAM,YAAY,aAAwD,CAAC;AAClF,eAAO,MAAM,eAAe,aAAsB,CAAC;AAEnD,eAAO,MAAM,eAAe,QAAS,CAAC;AAEtC,eAAO,MAAM,WAAW;;;;;CAKd,CAAC;AAEX,eAAO,MAAM,UAAU;;;;;;;;;;CAUb,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export const BELL = 7;
|
|
2
|
+
export const BELL_CODE = String.fromCharCode(BELL);
|
|
3
|
+
export const CAN = 24;
|
|
4
|
+
export const CAN_CODE = String.fromCharCode(CAN);
|
|
5
|
+
export const SUB = 26;
|
|
6
|
+
export const SUB_CODE = String.fromCharCode(SUB);
|
|
7
|
+
export const ESC = 27;
|
|
8
|
+
export const ESC_CODE = String.fromCharCode(ESC);
|
|
9
|
+
export const BACKSLASH = 92;
|
|
10
|
+
export const BACKSLASH_CODE = String.fromCharCode(BACKSLASH);
|
|
11
|
+
export const DCS = 144;
|
|
12
|
+
export const DCS_CODE = String.fromCharCode(DCS);
|
|
13
|
+
export const SOS = 152;
|
|
14
|
+
export const SOS_CODE = String.fromCharCode(SOS);
|
|
15
|
+
export const CSI = 155;
|
|
16
|
+
export const CSI_CODE = String.fromCharCode(CSI);
|
|
17
|
+
export const ST = 156;
|
|
18
|
+
export const ST_CODE = String.fromCharCode(ST);
|
|
19
|
+
export const OSC = 157;
|
|
20
|
+
export const OSC_CODE = String.fromCharCode(OSC);
|
|
21
|
+
export const PM = 158;
|
|
22
|
+
export const PM_CODE = String.fromCharCode(PM);
|
|
23
|
+
export const APC = 159;
|
|
24
|
+
export const APC_CODE = String.fromCharCode(APC);
|
|
25
|
+
export const CSI_OPEN = "[".charCodeAt(0);
|
|
26
|
+
export const CSI_OPEN_CODE = String.fromCharCode(CSI_OPEN);
|
|
27
|
+
export const OSC_OPEN = "]".charCodeAt(0);
|
|
28
|
+
export const OSC_OPEN_CODE = String.fromCharCode(OSC_OPEN);
|
|
29
|
+
export const DEC_OPEN = "?".charCodeAt(0);
|
|
30
|
+
export const PRIVATE_OPENERS = new Set(["<", "=", ">"]);
|
|
31
|
+
export const DCS_OPEN = "P";
|
|
32
|
+
export const APC_OPEN = "_";
|
|
33
|
+
export const SOS_OPEN = "^";
|
|
34
|
+
export const PM_OPEN = "X";
|
|
35
|
+
export const STRING_OPENERS = new Set([DCS_OPEN, APC_OPEN, SOS_OPEN, PM_OPEN]);
|
|
36
|
+
export const INTERRUPTERS = new Set([CAN, SUB, ESC, CSI, OSC, DCS, APC, PM, SOS]);
|
|
37
|
+
export const C0_INTERRUPTERS = new Set([CAN, SUB]);
|
|
38
|
+
export const PARAM_SEPARATOR = /[;:]/;
|
|
39
|
+
export const TOKEN_TYPES = {
|
|
40
|
+
TEXT: "TEXT",
|
|
41
|
+
INTRODUCER: "INTRODUCER",
|
|
42
|
+
DATA: "DATA",
|
|
43
|
+
FINAL: "FINAL",
|
|
44
|
+
};
|
|
45
|
+
export const CODE_TYPES = {
|
|
46
|
+
CSI: "CSI",
|
|
47
|
+
DCS: "DCS",
|
|
48
|
+
DEC: "DEC",
|
|
49
|
+
ESC: "ESC",
|
|
50
|
+
OSC: "OSC",
|
|
51
|
+
PRIVATE: "PRIVATE",
|
|
52
|
+
SGR: "SGR",
|
|
53
|
+
STRING: "STRING",
|
|
54
|
+
TEXT: "TEXT",
|
|
55
|
+
};
|
package/dist/escaped.d.ts
CHANGED
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
//#
|
|
7
|
-
declare function tokenizer(input: string): IterableIterator<TOKEN>;
|
|
8
|
-
declare function tokenize(input: string): TOKEN[];
|
|
9
|
-
//#endregion
|
|
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 };
|
|
1
|
+
export * from "./constants.ts";
|
|
2
|
+
export { parse } from "./parse.escaped.ts";
|
|
3
|
+
export { parser } from "./parse.ts";
|
|
4
|
+
export { tokenize, tokenizer } from "./tokenize.escaped.ts";
|
|
5
|
+
export type { CODE, CONTROL_CODE, TEXT, TOKEN } from "./types.ts";
|
|
6
|
+
//# sourceMappingURL=escaped.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escaped.d.ts","sourceRoot":"","sources":["../src/escaped.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/escaped.js
CHANGED
|
@@ -1,275 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const CSI_ESCAPED_HEX = "\\x9b";
|
|
6
|
-
const ABANDONED = "ABANDONED";
|
|
7
|
-
const INTRODUCERS = [
|
|
8
|
-
["\\u001b", 6],
|
|
9
|
-
[CSI_ESCAPED, 6],
|
|
10
|
-
[CSI_ESCAPED_HEX, 4],
|
|
11
|
-
["\\x1b", 4],
|
|
12
|
-
["\\033", 4],
|
|
13
|
-
["\\e", 2]
|
|
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
|
-
}
|
|
27
|
-
const INTRODUCER_LOOKUP = /* @__PURE__ */ new Map();
|
|
28
|
-
const INTRODUCER_FIRST_CHAR_CACHE = /* @__PURE__ */ new Map();
|
|
29
|
-
for (const [sequence, len] of INTRODUCERS) {
|
|
30
|
-
const secondChar = sequence[1];
|
|
31
|
-
if (!INTRODUCER_LOOKUP.has(secondChar)) INTRODUCER_LOOKUP.set(secondChar, []);
|
|
32
|
-
INTRODUCER_LOOKUP.get(secondChar)?.push([sequence, len]);
|
|
33
|
-
INTRODUCER_FIRST_CHAR_CACHE.set(sequence, true);
|
|
34
|
-
}
|
|
35
|
-
function emit(token) {
|
|
36
|
-
return token;
|
|
37
|
-
}
|
|
38
|
-
function* tokenizer(input) {
|
|
39
|
-
const l = input.length;
|
|
40
|
-
let i = 0;
|
|
41
|
-
let state = "GROUND";
|
|
42
|
-
let currentCode;
|
|
43
|
-
let backslashIndex = input.indexOf(BACKSLASH_CODE);
|
|
44
|
-
function setState(next, code) {
|
|
45
|
-
state = next;
|
|
46
|
-
currentCode = code;
|
|
47
|
-
}
|
|
48
|
-
while (i < l) if (state === "GROUND") {
|
|
49
|
-
const textStart = i;
|
|
50
|
-
while (i < l) {
|
|
51
|
-
if (backslashIndex === -1) {
|
|
52
|
-
i = l;
|
|
53
|
-
break;
|
|
54
|
-
}
|
|
55
|
-
if (backslashIndex < i) backslashIndex = input.indexOf(BACKSLASH_CODE, i);
|
|
56
|
-
if (backslashIndex === -1) {
|
|
57
|
-
i = l;
|
|
58
|
-
break;
|
|
59
|
-
}
|
|
60
|
-
let isIntroducer = false;
|
|
61
|
-
const candidates = INTRODUCER_LOOKUP.get(input[backslashIndex + 1]);
|
|
62
|
-
if (candidates) for (const [seq, len] of candidates) {
|
|
63
|
-
if (backslashIndex + len > l) continue;
|
|
64
|
-
if (input.startsWith(seq, backslashIndex)) {
|
|
65
|
-
isIntroducer = true;
|
|
66
|
-
break;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
if (isIntroducer) {
|
|
70
|
-
i = backslashIndex;
|
|
71
|
-
break;
|
|
72
|
-
} else i = backslashIndex + 1;
|
|
73
|
-
}
|
|
74
|
-
if (i > textStart) yield emit({
|
|
75
|
-
type: TOKEN_TYPES.TEXT,
|
|
76
|
-
pos: textStart,
|
|
77
|
-
raw: input.substring(textStart, i)
|
|
78
|
-
});
|
|
79
|
-
if (i < l) {
|
|
80
|
-
const candidates = INTRODUCER_LOOKUP.get(input[i + 1]);
|
|
81
|
-
if (candidates) {
|
|
82
|
-
let isMatch = false;
|
|
83
|
-
for (const [seq, len] of candidates) {
|
|
84
|
-
if (i + len > l) continue;
|
|
85
|
-
if (input.startsWith(seq, i)) {
|
|
86
|
-
isMatch = true;
|
|
87
|
-
if (seq === CSI_ESCAPED || seq === CSI_ESCAPED_HEX) {
|
|
88
|
-
yield emit({
|
|
89
|
-
type: TOKEN_TYPES.INTRODUCER,
|
|
90
|
-
pos: i,
|
|
91
|
-
raw: seq,
|
|
92
|
-
code: CSI_CODE
|
|
93
|
-
});
|
|
94
|
-
i += len;
|
|
95
|
-
setState("SEQUENCE", CSI);
|
|
96
|
-
} else {
|
|
97
|
-
const next = input[i + len];
|
|
98
|
-
if (next === CSI_OPEN_CODE) {
|
|
99
|
-
yield emit({
|
|
100
|
-
type: TOKEN_TYPES.INTRODUCER,
|
|
101
|
-
pos: i,
|
|
102
|
-
raw: seq + next,
|
|
103
|
-
code: CSI_CODE
|
|
104
|
-
});
|
|
105
|
-
i += len + 1;
|
|
106
|
-
setState("SEQUENCE", CSI);
|
|
107
|
-
} else if (next === OSC_OPEN_CODE) {
|
|
108
|
-
yield emit({
|
|
109
|
-
type: TOKEN_TYPES.INTRODUCER,
|
|
110
|
-
pos: i,
|
|
111
|
-
raw: seq + next,
|
|
112
|
-
code: OSC_CODE
|
|
113
|
-
});
|
|
114
|
-
i += len + 1;
|
|
115
|
-
setState("SEQUENCE", OSC);
|
|
116
|
-
} else if (STRING_OPENERS.has(next)) {
|
|
117
|
-
yield emit({
|
|
118
|
-
type: TOKEN_TYPES.INTRODUCER,
|
|
119
|
-
pos: i,
|
|
120
|
-
raw: seq + next,
|
|
121
|
-
code: next
|
|
122
|
-
});
|
|
123
|
-
i += len + 1;
|
|
124
|
-
setState("SEQUENCE", next.charCodeAt(0));
|
|
125
|
-
} else if (next) {
|
|
126
|
-
let j = i + len;
|
|
127
|
-
while (j < l && input.charCodeAt(j) >= 32 && input.charCodeAt(j) <= 47) j++;
|
|
128
|
-
if (j < l) {
|
|
129
|
-
const is = input.slice(i + len, j);
|
|
130
|
-
if (is) yield emit({
|
|
131
|
-
type: TOKEN_TYPES.INTRODUCER,
|
|
132
|
-
pos: i,
|
|
133
|
-
raw: seq + is,
|
|
134
|
-
code: ESC_CODE,
|
|
135
|
-
intermediate: is
|
|
136
|
-
});
|
|
137
|
-
else yield emit({
|
|
138
|
-
type: TOKEN_TYPES.INTRODUCER,
|
|
139
|
-
pos: i,
|
|
140
|
-
raw: seq,
|
|
141
|
-
code: ESC_CODE
|
|
142
|
-
});
|
|
143
|
-
i = j;
|
|
144
|
-
setState("SEQUENCE", ESC);
|
|
145
|
-
} else i = j;
|
|
146
|
-
} else i += len;
|
|
147
|
-
}
|
|
148
|
-
break;
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
if (!isMatch) i++;
|
|
152
|
-
} else i++;
|
|
153
|
-
}
|
|
154
|
-
} else if (state === "SEQUENCE") {
|
|
155
|
-
let terminator = "";
|
|
156
|
-
let terminatorPos = -1;
|
|
157
|
-
const pos = i;
|
|
158
|
-
while (!terminator && i < l) {
|
|
159
|
-
if (input.charCodeAt(i) === BACKSLASH) {
|
|
160
|
-
const next = input[i + 1];
|
|
161
|
-
if (next) {
|
|
162
|
-
const interrupters = INTERRUPTER_LOOKUP.get(next);
|
|
163
|
-
if (interrupters) {
|
|
164
|
-
for (const [seq, len] of interrupters) if (i + len <= l) {
|
|
165
|
-
let matched = true;
|
|
166
|
-
for (let k = 0; k < len; k++) if (input[i + k] !== seq[k]) {
|
|
167
|
-
matched = false;
|
|
168
|
-
break;
|
|
169
|
-
}
|
|
170
|
-
if (matched) {
|
|
171
|
-
terminator = ABANDONED;
|
|
172
|
-
terminatorPos = i;
|
|
173
|
-
i += len;
|
|
174
|
-
break;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
if (terminator) break;
|
|
180
|
-
if (currentCode !== CSI && currentCode !== ESC) {
|
|
181
|
-
if (next === "a" && i + 2 <= l) {
|
|
182
|
-
if (currentCode === OSC && input[i + 1] === "a") {
|
|
183
|
-
terminator = "\\a";
|
|
184
|
-
terminatorPos = i;
|
|
185
|
-
i += 2;
|
|
186
|
-
}
|
|
187
|
-
} else if (next === "x") {
|
|
188
|
-
if (i + 4 <= l) {
|
|
189
|
-
const char3 = input[i + 2];
|
|
190
|
-
const char4 = input[i + 3];
|
|
191
|
-
if (char3 === "0" && char4 === "7" && currentCode === OSC) {
|
|
192
|
-
terminator = "\\x07";
|
|
193
|
-
terminatorPos = i;
|
|
194
|
-
i += 4;
|
|
195
|
-
} else if (char3 === "9" && char4 === "c") {
|
|
196
|
-
terminator = "\\x9c";
|
|
197
|
-
terminatorPos = i;
|
|
198
|
-
i += 4;
|
|
199
|
-
} else if (char3 === "1" && char4 === "b" && i + 6 <= l && input.charCodeAt(i + 4) === BACKSLASH && input.charCodeAt(i + 5) === BACKSLASH) {
|
|
200
|
-
terminator = "\\x1b\\\\";
|
|
201
|
-
terminatorPos = i;
|
|
202
|
-
i += 6;
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
} else if (next === "u" && currentCode === OSC && i + 6 <= l) {
|
|
206
|
-
if (input[i + 2] === "0" && input[i + 3] === "0" && input[i + 4] === "0" && input[i + 5] === "7") {
|
|
207
|
-
terminator = "\\u0007";
|
|
208
|
-
terminatorPos = i;
|
|
209
|
-
i += 6;
|
|
210
|
-
}
|
|
211
|
-
} else if (next === "e" && i + 4 <= l) {
|
|
212
|
-
if (input.charCodeAt(i + 2) === BACKSLASH && input.charCodeAt(i + 3) === BACKSLASH) {
|
|
213
|
-
terminator = "\\e\\\\";
|
|
214
|
-
terminatorPos = i;
|
|
215
|
-
i += 4;
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
if (!terminator) {
|
|
220
|
-
if (next) {
|
|
221
|
-
const candidates = INTRODUCER_LOOKUP.get(next);
|
|
222
|
-
if (candidates) for (const [seq, len] of candidates) {
|
|
223
|
-
if (i + len > l) continue;
|
|
224
|
-
let matched = true;
|
|
225
|
-
for (let k = 0; k < len && matched; k += 2) {
|
|
226
|
-
matched = input[i + k] === seq[k];
|
|
227
|
-
if (matched && k + 1 < len) matched = input[i + k + 1] === seq[k + 1];
|
|
228
|
-
}
|
|
229
|
-
if (matched) {
|
|
230
|
-
terminator = ABANDONED;
|
|
231
|
-
terminatorPos = i;
|
|
232
|
-
break;
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
} else if (currentCode === CSI) {
|
|
238
|
-
const charCode = input.charCodeAt(i);
|
|
239
|
-
if (charCode >= 64 && charCode <= 126) {
|
|
240
|
-
terminator = input[i];
|
|
241
|
-
terminatorPos = i;
|
|
242
|
-
i++;
|
|
243
|
-
}
|
|
244
|
-
} else if (currentCode === ESC) {
|
|
245
|
-
terminator = input[i];
|
|
246
|
-
terminatorPos = i;
|
|
247
|
-
i++;
|
|
248
|
-
}
|
|
249
|
-
if (!terminator) i++;
|
|
250
|
-
}
|
|
251
|
-
if (terminatorPos > pos) yield emit({
|
|
252
|
-
type: TOKEN_TYPES.DATA,
|
|
253
|
-
pos,
|
|
254
|
-
raw: input.substring(pos, terminatorPos)
|
|
255
|
-
});
|
|
256
|
-
if (terminator && terminator !== ABANDONED) yield emit({
|
|
257
|
-
type: TOKEN_TYPES.FINAL,
|
|
258
|
-
pos: terminatorPos,
|
|
259
|
-
raw: terminator
|
|
260
|
-
});
|
|
261
|
-
setState("GROUND");
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
function tokenize(input) {
|
|
265
|
-
return Array.from(tokenizer(input));
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
//#endregion
|
|
269
|
-
//#region src/parse.escaped.ts
|
|
270
|
-
function parse(input) {
|
|
271
|
-
return Array.from(parser(tokenizer(input)));
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
//#endregion
|
|
275
|
-
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 };
|
|
1
|
+
export * from "./constants.js";
|
|
2
|
+
export { parse } from "./parse.escaped.js";
|
|
3
|
+
export { parser } from "./parse.js";
|
|
4
|
+
export { tokenize, tokenizer } from "./tokenize.escaped.js";
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
//#endregion
|
|
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 };
|
|
1
|
+
export * from "./constants.ts";
|
|
2
|
+
export { parse, parser } from "./parse.ts";
|
|
3
|
+
export { tokenize, tokenizer } from "./tokenize.ts";
|
|
4
|
+
export type { CODE, CONTROL_CODE, TEXT, TOKEN } from "./types.ts";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACpD,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export {
|
|
1
|
+
export * from "./constants.js";
|
|
2
|
+
export { parse, parser } from "./parse.js";
|
|
3
|
+
export { tokenize, tokenizer } from "./tokenize.js";
|
package/dist/parse.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAiB,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAsC/E;AA2BD,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,CA2C3C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.escaped.d.ts","sourceRoot":"","sources":["../src/parse.escaped.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,CAE3C"}
|
package/dist/parse.js
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { APC_CODE, APC_OPEN, CODE_TYPES, CSI_CODE, DCS_CODE, DCS_OPEN, ESC_CODE, OSC_CODE, PM_CODE, PM_OPEN, SOS_CODE, SOS_OPEN, TOKEN_TYPES, } from "./constants.js";
|
|
2
|
+
import { parseAPC } from "./parsers/apc.js";
|
|
3
|
+
import { parseCSI } from "./parsers/csi.js";
|
|
4
|
+
import { parseDCS } from "./parsers/dcs.js";
|
|
5
|
+
import { parseESC } from "./parsers/esc.js";
|
|
6
|
+
import { parseOSC } from "./parsers/osc.js";
|
|
7
|
+
import { parsePM } from "./parsers/pm.js";
|
|
8
|
+
import { parseSOS } from "./parsers/sos.js";
|
|
9
|
+
import { tokenize } from "./tokenize.js";
|
|
10
|
+
export function* parser(tokens) {
|
|
11
|
+
let current = tokens.next();
|
|
12
|
+
while (!current.done) {
|
|
13
|
+
const token = current.value;
|
|
14
|
+
if (token.type === TOKEN_TYPES.TEXT) {
|
|
15
|
+
yield { type: CODE_TYPES.TEXT, pos: token.pos, raw: token.raw };
|
|
16
|
+
current = tokens.next();
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
if (token.type === TOKEN_TYPES.INTRODUCER) {
|
|
20
|
+
const introducer = token;
|
|
21
|
+
const data = [];
|
|
22
|
+
let final;
|
|
23
|
+
current = tokens.next();
|
|
24
|
+
while (!current.done) {
|
|
25
|
+
const nextToken = current.value;
|
|
26
|
+
if (nextToken.type === TOKEN_TYPES.DATA) {
|
|
27
|
+
data.push(nextToken);
|
|
28
|
+
}
|
|
29
|
+
else if (nextToken.type === TOKEN_TYPES.FINAL) {
|
|
30
|
+
final = nextToken;
|
|
31
|
+
current = tokens.next();
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
current = tokens.next();
|
|
38
|
+
}
|
|
39
|
+
yield emitCode(introducer, data, final);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
current = tokens.next();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function emitCode(introducer, data, final) {
|
|
47
|
+
switch (introducer.code) {
|
|
48
|
+
case CSI_CODE:
|
|
49
|
+
return parseCSI(introducer, data, final);
|
|
50
|
+
case OSC_CODE:
|
|
51
|
+
return parseOSC(introducer, data, final);
|
|
52
|
+
case DCS_CODE:
|
|
53
|
+
case DCS_OPEN:
|
|
54
|
+
return parseDCS(introducer, data, final);
|
|
55
|
+
case APC_CODE:
|
|
56
|
+
case APC_OPEN:
|
|
57
|
+
return parseAPC(introducer, data, final);
|
|
58
|
+
case PM_CODE:
|
|
59
|
+
case PM_OPEN:
|
|
60
|
+
return parsePM(introducer, data, final);
|
|
61
|
+
case SOS_CODE:
|
|
62
|
+
case SOS_OPEN:
|
|
63
|
+
return parseSOS(introducer, data, final);
|
|
64
|
+
case ESC_CODE:
|
|
65
|
+
return parseESC(introducer, data, final);
|
|
66
|
+
default:
|
|
67
|
+
return { type: CODE_TYPES.TEXT, pos: introducer.pos, raw: introducer.raw };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export function parse(input) {
|
|
71
|
+
const tokens = tokenize(input);
|
|
72
|
+
const result = [];
|
|
73
|
+
let ti = 0;
|
|
74
|
+
const tlen = tokens.length;
|
|
75
|
+
while (ti < tlen) {
|
|
76
|
+
const token = tokens[ti];
|
|
77
|
+
if (token.type === TOKEN_TYPES.TEXT) {
|
|
78
|
+
result.push({ type: CODE_TYPES.TEXT, pos: token.pos, raw: token.raw });
|
|
79
|
+
ti++;
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (token.type === TOKEN_TYPES.INTRODUCER) {
|
|
83
|
+
const introducer = token;
|
|
84
|
+
const data = [];
|
|
85
|
+
let final;
|
|
86
|
+
ti++;
|
|
87
|
+
while (ti < tlen) {
|
|
88
|
+
const nextToken = tokens[ti];
|
|
89
|
+
if (nextToken.type === TOKEN_TYPES.DATA) {
|
|
90
|
+
data.push(nextToken);
|
|
91
|
+
}
|
|
92
|
+
else if (nextToken.type === TOKEN_TYPES.FINAL) {
|
|
93
|
+
final = nextToken;
|
|
94
|
+
ti++;
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
ti++;
|
|
101
|
+
}
|
|
102
|
+
result.push(emitCode(introducer, data, final));
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
ti++;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return result;
|
|
109
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apc.d.ts","sourceRoot":"","sources":["../../src/parsers/apc.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 parseAPC(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: "APC", params: data ? [data] : [] };
|
|
6
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csi.d.ts","sourceRoot":"","sources":["../../src/parsers/csi.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAqB,KAAK,EAAE,MAAM,aAAa,CAAC;AAElE,wBAAgB,QAAQ,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,GAAG,SAAS,GAAG,IAAI,CAsE/F"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { CODE_TYPES, PRIVATE_OPENERS } from "../constants.js";
|
|
2
|
+
export function parseCSI(introducer, dataTokens, final) {
|
|
3
|
+
const data = dataTokens.length === 1 ? dataTokens[0].raw : dataTokens.length === 0 ? "" : dataTokens.map(t => t.raw).join("");
|
|
4
|
+
const finalRaw = final?.raw ?? "";
|
|
5
|
+
const raw = introducer.raw + data + finalRaw;
|
|
6
|
+
const params = [];
|
|
7
|
+
let type = CODE_TYPES.CSI;
|
|
8
|
+
let paramEnd = 0;
|
|
9
|
+
if (data) {
|
|
10
|
+
while (paramEnd < data.length) {
|
|
11
|
+
const charCode = data.charCodeAt(paramEnd);
|
|
12
|
+
if (charCode < 0x30 || charCode > 0x3f)
|
|
13
|
+
break;
|
|
14
|
+
paramEnd++;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
const paramSection = paramEnd > 0 ? data.substring(0, paramEnd) : "";
|
|
18
|
+
const intermediates = paramEnd < data.length ? data.substring(paramEnd) : "";
|
|
19
|
+
if (paramSection) {
|
|
20
|
+
let start = 0;
|
|
21
|
+
for (let i = 0; i <= paramSection.length; i++) {
|
|
22
|
+
if (i === paramSection.length || paramSection.charCodeAt(i) === 0x3b || paramSection.charCodeAt(i) === 0x3a) {
|
|
23
|
+
params.push(i > start ? paramSection.substring(start, i) : "0");
|
|
24
|
+
start = i + 1;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const command = intermediates + finalRaw;
|
|
29
|
+
const first = params[0];
|
|
30
|
+
if (first !== undefined && first.charCodeAt(0) === 0x3f) {
|
|
31
|
+
type = CODE_TYPES.DEC;
|
|
32
|
+
if (first.length > 1)
|
|
33
|
+
params[0] = first.substring(1);
|
|
34
|
+
else
|
|
35
|
+
params.shift();
|
|
36
|
+
return { type, pos: introducer.pos, raw, command, params };
|
|
37
|
+
}
|
|
38
|
+
for (const param of params) {
|
|
39
|
+
if (param.length > 0 && PRIVATE_OPENERS.has(param[0])) {
|
|
40
|
+
type = CODE_TYPES.PRIVATE;
|
|
41
|
+
const privateCommand = param[0] + command;
|
|
42
|
+
for (let i = 0; i < params.length; i++) {
|
|
43
|
+
if (params[i].length > 0 && PRIVATE_OPENERS.has(params[i][0])) {
|
|
44
|
+
if (params[i].length > 1) {
|
|
45
|
+
params[i] = params[i].substring(1);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
params.splice(i, 1);
|
|
49
|
+
}
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return { type, pos: introducer.pos, raw, command: privateCommand, params };
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (command === "m" && params.length === 5 && params[1] === "2" && (first === "38" || first === "48")) {
|
|
57
|
+
params.splice(2, 0, "0");
|
|
58
|
+
}
|
|
59
|
+
if (command === "r" && params.length === 2 && params[1] === "0") {
|
|
60
|
+
params[1] = "-1";
|
|
61
|
+
}
|
|
62
|
+
return { type, pos: introducer.pos, raw, command, params };
|
|
63
|
+
}
|