Skip to content

PR #320修正: ユーザー辞書のcompiled dictionary exportを保存時実行に整理#329

Open
artin-kagun wants to merge 4 commits into
azooKey:mainfrom
artin-kagun:codex/user-dictionary-export-on-save-review-fix
Open

PR #320修正: ユーザー辞書のcompiled dictionary exportを保存時実行に整理#329
artin-kagun wants to merge 4 commits into
azooKey:mainfrom
artin-kagun:codex/user-dictionary-export-on-save-review-fix

Conversation

@artin-kagun
Copy link
Copy Markdown

概要

PR#320のご指摘に合わせて修正を行いました。

ユーザー辞書を保存・更新したタイミングで、変換器が利用できる compiled dictionary として export するようにします。

大きめのユーザー辞書を利用する場合でも、変換時に UserDefaults の辞書データを毎回扱うのではなく、あらかじめ export 済みの compiled dictionary を converter 側で参照できるようにする目的です。

変更内容

  • ユーザー辞書・システムユーザー辞書の更新時に compiled dictionary を export する処理を追加
  • アプリ起動時、compiled dictionary が未作成の場合に初期 export する処理を追加
  • 設定変更後は AppDelegate が保持している共有 KanaKanjiConverter に対して updateUserDictionaryURL(..., forceReload: true) を呼び、実行中のIMEへ再読み込みを通知
  • 変換時に fallback JSON や metadata を参照する処理を削除
  • compiled dictionary に含められない読みは fallback JSON に保存せず、export対象から除外
  • metadata.json / fallback.json が生成されないことをテストで確認
  • Linux環境でも主要な compiled dictionary export テストが実行できるよう、テスト用の小さな charID.chid を注入可能に変更

レビューコメントへの対応

fallback JSONについて

compiled dictionaryに含められない項目はfallbackとしてJSONに保存し、入力中の読みと関係するものだけdynamic dictionaryとして渡すようにしています。

この設計は削除しました。

compiled dictionary に含められない読みは fallback.json に保存せず、export対象から除外するようにしています。
また、変換時に fallback JSON を読み込んで dynamic dictionary として渡す処理も削除しました。

これにより、ユーザー環境に fallback 用の独自JSONファイルを保存し続けることを避けています。

読みのvalidationについて

それ以外を読みとする単語はそもそも入力やimport(別PRですが)のvalidationで弾くようにして、fallbackにJSONを使うのは避けたいです。

このPRでは fallback JSON を使わない方針に変更しました。

一方で、既存の手動ユーザー辞書UIには読みとして登録可能な文字種を制限するvalidationがないため、このPRではUI仕様変更までは行っていません。
compiled dictionaryへexportできない読みは、fallback JSON に保存せず、export対象から除外する扱いにしています。

入力時・import時のvalidationについては、import機能側のPRで同じ判定を利用して扱うのが自然だと考えています。

metadata.jsonについて

metadata.json の modificationDate を軽い更新検知として使っています。

この仕組みは削除しました。

metadata.json を保存せず、変換時にも modificationDate を見ないようにしています。

converter経由のreloadについて

KanaKanjiConverterインスタンスはIMEアプリケーション全体でシングルトンに近い扱いになっていると思うので、単にそれを経由してuser dictionaryのreloadをトリガーするのがよりシンプルな気がしました。

この方針に合わせ、設定変更時に compiled dictionary を export した後、AppDelegate が保持している共有 KanaKanjiConverter に対して updateUserDictionaryURL(..., forceReload: true) を呼ぶようにしました。

これにより、metadataファイルの更新検知ではなく、設定変更後に converter へ明示的にreloadを通知する形にしています。

ユーザー環境に保存するファイルについて

ユーザ環境によく設計されていないファイルを保存していくのは将来的に負債になるので、避けたいです。

この指摘を踏まえ、metadata.jsonfallback.json は生成しないようにしました。

ユーザー環境に保存されるのは、converter が利用する compiled dictionary のファイル群のみです。

動作確認

  • swift test --disable-sandbox --package-path Core --build-path /private/tmp/azookey-pr320-review-fix-build
    • 31 tests passed
  • git diff --check
  • 別IMEとしてインストールしてローカル検証(問題なく変換が作動すること)を確認
  • 手元の数学・物理・化学・生物など約40000単語を収録したユーザー辞書データを投入し、大量の辞書データが保存されている状態を再現
  • compiled dictionary が生成されることを確認
  • 投入した辞書由来の候補が変換候補に出ることを確認
  • metadata.json / fallback.json が生成されないことを確認

@artin-kagun artin-kagun marked this pull request as ready for review May 11, 2026 06:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant