93 lines
2.6 KiB
Plaintext
93 lines
2.6 KiB
Plaintext
'use strict';
|
|
|
|
const emoji_data = require('./data.cjs');
|
|
|
|
function getEmojiCodePoint(code) {
|
|
return parseInt(code, 16);
|
|
}
|
|
function utf32FirstNum(code) {
|
|
return (code - emoji_data.minUTF32 >> 10 | 0) + emoji_data.startUTF32Pair1;
|
|
}
|
|
function utf32SecondNum(code) {
|
|
return (code - emoji_data.minUTF32 & 1023) + emoji_data.startUTF32Pair2;
|
|
}
|
|
function splitUTF32Number(code) {
|
|
if (code >= emoji_data.minUTF32) {
|
|
return [utf32FirstNum(code), utf32SecondNum(code)];
|
|
}
|
|
}
|
|
function isUTF32SplitNumber(value) {
|
|
if (value >= emoji_data.startUTF32Pair1) {
|
|
if (value < emoji_data.startUTF32Pair2) {
|
|
return 1;
|
|
}
|
|
if (value < emoji_data.endUTF32Pair) {
|
|
return 2;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function mergeUTF32Numbers(part1, part2) {
|
|
if (part1 < emoji_data.startUTF32Pair1 || part1 >= emoji_data.startUTF32Pair2 || part2 < emoji_data.startUTF32Pair2 || part2 >= emoji_data.endUTF32Pair) {
|
|
return;
|
|
}
|
|
return (part1 - emoji_data.startUTF32Pair1 << 10) + (part2 - emoji_data.startUTF32Pair2) + emoji_data.minUTF32;
|
|
}
|
|
function getEmojiUnicode(code) {
|
|
return String.fromCodePoint(
|
|
typeof code === "number" ? code : getEmojiCodePoint(code)
|
|
);
|
|
}
|
|
function convertEmojiSequenceToUTF16(numbers) {
|
|
const results = [];
|
|
for (let i = 0; i < numbers.length; i++) {
|
|
const code = numbers[i];
|
|
if (code >= emoji_data.minUTF32) {
|
|
results.push(utf32FirstNum(code));
|
|
results.push(utf32SecondNum(code));
|
|
} else {
|
|
results.push(code);
|
|
}
|
|
}
|
|
return results;
|
|
}
|
|
function convertEmojiSequenceToUTF32(numbers, throwOnError = true) {
|
|
const results = [];
|
|
for (let i = 0; i < numbers.length; i++) {
|
|
const code = numbers[i];
|
|
if (code >= emoji_data.minUTF32) {
|
|
results.push(code);
|
|
continue;
|
|
}
|
|
const part = isUTF32SplitNumber(code);
|
|
if (!part) {
|
|
results.push(code);
|
|
continue;
|
|
}
|
|
if (part === 1 && numbers.length > i + 1) {
|
|
const merged = mergeUTF32Numbers(code, numbers[i + 1]);
|
|
if (merged) {
|
|
i++;
|
|
results.push(merged);
|
|
continue;
|
|
}
|
|
}
|
|
if (throwOnError) {
|
|
const nextCode = numbers[i + 1];
|
|
throw new Error(
|
|
`Invalid UTF-16 sequence: ${code.toString(16)}-${nextCode ? nextCode.toString(16) : "undefined"}`
|
|
);
|
|
}
|
|
results.push(code);
|
|
}
|
|
return results;
|
|
}
|
|
|
|
exports.convertEmojiSequenceToUTF16 = convertEmojiSequenceToUTF16;
|
|
exports.convertEmojiSequenceToUTF32 = convertEmojiSequenceToUTF32;
|
|
exports.getEmojiCodePoint = getEmojiCodePoint;
|
|
exports.getEmojiUnicode = getEmojiUnicode;
|
|
exports.isUTF32SplitNumber = isUTF32SplitNumber;
|
|
exports.mergeUTF32Numbers = mergeUTF32Numbers;
|
|
exports.splitUTF32Number = splitUTF32Number;
|