You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
typesetting/pitfall/pdfkit/node_modules/unicode-trie/index.js

92 lines
2.9 KiB
JavaScript

// Generated by CoffeeScript 1.7.1
var UnicodeTrie, inflate;
inflate = require('tiny-inflate');
UnicodeTrie = (function() {
var DATA_BLOCK_LENGTH, DATA_GRANULARITY, DATA_MASK, INDEX_1_OFFSET, INDEX_2_BLOCK_LENGTH, INDEX_2_BMP_LENGTH, INDEX_2_MASK, INDEX_SHIFT, LSCP_INDEX_2_LENGTH, LSCP_INDEX_2_OFFSET, OMITTED_BMP_INDEX_1_LENGTH, SHIFT_1, SHIFT_1_2, SHIFT_2, UTF8_2B_INDEX_2_LENGTH, UTF8_2B_INDEX_2_OFFSET;
SHIFT_1 = 6 + 5;
SHIFT_2 = 5;
SHIFT_1_2 = SHIFT_1 - SHIFT_2;
OMITTED_BMP_INDEX_1_LENGTH = 0x10000 >> SHIFT_1;
INDEX_2_BLOCK_LENGTH = 1 << SHIFT_1_2;
INDEX_2_MASK = INDEX_2_BLOCK_LENGTH - 1;
INDEX_SHIFT = 2;
DATA_BLOCK_LENGTH = 1 << SHIFT_2;
DATA_MASK = DATA_BLOCK_LENGTH - 1;
LSCP_INDEX_2_OFFSET = 0x10000 >> SHIFT_2;
LSCP_INDEX_2_LENGTH = 0x400 >> SHIFT_2;
INDEX_2_BMP_LENGTH = LSCP_INDEX_2_OFFSET + LSCP_INDEX_2_LENGTH;
UTF8_2B_INDEX_2_OFFSET = INDEX_2_BMP_LENGTH;
UTF8_2B_INDEX_2_LENGTH = 0x800 >> 6;
INDEX_1_OFFSET = UTF8_2B_INDEX_2_OFFSET + UTF8_2B_INDEX_2_LENGTH;
DATA_GRANULARITY = 1 << INDEX_SHIFT;
function UnicodeTrie(data) {
var isBuffer, uncompressedLength, view;
isBuffer = typeof data.readUInt32BE === 'function' && typeof data.slice === 'function';
if (isBuffer || data instanceof Uint8Array) {
if (isBuffer) {
this.highStart = data.readUInt32BE(0);
this.errorValue = data.readUInt32BE(4);
uncompressedLength = data.readUInt32BE(8);
data = data.slice(12);
} else {
view = new DataView(data.buffer);
this.highStart = view.getUint32(0);
this.errorValue = view.getUint32(4);
uncompressedLength = view.getUint32(8);
data = data.subarray(12);
}
data = inflate(data, new Uint8Array(uncompressedLength));
data = inflate(data, new Uint8Array(uncompressedLength));
this.data = new Uint32Array(data.buffer);
} else {
this.data = data.data, this.highStart = data.highStart, this.errorValue = data.errorValue;
}
}
UnicodeTrie.prototype.get = function(codePoint) {
var index;
if (codePoint < 0 || codePoint > 0x10ffff) {
return this.errorValue;
}
if (codePoint < 0xd800 || (codePoint > 0xdbff && codePoint <= 0xffff)) {
index = (this.data[codePoint >> SHIFT_2] << INDEX_SHIFT) + (codePoint & DATA_MASK);
return this.data[index];
}
if (codePoint <= 0xffff) {
index = (this.data[LSCP_INDEX_2_OFFSET + ((codePoint - 0xd800) >> SHIFT_2)] << INDEX_SHIFT) + (codePoint & DATA_MASK);
return this.data[index];
}
if (codePoint < this.highStart) {
index = this.data[(INDEX_1_OFFSET - OMITTED_BMP_INDEX_1_LENGTH) + (codePoint >> SHIFT_1)];
index = this.data[index + ((codePoint >> SHIFT_2) & INDEX_2_MASK)];
index = (index << INDEX_SHIFT) + (codePoint & DATA_MASK);
return this.data[index];
}
return this.data[this.data.length - DATA_GRANULARITY];
};
return UnicodeTrie;
})();
module.exports = UnicodeTrie;