だるろぐ

明日できることは、今日しない。

オープン拡張辞書を Windows Runtime アプリで読み書きする(1)

オープン拡張辞書は、Microsoft IMEの追加辞書を作成、共有する機能です。簡単にインストールができるので、Webページや共有フォルダーに置いたり、メールに添付して配布したり、シーンに応じて多様な方法で共有と配布ができます。

Microsoft IME オープン拡張辞書について

Windows 8 以降だと OS 標準の IME で使えるのに、割りと流行ってない感じ。もっと使われないともったいなーと思ったので、こいつが編集できる Windows ストア アプリでも作ろうと思い立った。

オープン拡張辞書には二種類ある。

  • .dctx: UTF-8 でエンコードされた XML ファイル
  • .dctxc: .dctx を ZIP で圧縮したもの

あと署名を付けると収録できる単語数が増えるとか(署名されていない場合は1万語まで)いろいろあるのだけど、これはまぁ、今のところどうでもいい。今回はとりあえず .dctx が読めることを目標にする。ZIP うんぬんは、まぁ、.NET Framework 4.5 でごにょごにょすれば割と簡単にできるのだろう(慢心

とりあえずはクラス作りから。

public class OpenExtendedDictionary
{
    public OpenExtendedDictionary()
    {
        DictionaryInfo = new OpenExtendedDictionaryInfo();
    }

    public string DictionaryGuid { get; set; }
    public string DictionaryLanguage { get; set; }
    public string DictionaryVersion { get; set; }
    public bool CommentInsertion { get; set; }
    public OpenExtendedDictionaryInfo DictionaryInfo { get; set; }
    public ObservableCollection<OpenExtendedDictionaryEntry> DictionaryEntries { get; set; }
}

public class OpenExtendedDictionaryInfo
{
    public string ShortName { get; set; }
    public string LongName { get; set; }
    public string Description { get; set; }
    public string Copyright { get; set; }
    public string Language { get; set; }
}

public class OpenExtendedDictionaryEntry
{
    public string PartOfSpeech { get; set; }
    public string OutputString { get; set; }
    public string InputString { get; set; }
    public int Priority { get; set; }
    public bool ReverseConversion { get; set; }
    public bool CommonWord { get; set; }
}

こんな感じだろうか。ほんとは INotifyPropertyChanged とかも実装すべきなんだろうけれど、今回はまだいいや。

あと、ここまで書いてから仕様を見直して知ったのだけど、DictionaryInfo は言語ごとに複数持てるので、リスト(言語で引けるようにディクショナリにしたほうがいいかな)じゃないとだめだ。めんどくさいので、あとで直すことにする。

次回

XML を読み書きする方法は3つほどある。

  1. XmlDocument を使う。あまり使ったことがないから知らん
  2. XDocument を使う。LINQ と相性がいい
  3. シリアライズする。どうやるのかわからんが、一番かっこよさそうな実装

気が向いたら続きを書く。