diff --git a/src/routes/song/[slug]/+page.svelte b/src/routes/song/[slug]/+page.svelte index ccbc8f8..9562fc6 100644 --- a/src/routes/song/[slug]/+page.svelte +++ b/src/routes/song/[slug]/+page.svelte @@ -49,9 +49,10 @@ console.log(`input changed: ${input}`) // Convert to hiragana inp = toHiragana(inp, { IMEMode: true }) + const imeUsed = input !== inp // While it has kana or kanji, pop from input - while (inp.length && (isKana(inp[0]) || isKanji(inp[0]))) { + while (inp && (isKana(inp[0]) || isKanji(inp[0]))) { let char = inp[0] // Check if it matches current character @@ -59,7 +60,7 @@ let cSeg = cLine.parts.find(seg => wi >= seg.swi && wi < seg.swi + seg.kana.length)! let exp = cSeg.kana[wi - cSeg.swi] let res = fuzzyEquals(char, exp) - if (res === 'wrong' && !isComposed && composeList.includes(exp)) return // Need to compose, stop here + if (res === 'wrong' && !imeUsed && !isComposed && composeList.includes(exp)) return // Need to compose, stop here states[li][wi] = res // Move index @@ -67,6 +68,12 @@ if (wi >= cLine.totalLen) { li += 1; wi = 0 } inp = inp.slice(1) } + + // Prevent IME stuck + if (imeUsed && inp && !isKana(inp[0]) && inp.split('').some(c => isKana(c)) ) { + console.log("Clearing input to prevent IME stuck") + inp = "" + } } $effect(() => inputChanged(inp, false)) @@ -83,12 +90,13 @@ { inputChanged(inp, true) console.log("Event: input") -}} bind:value={inp} autofocus /> - +}} bind:value={inp} class="absolute opacity-0 top-[-9999px] left-[-9999px]" /> -