1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- '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;
- };
|