@orz/ui-hex 0.0.0-stage → 0.1.0
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/LICENSE +29 -0
- package/README.md +536 -2
- package/dist/column-fit.d.ts +16 -0
- package/dist/column-fit.d.ts.map +1 -0
- package/dist/column-fit.js +22 -0
- package/dist/column-fit.js.map +1 -0
- package/dist/decode.d.ts +11 -0
- package/dist/decode.d.ts.map +1 -0
- package/dist/decode.js +63 -0
- package/dist/decode.js.map +1 -0
- package/dist/document.d.ts +75 -0
- package/dist/document.d.ts.map +1 -0
- package/dist/document.js +523 -0
- package/dist/document.js.map +1 -0
- package/dist/editing.d.ts +66 -0
- package/dist/editing.d.ts.map +1 -0
- package/dist/editing.js +202 -0
- package/dist/editing.js.map +1 -0
- package/dist/encoding-picker.d.ts +6 -0
- package/dist/encoding-picker.d.ts.map +1 -0
- package/dist/encoding-picker.js +84 -0
- package/dist/encoding-picker.js.map +1 -0
- package/dist/encodings.d.ts +19 -0
- package/dist/encodings.d.ts.map +1 -0
- package/dist/encodings.js +106 -0
- package/dist/encodings.js.map +1 -0
- package/dist/format.d.ts +29 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +73 -0
- package/dist/format.js.map +1 -0
- package/dist/hex-editor.d.ts +27 -0
- package/dist/hex-editor.d.ts.map +1 -0
- package/dist/hex-editor.js +270 -0
- package/dist/hex-editor.js.map +1 -0
- package/dist/hex-grid.d.ts +102 -0
- package/dist/hex-grid.d.ts.map +1 -0
- package/dist/hex-grid.js +860 -0
- package/dist/hex-grid.js.map +1 -0
- package/dist/hex-inspector.d.ts +12 -0
- package/dist/hex-inspector.d.ts.map +1 -0
- package/dist/hex-inspector.js +68 -0
- package/dist/hex-inspector.js.map +1 -0
- package/dist/hex-paste.d.ts +26 -0
- package/dist/hex-paste.d.ts.map +1 -0
- package/dist/hex-paste.js +42 -0
- package/dist/hex-paste.js.map +1 -0
- package/dist/hex-view.d.ts +4 -0
- package/dist/hex-view.d.ts.map +1 -0
- package/dist/hex-view.js +6 -0
- package/dist/hex-view.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/navigation.d.ts +25 -0
- package/dist/navigation.d.ts.map +1 -0
- package/dist/navigation.js +100 -0
- package/dist/navigation.js.map +1 -0
- package/dist/page-cache.d.ts +45 -0
- package/dist/page-cache.d.ts.map +1 -0
- package/dist/page-cache.js +334 -0
- package/dist/page-cache.js.map +1 -0
- package/dist/source.d.ts +22 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +31 -0
- package/dist/source.js.map +1 -0
- package/dist/text-decoding-multibyte.d.ts +17 -0
- package/dist/text-decoding-multibyte.d.ts.map +1 -0
- package/dist/text-decoding-multibyte.js +448 -0
- package/dist/text-decoding-multibyte.js.map +1 -0
- package/dist/text-decoding.d.ts +45 -0
- package/dist/text-decoding.d.ts.map +1 -0
- package/dist/text-decoding.js +106 -0
- package/dist/text-decoding.js.map +1 -0
- package/dist/types.d.ts +15 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/use-hex-document-state.d.ts +10 -0
- package/dist/use-hex-document-state.d.ts.map +1 -0
- package/dist/use-hex-document-state.js +22 -0
- package/dist/use-hex-document-state.js.map +1 -0
- package/package.json +53 -3
- package/styles.css +456 -0
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
import { classify, hasLoneSurrogate, } from "./text-decoding.js";
|
|
2
|
+
/**
|
|
3
|
+
* Test instrumentation, not exported from the package: `decodes` counts
|
|
4
|
+
* `TextDecoder` calls, `overruns` counts candidates that ran past a window end
|
|
5
|
+
* that still had its full lookahead, which the lookahead rules make impossible.
|
|
6
|
+
*/
|
|
7
|
+
export const multibyteProbe = { decodes: 0, overruns: 0 };
|
|
8
|
+
const CACHE_LIMIT = 4096;
|
|
9
|
+
function fatalDecoder(label) {
|
|
10
|
+
return new TextDecoder(label, {
|
|
11
|
+
fatal: true,
|
|
12
|
+
// A UTF BOM is a character to show, not a mark to strip. The other
|
|
13
|
+
// decoders never strip one, and Node 22 drops a lone FF from some of
|
|
14
|
+
// them under ignoreBOM.
|
|
15
|
+
ignoreBOM: label.startsWith("utf-"),
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
/** `bytes` big-endian, times 8, plus the length: unique for up to 4 bytes, and exact in a double. */
|
|
19
|
+
function pack(window, i, length) {
|
|
20
|
+
let key = 0;
|
|
21
|
+
for (let k = 0; k < length; k++)
|
|
22
|
+
key = key * 256 + window[i + k];
|
|
23
|
+
return key * 8 + length;
|
|
24
|
+
}
|
|
25
|
+
function unpack(packed, out) {
|
|
26
|
+
const length = packed % 8;
|
|
27
|
+
const bytes = Math.floor(packed / 8);
|
|
28
|
+
for (let k = length - 1; k >= 0; k--) {
|
|
29
|
+
out.push(Math.floor(bytes / 256 ** k) % 256);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function asciiCells(controlCodes) {
|
|
33
|
+
const cells = [];
|
|
34
|
+
for (let byte = 0; byte < 0x80; byte++) {
|
|
35
|
+
cells[byte] = {
|
|
36
|
+
...classify(String.fromCharCode(byte), controlCodes),
|
|
37
|
+
length: 1,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
return cells;
|
|
41
|
+
}
|
|
42
|
+
const ASCII = {
|
|
43
|
+
abbreviations: asciiCells("abbreviations"),
|
|
44
|
+
dots: asciiCells("dots"),
|
|
45
|
+
};
|
|
46
|
+
function decodeWith(decoder, bytes) {
|
|
47
|
+
multibyteProbe.decodes++;
|
|
48
|
+
try {
|
|
49
|
+
return decoder.decode(bytes);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Node's ICU euc-kr lacks the UHC extension, and instead of throwing on a lead
|
|
57
|
+
* it does not know, passes it through as a C1 control followed by the trail.
|
|
58
|
+
* Taken as one glyph, that would swallow the trail byte.
|
|
59
|
+
*/
|
|
60
|
+
function passedThrough(text) {
|
|
61
|
+
const first = text.codePointAt(0);
|
|
62
|
+
return first >= 0x80 && first <= 0x9f && text.length > 1;
|
|
63
|
+
}
|
|
64
|
+
function multiByte(rule, encode, prepareEncode) {
|
|
65
|
+
// One cache per mode, so the key stays the bytes alone.
|
|
66
|
+
const caches = { abbreviations: new Map(), dots: new Map() };
|
|
67
|
+
function cachedDecode(controlCodes) {
|
|
68
|
+
const cache = caches[controlCodes];
|
|
69
|
+
return (window, i, length) => {
|
|
70
|
+
const key = pack(window, i, length);
|
|
71
|
+
let cell = cache.get(key);
|
|
72
|
+
if (!cell) {
|
|
73
|
+
const text = decodeWith(rule.decoder, window.subarray(i, i + length));
|
|
74
|
+
cell =
|
|
75
|
+
text === null || passedThrough(text)
|
|
76
|
+
? { kind: "dot", length: rule.failLength }
|
|
77
|
+
: { ...classify(text, controlCodes), length };
|
|
78
|
+
if (cache.size >= CACHE_LIMIT)
|
|
79
|
+
cache.clear();
|
|
80
|
+
cache.set(key, cell);
|
|
81
|
+
}
|
|
82
|
+
return cell;
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
lookbehind: rule.lookbehind,
|
|
87
|
+
lookahead: rule.lookahead,
|
|
88
|
+
decodeRow(window, row, controlCodes) {
|
|
89
|
+
return decodeSequences(window, row, rule, cachedDecode(controlCodes), ASCII[controlCodes]);
|
|
90
|
+
},
|
|
91
|
+
encode,
|
|
92
|
+
...(prepareEncode ? { prepareEncode } : {}),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function decodeSequences(window, row, rule, decode, ascii) {
|
|
96
|
+
const out = new Array(row.length);
|
|
97
|
+
if (row.length === 0)
|
|
98
|
+
return out;
|
|
99
|
+
const end = row.before + row.length;
|
|
100
|
+
// A window cut short of its lookahead ends at the source end.
|
|
101
|
+
const atSourceEnd = window.length - end < rule.lookahead;
|
|
102
|
+
const base = row.start - row.before;
|
|
103
|
+
let i = rule.resync(window, row, decode);
|
|
104
|
+
while (i < end) {
|
|
105
|
+
const byte = window[i];
|
|
106
|
+
let cell;
|
|
107
|
+
if (rule.asciiFastPath && byte < 0x80) {
|
|
108
|
+
cell = ascii[byte];
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
const length = rule.lengthAt(window, i);
|
|
112
|
+
if (i + length > window.length) {
|
|
113
|
+
if (!atSourceEnd)
|
|
114
|
+
multibyteProbe.overruns++;
|
|
115
|
+
cell = {
|
|
116
|
+
kind: "dot",
|
|
117
|
+
length: Math.min(rule.failLength, window.length - i),
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
cell = decode(window, i, length);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const length = cell.length;
|
|
125
|
+
for (let k = 0; k < length; k++) {
|
|
126
|
+
const j = i + k - row.before;
|
|
127
|
+
if (j < 0 || j >= row.length)
|
|
128
|
+
continue;
|
|
129
|
+
out[j] = k === 0 ? cell : { kind: "continuation", lead: base + i };
|
|
130
|
+
}
|
|
131
|
+
i += length;
|
|
132
|
+
}
|
|
133
|
+
return out;
|
|
134
|
+
}
|
|
135
|
+
// --- UTF-8 ----------------------------------------------------------------
|
|
136
|
+
function utf8Length(byte) {
|
|
137
|
+
if (byte >= 0xc2 && byte <= 0xdf)
|
|
138
|
+
return 2;
|
|
139
|
+
if (byte >= 0xe0 && byte <= 0xef)
|
|
140
|
+
return 3;
|
|
141
|
+
if (byte >= 0xf0 && byte <= 0xf4)
|
|
142
|
+
return 4;
|
|
143
|
+
return 1;
|
|
144
|
+
}
|
|
145
|
+
const isUtf8Continuation = (byte) => (byte & 0xc0) === 0x80;
|
|
146
|
+
const UTF8_RULE = {
|
|
147
|
+
lookbehind: 3,
|
|
148
|
+
lookahead: 3,
|
|
149
|
+
decoder: fatalDecoder("utf-8"),
|
|
150
|
+
failLength: 1,
|
|
151
|
+
asciiFastPath: true,
|
|
152
|
+
resync(window, { before }, decode) {
|
|
153
|
+
if (!isUtf8Continuation(window[before]))
|
|
154
|
+
return before;
|
|
155
|
+
for (let j = before - 1; j >= 0 && j >= before - 3; j--) {
|
|
156
|
+
const byte = window[j];
|
|
157
|
+
if (isUtf8Continuation(byte))
|
|
158
|
+
continue;
|
|
159
|
+
const length = utf8Length(byte);
|
|
160
|
+
// Only a lead whose sequence is valid owns the continuations; an
|
|
161
|
+
// invalid one decays to a dot and leaves them as dots too.
|
|
162
|
+
if (j + length > before &&
|
|
163
|
+
j + length <= window.length &&
|
|
164
|
+
decode(window, j, length).length === length) {
|
|
165
|
+
return j;
|
|
166
|
+
}
|
|
167
|
+
return before;
|
|
168
|
+
}
|
|
169
|
+
return before;
|
|
170
|
+
},
|
|
171
|
+
lengthAt: (window, i) => utf8Length(window[i]),
|
|
172
|
+
};
|
|
173
|
+
const utf8Encoder = new TextEncoder();
|
|
174
|
+
export const utf8Decoding = multiByte(UTF8_RULE, (text) =>
|
|
175
|
+
// TextEncoder writes EF BF BD for a lone surrogate instead of failing.
|
|
176
|
+
hasLoneSurrogate(text) ? null : utf8Encoder.encode(text));
|
|
177
|
+
// --- UTF-16 ---------------------------------------------------------------
|
|
178
|
+
const isHigh = (unit) => unit >= 0xd800 && unit <= 0xdbff;
|
|
179
|
+
const isLow = (unit) => unit >= 0xdc00 && unit <= 0xdfff;
|
|
180
|
+
export function utf16Decoding(littleEndian) {
|
|
181
|
+
const unitAt = (window, i) => littleEndian
|
|
182
|
+
? window[i] | (window[i + 1] << 8)
|
|
183
|
+
: (window[i] << 8) | window[i + 1];
|
|
184
|
+
const rule = {
|
|
185
|
+
lookbehind: 3,
|
|
186
|
+
lookahead: 3,
|
|
187
|
+
decoder: fatalDecoder(littleEndian ? "utf-16le" : "utf-16be"),
|
|
188
|
+
failLength: 2,
|
|
189
|
+
asciiFastPath: false,
|
|
190
|
+
resync(window, { start, before }) {
|
|
191
|
+
let i = start % 2 === 1 ? Math.max(0, before - 1) : before;
|
|
192
|
+
if (i >= 2 &&
|
|
193
|
+
i + 2 <= window.length &&
|
|
194
|
+
isLow(unitAt(window, i)) &&
|
|
195
|
+
isHigh(unitAt(window, i - 2))) {
|
|
196
|
+
i -= 2;
|
|
197
|
+
}
|
|
198
|
+
return i;
|
|
199
|
+
},
|
|
200
|
+
lengthAt(window, i) {
|
|
201
|
+
if (i + 4 <= window.length &&
|
|
202
|
+
isHigh(unitAt(window, i)) &&
|
|
203
|
+
isLow(unitAt(window, i + 2))) {
|
|
204
|
+
return 4;
|
|
205
|
+
}
|
|
206
|
+
return 2;
|
|
207
|
+
},
|
|
208
|
+
};
|
|
209
|
+
return multiByte(rule, (text) => {
|
|
210
|
+
if (hasLoneSurrogate(text))
|
|
211
|
+
return null;
|
|
212
|
+
const out = new Uint8Array(text.length * 2);
|
|
213
|
+
for (let i = 0; i < text.length; i++) {
|
|
214
|
+
const unit = text.charCodeAt(i);
|
|
215
|
+
out[2 * i + (littleEndian ? 0 : 1)] = unit & 0xff;
|
|
216
|
+
out[2 * i + (littleEndian ? 1 : 0)] = unit >> 8;
|
|
217
|
+
}
|
|
218
|
+
return out;
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
// --- East Asian -----------------------------------------------------------
|
|
222
|
+
const inRange = (byte, from, to) => byte >= from && byte <= to;
|
|
223
|
+
const SHIFT_JIS_LEAD = (byte) => inRange(byte, 0x81, 0x9f) || inRange(byte, 0xe0, 0xfc);
|
|
224
|
+
const packBytes = (bytes) => pack(bytes, 0, bytes.length);
|
|
225
|
+
/** The encoder steps both Japanese encoders share, after the decoded grid. */
|
|
226
|
+
function japaneseExceptions(map) {
|
|
227
|
+
map.set(0xa5, packBytes([0x5c]));
|
|
228
|
+
map.set(0x203e, packBytes([0x7e]));
|
|
229
|
+
const minus = map.get(0xff0d);
|
|
230
|
+
if (minus === undefined)
|
|
231
|
+
map.delete(0x2212);
|
|
232
|
+
else
|
|
233
|
+
map.set(0x2212, minus);
|
|
234
|
+
}
|
|
235
|
+
// gb18030 encoder's side table: Private Use code points GB18030-2022 moved
|
|
236
|
+
// off these sequences, which still encode to them.
|
|
237
|
+
const GB18030_PUA = [
|
|
238
|
+
[0xe78d, 0xa6, 0xd9],
|
|
239
|
+
[0xe78e, 0xa6, 0xda],
|
|
240
|
+
[0xe78f, 0xa6, 0xdb],
|
|
241
|
+
[0xe790, 0xa6, 0xdc],
|
|
242
|
+
[0xe791, 0xa6, 0xdd],
|
|
243
|
+
[0xe792, 0xa6, 0xde],
|
|
244
|
+
[0xe793, 0xa6, 0xdf],
|
|
245
|
+
[0xe794, 0xa6, 0xec],
|
|
246
|
+
[0xe795, 0xa6, 0xed],
|
|
247
|
+
[0xe796, 0xa6, 0xf3],
|
|
248
|
+
[0xe81e, 0xfe, 0x59],
|
|
249
|
+
[0xe826, 0xfe, 0x61],
|
|
250
|
+
[0xe82b, 0xfe, 0x66],
|
|
251
|
+
[0xe82c, 0xfe, 0x67],
|
|
252
|
+
[0xe832, 0xfe, 0x6d],
|
|
253
|
+
[0xe843, 0xfe, 0x7e],
|
|
254
|
+
[0xe854, 0xfe, 0x90],
|
|
255
|
+
[0xe864, 0xfe, 0xa0],
|
|
256
|
+
];
|
|
257
|
+
/** Code points from U+10000 up sit linearly from 90 30 81 30. */
|
|
258
|
+
function gb18030Supplementary(code, out) {
|
|
259
|
+
const i = code - 0x10000;
|
|
260
|
+
out.push(0x90 + Math.floor(i / 12600), 0x30 + (Math.floor(i / 1260) % 10), 0x81 + (Math.floor(i / 10) % 126), 0x30 + (i % 10));
|
|
261
|
+
}
|
|
262
|
+
function twoByteGrid(add, leads, trailFrom) {
|
|
263
|
+
for (let lead = 0x81; lead <= 0xfe; lead++) {
|
|
264
|
+
if (!leads(lead))
|
|
265
|
+
continue;
|
|
266
|
+
for (let trail = trailFrom; trail <= 0xfe; trail++)
|
|
267
|
+
add([lead, trail]);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
// The reverse maps follow the encoder sections of the Encoding Standard,
|
|
271
|
+
// Living Standard last updated 19 October 2026: 10.2.2 gb18030, 11.1.2 Big5,
|
|
272
|
+
// 12.1.2 EUC-JP, 12.3.2 Shift_JIS and 13.1.2 EUC-KR, with section 5's index
|
|
273
|
+
// Shift_JIS pointer and index Big5 pointer. Enumerating the decoder in
|
|
274
|
+
// pointer order and keeping the first hit is the standard's index pointer;
|
|
275
|
+
// each exception below is one of those sections' steps.
|
|
276
|
+
const FAMILIES = {
|
|
277
|
+
shift_jis: {
|
|
278
|
+
lookahead: 1,
|
|
279
|
+
syncBelow: 0x40,
|
|
280
|
+
lengthAt: (window, i) => (SHIFT_JIS_LEAD(window[i]) ? 2 : 1),
|
|
281
|
+
buildReverse(add) {
|
|
282
|
+
// The single bytes 80 and A1-DF are encoder steps, set afterwards.
|
|
283
|
+
// Leads ED-EF are pointers 8272-8835, the NEC-selected IBM extensions,
|
|
284
|
+
// which index Shift_JIS pointer leaves out so the IBM copies at FA-FC
|
|
285
|
+
// win. Leads F0-F9 are the EUDC range, which decodes to Private Use but
|
|
286
|
+
// is in no index, so it has no encoding.
|
|
287
|
+
twoByteGrid(add, (lead) => SHIFT_JIS_LEAD(lead) &&
|
|
288
|
+
!inRange(lead, 0xed, 0xef) &&
|
|
289
|
+
!inRange(lead, 0xf0, 0xf9), 0x40);
|
|
290
|
+
},
|
|
291
|
+
},
|
|
292
|
+
"euc-jp": {
|
|
293
|
+
lookahead: 3,
|
|
294
|
+
syncBelow: 0x80,
|
|
295
|
+
lengthAt(window, i) {
|
|
296
|
+
const byte = window[i];
|
|
297
|
+
if (byte === 0x8f)
|
|
298
|
+
return 3;
|
|
299
|
+
return byte === 0x8e || inRange(byte, 0xa1, 0xfe) ? 2 : 1;
|
|
300
|
+
},
|
|
301
|
+
buildReverse(add) {
|
|
302
|
+
for (let trail = 0xa1; trail <= 0xdf; trail++)
|
|
303
|
+
add([0x8e, trail]);
|
|
304
|
+
// The 8F (JIS X 0212) form is decode-only.
|
|
305
|
+
twoByteGrid(add, (lead) => lead >= 0xa1, 0xa1);
|
|
306
|
+
},
|
|
307
|
+
},
|
|
308
|
+
gb18030: {
|
|
309
|
+
lookahead: 3,
|
|
310
|
+
syncBelow: 0x30,
|
|
311
|
+
lengthAt(window, i) {
|
|
312
|
+
const byte = window[i];
|
|
313
|
+
if (!inRange(byte, 0x81, 0xfe))
|
|
314
|
+
return 1;
|
|
315
|
+
return inRange(window[i + 1] ?? 0, 0x30, 0x39) ? 4 : 2;
|
|
316
|
+
},
|
|
317
|
+
buildReverse(add) {
|
|
318
|
+
// No single 80: with is GBK false, € takes its index pointer, A2 E3.
|
|
319
|
+
twoByteGrid(add, () => true, 0x40);
|
|
320
|
+
// The ranges pointer comes after the index pointer, so the BMP's
|
|
321
|
+
// four-byte forms only fill in what the two-byte index lacks.
|
|
322
|
+
for (let pointer = 0; pointer <= 39419; pointer++) {
|
|
323
|
+
add([
|
|
324
|
+
0x81 + Math.floor(pointer / 12600),
|
|
325
|
+
0x30 + (Math.floor(pointer / 1260) % 10),
|
|
326
|
+
0x81 + (Math.floor(pointer / 10) % 126),
|
|
327
|
+
0x30 + (pointer % 10),
|
|
328
|
+
]);
|
|
329
|
+
}
|
|
330
|
+
},
|
|
331
|
+
},
|
|
332
|
+
big5: {
|
|
333
|
+
lookahead: 1,
|
|
334
|
+
syncBelow: 0x40,
|
|
335
|
+
lengthAt: (window, i) => (inRange(window[i], 0x81, 0xfe) ? 2 : 1),
|
|
336
|
+
buildReverse(add) {
|
|
337
|
+
// Leads 81-A0 are the HKSCS extensions, which index Big5 pointer skips.
|
|
338
|
+
twoByteGrid(add, (lead) => lead >= 0xa1, 0x40);
|
|
339
|
+
},
|
|
340
|
+
},
|
|
341
|
+
"euc-kr": {
|
|
342
|
+
lookahead: 1,
|
|
343
|
+
syncBelow: 0x41,
|
|
344
|
+
lengthAt: (window, i) => (inRange(window[i], 0x81, 0xfe) ? 2 : 1),
|
|
345
|
+
buildReverse(add) {
|
|
346
|
+
twoByteGrid(add, () => true, 0x41);
|
|
347
|
+
},
|
|
348
|
+
},
|
|
349
|
+
};
|
|
350
|
+
// index Big5 pointer takes the last pointer for these.
|
|
351
|
+
const BIG5_LAST = new Set([0x2550, 0x255e, 0x2561, 0x256a, 0x5341, 0x5345]);
|
|
352
|
+
function applyExceptions(id, map) {
|
|
353
|
+
switch (id) {
|
|
354
|
+
case "shift_jis":
|
|
355
|
+
map.set(0x80, packBytes([0x80]));
|
|
356
|
+
for (let code = 0xff61; code <= 0xff9f; code++) {
|
|
357
|
+
map.set(code, packBytes([code - 0xff61 + 0xa1]));
|
|
358
|
+
}
|
|
359
|
+
japaneseExceptions(map);
|
|
360
|
+
break;
|
|
361
|
+
case "euc-jp":
|
|
362
|
+
for (let code = 0xff61; code <= 0xff9f; code++) {
|
|
363
|
+
map.set(code, packBytes([0x8e, code - 0xff61 + 0xa1]));
|
|
364
|
+
}
|
|
365
|
+
japaneseExceptions(map);
|
|
366
|
+
break;
|
|
367
|
+
case "gb18030":
|
|
368
|
+
// A3 A0 decodes to U+3000 for deployed content, so U+E5E5 cannot round-trip.
|
|
369
|
+
map.delete(0xe5e5);
|
|
370
|
+
for (const [code, lead, trail] of GB18030_PUA) {
|
|
371
|
+
map.set(code, packBytes([lead, trail]));
|
|
372
|
+
}
|
|
373
|
+
break;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
const reverseMaps = new WeakMap();
|
|
377
|
+
/** Test access to an East Asian decoding's reverse map, building it if needed. */
|
|
378
|
+
export function reverseMapOf(decoding) {
|
|
379
|
+
return reverseMaps.get(decoding)?.();
|
|
380
|
+
}
|
|
381
|
+
export function eastAsianDecoding(id) {
|
|
382
|
+
const family = FAMILIES[id];
|
|
383
|
+
const decoder = fatalDecoder(id);
|
|
384
|
+
const rule = {
|
|
385
|
+
lookbehind: 64,
|
|
386
|
+
lookahead: family.lookahead,
|
|
387
|
+
decoder,
|
|
388
|
+
failLength: 1,
|
|
389
|
+
asciiFastPath: true,
|
|
390
|
+
resync(window, { before }) {
|
|
391
|
+
for (let j = before - 1; j >= 0; j--) {
|
|
392
|
+
if (window[j] < family.syncBelow)
|
|
393
|
+
return j + 1;
|
|
394
|
+
}
|
|
395
|
+
// Best effort: with no sync byte in reach, rows may disagree on a
|
|
396
|
+
// glyph that straddles them.
|
|
397
|
+
return 0;
|
|
398
|
+
},
|
|
399
|
+
lengthAt: family.lengthAt,
|
|
400
|
+
};
|
|
401
|
+
let reverse;
|
|
402
|
+
const build = () => {
|
|
403
|
+
if (reverse)
|
|
404
|
+
return reverse;
|
|
405
|
+
const map = new Map();
|
|
406
|
+
family.buildReverse((bytes) => {
|
|
407
|
+
const text = decodeWith(decoder, Uint8Array.from(bytes));
|
|
408
|
+
if (text === null)
|
|
409
|
+
return;
|
|
410
|
+
const code = text.codePointAt(0);
|
|
411
|
+
// The Big5 pairs with a combining mark have no single code point to map.
|
|
412
|
+
if (text.length !== (code > 0xffff ? 2 : 1))
|
|
413
|
+
return;
|
|
414
|
+
const lastWins = id === "big5" && BIG5_LAST.has(code);
|
|
415
|
+
if (lastWins || !map.has(code))
|
|
416
|
+
map.set(code, packBytes(bytes));
|
|
417
|
+
});
|
|
418
|
+
applyExceptions(id, map);
|
|
419
|
+
reverse = map;
|
|
420
|
+
return map;
|
|
421
|
+
};
|
|
422
|
+
const decoding = multiByte(rule, (text) => {
|
|
423
|
+
if (hasLoneSurrogate(text))
|
|
424
|
+
return null;
|
|
425
|
+
const map = build();
|
|
426
|
+
const out = [];
|
|
427
|
+
for (const char of text) {
|
|
428
|
+
const code = char.codePointAt(0);
|
|
429
|
+
if (code < 0x80) {
|
|
430
|
+
out.push(code);
|
|
431
|
+
continue;
|
|
432
|
+
}
|
|
433
|
+
const packed = map.get(code);
|
|
434
|
+
if (packed !== undefined)
|
|
435
|
+
unpack(packed, out);
|
|
436
|
+
else if (id === "gb18030" && code >= 0x10000)
|
|
437
|
+
gb18030Supplementary(code, out);
|
|
438
|
+
else
|
|
439
|
+
return null;
|
|
440
|
+
}
|
|
441
|
+
return Uint8Array.from(out);
|
|
442
|
+
}, () => {
|
|
443
|
+
build();
|
|
444
|
+
});
|
|
445
|
+
reverseMaps.set(decoding, build);
|
|
446
|
+
return decoding;
|
|
447
|
+
}
|
|
448
|
+
//# sourceMappingURL=text-decoding-multibyte.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-decoding-multibyte.js","sourceRoot":"","sources":["../src/text-decoding-multibyte.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { ControlCodes } from "./types.ts";
|
|
2
|
+
export interface TextCell {
|
|
3
|
+
kind: "char" | "control" | "dot" | "continuation";
|
|
4
|
+
text?: string;
|
|
5
|
+
/** On a glyph's first byte: how many bytes the glyph covers, possibly running past the row end. */
|
|
6
|
+
length?: number;
|
|
7
|
+
/** On a continuation: the absolute offset of the glyph's first byte, possibly on an earlier row. */
|
|
8
|
+
lead?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface TextRow {
|
|
11
|
+
/** The source offset of the row's first byte. */
|
|
12
|
+
start: number;
|
|
13
|
+
/** How many window bytes come before the row. */
|
|
14
|
+
before: number;
|
|
15
|
+
/** How many bytes the row has. */
|
|
16
|
+
length: number;
|
|
17
|
+
}
|
|
18
|
+
export interface TextDecoding {
|
|
19
|
+
/** Bytes before the row start needed to resynchronise; 0 for single-byte encodings. */
|
|
20
|
+
lookbehind: number;
|
|
21
|
+
/** Bytes after the row end needed to finish a glyph that starts on the row; 0 for single-byte. */
|
|
22
|
+
lookahead: number;
|
|
23
|
+
/**
|
|
24
|
+
* `window` is up to `lookbehind` bytes, then the row's `length` bytes, then
|
|
25
|
+
* up to `lookahead` bytes; fewer at either end of the source. Returns
|
|
26
|
+
* exactly `row.length` cells, one per row byte.
|
|
27
|
+
*/
|
|
28
|
+
decodeRow(window: Uint8Array, row: TextRow, controlCodes: ControlCodes): TextCell[];
|
|
29
|
+
/** The bytes an editor writes for typed or pasted text; `null` when any character has none. */
|
|
30
|
+
encode?(text: string): Uint8Array | null;
|
|
31
|
+
/** Builds whatever `encode` needs ahead of the first call; a no-op where nothing is built. */
|
|
32
|
+
prepareEncode?(): void;
|
|
33
|
+
}
|
|
34
|
+
export declare function controlName(code: number): string | undefined;
|
|
35
|
+
/** The cell a decoded character shows as; `length` is the caller's. */
|
|
36
|
+
export declare function classify(text: string, controlCodes: ControlCodes): TextCell;
|
|
37
|
+
/** How many text cells a glyph is drawn across, without measuring it; never fewer than one. */
|
|
38
|
+
export declare function glyphCells(text: string): number;
|
|
39
|
+
/** `TextEncoder` and the code-unit encoders would otherwise write a lone surrogate silently. */
|
|
40
|
+
export declare function hasLoneSurrogate(text: string): boolean;
|
|
41
|
+
export declare const asciiDecoding: TextDecoding;
|
|
42
|
+
export declare const latin1Decoding: TextDecoding;
|
|
43
|
+
/** A single-byte encoding `TextDecoder` knows, built from one decode per byte on first use. */
|
|
44
|
+
export declare function tableDecoding(label: string): TextDecoding;
|
|
45
|
+
//# sourceMappingURL=text-decoding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-decoding.d.ts","sourceRoot":"","sources":["../src/text-decoding.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,cAAc,CAAC;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mGAAmG;IACnG,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oGAAoG;IACpG,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,OAAO;IACtB,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,uFAAuF;IACvF,UAAU,EAAE,MAAM,CAAC;IACnB,kGAAkG;IAClG,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,SAAS,CACP,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,OAAO,EACZ,YAAY,EAAE,YAAY,GACzB,QAAQ,EAAE,CAAC;IACd,+FAA+F;IAC/F,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC;IACzC,8FAA8F;IAC9F,aAAa,CAAC,IAAI,IAAI,CAAC;CACxB;AAOD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG5D;AAOD,uEAAuE;AACvE,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,GAAG,QAAQ,CAS3E;AAED,+FAA+F;AAC/F,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAID,gGAAgG;AAChG,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtD;AAyDD,eAAO,MAAM,aAAa,EAAE,YAO3B,CAAC;AAGF,eAAO,MAAM,cAAc,EAAE,YAG5B,CAAC;AAEF,+FAA+F;AAC/F,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CA0BzD"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { cellWidth } from "@orz/ui/lib/cell-width";
|
|
2
|
+
const CONTROL_NAMES = "NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US".split(" ");
|
|
3
|
+
export function controlName(code) {
|
|
4
|
+
if (code < 0x20)
|
|
5
|
+
return CONTROL_NAMES[code];
|
|
6
|
+
return code === 0x7f ? "DT" : undefined;
|
|
7
|
+
}
|
|
8
|
+
// C1, format characters, combining marks (which would merge into the previous
|
|
9
|
+
// cell's glyph), separators, private use, unassigned, lone surrogates, U+FFFD.
|
|
10
|
+
const NO_GLYPH = /^[\p{Cc}\p{Cf}\p{Mn}\p{Me}\p{Zl}\p{Zp}\p{Co}\p{Cn}\p{Cs}\u{FFFD}]/u;
|
|
11
|
+
/** The cell a decoded character shows as; `length` is the caller's. */
|
|
12
|
+
export function classify(text, controlCodes) {
|
|
13
|
+
const code = text.codePointAt(0) ?? 0xfffd;
|
|
14
|
+
if (code < 0x20 || code === 0x7f) {
|
|
15
|
+
return controlCodes === "abbreviations"
|
|
16
|
+
? { kind: "control", text: controlName(code) }
|
|
17
|
+
: { kind: "dot" };
|
|
18
|
+
}
|
|
19
|
+
if (NO_GLYPH.test(text))
|
|
20
|
+
return { kind: "dot" };
|
|
21
|
+
return { kind: "char", text };
|
|
22
|
+
}
|
|
23
|
+
/** How many text cells a glyph is drawn across, without measuring it; never fewer than one. */
|
|
24
|
+
export function glyphCells(text) {
|
|
25
|
+
return Math.max(1, cellWidth(text.codePointAt(0) ?? 0));
|
|
26
|
+
}
|
|
27
|
+
const LONE_SURROGATE = /\p{Cs}/u;
|
|
28
|
+
/** `TextEncoder` and the code-unit encoders would otherwise write a lone surrogate silently. */
|
|
29
|
+
export function hasLoneSurrogate(text) {
|
|
30
|
+
return LONE_SURROGATE.test(text);
|
|
31
|
+
}
|
|
32
|
+
function cellTables(decode) {
|
|
33
|
+
const abbreviations = [];
|
|
34
|
+
const dots = [];
|
|
35
|
+
for (let byte = 0; byte < 256; byte++) {
|
|
36
|
+
const text = decode(byte);
|
|
37
|
+
abbreviations[byte] = { ...classify(text, "abbreviations"), length: 1 };
|
|
38
|
+
dots[byte] = { ...classify(text, "dots"), length: 1 };
|
|
39
|
+
}
|
|
40
|
+
return [abbreviations, dots];
|
|
41
|
+
}
|
|
42
|
+
function singleByte(tables, encode) {
|
|
43
|
+
return {
|
|
44
|
+
lookbehind: 0,
|
|
45
|
+
lookahead: 0,
|
|
46
|
+
decodeRow(window, row, controlCodes) {
|
|
47
|
+
const cells = tables()[controlCodes === "dots" ? 1 : 0];
|
|
48
|
+
const out = new Array(row.length);
|
|
49
|
+
for (let i = 0; i < row.length; i++) {
|
|
50
|
+
out[i] = cells[window[row.before + i]];
|
|
51
|
+
}
|
|
52
|
+
return out;
|
|
53
|
+
},
|
|
54
|
+
encode,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function lazy(build) {
|
|
58
|
+
let value;
|
|
59
|
+
return () => {
|
|
60
|
+
value ??= build();
|
|
61
|
+
return value;
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function encodeBelow(limit) {
|
|
65
|
+
return (text) => {
|
|
66
|
+
const out = [];
|
|
67
|
+
for (const char of text) {
|
|
68
|
+
const code = char.codePointAt(0);
|
|
69
|
+
if (code >= limit)
|
|
70
|
+
return null;
|
|
71
|
+
out.push(code);
|
|
72
|
+
}
|
|
73
|
+
return Uint8Array.from(out);
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
export const asciiDecoding = singleByte(lazy(() => cellTables((byte) => byte < 0x80 ? String.fromCharCode(byte) : "\u{FFFD}")), encodeBelow(0x80));
|
|
77
|
+
// Computed: TextDecoder("iso-8859-1") is Windows-1252 under the Encoding Standard.
|
|
78
|
+
export const latin1Decoding = singleByte(lazy(() => cellTables((byte) => String.fromCharCode(byte))), encodeBelow(0x100));
|
|
79
|
+
/** A single-byte encoding `TextDecoder` knows, built from one decode per byte on first use. */
|
|
80
|
+
export function tableDecoding(label) {
|
|
81
|
+
const built = lazy(() => {
|
|
82
|
+
const decoder = new TextDecoder(label);
|
|
83
|
+
const chars = [];
|
|
84
|
+
const reverse = new Map();
|
|
85
|
+
for (let byte = 0; byte < 256; byte++) {
|
|
86
|
+
const char = decoder.decode(Uint8Array.of(byte));
|
|
87
|
+
chars[byte] = char;
|
|
88
|
+
// The lower byte wins a duplicate; an undefined byte encodes nothing.
|
|
89
|
+
if (char !== "\u{FFFD}" && !reverse.has(char))
|
|
90
|
+
reverse.set(char, byte);
|
|
91
|
+
}
|
|
92
|
+
return { tables: cellTables((byte) => chars[byte]), reverse };
|
|
93
|
+
});
|
|
94
|
+
return singleByte(() => built().tables, (text) => {
|
|
95
|
+
const { reverse } = built();
|
|
96
|
+
const out = [];
|
|
97
|
+
for (const char of text) {
|
|
98
|
+
const byte = reverse.get(char);
|
|
99
|
+
if (byte === undefined)
|
|
100
|
+
return null;
|
|
101
|
+
out.push(byte);
|
|
102
|
+
}
|
|
103
|
+
return Uint8Array.from(out);
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=text-decoding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-decoding.js","sourceRoot":"","sources":["../src/text-decoding.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type HexPane = "hex" | "text";
|
|
2
|
+
export interface HexSelection {
|
|
3
|
+
/** Where the selection started; inclusive byte offset into the source. */
|
|
4
|
+
anchor: number;
|
|
5
|
+
/** The caret: where it ends and where the keyboard moves from; inclusive. */
|
|
6
|
+
focus: number;
|
|
7
|
+
/** The pane it was made in: gets the focused colours, and decides the copy format. */
|
|
8
|
+
pane: HexPane;
|
|
9
|
+
/** The hex digit an editor's next keystroke writes; only the hex pane counts it. */
|
|
10
|
+
nibble?: 0 | 1;
|
|
11
|
+
}
|
|
12
|
+
export type ControlCodes = "abbreviations" | "dots";
|
|
13
|
+
/** Equal field by field, so a field added later (an editing caret's nibble) counts too. */
|
|
14
|
+
export declare function sameSelection(a: HexSelection | null, b: HexSelection | null): boolean;
|
|
15
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;AAErC,MAAM,WAAW,YAAY;IAC3B,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,KAAK,EAAE,MAAM,CAAC;IACd,sFAAsF;IACtF,IAAI,EAAE,OAAO,CAAC;IACd,oFAAoF;IACpF,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;CAChB;AAED,MAAM,MAAM,YAAY,GAAG,eAAe,GAAG,MAAM,CAAC;AAEpD,2FAA2F;AAC3F,wBAAgB,aAAa,CAC3B,CAAC,EAAE,YAAY,GAAG,IAAI,EACtB,CAAC,EAAE,YAAY,GAAG,IAAI,GACrB,OAAO,CAOT"}
|