mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-09-07 01:09:54 +08:00
perf(editor): avoid recreation of Intl.Segmenter (#10295)
<img width="537" alt="image" src="https://github.com/user-attachments/assets/43e54d94-6228-4c26-b3d0-cf4725b251e4" />
This commit is contained in:
@@ -8,13 +8,22 @@ interface WordSegment {
|
|||||||
|
|
||||||
const CJK_REGEX = /[\u4E00-\u9FFF\u3400-\u4DBF\uF900-\uFAFF]/u;
|
const CJK_REGEX = /[\u4E00-\u9FFF\u3400-\u4DBF\uF900-\uFAFF]/u;
|
||||||
|
|
||||||
|
const sentenceSegmenter = new Intl.Segmenter(undefined, {
|
||||||
|
granularity: 'sentence',
|
||||||
|
});
|
||||||
|
const wordSegmenter = new Intl.Segmenter(undefined, {
|
||||||
|
granularity: 'word',
|
||||||
|
});
|
||||||
|
const graphemeSegmenter = new Intl.Segmenter(undefined, {
|
||||||
|
granularity: 'grapheme',
|
||||||
|
});
|
||||||
|
|
||||||
function hasCJK(text: string): boolean {
|
function hasCJK(text: string): boolean {
|
||||||
return CJK_REGEX.test(text);
|
return CJK_REGEX.test(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getWordSegments(text: string): WordSegment[] {
|
function getWordSegments(text: string): WordSegment[] {
|
||||||
const granularity = hasCJK(text) ? 'grapheme' : 'word';
|
const segmenter = hasCJK(text) ? graphemeSegmenter : wordSegmenter;
|
||||||
const segmenter = new Intl.Segmenter(undefined, { granularity });
|
|
||||||
return Array.from(segmenter.segment(text)).map(({ segment, index }) => ({
|
return Array.from(segmenter.segment(text)).map(({ segment, index }) => ({
|
||||||
text: segment,
|
text: segment,
|
||||||
start: index,
|
start: index,
|
||||||
@@ -130,6 +139,7 @@ export function getSentenceRects(
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function segmentSentences(text: string): string[] {
|
export function segmentSentences(text: string): string[] {
|
||||||
const segmenter = new Intl.Segmenter(undefined, { granularity: 'sentence' });
|
return Array.from(sentenceSegmenter.segment(text)).map(
|
||||||
return Array.from(segmenter.segment(text)).map(({ segment }) => segment);
|
({ segment }) => segment
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user