38 lines
1.0 KiB
JavaScript
38 lines
1.0 KiB
JavaScript
|
// Based on:
|
||
|
// http://norbertlindenberg.com/2012/05/ecmascript-supplementary-characters/
|
||
|
// and:
|
||
|
// https://github.com/mathiasbynens/String.fromCodePoint/blob/master
|
||
|
// /fromcodepoint.js
|
||
|
|
||
|
"use strict";
|
||
|
|
||
|
var floor = Math.floor, fromCharCode = String.fromCharCode;
|
||
|
|
||
|
// eslint-disable-next-line no-unused-vars
|
||
|
module.exports = function (codePoint1 /*, …codePoints*/) {
|
||
|
var chars = [], length = arguments.length, i, codePoint, result = "";
|
||
|
for (i = 0; i < length; ++i) {
|
||
|
codePoint = Number(arguments[i]);
|
||
|
if (
|
||
|
!isFinite(codePoint) ||
|
||
|
codePoint < 0 ||
|
||
|
codePoint > 0x10ffff ||
|
||
|
floor(codePoint) !== codePoint
|
||
|
) {
|
||
|
throw new RangeError("Invalid code point " + codePoint);
|
||
|
}
|
||
|
|
||
|
if (codePoint < 0x10000) {
|
||
|
chars.push(codePoint);
|
||
|
} else {
|
||
|
codePoint -= 0x10000;
|
||
|
// eslint-disable-next-line no-bitwise
|
||
|
chars.push((codePoint >> 10) + 0xd800, (codePoint % 0x400) + 0xdc00);
|
||
|
}
|
||
|
if (i + 1 !== length && chars.length <= 0x4000) continue;
|
||
|
result += fromCharCode.apply(null, chars);
|
||
|
chars.length = 0;
|
||
|
}
|
||
|
return result;
|
||
|
};
|