diff --git a/src-react/src/components/LoadingDialog.tsx b/src-react/src/components/LoadingDialog.tsx index 03522bd..6559ae6 100644 --- a/src-react/src/components/LoadingDialog.tsx +++ b/src-react/src/components/LoadingDialog.tsx @@ -38,7 +38,7 @@ interface Progress { } function LoadingDialog() { - const [messages, setMessages] = useState([]); + const [messages, set_messages] = useState([]); const isInit = useRef(false); @@ -106,11 +106,11 @@ function LoadingDialog() { } await invoke("init_yomitan", { dicts, lang }); - setMessages([]); + set_messages([]); } listen("load-yomitan-dir", ({ payload }) => { - setMessages((messages) => { + set_messages((messages) => { if (payload.new_dicts.length > 0) { messages = [ ...messages, @@ -149,7 +149,7 @@ function LoadingDialog() { }, []); function updateProgress(payload: Progress) { - setMessages((messages) => { + set_messages((messages) => { const prev = messages[messages.length - 1]; if (prev?.message === payload.message) { messages = messages.slice(0, messages.length - 1); diff --git a/src-react/src/pages/SearchPage.tsx b/src-react/src/pages/SearchPage.tsx index 7ed0351..d4f3e56 100644 --- a/src-react/src/pages/SearchPage.tsx +++ b/src-react/src/pages/SearchPage.tsx @@ -6,13 +6,13 @@ import { useState, } from "react"; import { useSearchParams } from "react-router"; -import { toKana } from "wanakana"; +import { toHiragana, toKana } from "wanakana"; import { Box, Card, CloseButton, - Group, + Field, Input, InputGroup, Stack, @@ -116,9 +116,10 @@ function SearchPage() { } if (!norm_q) return; - const ender = /\p{Z}$/u.test(q) ? "" : "*"; + const ender = + /\p{Z}$/u.test(q) || [..."*?[]"].some((c) => q.includes(c)) ? "" : "*"; - const re = /\<(.+?)\>\[(.+?)\]/g; + const re = /\<(.+?)\>{(.+?)}/g; let qTerm = ""; let qReading = ""; @@ -199,9 +200,7 @@ function SearchPage() { q = toKana(q, { useObsoleteKana: true, IMEMode: true, - customKanaMapping: Object.fromEntries( - "<>[]".split("").map((c) => [c, c]), - ), + customKanaMapping: Object.fromEntries([..."<>{}"].map((c) => [c, c])), }); } @@ -224,14 +223,14 @@ function SearchPage() { target, }) => { const cleanedFuri = [...furigana.replace(/n/g, "ん")] - .map((c) => katakanaToHiragana(c)) + .map((c) => toHiragana(c, { passRomaji: true })) .join(""); let parts = compositionData.split(KANJI_REGEX); if (parts.length === 1) return; const hiraganaParts = parts.map((p) => - [...p].map((c) => katakanaToHiragana(c)).join(""), + [...p].map((c) => toHiragana(c, { passRomaji: true })).join(""), ); const regex = new RegExp( `^${hiraganaParts.map((p, idx) => `(${idx & 1 ? ".+" : p})`).join("")}$`, @@ -244,7 +243,7 @@ function SearchPage() { rt.shift(); const markup = parts - .map((p, idx) => (idx & 1 ? `<${p}>[${rt[idx]}]` : p)) + .map((p, idx) => (idx & 1 ? `<${p}>{${rt[idx]}}` : p)) .join(""); set_q((q) => { @@ -262,13 +261,6 @@ function SearchPage() { }); }; - function katakanaToHiragana(k: string) { - let c = k.charCodeAt(0); - return c >= 12449 && c <= 12531 - ? String.fromCharCode(k.charCodeAt(0) - 96) - : k; - } - const clearButton = q.trim() ? ( - + - {/* */} - + {q.includes(" ") ? ( + + Space (" ") to mark word boundary for search + + ) : null} + {[..."*?[]"].some((c) => q.includes(c)) ? ( + + {"*?[]"} can be used as + + glob + + + ) : null} +
- - onTermClicked(term + " ")}>{term} + + + onTermClicked(reading ? `<${term}>{${reading}}` : term) + } + > + {term} + {reading && reading !== term ? ( <> {"("} - onTermClicked(reading + " ")}> - {reading} - + onTermClicked(reading)}>{reading} {")"} ) : null} - 【{dict_title}】{JSONdumpClean(it)} + 【{dict_title}】 + {JSONdumpClean(it)}
({ ignored: ["**/src-tauri/**"], }, }, + build: { + chunkSizeWarningLimit: 1024, // default = 500 kB + }, }));