@pnpm/exe 11.0.0-beta.0 → 11.0.0-beta.2
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/node_modules/@gar/promise-retry/lib/index.js +28 -0
- package/dist/node_modules/@gar/promise-retry/package.json +48 -0
- package/dist/node_modules/@npmcli/agent/package.json +7 -7
- package/dist/node_modules/@npmcli/fs/package.json +4 -4
- package/dist/node_modules/abbrev/package.json +11 -15
- package/dist/node_modules/cacache/package.json +10 -11
- package/dist/node_modules/glob/dist/commonjs/glob.js +2 -1
- package/dist/node_modules/glob/dist/commonjs/index.min.js +4 -0
- package/dist/node_modules/glob/dist/commonjs/pattern.js +4 -0
- package/dist/node_modules/glob/dist/esm/glob.js +2 -1
- package/dist/node_modules/glob/dist/esm/index.min.js +4 -0
- package/dist/node_modules/glob/dist/esm/pattern.js +4 -0
- package/dist/node_modules/glob/package.json +38 -37
- package/dist/node_modules/graceful-fs/graceful-fs.js +1 -1
- package/dist/node_modules/iconv-lite/encodings/dbcs-codec.js +460 -525
- package/dist/node_modules/iconv-lite/encodings/dbcs-data.js +179 -182
- package/dist/node_modules/iconv-lite/encodings/index.js +15 -15
- package/dist/node_modules/iconv-lite/encodings/internal.js +168 -148
- package/dist/node_modules/iconv-lite/encodings/sbcs-codec.js +55 -52
- package/dist/node_modules/iconv-lite/encodings/sbcs-data.js +174 -175
- package/dist/node_modules/iconv-lite/encodings/utf16.js +121 -131
- package/dist/node_modules/iconv-lite/encodings/utf32.js +226 -238
- package/dist/node_modules/iconv-lite/encodings/utf7.js +208 -215
- package/dist/node_modules/iconv-lite/lib/bom-handling.js +30 -34
- package/dist/node_modules/iconv-lite/lib/helpers/merge-exports.js +13 -0
- package/dist/node_modules/iconv-lite/lib/index.js +125 -123
- package/dist/node_modules/iconv-lite/lib/streams.js +92 -96
- package/dist/node_modules/iconv-lite/package.json +34 -8
- package/dist/node_modules/isexe/package.json +65 -18
- package/dist/node_modules/lru-cache/dist/commonjs/index.js +134 -85
- package/dist/node_modules/lru-cache/dist/commonjs/index.min.js +1 -1
- package/dist/node_modules/lru-cache/dist/esm/index.js +134 -85
- package/dist/node_modules/lru-cache/dist/esm/index.min.js +1 -1
- package/dist/node_modules/lru-cache/package.json +18 -41
- package/dist/node_modules/make-fetch-happen/lib/remote.js +1 -1
- package/dist/node_modules/make-fetch-happen/package.json +10 -10
- package/dist/node_modules/minipass-fetch/lib/body.js +25 -15
- package/dist/node_modules/minipass-fetch/package.json +7 -7
- package/dist/node_modules/minipass-sized/dist/commonjs/index.js +69 -0
- package/dist/node_modules/minipass-sized/dist/esm/index.js +64 -0
- package/dist/node_modules/minipass-sized/package.json +39 -9
- package/dist/node_modules/node-gyp/.release-please-manifest.json +1 -1
- package/dist/node_modules/node-gyp/bin/node-gyp.js +7 -0
- package/dist/node_modules/node-gyp/gyp/.release-please-manifest.json +1 -1
- package/dist/node_modules/node-gyp/gyp/pylib/gyp/MSVSNew.py +3 -3
- package/dist/node_modules/node-gyp/gyp/pylib/gyp/MSVSVersion.py +26 -1
- package/dist/node_modules/node-gyp/gyp/pylib/gyp/generator/make.py +1 -1
- package/dist/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja.py +3 -4
- package/dist/node_modules/node-gyp/gyp/pylib/gyp/xcodeproj_file.py +1 -1
- package/dist/node_modules/node-gyp/gyp/pyproject.toml +1 -1
- package/dist/node_modules/node-gyp/lib/build.js +2 -2
- package/dist/node_modules/node-gyp/lib/find-python.js +2 -8
- package/dist/node_modules/node-gyp/lib/find-visualstudio.js +11 -5
- package/dist/node_modules/node-gyp/lib/install.js +1 -1
- package/dist/node_modules/node-gyp/lib/process-release.js +3 -3
- package/dist/node_modules/node-gyp/package.json +13 -13
- package/dist/node_modules/nopt/package.json +5 -5
- package/dist/node_modules/proc-log/lib/index.js +10 -5
- package/dist/node_modules/proc-log/package.json +5 -5
- package/dist/node_modules/retry/lib/retry.js +2 -2
- package/dist/node_modules/retry/lib/retry_operation.js +10 -6
- package/dist/node_modules/retry/package.json +6 -2
- package/dist/node_modules/ssri/lib/index.js +33 -63
- package/dist/node_modules/ssri/package.json +17 -17
- package/dist/node_modules/unique-filename/package.json +5 -5
- package/dist/node_modules/unique-slug/package.json +4 -4
- package/dist/node_modules/which/package.json +29 -20
- package/dist/pnpm.mjs +63969 -54688
- package/dist/worker.js +601 -2162
- package/package.json +8 -8
- package/dist/node_modules/@isaacs/cliui/dist/commonjs/ansi-regex/index.js +0 -16
- package/dist/node_modules/@isaacs/cliui/dist/commonjs/ansi-styles/index.js +0 -170
- package/dist/node_modules/@isaacs/cliui/dist/commonjs/eastasianwidth/index.js +0 -307
- package/dist/node_modules/@isaacs/cliui/dist/commonjs/emoji-regex/index.js +0 -7
- package/dist/node_modules/@isaacs/cliui/dist/commonjs/index.js +0 -322
- package/dist/node_modules/@isaacs/cliui/dist/commonjs/index.min.js +0 -12
- package/dist/node_modules/@isaacs/cliui/dist/commonjs/string-width/index.js +0 -49
- package/dist/node_modules/@isaacs/cliui/dist/commonjs/strip-ansi/index.js +0 -8
- package/dist/node_modules/@isaacs/cliui/dist/commonjs/wrap-ansi/index.js +0 -176
- package/dist/node_modules/@isaacs/cliui/dist/esm/ansi-regex/index.js +0 -12
- package/dist/node_modules/@isaacs/cliui/dist/esm/ansi-styles/index.js +0 -167
- package/dist/node_modules/@isaacs/cliui/dist/esm/eastasianwidth/index.js +0 -299
- package/dist/node_modules/@isaacs/cliui/dist/esm/emoji-regex/index.js +0 -3
- package/dist/node_modules/@isaacs/cliui/dist/esm/index.js +0 -317
- package/dist/node_modules/@isaacs/cliui/dist/esm/index.min.js +0 -12
- package/dist/node_modules/@isaacs/cliui/dist/esm/string-width/index.js +0 -46
- package/dist/node_modules/@isaacs/cliui/dist/esm/strip-ansi/index.js +0 -4
- package/dist/node_modules/@isaacs/cliui/dist/esm/wrap-ansi/index.js +0 -172
- package/dist/node_modules/@isaacs/cliui/package.json +0 -163
- package/dist/node_modules/cross-spawn/LICENSE +0 -21
- package/dist/node_modules/cross-spawn/index.js +0 -39
- package/dist/node_modules/cross-spawn/lib/enoent.js +0 -59
- package/dist/node_modules/cross-spawn/lib/parse.js +0 -91
- package/dist/node_modules/cross-spawn/lib/util/escape.js +0 -47
- package/dist/node_modules/cross-spawn/lib/util/readShebang.js +0 -23
- package/dist/node_modules/cross-spawn/lib/util/resolveCommand.js +0 -52
- package/dist/node_modules/cross-spawn/package.json +0 -73
- package/dist/node_modules/encoding/.prettierrc.js +0 -8
- package/dist/node_modules/encoding/LICENSE +0 -16
- package/dist/node_modules/encoding/lib/encoding.js +0 -83
- package/dist/node_modules/encoding/package.json +0 -18
- package/dist/node_modules/err-code/.eslintrc.json +0 -7
- package/dist/node_modules/err-code/bower.json +0 -30
- package/dist/node_modules/err-code/index.js +0 -47
- package/dist/node_modules/err-code/index.umd.js +0 -51
- package/dist/node_modules/err-code/package.json +0 -34
- package/dist/node_modules/foreground-child/LICENSE +0 -15
- package/dist/node_modules/foreground-child/dist/commonjs/all-signals.js +0 -58
- package/dist/node_modules/foreground-child/dist/commonjs/index.js +0 -123
- package/dist/node_modules/foreground-child/dist/commonjs/proxy-signals.js +0 -38
- package/dist/node_modules/foreground-child/dist/commonjs/watchdog.js +0 -50
- package/dist/node_modules/foreground-child/dist/esm/all-signals.js +0 -52
- package/dist/node_modules/foreground-child/dist/esm/index.js +0 -115
- package/dist/node_modules/foreground-child/dist/esm/proxy-signals.js +0 -34
- package/dist/node_modules/foreground-child/dist/esm/watchdog.js +0 -46
- package/dist/node_modules/foreground-child/package.json +0 -106
- package/dist/node_modules/glob/dist/esm/bin.d.mts +0 -3
- package/dist/node_modules/glob/dist/esm/bin.mjs +0 -346
- package/dist/node_modules/iconv-lite/.github/dependabot.yml +0 -11
- package/dist/node_modules/iconv-lite/.idea/codeStyles/Project.xml +0 -47
- package/dist/node_modules/iconv-lite/.idea/codeStyles/codeStyleConfig.xml +0 -5
- package/dist/node_modules/iconv-lite/.idea/iconv-lite.iml +0 -12
- package/dist/node_modules/iconv-lite/.idea/inspectionProfiles/Project_Default.xml +0 -6
- package/dist/node_modules/iconv-lite/.idea/modules.xml +0 -8
- package/dist/node_modules/iconv-lite/.idea/vcs.xml +0 -6
- package/dist/node_modules/isexe/LICENSE +0 -15
- package/dist/node_modules/isexe/index.js +0 -57
- package/dist/node_modules/isexe/mode.js +0 -41
- package/dist/node_modules/isexe/windows.js +0 -42
- package/dist/node_modules/jackspeak/dist/commonjs/index.js +0 -944
- package/dist/node_modules/jackspeak/dist/commonjs/index.min.js +0 -33
- package/dist/node_modules/jackspeak/dist/commonjs/package.json +0 -3
- package/dist/node_modules/jackspeak/dist/esm/index.js +0 -936
- package/dist/node_modules/jackspeak/dist/esm/index.min.js +0 -33
- package/dist/node_modules/jackspeak/dist/esm/package.json +0 -3
- package/dist/node_modules/jackspeak/package.json +0 -115
- package/dist/node_modules/lru-cache/LICENSE +0 -15
- package/dist/node_modules/minipass-sized/index.js +0 -67
- package/dist/node_modules/minipass-sized/node_modules/minipass/LICENSE +0 -15
- package/dist/node_modules/minipass-sized/node_modules/minipass/index.js +0 -649
- package/dist/node_modules/minipass-sized/node_modules/minipass/package.json +0 -56
- package/dist/node_modules/minipass-sized/package-lock.json +0 -3464
- package/dist/node_modules/node-gyp/node_modules/isexe/dist/commonjs/package.json +0 -3
- package/dist/node_modules/node-gyp/node_modules/isexe/dist/esm/package.json +0 -3
- package/dist/node_modules/node-gyp/node_modules/isexe/package.json +0 -78
- package/dist/node_modules/node-gyp/node_modules/which/LICENSE +0 -15
- package/dist/node_modules/node-gyp/node_modules/which/package.json +0 -52
- package/dist/node_modules/package-json-from-dist/dist/commonjs/index.js +0 -134
- package/dist/node_modules/package-json-from-dist/dist/commonjs/package.json +0 -3
- package/dist/node_modules/package-json-from-dist/dist/esm/index.js +0 -129
- package/dist/node_modules/package-json-from-dist/dist/esm/package.json +0 -3
- package/dist/node_modules/package-json-from-dist/package.json +0 -68
- package/dist/node_modules/path-key/index.js +0 -16
- package/dist/node_modules/path-key/license +0 -9
- package/dist/node_modules/path-key/package.json +0 -39
- package/dist/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.js +0 -1589
- package/dist/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.min.js +0 -2
- package/dist/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/package.json +0 -3
- package/dist/node_modules/path-scurry/node_modules/lru-cache/dist/esm/index.js +0 -1585
- package/dist/node_modules/path-scurry/node_modules/lru-cache/dist/esm/index.min.js +0 -2
- package/dist/node_modules/path-scurry/node_modules/lru-cache/dist/esm/package.json +0 -3
- package/dist/node_modules/path-scurry/node_modules/lru-cache/package.json +0 -101
- package/dist/node_modules/promise-retry/index.js +0 -52
- package/dist/node_modules/promise-retry/package.json +0 -37
- package/dist/node_modules/retry/equation.gif +0 -0
- package/dist/node_modules/shebang-command/index.js +0 -19
- package/dist/node_modules/shebang-command/license +0 -9
- package/dist/node_modules/shebang-command/package.json +0 -34
- package/dist/node_modules/shebang-regex/index.js +0 -2
- package/dist/node_modules/shebang-regex/license +0 -9
- package/dist/node_modules/shebang-regex/package.json +0 -35
- package/dist/node_modules/signal-exit/LICENSE.txt +0 -16
- package/dist/node_modules/signal-exit/dist/cjs/browser.js +0 -10
- package/dist/node_modules/signal-exit/dist/cjs/index.js +0 -279
- package/dist/node_modules/signal-exit/dist/cjs/package.json +0 -3
- package/dist/node_modules/signal-exit/dist/cjs/signals.js +0 -42
- package/dist/node_modules/signal-exit/dist/mjs/browser.js +0 -4
- package/dist/node_modules/signal-exit/dist/mjs/index.js +0 -275
- package/dist/node_modules/signal-exit/dist/mjs/package.json +0 -3
- package/dist/node_modules/signal-exit/dist/mjs/signals.js +0 -39
- package/dist/node_modules/signal-exit/package.json +0 -106
- package/dist/node_modules/which/bin/node-which +0 -52
- package/dist/node_modules/which/which.js +0 -125
- /package/dist/node_modules/{promise-retry → @gar/promise-retry}/LICENSE +0 -0
- /package/dist/node_modules/{node-gyp/node_modules/isexe → isexe}/dist/commonjs/index.js +0 -0
- /package/dist/node_modules/{node-gyp/node_modules/isexe → isexe}/dist/commonjs/index.min.js +0 -0
- /package/dist/node_modules/{node-gyp/node_modules/isexe → isexe}/dist/commonjs/options.js +0 -0
- /package/dist/node_modules/{@isaacs/cliui → isexe}/dist/commonjs/package.json +0 -0
- /package/dist/node_modules/{node-gyp/node_modules/isexe → isexe}/dist/commonjs/posix.js +0 -0
- /package/dist/node_modules/{node-gyp/node_modules/isexe → isexe}/dist/commonjs/win32.js +0 -0
- /package/dist/node_modules/{node-gyp/node_modules/isexe → isexe}/dist/esm/index.js +0 -0
- /package/dist/node_modules/{node-gyp/node_modules/isexe → isexe}/dist/esm/index.min.js +0 -0
- /package/dist/node_modules/{node-gyp/node_modules/isexe → isexe}/dist/esm/options.js +0 -0
- /package/dist/node_modules/{@isaacs/cliui → isexe}/dist/esm/package.json +0 -0
- /package/dist/node_modules/{node-gyp/node_modules/isexe → isexe}/dist/esm/posix.js +0 -0
- /package/dist/node_modules/{node-gyp/node_modules/isexe → isexe}/dist/esm/win32.js +0 -0
- /package/dist/node_modules/{foreground-child → minipass-sized}/dist/commonjs/package.json +0 -0
- /package/dist/node_modules/{foreground-child → minipass-sized}/dist/esm/package.json +0 -0
- /package/dist/node_modules/{node-gyp/node_modules/which → which}/bin/which.js +0 -0
- /package/dist/node_modules/{node-gyp/node_modules/which → which}/lib/index.js +0 -0
|
@@ -1,597 +1,532 @@
|
|
|
1
|
-
"use strict"
|
|
2
|
-
var Buffer = require("safer-buffer").Buffer
|
|
1
|
+
"use strict"
|
|
2
|
+
var Buffer = require("safer-buffer").Buffer
|
|
3
3
|
|
|
4
4
|
// Multibyte codec. In this scheme, a character is represented by 1 or more bytes.
|
|
5
5
|
// Our codec supports UTF-16 surrogates, extensions for GB18030 and unicode sequences.
|
|
6
6
|
// To save memory and loading time, we read table files only when requested.
|
|
7
7
|
|
|
8
|
-
exports._dbcs = DBCSCodec
|
|
8
|
+
exports._dbcs = DBCSCodec
|
|
9
9
|
|
|
10
|
-
var UNASSIGNED = -1
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
for (var i = 0; i < 0x100; i++)
|
|
18
|
-
UNASSIGNED_NODE[i] = UNASSIGNED;
|
|
10
|
+
var UNASSIGNED = -1
|
|
11
|
+
var GB18030_CODE = -2
|
|
12
|
+
var SEQ_START = -10
|
|
13
|
+
var NODE_START = -1000
|
|
14
|
+
var UNASSIGNED_NODE = new Array(0x100)
|
|
15
|
+
var DEF_CHAR = -1
|
|
19
16
|
|
|
17
|
+
for (var i = 0; i < 0x100; i++) { UNASSIGNED_NODE[i] = UNASSIGNED }
|
|
20
18
|
|
|
21
19
|
// Class DBCSCodec reads and initializes mapping tables.
|
|
22
|
-
function DBCSCodec(codecOptions, iconv) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
//
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
if (secondByteNode[j] === UNASSIGNED) {
|
|
69
|
-
secondByteNode[j] = NODE_START - commonThirdByteNodeIdx;
|
|
70
|
-
} else if (secondByteNode[j] > NODE_START) {
|
|
71
|
-
throw new Error("gb18030 decode tables conflict at byte 2");
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
var thirdByteNode = this.decodeTables[NODE_START - secondByteNode[j]];
|
|
75
|
-
for (var k = 0x81; k <= 0xFE; k++) {
|
|
76
|
-
if (thirdByteNode[k] === UNASSIGNED) {
|
|
77
|
-
thirdByteNode[k] = NODE_START - commonFourthByteNodeIdx;
|
|
78
|
-
} else if (thirdByteNode[k] === NODE_START - commonFourthByteNodeIdx) {
|
|
79
|
-
continue;
|
|
80
|
-
} else if (thirdByteNode[k] > NODE_START) {
|
|
81
|
-
throw new Error("gb18030 decode tables conflict at byte 3");
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
var fourthByteNode = this.decodeTables[NODE_START - thirdByteNode[k]];
|
|
85
|
-
for (var l = 0x30; l <= 0x39; l++) {
|
|
86
|
-
if (fourthByteNode[l] === UNASSIGNED)
|
|
87
|
-
fourthByteNode[l] = GB18030_CODE;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
20
|
+
function DBCSCodec (codecOptions, iconv) {
|
|
21
|
+
this.encodingName = codecOptions.encodingName
|
|
22
|
+
if (!codecOptions) { throw new Error("DBCS codec is called without the data.") }
|
|
23
|
+
if (!codecOptions.table) { throw new Error("Encoding '" + this.encodingName + "' has no data.") }
|
|
24
|
+
|
|
25
|
+
// Load tables.
|
|
26
|
+
var mappingTable = codecOptions.table()
|
|
27
|
+
|
|
28
|
+
// Decode tables: MBCS -> Unicode.
|
|
29
|
+
|
|
30
|
+
// decodeTables is a trie, encoded as an array of arrays of integers. Internal arrays are trie nodes and all have len = 256.
|
|
31
|
+
// Trie root is decodeTables[0].
|
|
32
|
+
// Values: >= 0 -> unicode character code. can be > 0xFFFF
|
|
33
|
+
// == UNASSIGNED -> unknown/unassigned sequence.
|
|
34
|
+
// == GB18030_CODE -> this is the end of a GB18030 4-byte sequence.
|
|
35
|
+
// <= NODE_START -> index of the next node in our trie to process next byte.
|
|
36
|
+
// <= SEQ_START -> index of the start of a character code sequence, in decodeTableSeq.
|
|
37
|
+
this.decodeTables = []
|
|
38
|
+
this.decodeTables[0] = UNASSIGNED_NODE.slice(0) // Create root node.
|
|
39
|
+
|
|
40
|
+
// Sometimes a MBCS char corresponds to a sequence of unicode chars. We store them as arrays of integers here.
|
|
41
|
+
this.decodeTableSeq = []
|
|
42
|
+
|
|
43
|
+
// Actual mapping tables consist of chunks. Use them to fill up decode tables.
|
|
44
|
+
for (var i = 0; i < mappingTable.length; i++) { this._addDecodeChunk(mappingTable[i]) }
|
|
45
|
+
|
|
46
|
+
// Load & create GB18030 tables when needed.
|
|
47
|
+
if (typeof codecOptions.gb18030 === "function") {
|
|
48
|
+
this.gb18030 = codecOptions.gb18030() // Load GB18030 ranges.
|
|
49
|
+
|
|
50
|
+
// Add GB18030 common decode nodes.
|
|
51
|
+
var commonThirdByteNodeIdx = this.decodeTables.length
|
|
52
|
+
this.decodeTables.push(UNASSIGNED_NODE.slice(0))
|
|
53
|
+
|
|
54
|
+
var commonFourthByteNodeIdx = this.decodeTables.length
|
|
55
|
+
this.decodeTables.push(UNASSIGNED_NODE.slice(0))
|
|
56
|
+
|
|
57
|
+
// Fill out the tree
|
|
58
|
+
var firstByteNode = this.decodeTables[0]
|
|
59
|
+
for (var i = 0x81; i <= 0xFE; i++) {
|
|
60
|
+
var secondByteNode = this.decodeTables[NODE_START - firstByteNode[i]]
|
|
61
|
+
for (var j = 0x30; j <= 0x39; j++) {
|
|
62
|
+
if (secondByteNode[j] === UNASSIGNED) {
|
|
63
|
+
secondByteNode[j] = NODE_START - commonThirdByteNodeIdx
|
|
64
|
+
} else if (secondByteNode[j] > NODE_START) {
|
|
65
|
+
throw new Error("gb18030 decode tables conflict at byte 2")
|
|
91
66
|
}
|
|
92
|
-
}
|
|
93
67
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
// means end of sequence (needed when one sequence is a strict subsequence of another).
|
|
109
|
-
// Objects are kept separately from encodeTable to increase performance.
|
|
110
|
-
this.encodeTableSeq = [];
|
|
111
|
-
|
|
112
|
-
// Some chars can be decoded, but need not be encoded.
|
|
113
|
-
var skipEncodeChars = {};
|
|
114
|
-
if (codecOptions.encodeSkipVals)
|
|
115
|
-
for (var i = 0; i < codecOptions.encodeSkipVals.length; i++) {
|
|
116
|
-
var val = codecOptions.encodeSkipVals[i];
|
|
117
|
-
if (typeof val === 'number')
|
|
118
|
-
skipEncodeChars[val] = true;
|
|
119
|
-
else
|
|
120
|
-
for (var j = val.from; j <= val.to; j++)
|
|
121
|
-
skipEncodeChars[j] = true;
|
|
68
|
+
var thirdByteNode = this.decodeTables[NODE_START - secondByteNode[j]]
|
|
69
|
+
for (var k = 0x81; k <= 0xFE; k++) {
|
|
70
|
+
if (thirdByteNode[k] === UNASSIGNED) {
|
|
71
|
+
thirdByteNode[k] = NODE_START - commonFourthByteNodeIdx
|
|
72
|
+
} else if (thirdByteNode[k] === NODE_START - commonFourthByteNodeIdx) {
|
|
73
|
+
continue
|
|
74
|
+
} else if (thirdByteNode[k] > NODE_START) {
|
|
75
|
+
throw new Error("gb18030 decode tables conflict at byte 3")
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
var fourthByteNode = this.decodeTables[NODE_START - thirdByteNode[k]]
|
|
79
|
+
for (var l = 0x30; l <= 0x39; l++) {
|
|
80
|
+
if (fourthByteNode[l] === UNASSIGNED) { fourthByteNode[l] = GB18030_CODE }
|
|
81
|
+
}
|
|
122
82
|
}
|
|
123
|
-
|
|
124
|
-
// Use decode trie to recursively fill out encode tables.
|
|
125
|
-
this._fillEncodeTable(0, 0, skipEncodeChars);
|
|
126
|
-
|
|
127
|
-
// Add more encoding pairs when needed.
|
|
128
|
-
if (codecOptions.encodeAdd) {
|
|
129
|
-
for (var uChar in codecOptions.encodeAdd)
|
|
130
|
-
if (Object.prototype.hasOwnProperty.call(codecOptions.encodeAdd, uChar))
|
|
131
|
-
this._setEncodeChar(uChar.charCodeAt(0), codecOptions.encodeAdd[uChar]);
|
|
83
|
+
}
|
|
132
84
|
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
this.defaultCharUnicode = iconv.defaultCharUnicode
|
|
88
|
+
|
|
89
|
+
// Encode tables: Unicode -> DBCS.
|
|
90
|
+
|
|
91
|
+
// `encodeTable` is array mapping from unicode char to encoded char. All its values are integers for performance.
|
|
92
|
+
// Because it can be sparse, it is represented as array of buckets by 256 chars each. Bucket can be null.
|
|
93
|
+
// Values: >= 0 -> it is a normal char. Write the value (if <=256 then 1 byte, if <=65536 then 2 bytes, etc.).
|
|
94
|
+
// == UNASSIGNED -> no conversion found. Output a default char.
|
|
95
|
+
// <= SEQ_START -> it's an index in encodeTableSeq, see below. The character starts a sequence.
|
|
96
|
+
this.encodeTable = []
|
|
97
|
+
|
|
98
|
+
// `encodeTableSeq` is used when a sequence of unicode characters is encoded as a single code. We use a tree of
|
|
99
|
+
// objects where keys correspond to characters in sequence and leafs are the encoded dbcs values. A special DEF_CHAR key
|
|
100
|
+
// means end of sequence (needed when one sequence is a strict subsequence of another).
|
|
101
|
+
// Objects are kept separately from encodeTable to increase performance.
|
|
102
|
+
this.encodeTableSeq = []
|
|
103
|
+
|
|
104
|
+
// Some chars can be decoded, but need not be encoded.
|
|
105
|
+
var skipEncodeChars = {}
|
|
106
|
+
if (codecOptions.encodeSkipVals) {
|
|
107
|
+
for (var i = 0; i < codecOptions.encodeSkipVals.length; i++) {
|
|
108
|
+
var val = codecOptions.encodeSkipVals[i]
|
|
109
|
+
if (typeof val === "number") { skipEncodeChars[val] = true } else {
|
|
110
|
+
for (var j = val.from; j <= val.to; j++) { skipEncodeChars[j] = true }
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Use decode trie to recursively fill out encode tables.
|
|
116
|
+
this._fillEncodeTable(0, 0, skipEncodeChars)
|
|
133
117
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
118
|
+
// Add more encoding pairs when needed.
|
|
119
|
+
if (codecOptions.encodeAdd) {
|
|
120
|
+
for (var uChar in codecOptions.encodeAdd) {
|
|
121
|
+
if (Object.prototype.hasOwnProperty.call(codecOptions.encodeAdd, uChar)) { this._setEncodeChar(uChar.charCodeAt(0), codecOptions.encodeAdd[uChar]) }
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
this.defCharSB = this.encodeTable[0][iconv.defaultCharSingleByte.charCodeAt(0)]
|
|
126
|
+
if (this.defCharSB === UNASSIGNED) this.defCharSB = this.encodeTable[0]["?"]
|
|
127
|
+
if (this.defCharSB === UNASSIGNED) this.defCharSB = "?".charCodeAt(0)
|
|
137
128
|
}
|
|
138
129
|
|
|
139
|
-
DBCSCodec.prototype.encoder = DBCSEncoder
|
|
140
|
-
DBCSCodec.prototype.decoder = DBCSDecoder
|
|
130
|
+
DBCSCodec.prototype.encoder = DBCSEncoder
|
|
131
|
+
DBCSCodec.prototype.decoder = DBCSDecoder
|
|
141
132
|
|
|
142
133
|
// Decoder helpers
|
|
143
|
-
DBCSCodec.prototype._getDecodeTrieNode = function(addr) {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
var
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
}
|
|
161
|
-
else
|
|
162
|
-
throw new Error("Overwrite byte in " + this.encodingName + ", addr: " + addr.toString(16));
|
|
163
|
-
}
|
|
164
|
-
return node;
|
|
134
|
+
DBCSCodec.prototype._getDecodeTrieNode = function (addr) {
|
|
135
|
+
var bytes = []
|
|
136
|
+
for (; addr > 0; addr >>>= 8) { bytes.push(addr & 0xFF) }
|
|
137
|
+
if (bytes.length == 0) { bytes.push(0) }
|
|
138
|
+
|
|
139
|
+
var node = this.decodeTables[0]
|
|
140
|
+
for (var i = bytes.length - 1; i > 0; i--) { // Traverse nodes deeper into the trie.
|
|
141
|
+
var val = node[bytes[i]]
|
|
142
|
+
|
|
143
|
+
if (val == UNASSIGNED) { // Create new node.
|
|
144
|
+
node[bytes[i]] = NODE_START - this.decodeTables.length
|
|
145
|
+
this.decodeTables.push(node = UNASSIGNED_NODE.slice(0))
|
|
146
|
+
} else if (val <= NODE_START) { // Existing node.
|
|
147
|
+
node = this.decodeTables[NODE_START - val]
|
|
148
|
+
} else { throw new Error("Overwrite byte in " + this.encodingName + ", addr: " + addr.toString(16)) }
|
|
149
|
+
}
|
|
150
|
+
return node
|
|
165
151
|
}
|
|
166
152
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
writeTable[curAddr++] = code; // Basic char
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
else if (typeof part === "number") { // Integer, meaning increasing sequence starting with prev character.
|
|
203
|
-
var charCode = writeTable[curAddr - 1] + 1;
|
|
204
|
-
for (var l = 0; l < part; l++)
|
|
205
|
-
writeTable[curAddr++] = charCode++;
|
|
206
|
-
}
|
|
207
|
-
else
|
|
208
|
-
throw new Error("Incorrect type '" + typeof part + "' given in " + this.encodingName + " at chunk " + chunk[0]);
|
|
209
|
-
}
|
|
210
|
-
if (curAddr > 0xFF)
|
|
211
|
-
throw new Error("Incorrect chunk in " + this.encodingName + " at addr " + chunk[0] + ": too long" + curAddr);
|
|
153
|
+
DBCSCodec.prototype._addDecodeChunk = function (chunk) {
|
|
154
|
+
// First element of chunk is the hex mbcs code where we start.
|
|
155
|
+
var curAddr = parseInt(chunk[0], 16)
|
|
156
|
+
|
|
157
|
+
// Choose the decoding node where we'll write our chars.
|
|
158
|
+
var writeTable = this._getDecodeTrieNode(curAddr)
|
|
159
|
+
curAddr = curAddr & 0xFF
|
|
160
|
+
|
|
161
|
+
// Write all other elements of the chunk to the table.
|
|
162
|
+
for (var k = 1; k < chunk.length; k++) {
|
|
163
|
+
var part = chunk[k]
|
|
164
|
+
if (typeof part === "string") { // String, write as-is.
|
|
165
|
+
for (var l = 0; l < part.length;) {
|
|
166
|
+
var code = part.charCodeAt(l++)
|
|
167
|
+
if (code >= 0xD800 && code < 0xDC00) { // Decode surrogate
|
|
168
|
+
var codeTrail = part.charCodeAt(l++)
|
|
169
|
+
if (codeTrail >= 0xDC00 && codeTrail < 0xE000) { writeTable[curAddr++] = 0x10000 + (code - 0xD800) * 0x400 + (codeTrail - 0xDC00) } else { throw new Error("Incorrect surrogate pair in " + this.encodingName + " at chunk " + chunk[0]) }
|
|
170
|
+
} else if (code > 0x0FF0 && code <= 0x0FFF) { // Character sequence (our own encoding used)
|
|
171
|
+
var len = 0xFFF - code + 2
|
|
172
|
+
var seq = []
|
|
173
|
+
for (var m = 0; m < len; m++) { seq.push(part.charCodeAt(l++)) } // Simple variation: don't support surrogates or subsequences in seq.
|
|
174
|
+
|
|
175
|
+
writeTable[curAddr++] = SEQ_START - this.decodeTableSeq.length
|
|
176
|
+
this.decodeTableSeq.push(seq)
|
|
177
|
+
} else { writeTable[curAddr++] = code } // Basic char
|
|
178
|
+
}
|
|
179
|
+
} else if (typeof part === "number") { // Integer, meaning increasing sequence starting with prev character.
|
|
180
|
+
var charCode = writeTable[curAddr - 1] + 1
|
|
181
|
+
for (var l = 0; l < part; l++) { writeTable[curAddr++] = charCode++ }
|
|
182
|
+
} else { throw new Error("Incorrect type '" + typeof part + "' given in " + this.encodingName + " at chunk " + chunk[0]) }
|
|
183
|
+
}
|
|
184
|
+
if (curAddr > 0xFF) { throw new Error("Incorrect chunk in " + this.encodingName + " at addr " + chunk[0] + ": too long" + curAddr) }
|
|
212
185
|
}
|
|
213
186
|
|
|
214
187
|
// Encoder helpers
|
|
215
|
-
DBCSCodec.prototype._getEncodeBucket = function(uCode) {
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
188
|
+
DBCSCodec.prototype._getEncodeBucket = function (uCode) {
|
|
189
|
+
var high = uCode >> 8 // This could be > 0xFF because of astral characters.
|
|
190
|
+
if (this.encodeTable[high] === undefined) {
|
|
191
|
+
this.encodeTable[high] = UNASSIGNED_NODE.slice(0)
|
|
192
|
+
} // Create bucket on demand.
|
|
193
|
+
return this.encodeTable[high]
|
|
220
194
|
}
|
|
221
195
|
|
|
222
|
-
DBCSCodec.prototype._setEncodeChar = function(uCode, dbcsCode) {
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
else if (bucket[low] == UNASSIGNED)
|
|
228
|
-
bucket[low] = dbcsCode;
|
|
196
|
+
DBCSCodec.prototype._setEncodeChar = function (uCode, dbcsCode) {
|
|
197
|
+
var bucket = this._getEncodeBucket(uCode)
|
|
198
|
+
var low = uCode & 0xFF
|
|
199
|
+
if (bucket[low] <= SEQ_START) { this.encodeTableSeq[SEQ_START - bucket[low]][DEF_CHAR] = dbcsCode } // There's already a sequence, set a single-char subsequence of it.
|
|
200
|
+
else if (bucket[low] == UNASSIGNED) { bucket[low] = dbcsCode }
|
|
229
201
|
}
|
|
230
202
|
|
|
231
|
-
DBCSCodec.prototype._setEncodeSequence = function(seq, dbcsCode) {
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
203
|
+
DBCSCodec.prototype._setEncodeSequence = function (seq, dbcsCode) {
|
|
204
|
+
// Get the root of character tree according to first character of the sequence.
|
|
205
|
+
var uCode = seq[0]
|
|
206
|
+
var bucket = this._getEncodeBucket(uCode)
|
|
207
|
+
var low = uCode & 0xFF
|
|
208
|
+
|
|
209
|
+
var node
|
|
210
|
+
if (bucket[low] <= SEQ_START) {
|
|
211
|
+
// There's already a sequence with - use it.
|
|
212
|
+
node = this.encodeTableSeq[SEQ_START - bucket[low]]
|
|
213
|
+
} else {
|
|
214
|
+
// There was no sequence object - allocate a new one.
|
|
215
|
+
node = {}
|
|
216
|
+
if (bucket[low] !== UNASSIGNED) node[DEF_CHAR] = bucket[low] // If a char was set before - make it a single-char subsequence.
|
|
217
|
+
bucket[low] = SEQ_START - this.encodeTableSeq.length
|
|
218
|
+
this.encodeTableSeq.push(node)
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Traverse the character tree, allocating new nodes as needed.
|
|
222
|
+
for (var j = 1; j < seq.length - 1; j++) {
|
|
223
|
+
var oldVal = node[uCode]
|
|
224
|
+
if (typeof oldVal === "object") { node = oldVal } else {
|
|
225
|
+
node = node[uCode] = {}
|
|
226
|
+
if (oldVal !== undefined) { node[DEF_CHAR] = oldVal }
|
|
249
227
|
}
|
|
228
|
+
}
|
|
250
229
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
if (typeof oldVal === 'object')
|
|
255
|
-
node = oldVal;
|
|
256
|
-
else {
|
|
257
|
-
node = node[uCode] = {}
|
|
258
|
-
if (oldVal !== undefined)
|
|
259
|
-
node[DEF_CHAR] = oldVal
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
// Set the leaf to given dbcsCode.
|
|
264
|
-
uCode = seq[seq.length-1];
|
|
265
|
-
node[uCode] = dbcsCode;
|
|
230
|
+
// Set the leaf to given dbcsCode.
|
|
231
|
+
uCode = seq[seq.length - 1]
|
|
232
|
+
node[uCode] = dbcsCode
|
|
266
233
|
}
|
|
267
234
|
|
|
268
|
-
DBCSCodec.prototype._fillEncodeTable = function(nodeIdx, prefix, skipEncodeChars) {
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
}
|
|
290
|
-
} else if (uCode <= SEQ_START) {
|
|
291
|
-
this._setEncodeSequence(this.decodeTableSeq[SEQ_START - uCode], mbCode);
|
|
292
|
-
hasValues = true;
|
|
293
|
-
}
|
|
235
|
+
DBCSCodec.prototype._fillEncodeTable = function (nodeIdx, prefix, skipEncodeChars) {
|
|
236
|
+
var node = this.decodeTables[nodeIdx]
|
|
237
|
+
var hasValues = false
|
|
238
|
+
var subNodeEmpty = {}
|
|
239
|
+
for (var i = 0; i < 0x100; i++) {
|
|
240
|
+
var uCode = node[i]
|
|
241
|
+
var mbCode = prefix + i
|
|
242
|
+
if (skipEncodeChars[mbCode]) { continue }
|
|
243
|
+
|
|
244
|
+
if (uCode >= 0) {
|
|
245
|
+
this._setEncodeChar(uCode, mbCode)
|
|
246
|
+
hasValues = true
|
|
247
|
+
} else if (uCode <= NODE_START) {
|
|
248
|
+
var subNodeIdx = NODE_START - uCode
|
|
249
|
+
if (!subNodeEmpty[subNodeIdx]) { // Skip empty subtrees (they are too large in gb18030).
|
|
250
|
+
var newPrefix = (mbCode << 8) >>> 0 // NOTE: '>>> 0' keeps 32-bit num positive.
|
|
251
|
+
if (this._fillEncodeTable(subNodeIdx, newPrefix, skipEncodeChars)) { hasValues = true } else { subNodeEmpty[subNodeIdx] = true }
|
|
252
|
+
}
|
|
253
|
+
} else if (uCode <= SEQ_START) {
|
|
254
|
+
this._setEncodeSequence(this.decodeTableSeq[SEQ_START - uCode], mbCode)
|
|
255
|
+
hasValues = true
|
|
294
256
|
}
|
|
295
|
-
|
|
257
|
+
}
|
|
258
|
+
return hasValues
|
|
296
259
|
}
|
|
297
260
|
|
|
298
|
-
|
|
299
|
-
|
|
300
261
|
// == Encoder ==================================================================
|
|
301
262
|
|
|
302
|
-
function DBCSEncoder(options, codec) {
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
263
|
+
function DBCSEncoder (options, codec) {
|
|
264
|
+
// Encoder state
|
|
265
|
+
this.leadSurrogate = -1
|
|
266
|
+
this.seqObj = undefined
|
|
267
|
+
|
|
268
|
+
// Static data
|
|
269
|
+
this.encodeTable = codec.encodeTable
|
|
270
|
+
this.encodeTableSeq = codec.encodeTableSeq
|
|
271
|
+
this.defaultCharSingleByte = codec.defCharSB
|
|
272
|
+
this.gb18030 = codec.gb18030
|
|
312
273
|
}
|
|
313
274
|
|
|
314
|
-
DBCSEncoder.prototype.write = function(str) {
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
275
|
+
DBCSEncoder.prototype.write = function (str) {
|
|
276
|
+
var newBuf = Buffer.alloc(str.length * (this.gb18030 ? 4 : 3))
|
|
277
|
+
var leadSurrogate = this.leadSurrogate
|
|
278
|
+
var seqObj = this.seqObj
|
|
279
|
+
var nextChar = -1
|
|
280
|
+
var i = 0; var j = 0
|
|
281
|
+
|
|
282
|
+
while (true) {
|
|
283
|
+
// 0. Get next character.
|
|
284
|
+
if (nextChar === -1) {
|
|
285
|
+
if (i == str.length) break
|
|
286
|
+
var uCode = str.charCodeAt(i++)
|
|
287
|
+
} else {
|
|
288
|
+
var uCode = nextChar
|
|
289
|
+
nextChar = -1
|
|
290
|
+
}
|
|
330
291
|
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
}
|
|
342
|
-
} else { // We've got trail surrogate.
|
|
343
|
-
if (leadSurrogate !== -1) {
|
|
344
|
-
uCode = 0x10000 + (leadSurrogate - 0xD800) * 0x400 + (uCode - 0xDC00);
|
|
345
|
-
leadSurrogate = -1;
|
|
346
|
-
} else {
|
|
347
|
-
// Incomplete surrogate pair - only trail surrogate found.
|
|
348
|
-
uCode = UNASSIGNED;
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
}
|
|
292
|
+
// 1. Handle surrogates.
|
|
293
|
+
if (uCode >= 0xD800 && uCode < 0xE000) { // Char is one of surrogates.
|
|
294
|
+
if (uCode < 0xDC00) { // We've got lead surrogate.
|
|
295
|
+
if (leadSurrogate === -1) {
|
|
296
|
+
leadSurrogate = uCode
|
|
297
|
+
continue
|
|
298
|
+
} else {
|
|
299
|
+
leadSurrogate = uCode
|
|
300
|
+
// Double lead surrogate found.
|
|
301
|
+
uCode = UNASSIGNED
|
|
352
302
|
}
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
303
|
+
} else { // We've got trail surrogate.
|
|
304
|
+
if (leadSurrogate !== -1) {
|
|
305
|
+
uCode = 0x10000 + (leadSurrogate - 0xD800) * 0x400 + (uCode - 0xDC00)
|
|
306
|
+
leadSurrogate = -1
|
|
307
|
+
} else {
|
|
308
|
+
// Incomplete surrogate pair - only trail surrogate found.
|
|
309
|
+
uCode = UNASSIGNED
|
|
357
310
|
}
|
|
311
|
+
}
|
|
312
|
+
} else if (leadSurrogate !== -1) {
|
|
313
|
+
// Incomplete surrogate pair - only lead surrogate found.
|
|
314
|
+
nextChar = uCode; uCode = UNASSIGNED // Write an error, then current char.
|
|
315
|
+
leadSurrogate = -1
|
|
316
|
+
}
|
|
358
317
|
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
// TODO: What if we have no default? (resCode == undefined)
|
|
380
|
-
// Then, we should write first char of the sequence as-is and try the rest recursively.
|
|
381
|
-
// Didn't do it for now because no encoding has this situation yet.
|
|
382
|
-
// Currently, just skip the sequence and write current char.
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
seqObj = undefined;
|
|
318
|
+
// 2. Convert uCode character.
|
|
319
|
+
var dbcsCode = UNASSIGNED
|
|
320
|
+
if (seqObj !== undefined && uCode != UNASSIGNED) { // We are in the middle of the sequence
|
|
321
|
+
var resCode = seqObj[uCode]
|
|
322
|
+
if (typeof resCode === "object") { // Sequence continues.
|
|
323
|
+
seqObj = resCode
|
|
324
|
+
continue
|
|
325
|
+
} else if (typeof resCode === "number") { // Sequence finished. Write it.
|
|
326
|
+
dbcsCode = resCode
|
|
327
|
+
} else if (resCode == undefined) { // Current character is not part of the sequence.
|
|
328
|
+
// Try default character for this sequence
|
|
329
|
+
resCode = seqObj[DEF_CHAR]
|
|
330
|
+
if (resCode !== undefined) {
|
|
331
|
+
dbcsCode = resCode // Found. Write it.
|
|
332
|
+
nextChar = uCode // Current character will be written too in the next iteration.
|
|
333
|
+
} else {
|
|
334
|
+
// TODO: What if we have no default? (resCode == undefined)
|
|
335
|
+
// Then, we should write first char of the sequence as-is and try the rest recursively.
|
|
336
|
+
// Didn't do it for now because no encoding has this situation yet.
|
|
337
|
+
// Currently, just skip the sequence and write current char.
|
|
386
338
|
}
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
}
|
|
339
|
+
}
|
|
340
|
+
seqObj = undefined
|
|
341
|
+
} else if (uCode >= 0) { // Regular character
|
|
342
|
+
var subtable = this.encodeTable[uCode >> 8]
|
|
343
|
+
if (subtable !== undefined) { dbcsCode = subtable[uCode & 0xFF] }
|
|
344
|
+
|
|
345
|
+
if (dbcsCode <= SEQ_START) { // Sequence start
|
|
346
|
+
seqObj = this.encodeTableSeq[SEQ_START - dbcsCode]
|
|
347
|
+
continue
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
if (dbcsCode == UNASSIGNED && this.gb18030) {
|
|
351
|
+
// Use GB18030 algorithm to find character(s) to write.
|
|
352
|
+
var idx = findIdx(this.gb18030.uChars, uCode)
|
|
353
|
+
if (idx != -1) {
|
|
354
|
+
var dbcsCode = this.gb18030.gbChars[idx] + (uCode - this.gb18030.uChars[idx])
|
|
355
|
+
newBuf[j++] = 0x81 + Math.floor(dbcsCode / 12600); dbcsCode = dbcsCode % 12600
|
|
356
|
+
newBuf[j++] = 0x30 + Math.floor(dbcsCode / 1260); dbcsCode = dbcsCode % 1260
|
|
357
|
+
newBuf[j++] = 0x81 + Math.floor(dbcsCode / 10); dbcsCode = dbcsCode % 10
|
|
358
|
+
newBuf[j++] = 0x30 + dbcsCode
|
|
359
|
+
continue
|
|
409
360
|
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
410
363
|
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
newBuf[j++] = (dbcsCode >>> 16) & 0xFF;
|
|
429
|
-
newBuf[j++] = (dbcsCode >>> 8) & 0xFF;
|
|
430
|
-
newBuf[j++] = dbcsCode & 0xFF;
|
|
431
|
-
}
|
|
364
|
+
// 3. Write dbcsCode character.
|
|
365
|
+
if (dbcsCode === UNASSIGNED) { dbcsCode = this.defaultCharSingleByte }
|
|
366
|
+
|
|
367
|
+
if (dbcsCode < 0x100) {
|
|
368
|
+
newBuf[j++] = dbcsCode
|
|
369
|
+
} else if (dbcsCode < 0x10000) {
|
|
370
|
+
newBuf[j++] = dbcsCode >> 8 // high byte
|
|
371
|
+
newBuf[j++] = dbcsCode & 0xFF // low byte
|
|
372
|
+
} else if (dbcsCode < 0x1000000) {
|
|
373
|
+
newBuf[j++] = dbcsCode >> 16
|
|
374
|
+
newBuf[j++] = (dbcsCode >> 8) & 0xFF
|
|
375
|
+
newBuf[j++] = dbcsCode & 0xFF
|
|
376
|
+
} else {
|
|
377
|
+
newBuf[j++] = dbcsCode >>> 24
|
|
378
|
+
newBuf[j++] = (dbcsCode >>> 16) & 0xFF
|
|
379
|
+
newBuf[j++] = (dbcsCode >>> 8) & 0xFF
|
|
380
|
+
newBuf[j++] = dbcsCode & 0xFF
|
|
432
381
|
}
|
|
382
|
+
}
|
|
433
383
|
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
384
|
+
this.seqObj = seqObj
|
|
385
|
+
this.leadSurrogate = leadSurrogate
|
|
386
|
+
return newBuf.slice(0, j)
|
|
437
387
|
}
|
|
438
388
|
|
|
439
|
-
DBCSEncoder.prototype.end = function() {
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
} else {
|
|
456
|
-
// See todo above.
|
|
457
|
-
}
|
|
458
|
-
this.seqObj = undefined;
|
|
389
|
+
DBCSEncoder.prototype.end = function () {
|
|
390
|
+
if (this.leadSurrogate === -1 && this.seqObj === undefined) { return } // All clean. Most often case.
|
|
391
|
+
|
|
392
|
+
var newBuf = Buffer.alloc(10); var j = 0
|
|
393
|
+
|
|
394
|
+
if (this.seqObj) { // We're in the sequence.
|
|
395
|
+
var dbcsCode = this.seqObj[DEF_CHAR]
|
|
396
|
+
if (dbcsCode !== undefined) { // Write beginning of the sequence.
|
|
397
|
+
if (dbcsCode < 0x100) {
|
|
398
|
+
newBuf[j++] = dbcsCode
|
|
399
|
+
} else {
|
|
400
|
+
newBuf[j++] = dbcsCode >> 8 // high byte
|
|
401
|
+
newBuf[j++] = dbcsCode & 0xFF // low byte
|
|
402
|
+
}
|
|
403
|
+
} else {
|
|
404
|
+
// See todo above.
|
|
459
405
|
}
|
|
406
|
+
this.seqObj = undefined
|
|
407
|
+
}
|
|
460
408
|
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
409
|
+
if (this.leadSurrogate !== -1) {
|
|
410
|
+
// Incomplete surrogate pair - only lead surrogate found.
|
|
411
|
+
newBuf[j++] = this.defaultCharSingleByte
|
|
412
|
+
this.leadSurrogate = -1
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
return newBuf.slice(0, j)
|
|
468
416
|
}
|
|
469
417
|
|
|
470
418
|
// Export for testing
|
|
471
|
-
DBCSEncoder.prototype.findIdx = findIdx
|
|
472
|
-
|
|
419
|
+
DBCSEncoder.prototype.findIdx = findIdx
|
|
473
420
|
|
|
474
421
|
// == Decoder ==================================================================
|
|
475
422
|
|
|
476
|
-
function DBCSDecoder(options, codec) {
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
423
|
+
function DBCSDecoder (options, codec) {
|
|
424
|
+
// Decoder state
|
|
425
|
+
this.nodeIdx = 0
|
|
426
|
+
this.prevBytes = []
|
|
480
427
|
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
428
|
+
// Static data
|
|
429
|
+
this.decodeTables = codec.decodeTables
|
|
430
|
+
this.decodeTableSeq = codec.decodeTableSeq
|
|
431
|
+
this.defaultCharUnicode = codec.defaultCharUnicode
|
|
432
|
+
this.gb18030 = codec.gb18030
|
|
486
433
|
}
|
|
487
434
|
|
|
488
|
-
DBCSDecoder.prototype.write = function(buf) {
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
(
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
uCode -= 0x10000;
|
|
540
|
-
var uCodeLead = 0xD800 | (uCode >> 10);
|
|
541
|
-
newBuf[j++] = uCodeLead & 0xFF;
|
|
542
|
-
newBuf[j++] = uCodeLead >> 8;
|
|
543
|
-
|
|
544
|
-
uCode = 0xDC00 | (uCode & 0x3FF);
|
|
545
|
-
}
|
|
546
|
-
newBuf[j++] = uCode & 0xFF;
|
|
547
|
-
newBuf[j++] = uCode >> 8;
|
|
548
|
-
|
|
549
|
-
// Reset trie node.
|
|
550
|
-
nodeIdx = 0; seqStart = i+1;
|
|
435
|
+
DBCSDecoder.prototype.write = function (buf) {
|
|
436
|
+
var newBuf = Buffer.alloc(buf.length * 2)
|
|
437
|
+
var nodeIdx = this.nodeIdx
|
|
438
|
+
var prevBytes = this.prevBytes; var prevOffset = this.prevBytes.length
|
|
439
|
+
var seqStart = -this.prevBytes.length // idx of the start of current parsed sequence.
|
|
440
|
+
var uCode
|
|
441
|
+
|
|
442
|
+
for (var i = 0, j = 0; i < buf.length; i++) {
|
|
443
|
+
var curByte = (i >= 0) ? buf[i] : prevBytes[i + prevOffset]
|
|
444
|
+
|
|
445
|
+
// Lookup in current trie node.
|
|
446
|
+
var uCode = this.decodeTables[nodeIdx][curByte]
|
|
447
|
+
|
|
448
|
+
if (uCode >= 0) {
|
|
449
|
+
// Normal character, just use it.
|
|
450
|
+
} else if (uCode === UNASSIGNED) { // Unknown char.
|
|
451
|
+
// TODO: Callback with seq.
|
|
452
|
+
uCode = this.defaultCharUnicode.charCodeAt(0)
|
|
453
|
+
i = seqStart // Skip one byte ('i' will be incremented by the for loop) and try to parse again.
|
|
454
|
+
} else if (uCode === GB18030_CODE) {
|
|
455
|
+
if (i >= 3) {
|
|
456
|
+
var ptr = (buf[i - 3] - 0x81) * 12600 + (buf[i - 2] - 0x30) * 1260 + (buf[i - 1] - 0x81) * 10 + (curByte - 0x30)
|
|
457
|
+
} else {
|
|
458
|
+
var ptr = (prevBytes[i - 3 + prevOffset] - 0x81) * 12600 +
|
|
459
|
+
(((i - 2 >= 0) ? buf[i - 2] : prevBytes[i - 2 + prevOffset]) - 0x30) * 1260 +
|
|
460
|
+
(((i - 1 >= 0) ? buf[i - 1] : prevBytes[i - 1 + prevOffset]) - 0x81) * 10 +
|
|
461
|
+
(curByte - 0x30)
|
|
462
|
+
}
|
|
463
|
+
var idx = findIdx(this.gb18030.gbChars, ptr)
|
|
464
|
+
uCode = this.gb18030.uChars[idx] + ptr - this.gb18030.gbChars[idx]
|
|
465
|
+
} else if (uCode <= NODE_START) { // Go to next trie node.
|
|
466
|
+
nodeIdx = NODE_START - uCode
|
|
467
|
+
continue
|
|
468
|
+
} else if (uCode <= SEQ_START) { // Output a sequence of chars.
|
|
469
|
+
var seq = this.decodeTableSeq[SEQ_START - uCode]
|
|
470
|
+
for (var k = 0; k < seq.length - 1; k++) {
|
|
471
|
+
uCode = seq[k]
|
|
472
|
+
newBuf[j++] = uCode & 0xFF
|
|
473
|
+
newBuf[j++] = uCode >> 8
|
|
474
|
+
}
|
|
475
|
+
uCode = seq[seq.length - 1]
|
|
476
|
+
} else { throw new Error("iconv-lite internal error: invalid decoding table value " + uCode + " at " + nodeIdx + "/" + curByte) }
|
|
477
|
+
|
|
478
|
+
// Write the character to buffer, handling higher planes using surrogate pair.
|
|
479
|
+
if (uCode >= 0x10000) {
|
|
480
|
+
uCode -= 0x10000
|
|
481
|
+
var uCodeLead = 0xD800 | (uCode >> 10)
|
|
482
|
+
newBuf[j++] = uCodeLead & 0xFF
|
|
483
|
+
newBuf[j++] = uCodeLead >> 8
|
|
484
|
+
|
|
485
|
+
uCode = 0xDC00 | (uCode & 0x3FF)
|
|
551
486
|
}
|
|
487
|
+
newBuf[j++] = uCode & 0xFF
|
|
488
|
+
newBuf[j++] = uCode >> 8
|
|
489
|
+
|
|
490
|
+
// Reset trie node.
|
|
491
|
+
nodeIdx = 0; seqStart = i + 1
|
|
492
|
+
}
|
|
552
493
|
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
494
|
+
this.nodeIdx = nodeIdx
|
|
495
|
+
this.prevBytes = (seqStart >= 0)
|
|
496
|
+
? Array.prototype.slice.call(buf, seqStart)
|
|
497
|
+
: prevBytes.slice(seqStart + prevOffset).concat(Array.prototype.slice.call(buf))
|
|
557
498
|
|
|
558
|
-
|
|
499
|
+
return newBuf.slice(0, j).toString("ucs2")
|
|
559
500
|
}
|
|
560
501
|
|
|
561
|
-
DBCSDecoder.prototype.end = function() {
|
|
562
|
-
|
|
502
|
+
DBCSDecoder.prototype.end = function () {
|
|
503
|
+
var ret = ""
|
|
563
504
|
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
505
|
+
// Try to parse all remaining chars.
|
|
506
|
+
while (this.prevBytes.length > 0) {
|
|
507
|
+
// Skip 1 character in the buffer.
|
|
508
|
+
ret += this.defaultCharUnicode
|
|
509
|
+
var bytesArr = this.prevBytes.slice(1)
|
|
569
510
|
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
}
|
|
511
|
+
// Parse remaining as usual.
|
|
512
|
+
this.prevBytes = []
|
|
513
|
+
this.nodeIdx = 0
|
|
514
|
+
if (bytesArr.length > 0) { ret += this.write(bytesArr) }
|
|
515
|
+
}
|
|
576
516
|
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
517
|
+
this.prevBytes = []
|
|
518
|
+
this.nodeIdx = 0
|
|
519
|
+
return ret
|
|
580
520
|
}
|
|
581
521
|
|
|
582
522
|
// Binary search for GB18030. Returns largest i such that table[i] <= val.
|
|
583
|
-
function findIdx(table, val) {
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
else
|
|
593
|
-
r = mid;
|
|
594
|
-
}
|
|
595
|
-
return l;
|
|
523
|
+
function findIdx (table, val) {
|
|
524
|
+
if (table[0] > val) { return -1 }
|
|
525
|
+
|
|
526
|
+
var l = 0; var r = table.length
|
|
527
|
+
while (l < r - 1) { // always table[l] <= val < table[r]
|
|
528
|
+
var mid = l + ((r - l + 1) >> 1)
|
|
529
|
+
if (table[mid] <= val) { l = mid } else { r = mid }
|
|
530
|
+
}
|
|
531
|
+
return l
|
|
596
532
|
}
|
|
597
|
-
|