34 lines
650 B
TypeScript
34 lines
650 B
TypeScript
// Copyright 2021-2022 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
export function graphemeAwareSlice(
|
|
str: string,
|
|
length: number,
|
|
buffer = 100
|
|
): {
|
|
hasReadMore: boolean;
|
|
text: string;
|
|
} {
|
|
if (str.length <= length + buffer) {
|
|
return { text: str, hasReadMore: false };
|
|
}
|
|
|
|
let text: string | undefined;
|
|
|
|
for (const { index } of new Intl.Segmenter().segment(str)) {
|
|
if (!text && index >= length) {
|
|
text = str.slice(0, index);
|
|
}
|
|
if (text && index > length) {
|
|
return {
|
|
text,
|
|
hasReadMore: true,
|
|
};
|
|
}
|
|
}
|
|
|
|
return {
|
|
text: str,
|
|
hasReadMore: false,
|
|
};
|
|
}
|