fix: handle full CJK Unified Ideographs in search terms, closes #989 (#1002)

This commit is contained in:
Huang Xin
2025-04-30 14:52:19 +08:00
committed by GitHub
parent b1ea729a54
commit 141c502c76
4 changed files with 10 additions and 4 deletions
@@ -9,6 +9,7 @@ import { useReaderStore } from '@/store/readerStore';
import { useTranslation } from '@/hooks/useTranslation';
import { BookSearchConfig, BookSearchResult } from '@/types/book';
import { useResponsiveSize } from '@/hooks/useResponsiveSize';
import { isCJKStr } from '@/utils/lang';
import Dropdown from '@/components/Dropdown';
import SearchOptions from './SearchOptions';
@@ -104,8 +105,9 @@ const SearchBar: React.FC<SearchBarProps> = ({
};
const exceedMinSearchTermLength = (searchTerm: string) => {
const isCJK = /[\u4e00-\u9fa5\u3040-\u30ff\uac00-\ud7af]/.test(searchTerm);
const minLength = isCJK ? MINIMUM_SEARCH_TERM_LENGTH_CJK : MINIMUM_SEARCH_TERM_LENGTH_DEFAULT;
const minLength = isCJKStr(searchTerm)
? MINIMUM_SEARCH_TERM_LENGTH_CJK
: MINIMUM_SEARCH_TERM_LENGTH_DEFAULT;
return searchTerm.length >= minLength;
};
@@ -32,7 +32,7 @@ const SearchResultItem: React.FC<SearchResultItemProps> = ({
>
<div className='line-clamp-3'>
<span className=''>{excerpt.pre}</span>
<span className='font-semibold'>{excerpt.match}</span>
<span className='font-bold text-red-500'>{excerpt.match}</span>
<span className=''>{excerpt.post}</span>
</div>
</li>
@@ -2,6 +2,7 @@ import { getUserLocale } from '@/utils/misc';
import { TTSClient, TTSMessageEvent, TTSVoice } from './TTSClient';
import { AsyncQueue } from '@/utils/queue';
import { findSSMLMark, parseSSMLLang, parseSSMLMarks } from '@/utils/ssml';
import { isCJKStr } from '@/utils/lang';
import { TTSGranularity } from '@/types/view';
import { TTSUtils } from './TTSUtils';
@@ -123,7 +124,7 @@ async function* speakWithMarks(
const isCJK = (lang: string | null) => {
const cjkLangs = ['zh', 'ja', 'kr'];
if (lang && cjkLangs.some((cjk) => lang.startsWith(cjk))) return true;
return /[\u4e00-\u9fff\u3040-\u30ff\uac00-\ud7af]/.test(plainText);
return isCJKStr(plainText);
};
if (!isCJK(lang)) {
+3
View File
@@ -0,0 +1,3 @@
export const isCJKStr = (str: string) => {
return /[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}]/u.test(str ?? '');
};