44 lines
977 B
JavaScript
44 lines
977 B
JavaScript
|
'use strict';
|
||
|
|
||
|
function isHighSurrogate(codePoint) {
|
||
|
return codePoint >= 0xd800 && codePoint <= 0xdbff;
|
||
|
}
|
||
|
|
||
|
function isLowSurrogate(codePoint) {
|
||
|
return codePoint >= 0xdc00 && codePoint <= 0xdfff;
|
||
|
}
|
||
|
|
||
|
// Truncate string by size in bytes
|
||
|
module.exports = function truncate(getLength, string, byteLength) {
|
||
|
if (typeof string !== "string") {
|
||
|
throw new Error("Input must be string");
|
||
|
}
|
||
|
|
||
|
var charLength = string.length;
|
||
|
var curByteLength = 0;
|
||
|
var codePoint;
|
||
|
var segment;
|
||
|
|
||
|
for (var i = 0; i < charLength; i += 1) {
|
||
|
codePoint = string.charCodeAt(i);
|
||
|
segment = string[i];
|
||
|
|
||
|
if (isHighSurrogate(codePoint) && isLowSurrogate(string.charCodeAt(i + 1))) {
|
||
|
i += 1;
|
||
|
segment += string[i];
|
||
|
}
|
||
|
|
||
|
curByteLength += getLength(segment);
|
||
|
|
||
|
if (curByteLength === byteLength) {
|
||
|
return string.slice(0, i + 1);
|
||
|
}
|
||
|
else if (curByteLength > byteLength) {
|
||
|
return string.slice(0, i - segment.length + 1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return string;
|
||
|
};
|
||
|
|