なぜ作ったか
日本語タイピング練習で「し」を "shi" と入力したら正解だが "si" だと不正解、というアプリがある。でも si は有効なローマ字入力で、IME でも受け付ける。どちらも正解にしたい。
し/si/shi、ち/ti/chi、つ/tu/tsu、ふ/hu/fu ... 全部のバリエーションを網羅するローマ字マッピングを作り、タイピングゲームに仕上げました。
作ったもの
Typing JP — https://sen.ltd/portfolio/typing-jp/
- 全有効ローマ字バリエーション受付
- 3 モード: 練習 / タイムアタック(60秒) / 耐久(ミス3回)
- 3 ワードセット: 基本ひらがな / 単語(30) / 文章(10)
- っ の子音重複、ん の曖昧性解消
- リアルタイム文字ハイライト
- WPM / 正確性表示
vanilla JS、ゼロ依存、ビルド不要。node --test で 39 ケース。
ローマ字マップ
'し': ['si', 'shi'],
'ちゃ': ['tya', 'cha'],
'じゃ': ['zya', 'ja', 'jya'],
80+ エントリ。基本ひらがな(46) + 濁音/半濁音(25) + 拗音(33)。
トークナイズ: 拗音は 2 文字先読み
きゃ は 1 トークン(kya)であって き+や(ki+ya) ではない。2 文字の組み合わせを先にチェック:
const pair = str[i] + str[i + 1];
if (ROMAJI_MAP[pair]) { tokens.push(...); i += 2; continue; }
っ の子音重複
っか = "kka"、っし = "sshi" or "ssi"。次のトークンのローマ字から先頭子音を取って重複。
ん の曖昧性
母音(あいうえお)や や/ゆ/よ の前では "nn" 必須。かんい = ka + nn + i。"n" だけだと かに と区別できない。
テスト
39 ケース: マップの網羅性、トークナイズ、っ、ん、入力バリデーション、WPM/正確性計算。
シリーズ
100+ 公開ポートフォリオ シリーズの #38 です。
- 📦 リポジトリ: https://github.com/sen-ltd/typing-jp
- 🌐 デモ: https://sen.ltd/portfolio/typing-jp/
- 🏢 会社: https://sen.ltd/
