@cantoo/fontkit 2.0.5 → 2.0.7
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/browser-module.d.ts +239 -0
- package/dist/browser-module.mjs +4423 -1117
- package/dist/browser-module.mjs.map +1 -1
- package/dist/browser.cjs +4424 -1117
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.d.ts +239 -0
- package/dist/fontkit.umd.d.ts +239 -0
- package/dist/fontkit.umd.js +22076 -0
- package/dist/fontkit.umd.js.map +7 -0
- package/dist/index.d.ts +239 -0
- package/dist/main.cjs +4424 -1117
- package/dist/main.cjs.map +1 -1
- package/dist/main.d.ts +239 -0
- package/dist/module.d.ts +239 -0
- package/dist/module.mjs +4423 -1117
- package/dist/module.mjs.map +1 -1
- package/package.json +22 -5
- package/src/CmapProcessor.js +59 -20
- package/src/DFont.js +114 -14
- package/src/TTFFont.js +259 -57
- package/src/TrueTypeCollection.js +54 -10
- package/src/WOFF2Font.js +128 -16
- package/src/WOFFFont.js +45 -8
- package/src/aat/AATFeatureMap.js +62 -18
- package/src/aat/AATLayoutEngine.js +33 -1
- package/src/aat/AATLookupTable.js +22 -4
- package/src/aat/AATMorxProcessor.js +189 -52
- package/src/aat/AATStateMachine.js +32 -0
- package/src/base.js +19 -0
- package/src/cff/CFFCharsets.js +3 -0
- package/src/cff/CFFDict.js +79 -9
- package/src/cff/CFFEncodings.js +2 -0
- package/src/cff/CFFFont.js +119 -23
- package/src/cff/CFFIndex.js +62 -5
- package/src/cff/CFFOperand.js +52 -17
- package/src/cff/CFFPointer.js +41 -2
- package/src/cff/CFFPrivateDict.js +14 -4
- package/src/cff/CFFStandardStrings.js +1 -0
- package/src/cff/CFFTop.js +103 -10
- package/src/decorators.js +32 -13
- package/src/encodings.js +22 -5
- package/src/fs.js +10 -0
- package/src/glyph/BBox.js +14 -0
- package/src/glyph/CFFGlyph.js +290 -148
- package/src/glyph/COLRGlyph.js +38 -3
- package/src/glyph/Glyph.js +68 -9
- package/src/glyph/GlyphVariationProcessor.js +135 -34
- package/src/glyph/Path.js +107 -20
- package/src/glyph/SBIXGlyph.js +57 -8
- package/src/glyph/StandardNames.js +1 -0
- package/src/glyph/TTFGlyph.js +176 -29
- package/src/glyph/TTFGlyphEncoder.js +32 -0
- package/src/glyph/WOFF2Glyph.js +23 -4
- package/src/layout/GlyphPosition.js +6 -0
- package/src/layout/GlyphRun.js +25 -7
- package/src/layout/KernProcessor.js +62 -3
- package/src/layout/LayoutEngine.js +86 -12
- package/src/layout/Script.js +27 -1
- package/src/layout/UnicodeLayoutEngine.js +29 -4
- package/src/opentype/GPOSProcessor.js +156 -45
- package/src/opentype/GSUBProcessor.js +92 -33
- package/src/opentype/GlyphInfo.js +52 -4
- package/src/opentype/GlyphIterator.js +51 -2
- package/src/opentype/OTLayoutEngine.js +66 -8
- package/src/opentype/OTProcessor.js +283 -70
- package/src/opentype/ShapingPlan.js +51 -3
- package/src/opentype/shapers/ArabicShaper.js +19 -0
- package/src/opentype/shapers/DefaultShaper.js +51 -7
- package/src/opentype/shapers/HangulShaper.js +85 -7
- package/src/opentype/shapers/HebrewShaper.js +45 -11
- package/src/opentype/shapers/IndicShaper.js +141 -26
- package/src/opentype/shapers/ThaiShaper.js +35 -4
- package/src/opentype/shapers/UniversalShaper.js +83 -17
- package/src/opentype/shapers/index.js +15 -2
- package/src/packages/unicode-properties/data-trie.js +1 -0
- package/src/packages/unicode-properties/data.js +12 -0
- package/src/packages/unicode-properties/dist/index.cjs +22 -9
- package/src/packages/unicode-properties/dist/index.cjs.map +2 -2
- package/src/packages/unicode-properties/dist/index.mjs +21 -9
- package/src/packages/unicode-properties/dist/index.mjs.map +2 -2
- package/src/packages/unicode-properties/index.js +65 -0
- package/src/packages/unicode-properties/package.json +1 -1
- package/src/packages/unicode-trie/builder.js +128 -7
- package/src/packages/unicode-trie/dist/builder.cjs +129 -16
- package/src/packages/unicode-trie/dist/builder.cjs.map +2 -2
- package/src/packages/unicode-trie/dist/builder.mjs +128 -16
- package/src/packages/unicode-trie/dist/builder.mjs.map +2 -2
- package/src/packages/unicode-trie/dist/index.cjs +22 -9
- package/src/packages/unicode-trie/dist/index.cjs.map +2 -2
- package/src/packages/unicode-trie/dist/index.mjs +21 -9
- package/src/packages/unicode-trie/dist/index.mjs.map +2 -2
- package/src/packages/unicode-trie/index.js +62 -10
- package/src/packages/unicode-trie/package.json +1 -1
- package/src/packages/unicode-trie/swap.js +13 -0
- package/src/subset/CFFSubset.js +112 -22
- package/src/subset/Subset.js +21 -1
- package/src/subset/TTFSubset.js +79 -36
- package/src/tables/BASE.js +1 -0
- package/src/tables/COLR.js +1 -0
- package/src/tables/CPAL.js +1 -0
- package/src/tables/DSIG.js +1 -0
- package/src/tables/EBDT.js +10 -3
- package/src/tables/EBLC.js +67 -7
- package/src/tables/GDEF.js +1 -0
- package/src/tables/GPOS.js +79 -16
- package/src/tables/GSUB.js +14 -3
- package/src/tables/HVAR.js +51 -5
- package/src/tables/JSTF.js +3 -2
- package/src/tables/LTSH.js +1 -0
- package/src/tables/OS2.js +1 -0
- package/src/tables/PCLT.js +1 -0
- package/src/tables/STAT.js +46 -6
- package/src/tables/VDMX.js +1 -0
- package/src/tables/VORG.js +1 -0
- package/src/tables/WOFF2Directory.js +56 -8
- package/src/tables/WOFFDirectory.js +14 -2
- package/src/tables/aat.js +160 -35
- package/src/tables/avar.js +1 -0
- package/src/tables/bsln.js +3 -2
- package/src/tables/cmap.js +26 -6
- package/src/tables/cvt.js +1 -0
- package/src/tables/directory.js +44 -16
- package/src/tables/feat.js +24 -2
- package/src/tables/fpgm.js +1 -0
- package/src/tables/fvar.js +32 -4
- package/src/tables/gasp.js +1 -0
- package/src/tables/glyf.js +1 -0
- package/src/tables/gvar.js +29 -2
- package/src/tables/hdmx.js +12 -1
- package/src/tables/head.js +1 -0
- package/src/tables/hhea.js +1 -0
- package/src/tables/hmtx.js +18 -2
- package/src/tables/index.js +1 -0
- package/src/tables/just.js +15 -4
- package/src/tables/kern.js +43 -6
- package/src/tables/loca.js +21 -8
- package/src/tables/maxp.js +1 -0
- package/src/tables/morx.js +14 -7
- package/src/tables/name.js +104 -23
- package/src/tables/opbd.js +2 -1
- package/src/tables/opentype.js +39 -4
- package/src/tables/post.js +8 -1
- package/src/tables/prep.js +1 -0
- package/src/tables/sbix.js +12 -1
- package/src/tables/variations.js +23 -3
- package/src/tables/vhea.js +1 -0
- package/src/tables/vmtx.js +18 -2
- package/src/utils.js +15 -0
- package/types/assets.d.ts +13 -0
- package/types/deps.d.ts +83 -0
- package/types/fontkit.d.ts +1324 -0
- package/types/index.d.ts +239 -0
- package/types/restructure.d.ts +354 -0
|
@@ -139,6 +139,13 @@ const INDEX_2_START_OFFSET = INDEX_2_NULL_OFFSET + INDEX_2_BLOCK_LENGTH;
|
|
|
139
139
|
// (0x110000>>SHIFT_2)+UTF8_2B_INDEX_2_LENGTH+MAX_INDEX_1_LENGTH.)
|
|
140
140
|
const MAX_INDEX_LENGTH = 0xffff;
|
|
141
141
|
|
|
142
|
+
/**
|
|
143
|
+
* @param {ArrayLike<number>} a
|
|
144
|
+
* @param {number} s
|
|
145
|
+
* @param {number} t
|
|
146
|
+
* @param {number} length
|
|
147
|
+
* @returns {boolean}
|
|
148
|
+
*/
|
|
142
149
|
const equal_int = (a, s, t, length) => {
|
|
143
150
|
for (let i = 0; i < length; i++) {
|
|
144
151
|
if (a[s + i] !== a[t + i]) {
|
|
@@ -150,24 +157,37 @@ const equal_int = (a, s, t, length) => {
|
|
|
150
157
|
};
|
|
151
158
|
|
|
152
159
|
class UnicodeTrieBuilder {
|
|
160
|
+
/**
|
|
161
|
+
* @param {number} [initialValue=0]
|
|
162
|
+
* @param {number} [errorValue=0]
|
|
163
|
+
*/
|
|
153
164
|
constructor(initialValue, errorValue) {
|
|
154
165
|
let i, j;
|
|
155
166
|
if (initialValue == null) {
|
|
156
167
|
initialValue = 0;
|
|
157
168
|
}
|
|
169
|
+
/** @type {number} */
|
|
158
170
|
this.initialValue = initialValue;
|
|
159
171
|
if (errorValue == null) {
|
|
160
172
|
errorValue = 0;
|
|
161
173
|
}
|
|
174
|
+
/** @type {number} */
|
|
162
175
|
this.errorValue = errorValue;
|
|
176
|
+
/** @type {Int32Array} */
|
|
163
177
|
this.index1 = new Int32Array(INDEX_1_LENGTH);
|
|
178
|
+
/** @type {Int32Array} */
|
|
164
179
|
this.index2 = new Int32Array(MAX_INDEX_2_LENGTH);
|
|
180
|
+
/** @type {number} */
|
|
165
181
|
this.highStart = 0x110000;
|
|
166
182
|
|
|
183
|
+
/** @type {Uint32Array} */
|
|
167
184
|
this.data = new Uint32Array(INITIAL_DATA_LENGTH);
|
|
185
|
+
/** @type {number} */
|
|
168
186
|
this.dataCapacity = INITIAL_DATA_LENGTH;
|
|
169
187
|
|
|
188
|
+
/** @type {number} */
|
|
170
189
|
this.firstFreeBlock = 0;
|
|
190
|
+
/** @type {boolean} */
|
|
171
191
|
this.isCompacted = false;
|
|
172
192
|
|
|
173
193
|
// Multi-purpose per-data-block table.
|
|
@@ -183,6 +203,7 @@ class UnicodeTrieBuilder {
|
|
|
183
203
|
//
|
|
184
204
|
// Map of adjusted indexes, used in compactData() and compactIndex2().
|
|
185
205
|
// Maps from original indexes to new ones.
|
|
206
|
+
/** @type {Int32Array} */
|
|
186
207
|
this.map = new Int32Array(MAX_DATA_LENGTH_BUILDTIME >> SHIFT_2);
|
|
187
208
|
|
|
188
209
|
for (i = 0; i < 0x80; i++) {
|
|
@@ -197,7 +218,9 @@ class UnicodeTrieBuilder {
|
|
|
197
218
|
this.data[i] = this.initialValue;
|
|
198
219
|
}
|
|
199
220
|
|
|
221
|
+
/** @type {number} */
|
|
200
222
|
this.dataNullOffset = DATA_NULL_OFFSET;
|
|
223
|
+
/** @type {number} */
|
|
201
224
|
this.dataLength = NEW_DATA_START_OFFSET;
|
|
202
225
|
|
|
203
226
|
// set the index-2 indexes for the 2=0x80>>SHIFT_2 ASCII data blocks
|
|
@@ -239,7 +262,9 @@ class UnicodeTrieBuilder {
|
|
|
239
262
|
this.index2[INDEX_2_NULL_OFFSET + i] = DATA_NULL_OFFSET;
|
|
240
263
|
}
|
|
241
264
|
|
|
265
|
+
/** @type {number} */
|
|
242
266
|
this.index2NullOffset = INDEX_2_NULL_OFFSET;
|
|
267
|
+
/** @type {number} */
|
|
243
268
|
this.index2Length = INDEX_2_START_OFFSET;
|
|
244
269
|
|
|
245
270
|
// set the index-1 indexes for the linear index-2 block
|
|
@@ -262,6 +287,11 @@ class UnicodeTrieBuilder {
|
|
|
262
287
|
}
|
|
263
288
|
}
|
|
264
289
|
|
|
290
|
+
/**
|
|
291
|
+
* @param {number} codePoint
|
|
292
|
+
* @param {number} value
|
|
293
|
+
* @returns {this}
|
|
294
|
+
*/
|
|
265
295
|
set(codePoint, value) {
|
|
266
296
|
if ((codePoint < 0) || (codePoint > 0x10ffff)) {
|
|
267
297
|
throw new Error('Invalid code point');
|
|
@@ -276,6 +306,13 @@ class UnicodeTrieBuilder {
|
|
|
276
306
|
return this;
|
|
277
307
|
}
|
|
278
308
|
|
|
309
|
+
/**
|
|
310
|
+
* @param {number} start
|
|
311
|
+
* @param {number} end
|
|
312
|
+
* @param {number} value
|
|
313
|
+
* @param {boolean} [overwrite=true]
|
|
314
|
+
* @returns {this}
|
|
315
|
+
*/
|
|
279
316
|
setRange(start, end, value, overwrite) {
|
|
280
317
|
let block, repeatBlock;
|
|
281
318
|
if (overwrite == null) {
|
|
@@ -385,6 +422,11 @@ class UnicodeTrieBuilder {
|
|
|
385
422
|
return this;
|
|
386
423
|
}
|
|
387
424
|
|
|
425
|
+
/**
|
|
426
|
+
* @param {number} c
|
|
427
|
+
* @param {boolean} [fromLSCP=true]
|
|
428
|
+
* @returns {number}
|
|
429
|
+
*/
|
|
388
430
|
get(c, fromLSCP) {
|
|
389
431
|
let i2;
|
|
390
432
|
if (fromLSCP == null) {
|
|
@@ -408,6 +450,11 @@ class UnicodeTrieBuilder {
|
|
|
408
450
|
return this.data[block + (c & DATA_MASK)];
|
|
409
451
|
}
|
|
410
452
|
|
|
453
|
+
/**
|
|
454
|
+
* @param {number} c
|
|
455
|
+
* @param {boolean} forLSCP
|
|
456
|
+
* @returns {boolean}
|
|
457
|
+
*/
|
|
411
458
|
_isInNullBlock(c, forLSCP) {
|
|
412
459
|
let i2;
|
|
413
460
|
if (((c & 0xfffffc00) === 0xd800) && forLSCP) {
|
|
@@ -420,6 +467,9 @@ class UnicodeTrieBuilder {
|
|
|
420
467
|
return block === this.dataNullOffset;
|
|
421
468
|
}
|
|
422
469
|
|
|
470
|
+
/**
|
|
471
|
+
* @returns {number}
|
|
472
|
+
*/
|
|
423
473
|
_allocIndex2Block() {
|
|
424
474
|
const newBlock = this.index2Length;
|
|
425
475
|
const newTop = newBlock + INDEX_2_BLOCK_LENGTH;
|
|
@@ -436,6 +486,11 @@ class UnicodeTrieBuilder {
|
|
|
436
486
|
return newBlock;
|
|
437
487
|
}
|
|
438
488
|
|
|
489
|
+
/**
|
|
490
|
+
* @param {number} c
|
|
491
|
+
* @param {boolean} forLSCP
|
|
492
|
+
* @returns {number}
|
|
493
|
+
*/
|
|
439
494
|
_getIndex2Block(c, forLSCP) {
|
|
440
495
|
if ((c >= 0xd800) && (c < 0xdc00) && forLSCP) {
|
|
441
496
|
return LSCP_INDEX_2_OFFSET;
|
|
@@ -451,10 +506,18 @@ class UnicodeTrieBuilder {
|
|
|
451
506
|
return i2;
|
|
452
507
|
}
|
|
453
508
|
|
|
509
|
+
/**
|
|
510
|
+
* @param {number} block
|
|
511
|
+
* @returns {boolean}
|
|
512
|
+
*/
|
|
454
513
|
_isWritableBlock(block) {
|
|
455
514
|
return (block !== this.dataNullOffset) && (this.map[block >> SHIFT_2] === 1);
|
|
456
515
|
}
|
|
457
516
|
|
|
517
|
+
/**
|
|
518
|
+
* @param {number} copyBlock
|
|
519
|
+
* @returns {number}
|
|
520
|
+
*/
|
|
458
521
|
_allocDataBlock(copyBlock) {
|
|
459
522
|
let newBlock;
|
|
460
523
|
if (this.firstFreeBlock !== 0) {
|
|
@@ -493,12 +556,21 @@ class UnicodeTrieBuilder {
|
|
|
493
556
|
return newBlock;
|
|
494
557
|
}
|
|
495
558
|
|
|
559
|
+
/**
|
|
560
|
+
* @param {number} block
|
|
561
|
+
* @returns {void}
|
|
562
|
+
*/
|
|
496
563
|
_releaseDataBlock(block) {
|
|
497
564
|
// put this block at the front of the free-block chain
|
|
498
565
|
this.map[block >> SHIFT_2] = -this.firstFreeBlock;
|
|
499
566
|
this.firstFreeBlock = block;
|
|
500
567
|
}
|
|
501
568
|
|
|
569
|
+
/**
|
|
570
|
+
* @param {number} i2
|
|
571
|
+
* @param {number} block
|
|
572
|
+
* @returns {void}
|
|
573
|
+
*/
|
|
502
574
|
_setIndex2Entry(i2, block) {
|
|
503
575
|
++this.map[block >> SHIFT_2]; // increment first, in case block == oldBlock!
|
|
504
576
|
const oldBlock = this.index2[i2];
|
|
@@ -509,6 +581,11 @@ class UnicodeTrieBuilder {
|
|
|
509
581
|
this.index2[i2] = block;
|
|
510
582
|
}
|
|
511
583
|
|
|
584
|
+
/**
|
|
585
|
+
* @param {number} c
|
|
586
|
+
* @param {boolean} forLSCP
|
|
587
|
+
* @returns {number}
|
|
588
|
+
*/
|
|
512
589
|
_getDataBlock(c, forLSCP) {
|
|
513
590
|
let i2 = this._getIndex2Block(c, forLSCP);
|
|
514
591
|
i2 += (c >> SHIFT_2) & INDEX_2_MASK;
|
|
@@ -524,6 +601,15 @@ class UnicodeTrieBuilder {
|
|
|
524
601
|
return newBlock;
|
|
525
602
|
}
|
|
526
603
|
|
|
604
|
+
/**
|
|
605
|
+
* @param {number} block
|
|
606
|
+
* @param {number} start
|
|
607
|
+
* @param {number} limit
|
|
608
|
+
* @param {number} value
|
|
609
|
+
* @param {number} initialValue
|
|
610
|
+
* @param {boolean} overwrite
|
|
611
|
+
* @returns {void}
|
|
612
|
+
*/
|
|
527
613
|
_fillBlock(block, start, limit, value, initialValue, overwrite) {
|
|
528
614
|
let i;
|
|
529
615
|
if (overwrite) {
|
|
@@ -539,6 +625,11 @@ class UnicodeTrieBuilder {
|
|
|
539
625
|
}
|
|
540
626
|
}
|
|
541
627
|
|
|
628
|
+
/**
|
|
629
|
+
* @param {number} block
|
|
630
|
+
* @param {number} value
|
|
631
|
+
* @returns {void}
|
|
632
|
+
*/
|
|
542
633
|
_writeBlock(block, value) {
|
|
543
634
|
const limit = block + DATA_BLOCK_LENGTH;
|
|
544
635
|
while (block < limit) {
|
|
@@ -546,6 +637,10 @@ class UnicodeTrieBuilder {
|
|
|
546
637
|
}
|
|
547
638
|
}
|
|
548
639
|
|
|
640
|
+
/**
|
|
641
|
+
* @param {number} highValue
|
|
642
|
+
* @returns {number}
|
|
643
|
+
*/
|
|
549
644
|
_findHighStart(highValue) {
|
|
550
645
|
let prevBlock, prevI2Block;
|
|
551
646
|
const data32 = this.data;
|
|
@@ -618,6 +713,12 @@ class UnicodeTrieBuilder {
|
|
|
618
713
|
return 0;
|
|
619
714
|
}
|
|
620
715
|
|
|
716
|
+
/**
|
|
717
|
+
* @param {number} dataLength
|
|
718
|
+
* @param {number} otherBlock
|
|
719
|
+
* @param {number} blockLength
|
|
720
|
+
* @returns {number}
|
|
721
|
+
*/
|
|
621
722
|
_findSameDataBlock(dataLength, otherBlock, blockLength) {
|
|
622
723
|
// ensure that we do not even partially get past dataLength
|
|
623
724
|
dataLength -= blockLength;
|
|
@@ -632,6 +733,11 @@ class UnicodeTrieBuilder {
|
|
|
632
733
|
return -1;
|
|
633
734
|
}
|
|
634
735
|
|
|
736
|
+
/**
|
|
737
|
+
* @param {number} index2Length
|
|
738
|
+
* @param {number} otherBlock
|
|
739
|
+
* @returns {number}
|
|
740
|
+
*/
|
|
635
741
|
_findSameIndex2Block(index2Length, otherBlock) {
|
|
636
742
|
// ensure that we do not even partially get past index2Length
|
|
637
743
|
index2Length -= INDEX_2_BLOCK_LENGTH;
|
|
@@ -644,6 +750,9 @@ class UnicodeTrieBuilder {
|
|
|
644
750
|
return -1;
|
|
645
751
|
}
|
|
646
752
|
|
|
753
|
+
/**
|
|
754
|
+
* @returns {void}
|
|
755
|
+
*/
|
|
647
756
|
_compactData() {
|
|
648
757
|
// do not compact linear-ASCII data
|
|
649
758
|
let newStart = DATA_START_OFFSET;
|
|
@@ -748,6 +857,9 @@ class UnicodeTrieBuilder {
|
|
|
748
857
|
this.dataLength = newStart;
|
|
749
858
|
}
|
|
750
859
|
|
|
860
|
+
/**
|
|
861
|
+
* @returns {void}
|
|
862
|
+
*/
|
|
751
863
|
_compactIndex2() {
|
|
752
864
|
// do not compact linear-BMP index-2 blocks
|
|
753
865
|
let newStart = INDEX_2_BMP_LENGTH;
|
|
@@ -823,6 +935,9 @@ class UnicodeTrieBuilder {
|
|
|
823
935
|
this.index2Length = newStart;
|
|
824
936
|
}
|
|
825
937
|
|
|
938
|
+
/**
|
|
939
|
+
* @returns {void}
|
|
940
|
+
*/
|
|
826
941
|
_compact() {
|
|
827
942
|
// find highStart and round it up
|
|
828
943
|
let highValue = this.get(0x10ffff);
|
|
@@ -857,6 +972,9 @@ class UnicodeTrieBuilder {
|
|
|
857
972
|
this.isCompacted = true;
|
|
858
973
|
}
|
|
859
974
|
|
|
975
|
+
/**
|
|
976
|
+
* @returns {import('./index.js').default}
|
|
977
|
+
*/
|
|
860
978
|
freeze() {
|
|
861
979
|
let allIndexesLength, i;
|
|
862
980
|
if (!this.isCompacted) {
|
|
@@ -928,13 +1046,16 @@ class UnicodeTrieBuilder {
|
|
|
928
1046
|
return dest;
|
|
929
1047
|
}
|
|
930
1048
|
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
1049
|
+
/**
|
|
1050
|
+
* Generates a Buffer containing the serialized and compressed trie.
|
|
1051
|
+
* Trie data is compressed once with raw deflate (a second pass does not help).
|
|
1052
|
+
* Format:
|
|
1053
|
+
* uint32_t highStart;
|
|
1054
|
+
* uint32_t errorValue;
|
|
1055
|
+
* uint32_t uncompressedDataLength;
|
|
1056
|
+
* uint8_t trieData[dataLength];
|
|
1057
|
+
* @returns {Buffer}
|
|
1058
|
+
*/
|
|
938
1059
|
toBuffer() {
|
|
939
1060
|
const trie = this.freeze();
|
|
940
1061
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
var __defProp = Object.defineProperty;
|
|
2
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
@@ -48,6 +49,9 @@ var swap32LE = (array) => {
|
|
|
48
49
|
};
|
|
49
50
|
|
|
50
51
|
// index.js
|
|
52
|
+
function isNodeBuffer(value) {
|
|
53
|
+
return typeof value === "object" && value !== null && "readUInt32BE" in value && "readUInt32LE" in value && "slice" in value && typeof value.readUInt32BE === "function" && typeof value.readUInt32LE === "function" && typeof value.slice === "function";
|
|
54
|
+
}
|
|
51
55
|
var SHIFT_1 = 6 + 5;
|
|
52
56
|
var SHIFT_2 = 5;
|
|
53
57
|
var SHIFT_1_2 = SHIFT_1 - SHIFT_2;
|
|
@@ -65,29 +69,38 @@ var UTF8_2B_INDEX_2_LENGTH = 2048 >> 6;
|
|
|
65
69
|
var INDEX_1_OFFSET = UTF8_2B_INDEX_2_OFFSET + UTF8_2B_INDEX_2_LENGTH;
|
|
66
70
|
var DATA_GRANULARITY = 1 << INDEX_SHIFT;
|
|
67
71
|
var UnicodeTrie = class {
|
|
72
|
+
/**
|
|
73
|
+
* @param {Uint8Array | Buffer | UnicodeTrieInit} data
|
|
74
|
+
*/
|
|
68
75
|
constructor(data) {
|
|
69
|
-
|
|
70
|
-
|
|
76
|
+
if (isNodeBuffer(data) || data instanceof Uint8Array) {
|
|
77
|
+
let bytes;
|
|
71
78
|
let uncompressedLength;
|
|
72
|
-
if (
|
|
79
|
+
if (isNodeBuffer(data)) {
|
|
73
80
|
this.highStart = data.readUInt32LE(0);
|
|
74
81
|
this.errorValue = data.readUInt32LE(4);
|
|
75
82
|
uncompressedLength = data.readUInt32LE(8);
|
|
76
|
-
|
|
83
|
+
bytes = new Uint8Array(data.buffer, data.byteOffset + 12, data.byteLength - 12);
|
|
77
84
|
} else {
|
|
78
85
|
const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
79
86
|
this.highStart = view.getUint32(0, true);
|
|
80
87
|
this.errorValue = view.getUint32(4, true);
|
|
81
88
|
uncompressedLength = view.getUint32(8, true);
|
|
82
|
-
|
|
89
|
+
bytes = data.subarray(12);
|
|
83
90
|
}
|
|
84
|
-
|
|
85
|
-
swap32LE(
|
|
86
|
-
this.data = new Uint32Array(
|
|
91
|
+
bytes = (0, import_fflate.inflateSync)(bytes, { out: new Uint8Array(uncompressedLength) });
|
|
92
|
+
swap32LE(bytes);
|
|
93
|
+
this.data = new Uint32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength >> 2);
|
|
87
94
|
} else {
|
|
88
|
-
|
|
95
|
+
this.data = data.data;
|
|
96
|
+
this.highStart = data.highStart;
|
|
97
|
+
this.errorValue = data.errorValue;
|
|
89
98
|
}
|
|
90
99
|
}
|
|
100
|
+
/**
|
|
101
|
+
* @param {number} codePoint
|
|
102
|
+
* @returns {number}
|
|
103
|
+
*/
|
|
91
104
|
get(codePoint) {
|
|
92
105
|
let index;
|
|
93
106
|
if (codePoint < 0 || codePoint > 1114111) {
|
|
@@ -157,6 +170,10 @@ var equal_int = (a, s, t, length) => {
|
|
|
157
170
|
return true;
|
|
158
171
|
};
|
|
159
172
|
var UnicodeTrieBuilder = class {
|
|
173
|
+
/**
|
|
174
|
+
* @param {number} [initialValue=0]
|
|
175
|
+
* @param {number} [errorValue=0]
|
|
176
|
+
*/
|
|
160
177
|
constructor(initialValue, errorValue) {
|
|
161
178
|
let i, j;
|
|
162
179
|
if (initialValue == null) {
|
|
@@ -222,6 +239,11 @@ var UnicodeTrieBuilder = class {
|
|
|
222
239
|
this.set(i, this.initialValue);
|
|
223
240
|
}
|
|
224
241
|
}
|
|
242
|
+
/**
|
|
243
|
+
* @param {number} codePoint
|
|
244
|
+
* @param {number} value
|
|
245
|
+
* @returns {this}
|
|
246
|
+
*/
|
|
225
247
|
set(codePoint, value) {
|
|
226
248
|
if (codePoint < 0 || codePoint > 1114111) {
|
|
227
249
|
throw new Error("Invalid code point");
|
|
@@ -233,6 +255,13 @@ var UnicodeTrieBuilder = class {
|
|
|
233
255
|
this.data[block + (codePoint & DATA_MASK2)] = value;
|
|
234
256
|
return this;
|
|
235
257
|
}
|
|
258
|
+
/**
|
|
259
|
+
* @param {number} start
|
|
260
|
+
* @param {number} end
|
|
261
|
+
* @param {number} value
|
|
262
|
+
* @param {boolean} [overwrite=true]
|
|
263
|
+
* @returns {this}
|
|
264
|
+
*/
|
|
236
265
|
setRange(start, end, value, overwrite) {
|
|
237
266
|
let block, repeatBlock;
|
|
238
267
|
if (overwrite == null) {
|
|
@@ -300,6 +329,11 @@ var UnicodeTrieBuilder = class {
|
|
|
300
329
|
}
|
|
301
330
|
return this;
|
|
302
331
|
}
|
|
332
|
+
/**
|
|
333
|
+
* @param {number} c
|
|
334
|
+
* @param {boolean} [fromLSCP=true]
|
|
335
|
+
* @returns {number}
|
|
336
|
+
*/
|
|
303
337
|
get(c, fromLSCP) {
|
|
304
338
|
let i2;
|
|
305
339
|
if (fromLSCP == null) {
|
|
@@ -319,6 +353,11 @@ var UnicodeTrieBuilder = class {
|
|
|
319
353
|
const block = this.index2[i2];
|
|
320
354
|
return this.data[block + (c & DATA_MASK2)];
|
|
321
355
|
}
|
|
356
|
+
/**
|
|
357
|
+
* @param {number} c
|
|
358
|
+
* @param {boolean} forLSCP
|
|
359
|
+
* @returns {boolean}
|
|
360
|
+
*/
|
|
322
361
|
_isInNullBlock(c, forLSCP) {
|
|
323
362
|
let i2;
|
|
324
363
|
if ((c & 4294966272) === 55296 && forLSCP) {
|
|
@@ -329,6 +368,9 @@ var UnicodeTrieBuilder = class {
|
|
|
329
368
|
const block = this.index2[i2];
|
|
330
369
|
return block === this.dataNullOffset;
|
|
331
370
|
}
|
|
371
|
+
/**
|
|
372
|
+
* @returns {number}
|
|
373
|
+
*/
|
|
332
374
|
_allocIndex2Block() {
|
|
333
375
|
const newBlock = this.index2Length;
|
|
334
376
|
const newTop = newBlock + INDEX_2_BLOCK_LENGTH2;
|
|
@@ -339,6 +381,11 @@ var UnicodeTrieBuilder = class {
|
|
|
339
381
|
this.index2.set(this.index2.subarray(this.index2NullOffset, this.index2NullOffset + INDEX_2_BLOCK_LENGTH2), newBlock);
|
|
340
382
|
return newBlock;
|
|
341
383
|
}
|
|
384
|
+
/**
|
|
385
|
+
* @param {number} c
|
|
386
|
+
* @param {boolean} forLSCP
|
|
387
|
+
* @returns {number}
|
|
388
|
+
*/
|
|
342
389
|
_getIndex2Block(c, forLSCP) {
|
|
343
390
|
if (c >= 55296 && c < 56320 && forLSCP) {
|
|
344
391
|
return LSCP_INDEX_2_OFFSET2;
|
|
@@ -351,9 +398,17 @@ var UnicodeTrieBuilder = class {
|
|
|
351
398
|
}
|
|
352
399
|
return i2;
|
|
353
400
|
}
|
|
401
|
+
/**
|
|
402
|
+
* @param {number} block
|
|
403
|
+
* @returns {boolean}
|
|
404
|
+
*/
|
|
354
405
|
_isWritableBlock(block) {
|
|
355
406
|
return block !== this.dataNullOffset && this.map[block >> SHIFT_22] === 1;
|
|
356
407
|
}
|
|
408
|
+
/**
|
|
409
|
+
* @param {number} copyBlock
|
|
410
|
+
* @returns {number}
|
|
411
|
+
*/
|
|
357
412
|
_allocDataBlock(copyBlock) {
|
|
358
413
|
let newBlock;
|
|
359
414
|
if (this.firstFreeBlock !== 0) {
|
|
@@ -382,10 +437,19 @@ var UnicodeTrieBuilder = class {
|
|
|
382
437
|
this.map[newBlock >> SHIFT_22] = 0;
|
|
383
438
|
return newBlock;
|
|
384
439
|
}
|
|
440
|
+
/**
|
|
441
|
+
* @param {number} block
|
|
442
|
+
* @returns {void}
|
|
443
|
+
*/
|
|
385
444
|
_releaseDataBlock(block) {
|
|
386
445
|
this.map[block >> SHIFT_22] = -this.firstFreeBlock;
|
|
387
446
|
this.firstFreeBlock = block;
|
|
388
447
|
}
|
|
448
|
+
/**
|
|
449
|
+
* @param {number} i2
|
|
450
|
+
* @param {number} block
|
|
451
|
+
* @returns {void}
|
|
452
|
+
*/
|
|
389
453
|
_setIndex2Entry(i2, block) {
|
|
390
454
|
++this.map[block >> SHIFT_22];
|
|
391
455
|
const oldBlock = this.index2[i2];
|
|
@@ -394,6 +458,11 @@ var UnicodeTrieBuilder = class {
|
|
|
394
458
|
}
|
|
395
459
|
this.index2[i2] = block;
|
|
396
460
|
}
|
|
461
|
+
/**
|
|
462
|
+
* @param {number} c
|
|
463
|
+
* @param {boolean} forLSCP
|
|
464
|
+
* @returns {number}
|
|
465
|
+
*/
|
|
397
466
|
_getDataBlock(c, forLSCP) {
|
|
398
467
|
let i2 = this._getIndex2Block(c, forLSCP);
|
|
399
468
|
i2 += c >> SHIFT_22 & INDEX_2_MASK2;
|
|
@@ -405,6 +474,15 @@ var UnicodeTrieBuilder = class {
|
|
|
405
474
|
this._setIndex2Entry(i2, newBlock);
|
|
406
475
|
return newBlock;
|
|
407
476
|
}
|
|
477
|
+
/**
|
|
478
|
+
* @param {number} block
|
|
479
|
+
* @param {number} start
|
|
480
|
+
* @param {number} limit
|
|
481
|
+
* @param {number} value
|
|
482
|
+
* @param {number} initialValue
|
|
483
|
+
* @param {boolean} overwrite
|
|
484
|
+
* @returns {void}
|
|
485
|
+
*/
|
|
408
486
|
_fillBlock(block, start, limit, value, initialValue, overwrite) {
|
|
409
487
|
let i;
|
|
410
488
|
if (overwrite) {
|
|
@@ -419,12 +497,21 @@ var UnicodeTrieBuilder = class {
|
|
|
419
497
|
}
|
|
420
498
|
}
|
|
421
499
|
}
|
|
500
|
+
/**
|
|
501
|
+
* @param {number} block
|
|
502
|
+
* @param {number} value
|
|
503
|
+
* @returns {void}
|
|
504
|
+
*/
|
|
422
505
|
_writeBlock(block, value) {
|
|
423
506
|
const limit = block + DATA_BLOCK_LENGTH2;
|
|
424
507
|
while (block < limit) {
|
|
425
508
|
this.data[block++] = value;
|
|
426
509
|
}
|
|
427
510
|
}
|
|
511
|
+
/**
|
|
512
|
+
* @param {number} highValue
|
|
513
|
+
* @returns {number}
|
|
514
|
+
*/
|
|
428
515
|
_findHighStart(highValue) {
|
|
429
516
|
let prevBlock, prevI2Block;
|
|
430
517
|
const data32 = this.data;
|
|
@@ -482,6 +569,12 @@ var UnicodeTrieBuilder = class {
|
|
|
482
569
|
}
|
|
483
570
|
return 0;
|
|
484
571
|
}
|
|
572
|
+
/**
|
|
573
|
+
* @param {number} dataLength
|
|
574
|
+
* @param {number} otherBlock
|
|
575
|
+
* @param {number} blockLength
|
|
576
|
+
* @returns {number}
|
|
577
|
+
*/
|
|
485
578
|
_findSameDataBlock(dataLength, otherBlock, blockLength) {
|
|
486
579
|
dataLength -= blockLength;
|
|
487
580
|
let block = 0;
|
|
@@ -493,6 +586,11 @@ var UnicodeTrieBuilder = class {
|
|
|
493
586
|
}
|
|
494
587
|
return -1;
|
|
495
588
|
}
|
|
589
|
+
/**
|
|
590
|
+
* @param {number} index2Length
|
|
591
|
+
* @param {number} otherBlock
|
|
592
|
+
* @returns {number}
|
|
593
|
+
*/
|
|
496
594
|
_findSameIndex2Block(index2Length, otherBlock) {
|
|
497
595
|
index2Length -= INDEX_2_BLOCK_LENGTH2;
|
|
498
596
|
for (let block = 0; block <= index2Length; block++) {
|
|
@@ -502,6 +600,9 @@ var UnicodeTrieBuilder = class {
|
|
|
502
600
|
}
|
|
503
601
|
return -1;
|
|
504
602
|
}
|
|
603
|
+
/**
|
|
604
|
+
* @returns {void}
|
|
605
|
+
*/
|
|
505
606
|
_compactData() {
|
|
506
607
|
let newStart = DATA_START_OFFSET;
|
|
507
608
|
let start = 0;
|
|
@@ -570,6 +671,9 @@ var UnicodeTrieBuilder = class {
|
|
|
570
671
|
}
|
|
571
672
|
this.dataLength = newStart;
|
|
572
673
|
}
|
|
674
|
+
/**
|
|
675
|
+
* @returns {void}
|
|
676
|
+
*/
|
|
573
677
|
_compactIndex2() {
|
|
574
678
|
let newStart = INDEX_2_BMP_LENGTH2;
|
|
575
679
|
let start = 0;
|
|
@@ -612,6 +716,9 @@ var UnicodeTrieBuilder = class {
|
|
|
612
716
|
}
|
|
613
717
|
this.index2Length = newStart;
|
|
614
718
|
}
|
|
719
|
+
/**
|
|
720
|
+
* @returns {void}
|
|
721
|
+
*/
|
|
615
722
|
_compact() {
|
|
616
723
|
let highValue = this.get(1114111);
|
|
617
724
|
let highStart = this._findHighStart(highValue);
|
|
@@ -634,6 +741,9 @@ var UnicodeTrieBuilder = class {
|
|
|
634
741
|
}
|
|
635
742
|
this.isCompacted = true;
|
|
636
743
|
}
|
|
744
|
+
/**
|
|
745
|
+
* @returns {import('./index.js').default}
|
|
746
|
+
*/
|
|
637
747
|
freeze() {
|
|
638
748
|
let allIndexesLength, i;
|
|
639
749
|
if (!this.isCompacted) {
|
|
@@ -680,13 +790,16 @@ var UnicodeTrieBuilder = class {
|
|
|
680
790
|
});
|
|
681
791
|
return dest;
|
|
682
792
|
}
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
793
|
+
/**
|
|
794
|
+
* Generates a Buffer containing the serialized and compressed trie.
|
|
795
|
+
* Trie data is compressed once with raw deflate (a second pass does not help).
|
|
796
|
+
* Format:
|
|
797
|
+
* uint32_t highStart;
|
|
798
|
+
* uint32_t errorValue;
|
|
799
|
+
* uint32_t uncompressedDataLength;
|
|
800
|
+
* uint8_t trieData[dataLength];
|
|
801
|
+
* @returns {Buffer}
|
|
802
|
+
*/
|
|
690
803
|
toBuffer() {
|
|
691
804
|
const trie = this.freeze();
|
|
692
805
|
const data = new Uint8Array(trie.data.buffer);
|