diff --git a/README.md b/README.md
index 38184c59..6404b857 100644
--- a/README.md
+++ b/README.md
@@ -1,25 +1,545 @@
-## CorvusSKK
-SKK-like Japanese Input Method Editor for Windows
+# CorvusSKK ver. 1.8.7
-### License
+Windowsで動作するSKK風のIMEです。
+
+
+## ライセンス
Microsoft Public License (MS-PL)
-See LICENSE.TXT
+詳細は LICENSE.TXT を見てください。
+
+
+## インストール
+
+### 対応OS
+
+* Windows Vista (32-bit / 64-bit) SP2
+* Windows 7 (32-bit / 64-bit)
+* Windows 8 (32-bit / 64-bit)
+* Windows 8.1 (32-bit / 64-bit)
+
+
+### DirectX 9 以上をサポートしたGPU (推奨)
+
+表示オプションでDirect2Dを使用するには、DirectX 9 以上をサポートしたGPUが必要です。
+
+サポートしていない場合は自動的にGDIで描画されます。(多分)
+
+
+### Vista 用更新プログラムのインストール
+
+Windows Vista SP2 では、以下のプラットフォーム更新プログラムのいずれかを予めインストールして下さい。
+
+Windows 7 以降ではインストールは不要です。
+
+* KB971644 (Windows Update から)
+* KB971512
+
+ (x64) http://www.microsoft.com/ja-JP/download/details.aspx?id=4390
+
+ (x86) http://www.microsoft.com/ja-JP/download/details.aspx?id=3274
+
+
+### CorvusSKK のインストール
+
+corvusskk-X.Y.Z.zip を展開し、32bit版 Windows では corvusskk-X.Y.Z-x86.msi、64bit版 Windows では corvusskk-X.Y.Z-x64.msi を実行して下さい。(X, Y, Z はバージョン番号)
+
+アップデートの後はOSを再起動しておくと安全です。
+
+
+### 初期設定
+
+任意のユーザーアカウントで初めて使用するときは、設定ダイアログでOKボタンを押して初期設定を保存して下さい。
+
+設定ダイアログで保存した後は、IME OFF → ON で新しい設定が反映されます。
+
+バージョンアップで設定項目が追加されているとき、機能の種類によっては設定ダイアログで一度は保存する必要があるので、バージョンアップしたら動かない機能がある!というときは設定ダイアログでOKボタンを押してみて下さい。
+
+
+### Windows Store アプリ
+
+Windows Store アプリで使用するには、設定ファイル(config.xml)に Windows Store アプリへのアクセス許可を付加させる必要があります。
+
+Windows 8 以降で動作する設定ダイアログでOKボタンを押して保存を行うとアクセス許可の付加が自動的に行われます。
+
+
+### Adobe Reader X, XI, Acrobat Reader DC
+
+Adobe Reader X 以降で使用するには、設定ファイル(config.xml)に Adobe Reader へのアクセス許可を付加させる必要があります。
+
+設定ダイアログでOKボタンを押して保存を行うとアクセス許可の付加が自動的に行われます。
+
+
+
+## 設定
+
+### 設定ダイアログ
+
+設定ダイアログは、以下の操作で開くことができます。
+
+* 言語バーを右クリックし、メニューから「設定」を選択する。「テキストサービスと入力言語」ダイアログの「インストールされているサービス」からCorvusSKKを選択し、プロパティボタンを押す。
+* 言語バーの入力モードアイコンを左クリックし、メニューから「設定」を選択する。
+* 言語バーのヘルプボタンを左クリックし、メニューから「設定」を選択する。
+* Windows 8 以降の通知領域の入力モードアイコンを右クリックし、メニューから「設定」を選択する。
+
+設定ダイアログで保存した後は、IME OFF → ON で新しい設定が反映されます。
+
+IME ON/OFF のキーのみ、IME ON → OFF のときにも反映されます。
+
+
+### 設定ファイル、SKK辞書
+
+各種設定及び取込済SKK辞書は、ディレクトリ %AppData%\CorvusSKK の各ファイルに保存されます。
+
+| ファイル名 | 説明 |
+|---|---|
+| config.xml | 各種設定 |
+| skkdict.dic | 取込済SKK辞書 |
+| skkdict.idx | 取込済SKK辞書インデックス |
+
+各種設定の config.xml ファイルは、UTF-8 の XML フォーマットのテキストファイルとなっており、テキストエディタで編集可能です。変更した後は、IME OFF → ON で新しい設定が反映されます。
+
+
+### ユーザー辞書
+
+ユーザー辞書は、ディレクトリ %AppData%\CorvusSKK のファイルに保存されます。
+
+| ファイル名 | 説明 |
+|---|---|
+| userdict.txt | ユーザー辞書 |
+
+UTF-16(LE, BOMあり)のSKK辞書フォーマットとなっています。
+
+ユーザー辞書を編集する際は、ログオンユーザー権限で動作しているサーバープロセス(imcrvmgr.exe)をタスクマネージャなどで終了させた状態で行なって下さい。
+
+編集後、以下のいずれかの操作を行うとサーバープロセスが自動的に起動します。
+
+* IME OFF → ON
+* 仮名漢字変換開始
+* 補完開始
+
+ユーザー辞書は、サーバープロセスの起動時にメモリ上に読み込まれ、追加、変更、削除があったとき、かつ、以下のいずれかのときに上書きされます。
+
+* IME ON 状態から OFF 状態にするとき
+* IME ON 状態のアプリケーションが終了するとき
+* アプリケーションがフォーカスを失うとき
+* サーバープロセス(imcrvmgr.exe)が終了するとき
+
+
+### SKK辞書
+
+SKK辞書の詳細はこちらを参照下さい。 http://openlab.jp/skk/wiki/wiki.cgi?page=FrontPage
+
+こちらから辞書をダウンロード出来ます。 http://openlab.ring.gr.jp/skk/skk/dic/
+
+設定ダイアログのリストにSKK辞書を追加し、取込ボタンを押して下さい。取込済SKK辞書に変換されて使用可能となります。
+
+SKK辞書ファイルの文字コードは、EUC-JIS-2004、UTF-8 (BOMなし/あり)、UTF-16 (LE, BOMあり)に対応しています。
+
+SKK辞書のURLを追加した場合は、取込処理のときにディレクトリ %TMP%\CorvusSKK または %TEMP%\CorvusSKK にダウンロードされてから取り込まれます。
+
+SKK辞書のダウンロード機能では FTP, HTTP, HTTPS が使用可能です。プロキシはOSに設定されたものが使用されます。
+
+
+### SKK辞書サーバー
+
+別途用意されたSKK辞書サーバーと通信して、skkservプロトコルのクライアントとして辞書検索を行います。
+
+同時に1つのみ使用可能です。IPv4、IPv6 に対応しています。
+
+通信に使用する文字コードは、EUC-JIS-2004、UTF-8 に対応していますが、通常のSKK辞書サーバーではデフォルトの EUC-JIS-2004 を使用して下さい。
+
+サーバーコンプリーション機能は未実装です。
+
+
+### 動作
+
+| 機能 | 備考 |
+|---|---|
+| 初期入力モード | プログラム起動時の入力モードを指定します。 |
+| 送り仮名が決定したとき変換を開始する | 送り仮名を入力したとき自動的に変換を開始します。接頭辞も同様です。 |
+| 取消のとき変換位置を削除する | ▼モードから▽モードに遷移する際、送り仮名の位置情報を削除します。 |
+| 取消のとき送り仮名を削除する | ▼モードから▽モードに遷移する際、送り仮名の部分を削除します。 |
+| 後退に確定を含める | ▼モードのとき後退すると一文字削除した上で確定します。
OFFでは▼モードのとき後退は前候補と同じ機能を有します。 |
+| 候補に片仮名変換を追加する | 見出し語を片仮名に変換した候補を追加します。 |
+| 送り仮名で撥音を送り出す | 送り仮名入力開始後の変換位置指定を含む「な/にゃ」行の入力で「ん」を送り出します。
例) ON:「NoNO」→「▽の\*んお」/ OFF:「NoNO」→「▽の\*の」 |
+| 送り仮名が一致した候補を優先する | 送り仮名ブロックの送り仮名が一致する候補を優先して出力します。 |
+| 複数補完を使用する | 通常の補完のとき補完された見出し語を7個ずつ表示します。
補完対象は「候補一覧の色」の「選択」、補完部分は「候補」の色が使用されます。 |
+| 動的補完を使用する | 見出し語が入力されたとき補完された見出し語を表示します。
「▽表示属性」の「\*送り」の色が使用されます。 |
+| 複数動的補完を使用する | 見出し語が入力されたとき補完された見出し語を7個ずつ表示します。
補完対象は「候補一覧の色」の「選択」、補完部分は「候補」の色が使用されます。 |
+| 補完のときユーザー辞書を検索する | 補完/複数補完/動的補完/複数動的補完のときユーザー辞書の検索結果を追加して表示します。
表示する候補の数は最大で「候補一覧表示に要する変換回数」-1 です。
補完/動的補完では「▽表示属性」の「\*送り」の色が使用されます。
複数補完/複数動的補完では「候補一覧の色」の「注釈」の色が使用されます。 |
+
+
+###表示
+
+| 機能 | 備考 |
+|---|---|
+| 候補一覧のフォント | 候補一覧に表示するフォントの種類、スタイル、サイズを指定します。 |
+| 候補一覧の最大幅 | 候補一覧の最大幅のサイズを指定します。 |
+| 候補一覧の色 | 候補一覧の色を指定します。 |
+| 候補一覧の描画API | 候補一覧の描画を行うAPIを指定します。
Direct2Dと彩色の指定でカラーフォントをその色で表示します。(Windows8.1以降) |
+| 候補一覧表示に要する変換回数(0は表示無し) | 指定した回数変換すると候補一覧が表示されます。 |
+| 候補一覧が表示無しのとき候補数を表示する | (<現在の候補の番号>/<候補数>) の形式を追加して表示します。 |
+| 候補一覧を縦に表示する | 候補一覧で候補を縦に並べて表示します。 |
+| 注釈を表示する | <候補><セミコロン><注釈> の形式で注釈を表示します。 |
+| 入力モードを表示する | キャレットまたは辞書登録ウィンドウ付近に入力モードを表示します。
タイミングは、IME ON、入力モード変更、「\*無効\*」キー押下のときです。 |
+| ▽▼\*マークを表示する | 大切なものは目に見えないようです。 |
+| ローマ字を表示する | 仮名文字のローマ字プレフィックスを表示します。 |
+
+
+### 表示属性
+
+入力中文字列の表示属性を設定します。
+
+「連続」のチェックボックスをチェックすると、表の左側の表示属性を継承し、下線は繋って表示されます。
+
+確定入力モードでのローマ字は連続のチェックの有無に関わらず見出し語と同じ表示属性となります。
+
+辞書削除の確認メッセージは注釈と同じ表示属性となります。
+
+
+### 候補一覧選択キー
+
+候補一覧での確定は、デフォルトで 1〜7 と ASDFJKL と asdfjkl を使用します。
+
+コマンドプロンプト等では、デフォルトで 1〜9 と ASDFJKLGH と asdfjklgh を使用します。
+
+候補一覧が表示されているとき、Kanaキーロックは無視されます。
+
+| 機能 | 説明 |
+|---|---|
+| 数字 | 選択キー(1〜9で固定) |
+| 表示 | 選択キー(必須、候補一覧の表示にも使用) |
+| 予備 | 選択キー(空でもOK) |
+
+
+### キー設定(ON/OFF)
+
+IME ON/OFF のキーを指定します。
+
+仮想キーコード、Alt、Control、Shift の組合せを設定して下さい。
+
+仮想キーコードの詳細はこちらを参照下さい。 http://msdn.microsoft.com/en-us/library/dd375731(v=vs.85).aspx
+
+最大で8行です。
+
+
+### キー設定(文字)、キー設定(仮想キー)
+
+各機能に対してキーを正規表現で設定して下さい。
+
+Visual C++ 2013 の 正規表現で、文法は ECMAScript を使用しています。
+
+正規表現の詳細はこちらを参照下さい。 http://msdn.microsoft.com/en-us/library/bb982727(v=vs.120).aspx
+
+無効な正規表現で設定するとその機能は無効となります。警告等は表示されません。
+
+キー設定(文字)とキー設定(仮想キー)とで重複する場合は、キー設定(仮想キー)のほうが優先されます。
+
+キー設定(文字)には ASCII の範囲内の文字を設定出来ます。
+
+キー設定(仮想キー)にはShiftキー(S)またはCtrlキー(C)をキーコードに前置することで、修飾キーを設定出来ます。
+
+例えば、Shift+Tabであれば「S\x09」、Ctrl+Returnであれば「C\x0D」と記述します。
+
+
+### キー設定デフォルト
+
+キー設定 ON/OFF
+
+| 機能 | キー | 備考 |
+|---|---|---|
+| ON / OFF | Alt+` | 0xC0 + Alt |
+| 〃 | 漢字 | 0x19 |
+| 〃 | (Alt+半角/全角 Alt+`) | 0x19 |
+| 〃 | 半角/全角(Ctrl+`) | 0xF3, 0xF4 |
+
+キー設定(文字)
+
+| 機能 | キー | 備考 |
+|---|---|---|
+| かな/カナ | q | ひらがな/カタカナモード、かなカナ変換 |
+| カナ全英変換 | Ctrl+q | ひらがな/半角カタカナモード
ひらがなカタカナ→半角カタカナ変換
abbrev→全角英数字変換 |
+| 全英 | L | 全英モード |
+| ASCII | l | アスキーモード |
+| ひらがな | | ひらがなモード |
+| abbrev | / | abbrevモード |
+| 接辞 | < > | 接頭辞・接尾辞 |
+| 次候補 | Space Ctrl+n | 辞書検索開始、次候補 |
+| 前候補 | x Ctrl+p | 「後退」のキーも使用可 |
+| 辞書削除 | X Ctrl+x | ユーザー辞書から候補を削除 |
+| 次補完 | Ctrl+i(Tab) | 補完開始、次見出し語候補 |
+| 前補完 | Ctrl+u | 前見出し語候補 |
+| 絞り込み | | 候補を絞り込む見出し語の入力開始
skk-hint-start-char |
+| 変換位置 | | 変換位置指定
2回連続入力で文字自体が確定する
skk-sticky-key |
+| 直接入力 | 0〜9 | 見出し語入力でローマ字仮名変換しない |
+| 確定 | Ctrl+m(Return) Ctrl+j | |
+| 取消 | Ctrl+g Ctrl+[(Escape) | |
+| 後退 | Ctrl+h(BS) | |
+| 削除 | Ctrl+d DEL(Ctrl+BS) | |
+| \*無効\* | | アプリケーション側に非通知
辞書登録の確定無効 |
+| 左移動 | Ctrl+b | |
+| 先頭移動 | Ctrl+a | |
+| 右移動 | Ctrl+f | |
+| 末尾移動 | Ctrl+e | |
+| 貼付 | Ctrl+y Ctrl+v | クリップボードの文字列を貼り付け |
+
+ キー設定(仮想キー)
+
+| 機能 | キー | 備考 |
+|---|---|---|
+| かな/カナ | | ひらがな/カタカナモード、かなカナ変換 |
+| カナ全英変換 | | ひらがな/半角カタカナモード
ひらがなカタカナ→半角カタカナ変換
abbrev→全角英数字変換 |
+| 全英 | | 全英モード |
+| ASCII | | アスキーモード |
+| ひらがな | Ctrl+0x4A (Ctrl+j) | ひらがなモード |
+| abbrev | | abbrevモード |
+| 接辞 | | 接頭辞・接尾辞 |
+| 次候補 | | 辞書検索開始、次候補 |
+| 前候補 | | 「後退」のキーも使用可 |
+| 辞書削除 | | ユーザー辞書から候補を削除 |
+| 次補完 | | 補完開始、次見出し語候補 |
+| 前補完 | Shift+0x09(Shift+Tab) | 前見出し語候補 |
+| 絞り込み | | 候補を絞り込む見出し語の入力開始
skk-hint-start-char |
+| 変換位置 | | 変換位置指定
skk-sticky-key |
+| 直接入力 | | 見出し語入力でローマ字仮名変換しない(不使用) |
+| 確定 | | |
+| 取消 | | |
+| 後退 | | |
+| 削除 | 0x2E (Delete) | |
+| \*無効\* | Ctrl+0x4A (Ctrl+j) | アプリケーション側に非通知
辞書登録の確定無効 |
+| 左移動 | 0x25 (カーソル左) | |
+| 先頭移動 | 0x26 (カーソル上) | |
+| 右移動 | 0x27 (カーソル右) | |
+| 末尾移動 | 0x28 (カーソル下) | |
+| 貼付 | | クリップボードの文字列を貼り付け |
+
+
+### キー設定と入力モード遷移図
+
+![](installer/README_mode.png)
+
+
+### 半角カタカナモード
+
+半角カタカナモードでは、ローマ字仮名変換のみ可能です。
+
+ひらがな/カタカナへの変換、仮名漢字変換は出来ません。
+
+
+### 変換位置指定
+
+変換位置での挙動を指定します。最大で256行です。
+
+| 機能 | 説明 |
+|---|---|
+| 開始 | 変換位置開始キー |
+| 代替 | 変換位置開始キーに代わってローマ字仮名変換に使用する |
+| 送り | 辞書検索に使用する送りローマ字 |
+
+* 例1)AZIK風に、ローマ字仮名変換表で「q ん ン ン 0」と設定し、開始「Q」代替「q」送り「n」と設定する。
+
+ * 「KaQ」と入力すると、表示「▽か\*ん」、辞書検索キー「かn」と出来ます。
+
+* 例2)開始「(空)」代替「あ」送り「a」と設定する。
+
+ * かな入力のとき、送り仮名の最初を「あ」の状態で辞書検索を開始すると、送りローマ字が「a」となります。
+
+
+### ローマ字・仮名変換表
+
+ローマ字、平仮名、片仮名、所謂半角片仮名、促音/撥音(ん)、待機の組み合せを指定します。
+
+「促/ん」がONのとき、仮名が決定したあとに最後の入力文字が入力状態となります。
+
+「待機」がONのとき、入力した文字をローマ字仮名変換した結果(変換出来ないときは入力した文字そのまま)がローマ字として扱われ、辞書検索開始、確定、補完開始、ローマ字に設定されていない組み合わせ、のいずれかになるまで仮名の最終的な決定が遅延されます。
+
+平仮名/片仮名変換では基本的に1文字ずつ変換されます。
+
+例外として、「う゛」(う+濁点)は「ウ゛」(ウ+濁点)ではなく「ヴ」と変換されます。
+
+* 例) 平仮名「きょう」を片仮名「キョウ」に変換する場合、「きょ」→「キョ」、「う」→「ウ」ではなく、「き」→「キ」、「ょ」→「ョ」、「う」→「ウ」と変換されます。
+
+最大で32768行です。
+
+「…」ボタンから、KanaTableファイルの読み込みと書き出しを行うことができます。
+
+
+### KanaTableファイル
+
+* 文字コード:UTF-16(LE,BOMあり) または UTF-8
+* 改行:CR+LF または LF
+* フォーマット:<ローマ字><\t><ひらがな><\t><カタカナ><\t><カタカナ(半角)><\t><[促/ん]/[待機]><\r><\n>
+ * <ローマ字>、<ひらがな>、<カタカナ>、<カタカナ(半角)>は、それぞれUTF-16換算で最大14バイトです。
+ * [促/ん]は、ONのとき1、OFFのとき0です。
+ * [待機]は、ONのとき2、OFFのとき0です。
+ * <[促/ん]|[待機]>は、[促/ん]と[待機]の両方がONのとき3となりますが、[待機]のほうが優先されます。(0のときは無しでも可)
+ * 空行やタブのみの行は読み飛ばされます。
+ * <\t>、<\r>、<\n>は、それぞれタブ、改行コードに読み替えて下さい。
+* 例1)a<\t>あ<\t>ア<\t>ア<\r><\n>
+* 例2)nn<\t>ん<\t>ン<\t>ン<\t>0<\r><\n>
+* 例3)np<\t>ん<\t>ン<\t>ン<\t>1<\r><\n>
+* 例4)コ<\t>こ<\t>コ<\t>コ<\t>2<\r><\n>
+
+
+### ASCII・全英変換表
+
+ASCII、全英文字の組み合せを指定します。最大で128行です。
+
+
+
+## その他
+
+
+### Lua拡張
+
+サーバープロセス(imcrvmgr.exe)の各機能の拡張、プログラム実行変換もどき、数値変換をLuaスクリプトで実装しています。
+
+現在使用しているLuaのバージョンは5.3.0です。
+
+詳細はこちらを参照下さい。http://www.lua.org/manual/5.3/manual.html
+
+Lua内部の文字コードをUTF-8に決め打ちして、Unicode版のWindowsAPIとCランタイム関数を呼ぶようにパッチを当てています。
+
+スクリプトファイルの文字コードはUTF-8のみに対応しています。
+
+サーバープロセスのカレントディレクトリは、%AppData%\CorvusSKK になっています。
+
+サーバープロセスの起動時にスクリプトファイル(init.lua)が下記の優先順位でロードされます。
+
+1. %AppData%\CorvusSKK\init.lua
+2. サーバープロセスと同じディレクトリのinit.lua
+ * 通常、%SystemRoot%\System32\IME\IMCRVSKK\init.lua
+ * または、%SystemRoot%\SysWOW64\IME\IMCRVSKK\init.lua
+
+コンソールプログラムのlua.exeが %SystemRoot%\System32\IME\IMCRVSKK と %SystemRoot%\SysWOW64\IME\IMCRVSKK にあるので、カスタマイズする際のデバッグ用に使って下さい。
+
+
+### プログラム実行変換もどき
+
+Emacs Lispのプログラム実行変換に対応していますが、あくまで「もどき」なのでご了承下さい。
+
+以下の関数、値に大体対応しています。
+
+ substring
+ concat
+ make-string
+ string-to-char
+ string-to-number
+ current-time-string
+ car (skk-num-list の先頭要素のみ)
+ lambda
+ 1+
+ 1-
+ +
+ -
+ *
+ /
+ %
+ skk-version
+ skk-server-version
+ skk-gadget-units-conversion
+ skk-ad-to-gengo
+ skk-gengo-to-ad
+ skk-current-date
+ skk-default-current-date
+ skk-relative-date
+ skk-ignore-dic-word (デフォルト無効)
+ skk-omikuji (引数なし、独自実装。おみくじを引くことができます)
+ window-width (80で固定)
+ fill-column (70で固定)
+ comment-start ("/*")
+ comment-end ("*/")
+
+
+### 数値変換
+
+タイプ0〜3,5,8,9に対応しています。
+
+タイプ3と5での数値は0〜10^68-1の整数に対応しています。
+
+独自実装としてタイプ6(ローマ数字)が、1〜3999の整数に対応しています。
+
+見出し語として # (ナンバーサイン)を含み、候補として # と数字を含むエントリが辞書に存在する必要があります。(例:「めいじ#ねん /明治#3年/」)
+
+| 候補 | 説明 | 例 |
+|---|---|---|
+| #0 | タイプ0 無変換 |「1234567890」→「1234567890」 |
+| #1 | タイプ1 全角 |「1234567890」→「1234567890」 |
+| #2 | タイプ2 漢数字 位取りあり |「1234567890」→「一二三四五六七八九〇」 |
+| #3 | タイプ3 漢数字 位取りなし |「1234567890」→「十二億三千四百五十六万七千八百九十」 |
+| #5 | タイプ5 大字 |「1234567890」→「拾弐億参千四百五拾六万七千八百九拾」 |
+| #6 | タイプ6 ローマ数字(独自) |「1234」→「MCCXXXIV」 |
+| #8 | タイプ8 桁区切り |「1234567890」→「1,234,567,890」 |
+| #9 | タイプ9 将棋 |「12kin」→「1二金」 |
+
+
+### Unicodeコードポイント変換
+
+「U+XXXXXX」( コードポイント XXXXXX : 0000-FFFF または 10000-10FFFF ) または「uxxxxxx」( コードポイント xxxxxx : 0000-ffff または 10000-10ffff ) のフォーマットで変換して下さい。
+
+* 例1)「▽U+30A2」→「▼ア」
+* 例2)「▽u30a2」→「▼ア」
+
+
+### JIS X 0213面区点番号変換
+
+「X-YY-ZZ」( 面 X : 1-2、 区 YY : 01-94、点 ZZ: 01-94 ) のフォーマットで変換して下さい。Unicodeコードポイントが注釈として付加されます。
+
+* 例)「▽1-05-02」→「▼ア;U+30A2」
+
+
+### 文字コード表記変換
+
+「?X」( X : 任意の1文字以上の文字列 ) のフォーマットで変換して下さい。
+
+ASCII(hex), JIS X 0201(片仮名, 8bit, hex), JIS X 0213面区点番号のカンマ区切りの候補およびUnicodeコードポイントのカンマ区切りの候補に変換されます。
+
+ASCII, JIS X 0201, JIS X 0213に変換できない文字が含まれていた場合、Unicodeコードポイントの候補のみとなります。
+
+* 例1)「▽?ア」→「▼1-05-02」/「▼U+30A2」
+* 例2)「▽?あアアa」→「▼1-04-02,1-05-02,B1,61」/「▼U+3042,U+30A2,U+FF71,U+0061」
+* 例3)「▽?🐧」→「▼U+1F427」
+
+
+### 注釈の登録
+
+辞書登録のとき、登録する候補の入力と同時に行います。
+
+行頭以外の最後のセミコロン(いわゆる半角のセミコロン)以降が注釈となります。
+
+注釈にセミコロンを含めることは出来ません。
+
+* 例1)登録する見出し語「しょへい#ねん」、登録する候補「初平#3年」、登録する注釈「後漢」の場合
+ * 「初平#3年;後漢」と入力する。
+
+* 例2)登録する見出し語「なき」、登録する候補「(;_;)」、登録する注釈「顔文字」の場合
+ * 「(;_;);顔文字」と入力する。
+
+* 例3)登録する見出し語「せみころん」、登録する候補「;」、登録する注釈「セミコロン」の場合
+ * 「;;セミコロン」と入力する。
+
+
+### Windows 8, 8.1 のタッチキーボード
+
+タッチパネルを搭載したマシンでハードウェアキーボードに準拠したレイアウトを使用するには、以下の操作を行って下さい。
+
+* Windows 8 の場合
+ * 「PC設定」の画面 → 「全般」を選択 → 「タッチキーボード」の項目 → 「ハードウェアキーボードに準拠したレイアウトを使えるようにする」をオン
+
+* Windows 8.1 の場合
+ * 「PC設定」の画面 → 「PCとデバイス」の画面 → 「入力」を選択 → 「ハードウェアキーボードに準拠したレイアウトをタッチキーボードオプションとして追加する」をオン
-### Supported Operating Systems
+タッチパネルを搭載していないマシンでハードウェアキーボードに準拠したレイアウトを使用するには、レジストリに以下の値を設定して下さい。
-* Windows Vista (x86 / x64) SP2
-* Windows 7 (x86 / x64)
-* Windows 8 (x86 / x64)
-* Windows 8.1 (x86 / x64)
+ [HKEY_CURRENT_USER\SOFTWARE\Microsoft\TabletTip\1.7]
+ "EnableCompatibilityKeyboard"=dword:00000001
-### Build Requirements
-* Visual Studio Express 2013 for Windows Desktop Update 4
-* WiX Toolset v3.9 R2
+### 開発環境
-### Manual
+Visual Studio Express 2013 for Windows Desktop Update 4
-See installer\README.TXT (written in Japanese)
+WiX Toolset v3.9 R2
diff --git a/common/common.cpp b/common/common.cpp
index 0777cb65..ac668b8e 100644
--- a/common/common.cpp
+++ b/common/common.cpp
@@ -1,10 +1,10 @@
#include "common.h"
-#define CCSUNICODE L",ccs=UNICODE"
+#define CCSUTF16 L",ccs=UTF-16LE"
#define CCSUTF8 L",ccs=UTF-8"
-LPCWSTR RccsUNICODE = L"r" CCSUNICODE;
-LPCWSTR WccsUNICODE = L"w" CCSUNICODE;
+LPCWSTR RccsUTF16 = L"r" CCSUTF16;
+LPCWSTR WccsUTF16 = L"w" CCSUTF16;
LPCWSTR RccsUTF8 = L"r" CCSUTF8;
LPCWSTR WccsUTF8 = L"w" CCSUTF8;
LPCWSTR RB = L"rb";
diff --git a/common/common.h b/common/common.h
index f507878c..3dbcea83 100644
--- a/common/common.h
+++ b/common/common.h
@@ -54,8 +54,8 @@ typedef struct {
BYTE digest[16];
} MD5_DIGEST;
-extern LPCWSTR RccsUNICODE;
-extern LPCWSTR WccsUNICODE;
+extern LPCWSTR RccsUTF16;
+extern LPCWSTR WccsUTF16;
extern LPCWSTR RccsUTF8;
extern LPCWSTR WccsUTF8;
extern LPCWSTR RB;
diff --git a/common/version.h b/common/version.h
index 664a0240..c2ef97c3 100644
--- a/common/version.h
+++ b/common/version.h
@@ -3,7 +3,7 @@
#define VERSION_H
#define TEXTSERVICE_NAME L"CorvusSKK"
-#define TEXTSERVICE_VER L"1.8.6"
+#define TEXTSERVICE_VER L"1.8.7"
#ifndef _DEBUG
#define TEXTSERVICE_DESC TEXTSERVICE_NAME
@@ -14,7 +14,7 @@
//for resource
#define RC_AUTHOR "nathancorvussolis"
#define RC_PRODUCT "CorvusSKK"
-#define RC_VERSION "1.8.6"
-#define RC_VERSION_D 1,8,6,0
+#define RC_VERSION "1.8.7"
+#define RC_VERSION_D 1,8,7,0
#endif
diff --git a/imcrvcnf/DlgProcDictionary.cpp b/imcrvcnf/DlgProcDictionary.cpp
index d1eda950..3b798e51 100644
--- a/imcrvcnf/DlgProcDictionary.cpp
+++ b/imcrvcnf/DlgProcDictionary.cpp
@@ -7,6 +7,10 @@ static LPCWSTR defaultHost = L"localhost";
static LPCWSTR defaultPort = L"1178";
static LPCWSTR defaultTimeOut = L"1000";
+static WCHAR urlskkdic[INTERNET_MAX_URL_LENGTH];
+
+INT_PTR CALLBACK DlgProcSKKDicAddUrl(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
+
INT_PTR CALLBACK DlgProcDictionary(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
HWND hWndListView;
@@ -95,12 +99,13 @@ INT_PTR CALLBACK DlgProcDictionary(HWND hDlg, UINT message, WPARAM wParam, LPARA
}
return TRUE;
- case IDC_BUTTON_SKK_DIC_ADD:
+ case IDC_BUTTON_SKK_DIC_ADD_FILE:
path[0] = L'\0';
ZeroMemory(&ofn, sizeof(OPENFILENAMEW));
ofn.lStructSize = sizeof(OPENFILENAMEW);
ofn.hwndOwner = hDlg;
ofn.lpstrFile = path;
+ ofn.lpstrTitle = L"ファイル追加";
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_FILEMUSTEXIST;
if(GetOpenFileNameW(&ofn) != 0)
@@ -128,6 +133,38 @@ INT_PTR CALLBACK DlgProcDictionary(HWND hDlg, UINT message, WPARAM wParam, LPARA
}
return TRUE;
+ case IDC_BUTTON_SKK_DIC_ADD_URL:
+ urlskkdic[0] = L'\0';
+ if(IDOK == DialogBoxW(hInst, MAKEINTRESOURCE(IDD_DIALOG_SKK_DIC_ADD_URL), hDlg, DlgProcSKKDicAddUrl))
+ {
+ if(urlskkdic[0] == L'\0')
+ {
+ return TRUE;
+ }
+
+ PropSheet_Changed(GetParent(hDlg), hDlg);
+
+ index = ListView_GetNextItem(hWndListView, -1, LVNI_SELECTED);
+ count = ListView_GetItemCount(hWndListView);
+ if(index == -1)
+ {
+ index = count;
+ }
+ else
+ {
+ ++index;
+ }
+ item.mask = LVIF_TEXT;
+ item.pszText = urlskkdic;
+ item.iItem = index;
+ item.iSubItem = 0;
+ ListView_InsertItem(hWndListView, &item);
+ ListView_SetItemState(hWndListView, index, LVIS_FOCUSED | LVIS_SELECTED, 0x000F);
+ ListView_SetColumnWidth(hWndListView, 0, LVSCW_AUTOSIZE);
+ ListView_EnsureVisible(hWndListView, index, FALSE);
+ }
+ return TRUE;
+
case IDC_BUTTON_SKK_DIC_DEL:
index = ListView_GetNextItem(hWndListView, -1, LVNI_SELECTED);
if(index != -1)
@@ -225,3 +262,47 @@ INT_PTR CALLBACK DlgProcDictionary(HWND hDlg, UINT message, WPARAM wParam, LPARA
return FALSE;
}
+
+INT_PTR CALLBACK DlgProcSKKDicAddUrl(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ switch(message)
+ {
+ case WM_INITDIALOG:
+ return TRUE;
+ case WM_CTLCOLORDLG:
+ case WM_CTLCOLORSTATIC:
+ case WM_CTLCOLORBTN:
+ SetBkMode((HDC)wParam, TRANSPARENT);
+ SetTextColor((HDC)wParam, GetSysColor(COLOR_WINDOWTEXT));
+ return (INT_PTR)GetSysColorBrush(COLOR_WINDOW);
+ case WM_COMMAND:
+ switch(LOWORD(wParam))
+ {
+ case IDOK:
+ GetDlgItemTextW(hDlg, IDC_EDIT_SKK_DIC_URL, urlskkdic, _countof(urlskkdic));
+ {
+ // trim
+ std::wstring strurl = std::regex_replace(std::wstring(urlskkdic),
+ std::wregex(L"^\\s+|\\s+$"), std::wstring(L""));
+ _snwprintf_s(urlskkdic, _TRUNCATE, L"%s", strurl.c_str());
+
+ if(urlskkdic[0] == L'\0')
+ {
+ EndDialog(hDlg, IDCANCEL);
+ }
+ }
+ EndDialog(hDlg, IDOK);
+ break;
+ case IDCANCEL:
+ urlskkdic[0] = L'\0';
+ EndDialog(hDlg, IDCANCEL);
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ return FALSE;
+}
diff --git a/imcrvcnf/PropertyConfDictionary.cpp b/imcrvcnf/PropertyConfDictionary.cpp
index e034c309..29a99a65 100644
--- a/imcrvcnf/PropertyConfDictionary.cpp
+++ b/imcrvcnf/PropertyConfDictionary.cpp
@@ -12,6 +12,7 @@ struct {
HWND child;
HRESULT hr;
BOOL cancel;
+ WCHAR path[MAX_PATH];
} SkkDicInfo;
void LoadDictionary(HWND hwnd)
@@ -118,13 +119,105 @@ void LoadSKKDicAdd(SKKDIC &skkdic, const std::wstring &key, const std::wstring &
}
}
+HRESULT DownloadDic(LPCWSTR url, LPWSTR path, size_t len)
+{
+ HINTERNET hInet;
+ HINTERNET hUrl;
+ CHAR rbuf[RECVBUFSIZE];
+ BOOL retRead;
+ DWORD bytesRead = 0;
+ DWORD dwTimeout = 1000;
+ FILE *fp;
+ WCHAR dir[MAX_PATH];
+ std::wstring strurl;
+
+ DWORD temppathlen = GetTempPathW(_countof(dir), dir);
+ if(temppathlen == 0 || temppathlen > _countof(dir))
+ {
+ return E_FAIL;
+ }
+
+ wcsncat_s(dir, TEXTSERVICE_NAME, _TRUNCATE);
+ _wmkdir(dir);
+
+ strurl.assign(url);
+ strurl = std::regex_replace(strurl, std::wregex(L".+/"), std::wstring(L""));
+ if(strurl.empty())
+ {
+ return E_FAIL;
+ }
+ strurl = std::regex_replace(strurl, std::wregex(L"[\\\\/:*?\"<>|]"), std::wstring(L"_"));
+ _snwprintf_s(path, len, _TRUNCATE, L"%s\\%s", dir, strurl.c_str());
+
+ hInet = InternetOpenW(TEXTSERVICE_NAME L"/" TEXTSERVICE_VER, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
+ if(hInet != NULL)
+ {
+ InternetSetOptionW(hInet, INTERNET_OPTION_CONNECT_TIMEOUT, &dwTimeout, sizeof(dwTimeout));
+ InternetSetOptionW(hInet, INTERNET_OPTION_DATA_SEND_TIMEOUT, &dwTimeout, sizeof(dwTimeout));
+ InternetSetOptionW(hInet, INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, &dwTimeout, sizeof(dwTimeout));
+
+ hUrl = InternetOpenUrlW(hInet, url, NULL, 0, 0, 0);
+ if(hUrl != NULL)
+ {
+ _wfopen_s(&fp, path, WB);
+ if(fp == NULL)
+ {
+ return E_FAIL;
+ }
+
+ while(true)
+ {
+ ZeroMemory(rbuf, sizeof(rbuf));
+ retRead = InternetReadFile(hUrl, rbuf, sizeof(rbuf), &bytesRead);
+ if(retRead)
+ {
+ if(bytesRead == 0)
+ {
+ break;
+ }
+ }
+ else
+ {
+ InternetCloseHandle(hUrl);
+ InternetCloseHandle(hInet);
+ fclose(fp);
+ return E_FAIL;
+ }
+
+ fwrite(rbuf, bytesRead, 1, fp);
+ }
+
+ InternetCloseHandle(hUrl);
+ fclose(fp);
+ }
+ else
+ {
+ InternetCloseHandle(hInet);
+ return E_FAIL;
+ }
+
+ InternetCloseHandle(hInet);
+ }
+ else
+ {
+ return E_FAIL;
+ }
+
+ return S_OK;
+}
+
HRESULT LoadSKKDic(HWND hwnd, SKKDIC &entries_a, SKKDIC &entries_n)
{
HWND hWndList;
WCHAR path[MAX_PATH];
+ WCHAR url[INTERNET_MAX_URL_LENGTH];
size_t count, ic;
FILE *fp;
+ int encode;
WCHAR bom;
+ BYTE rbom[3];
+ CHAR buf[READBUFSIZE * sizeof(WCHAR)];
+ std::string strbuf;
std::wstring key;
int okuri;
SKKDICCANDIDATES sc;
@@ -142,40 +235,91 @@ HRESULT LoadSKKDic(HWND hwnd, SKKDIC &entries_a, SKKDIC &entries_n)
}
ListView_GetItemText(hWndList, ic, 0, path, _countof(path));
- okuri = -1;
+ //download
+ if(std::regex_match(std::wstring(path), std::wregex(L"(ftp|http|https)://.+")))
+ {
+ ListView_GetItemText(hWndList, ic, 0, url, _countof(url));
+
+ HRESULT hrd = DownloadDic(url, path, _countof(path));
+ if(hrd != S_OK)
+ {
+ _snwprintf_s(SkkDicInfo.path, _TRUNCATE, L"%s", url);
+ return E_FAIL;
+ }
+ }
+
+ encode = 0;
+
+ //check BOM
_wfopen_s(&fp, path, RB);
if(fp == NULL)
{
- continue;
+ wcscpy_s(SkkDicInfo.path, path);
+ return E_FAIL;
}
-
- bom = L'\0';
- fread(&bom, 2, 1, fp);
- if(bom == 0xBBEF)
+ ZeroMemory(rbom, sizeof(rbom));
+ fread(rbom, 3, 1, fp);
+ if(rbom[0] == 0xFF && rbom[1] == 0xFE)
{
- bom = L'\0';
- fread(&bom, 2, 1, fp);
- if((bom & 0xFF) == 0xBF)
- {
- bom = 0xFEFF;
- }
+ //UTF-16LE
+ encode = 16;
+ }
+ else if(rbom[0] == 0xEF && rbom[1] == 0xBB && rbom[2] == 0xBF)
+ {
+ //UTF-8
+ encode = 8;
}
+ fclose(fp);
- switch(bom)
+ //UTF-8 ?
+ if(encode == 0)
{
- case 0xFEFF:
- fclose(fp);
- _wfopen_s(&fp, path, RccsUNICODE);
+ strbuf.clear();
+
+ _wfopen_s(&fp, path, RB);
if(fp == NULL)
{
- continue;
+ wcscpy_s(SkkDicInfo.path, path);
+ return E_FAIL;
+ }
+ while(fgets(buf, _countof(buf), fp) != NULL)
+ {
+ strbuf += buf;
}
+ fclose(fp);
+
+ if(MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, strbuf.c_str(), -1, NULL, 0) != 0)
+ {
+ encode = 8;
+ }
+ }
+
+ switch(encode)
+ {
+ case 8:
+ //UTF-8
+ bom = 0xFEFF;
+ _wfopen_s(&fp, path, RccsUTF8);
+ break;
+ case 16:
+ //UTF-16LE
+ bom = 0xFEFF;
+ _wfopen_s(&fp, path, RccsUTF16);
break;
default:
- fseek(fp, 0, SEEK_SET);
+ //EUC-JIS-2004
+ bom = L'\0';
+ _wfopen_s(&fp, path, RB);
break;
}
+ if(fp == NULL)
+ {
+ wcscpy_s(SkkDicInfo.path, path);
+ return E_FAIL;
+ }
+
+ okuri = -1;
while(true)
{
@@ -243,7 +387,8 @@ HRESULT WriteSKKDic(const SKKDIC &entries_a, const SKKDIC &entries_n)
_wfopen_s(&fp, pathskkdic, WB);
if(fp == NULL)
{
- return S_FALSE;
+ wcscpy_s(SkkDicInfo.path, pathskkdic);
+ return E_FAIL;
}
//BOM
@@ -293,7 +438,8 @@ HRESULT WriteSKKDic(const SKKDIC &entries_a, const SKKDIC &entries_n)
_wfopen_s(&fp, pathskkidx, WB);
if(fp == NULL)
{
- return S_FALSE;
+ wcscpy_s(SkkDicInfo.path, pathskkidx);
+ return E_FAIL;
}
FORWARD_ITERATION_I(keypos_itr, keypos)
@@ -327,7 +473,7 @@ unsigned int __stdcall MakeSKKDicThread(void *p)
void MakeSKKDicWaitThread(void *p)
{
- WCHAR num[32];
+ WCHAR msg[512];
HANDLE hThread;
hThread = (HANDLE)_beginthreadex(NULL, 0, MakeSKKDicThread, NULL, 0, NULL);
@@ -352,8 +498,8 @@ void MakeSKKDicWaitThread(void *p)
_wremove(pathskkidx);
_wremove(pathskkdic);
- _snwprintf_s(num, _countof(num), L"失敗しました。0x%08X", SkkDicInfo.hr);
- MessageBoxW(SkkDicInfo.parent, num, TextServiceDesc, MB_OK | MB_ICONERROR);
+ _snwprintf_s(msg, _TRUNCATE, L"失敗しました。\n\n%s", SkkDicInfo.path);
+ MessageBoxW(SkkDicInfo.parent, msg, TextServiceDesc, MB_OK | MB_ICONERROR);
}
return;
}
@@ -364,8 +510,9 @@ INT_PTR CALLBACK DlgProcSKKDic(HWND hDlg, UINT message, WPARAM wParam, LPARAM lP
{
case WM_INITDIALOG:
SkkDicInfo.cancel = FALSE;
- SkkDicInfo.hr = S_FALSE;
+ SkkDicInfo.hr = S_OK;
SkkDicInfo.child = hDlg;
+ SkkDicInfo.path[0] = L'\0';
_beginthread(MakeSKKDicWaitThread, 0, NULL);
SendMessage(GetDlgItem(hDlg, IDC_PROGRESS_DIC_MAKE), PBM_SETMARQUEE, TRUE, 0);
return TRUE;
diff --git a/imcrvcnf/imcrvcnf.rc b/imcrvcnf/imcrvcnf.rc
index 6e98f88f..7dbb36b1 100644
Binary files a/imcrvcnf/imcrvcnf.rc and b/imcrvcnf/imcrvcnf.rc differ
diff --git a/imcrvcnf/imcrvcnf.vcxproj b/imcrvcnf/imcrvcnf.vcxproj
index 681f2d10..228e042d 100644
--- a/imcrvcnf/imcrvcnf.vcxproj
+++ b/imcrvcnf/imcrvcnf.vcxproj
@@ -99,7 +99,7 @@
Windows
true
- common.lib;shlwapi.lib;xmllite.lib;comctl32.lib;comdlg32.lib;%(AdditionalDependencies)
+ common.lib;shlwapi.lib;xmllite.lib;comctl32.lib;comdlg32.lib;wininet.lib;%(AdditionalDependencies)
$(OutDir)
@@ -123,7 +123,7 @@
Windows
true
- common.lib;shlwapi.lib;xmllite.lib;comctl32.lib;comdlg32.lib;%(AdditionalDependencies)
+ common.lib;shlwapi.lib;xmllite.lib;comctl32.lib;comdlg32.lib;wininet.lib;%(AdditionalDependencies)
$(OutDir)
@@ -150,7 +150,7 @@
Windows
true
true
- common.lib;shlwapi.lib;xmllite.lib;comctl32.lib;comdlg32.lib;%(AdditionalDependencies)
+ common.lib;shlwapi.lib;xmllite.lib;comctl32.lib;comdlg32.lib;wininet.lib;%(AdditionalDependencies)
$(OutDir)
@@ -177,7 +177,7 @@
Windows
true
true
- common.lib;shlwapi.lib;xmllite.lib;comctl32.lib;comdlg32.lib;%(AdditionalDependencies)
+ common.lib;shlwapi.lib;xmllite.lib;comctl32.lib;comdlg32.lib;wininet.lib;%(AdditionalDependencies)
$(OutDir)
diff --git a/imcrvcnf/resource.h b/imcrvcnf/resource.h
index 927c6ab3..141d8c55 100644
--- a/imcrvcnf/resource.h
+++ b/imcrvcnf/resource.h
@@ -7,7 +7,8 @@
#endif
#define IDD_DIALOG_DICTIONARY 110
-#define IDD_DIALOG_BEHAVIOR 111
+#define IDD_DIALOG_SKK_DIC_ADD_URL 111
+#define IDD_DIALOG_BEHAVIOR 112
#define IDD_DIALOG_DISPLAY 120
#define IDD_DIALOG_DISPLAYATTR1 121
#define IDD_DIALOG_DISPLAYATTR2 122
@@ -20,11 +21,12 @@
#define IDD_DIALOG_JLATTBL 143
#define IDC_LIST_SKK_DIC 1001
-#define IDC_BUTTON_SKK_DIC_ADD 1002
-#define IDC_BUTTON_SKK_DIC_DEL 1003
-#define IDC_BUTTON_SKK_DIC_UP 1004
-#define IDC_BUTTON_SKK_DIC_DOWN 1005
-#define IDC_BUTTON_SKK_DIC_MAKE 1006
+#define IDC_BUTTON_SKK_DIC_ADD_FILE 1002
+#define IDC_BUTTON_SKK_DIC_ADD_URL 1003
+#define IDC_BUTTON_SKK_DIC_DEL 1004
+#define IDC_BUTTON_SKK_DIC_UP 1005
+#define IDC_BUTTON_SKK_DIC_DOWN 1006
+#define IDC_BUTTON_SKK_DIC_MAKE 1007
#define IDD_DIALOG_SKK_DIC_MAKE 1021
#define IDC_PROGRESS_DIC_MAKE 1022
#define IDC_BUTTON_ABORT_DIC_MAKE 1023
@@ -35,20 +37,22 @@
#define IDC_EDIT_SKKSRV_PORT 1055
#define IDC_EDIT_SKKSRV_TIMEOUT 1056
-#define IDC_CHECKBOX_DEFAULTMODE 1101
-#define IDC_RADIO_DEFMODEHIRA 1102
-#define IDC_RADIO_DEFMODEASCII 1103
-#define IDC_CHECKBOX_BEGINCVOKURI 1104
-#define IDC_CHECKBOX_DELCVPOSCNCL 1105
-#define IDC_CHECKBOX_DELOKURICNCL 1106
-#define IDC_CHECKBOX_BACKINCENTER 1107
-#define IDC_CHECKBOX_ADDCANDKTKN 1108
-#define IDC_CHECKBOX_SHIFTNNOKURI 1109
-#define IDC_CHECKBOX_PRECEDEOKURI 1110
-#define IDC_CHECKBOX_STACOMPMULTI 1111
-#define IDC_CHECKBOX_DYNAMINCOMP 1112
-#define IDC_CHECKBOX_DYNCOMPMULTI 1113
-#define IDC_CHECKBOX_COMPUSERDIC 1114
+#define IDC_EDIT_SKK_DIC_URL 1101
+
+#define IDC_CHECKBOX_DEFAULTMODE 1201
+#define IDC_RADIO_DEFMODEHIRA 1202
+#define IDC_RADIO_DEFMODEASCII 1203
+#define IDC_CHECKBOX_BEGINCVOKURI 1204
+#define IDC_CHECKBOX_DELCVPOSCNCL 1205
+#define IDC_CHECKBOX_DELOKURICNCL 1206
+#define IDC_CHECKBOX_BACKINCENTER 1207
+#define IDC_CHECKBOX_ADDCANDKTKN 1208
+#define IDC_CHECKBOX_SHIFTNNOKURI 1209
+#define IDC_CHECKBOX_PRECEDEOKURI 1210
+#define IDC_CHECKBOX_STACOMPMULTI 1211
+#define IDC_CHECKBOX_DYNAMINCOMP 1212
+#define IDC_CHECKBOX_DYNCOMPMULTI 1213
+#define IDC_CHECKBOX_COMPUSERDIC 1214
#define IDC_EDIT_FONTNAME 2001
#define IDC_EDIT_FONTPOINT 2002
diff --git a/imcrvcnf/stdafx.h b/imcrvcnf/stdafx.h
index 2ff25096..ae67a159 100644
--- a/imcrvcnf/stdafx.h
+++ b/imcrvcnf/stdafx.h
@@ -18,3 +18,4 @@
#include
#include
#include
+#include
diff --git a/imcrvmgr/SearchUserDictionary.cpp b/imcrvmgr/SearchUserDictionary.cpp
index 767a3c21..fd88af3c 100644
--- a/imcrvmgr/SearchUserDictionary.cpp
+++ b/imcrvmgr/SearchUserDictionary.cpp
@@ -297,7 +297,7 @@ BOOL LoadSKKUserDic()
complements.clear();
accompaniments.clear();
- _wfopen_s(&fp, pathuserdic, RccsUNICODE);
+ _wfopen_s(&fp, pathuserdic, RccsUTF16);
if(fp == NULL)
{
return FALSE;
@@ -478,7 +478,7 @@ BOOL SaveSKKUserDic(USERDATA *userdata)
FILE *fp;
SKKDICOKURIBLOCKS so;
- _wfopen_s(&fp, pathuserdic, WccsUNICODE);
+ _wfopen_s(&fp, pathuserdic, WccsUTF16);
if(fp == NULL)
{
return FALSE;
diff --git a/installer/README.TXT b/installer/README.TXT
index da9c93a8..78565458 100644
--- a/installer/README.TXT
+++ b/installer/README.TXT
@@ -1,625 +1,28 @@
==============================================================================
- CorvusSKK version 1.8.6
- https://github.com/nathancorvussolis/corvusskk
- nathancorvussolis@gmail.com
-==============================================================================
-
- Windowsで動作するSKK風のIMEです。
-
- 対応OS
- ・Windows Vista (32-bit / 64-bit) SP2
- ・Windows 7 (32-bit / 64-bit)
- ・Windows 8 (32-bit / 64-bit)
- ・Windows 8.1 (32-bit / 64-bit)
-
- デジタル署名
- 発行先 Open Source Developer, SASAKI Nobuyuki
- 発行者 Certum Level III CA
-
-
-
-==============================================================================
- インストール
-==============================================================================
-
-
-・DirectX 9 以上をサポートしたGPU (推奨)
-
- 表示オプションでDirect2Dを使用するには、DirectX 9 以上をサポートしたGPUが
- 必要です。
- サポートしていない場合は自動的にGDIで描画されます。(多分)
-
-
-・Vista 用更新プログラムのインストール
-
- Windows Vista SP2 では、以下のプラットフォーム更新プログラムのいずれかを
- 予めインストールして下さい。
- Windows 7 以降ではインストールは不要です。
-
- ・KB971644 (Windows Update から)
- ・KB971512
- (x64) http://www.microsoft.com/ja-JP/download/details.aspx?id=4390
- (x86) http://www.microsoft.com/ja-JP/download/details.aspx?id=3274
-
-
-・CorvusSKK のインストール
-
- corvusskk-X.Y.Z.zip を展開し、32bit版 Windows では corvusskk-x86.msi、
- 64bit版 Windows では corvusskk-x64.msi を実行して下さい。
- (X, Y, Z はバージョン番号)
- アップデートの後はOSを再起動しておくと安全です。
-
-
-・初期設定
-
- 任意のユーザーアカウントで初めて使用するときは、設定ダイアログでOKボタンを
- 押して初期設定を保存して下さい。
-
- 設定ダイアログで保存した後は、IME OFF → ON で新しい設定が反映されます。
-
- バージョンアップで設定項目が追加されているとき、
- 機能の種類によっては設定ダイアログで一度は保存する必要があるので、
- バージョンアップしたら動かない機能がある!というときは設定ダイアログで
- OKボタンを押してみて下さい。
-
-
-・Windows Store アプリ
-
- Windows Store アプリで使用するには、設定ファイル(config.xml)に Windows Store
- アプリへのアクセス許可を付加させる必要があります。
- Windows 8 以降で動作する設定ダイアログでOKボタンを押して保存を行うとアクセス
- 許可の付加が自動的に行われます。
-
-
-・Adobe Reader X, XI, Acrobat Reader DC
-
- Adobe Reader X 以降で使用するには、設定ファイル(config.xml)に
- Adobe Reader へのアクセス許可を付加させる必要があります。
- 設定ダイアログでOKボタンを押して保存を行うとアクセス許可の付加が自動的に
- 行われます。
-
-
-
-==============================================================================
- 設定
-==============================================================================
-
-
-・設定ダイアログ
-
- 設定ダイアログは、以下の操作で開くことができます。
- ・言語バーを右クリックし、メニューから「設定」を選択する。
- 「テキストサービスと入力言語」ダイアログの「インストールされているサービス」
- からCorvusSKKを選択し、プロパティボタンを押す。
- ・言語バーの入力モードアイコンを左クリックし、メニューから「設定」を選択する。
- ・言語バーのヘルプボタンを左クリックし、メニューから「設定」を選択する。
- ・Windows 8 以降の通知領域の入力モードアイコンを右クリックし、メニューから
- 「設定」を選択する。
-
- 設定ダイアログで保存した後は、IME OFF → ON で新しい設定が反映されます。
- IME ON/OFF のキーのみ、IME ON → OFF のときにも反映されます。
-
-
-・設定ファイル、SKK辞書
-
- 各種設定及び取込済SKK辞書は、ディレクトリ %AppData%\CorvusSKK の各ファイルに
- 保存されます。
-
- ----------------------------------------------------------------------------
- || config.xml || 各種設定
- || skkdict.dic || 取込済SKK辞書
- || skkdict.idx || 取込済SKK辞書インデックス
- ----------------------------------------------------------------------------
-
- 各種設定の config.xml ファイルは、UTF-8 の XML フォーマットのテキストファイル
- となっており、テキストエディタで編集可能です。
- 変更した後は、IME OFF → ON で新しい設定が反映されます。
-
-
-・ユーザー辞書
-
- ユーザー辞書は、ディレクトリ %AppData%\CorvusSKK のファイルに保存されます。
-
- ----------------------------------------------------------------------------
- || userdict.txt || ユーザー辞書
- ----------------------------------------------------------------------------
-
- UTF-16(LE, BOMあり)のSKK辞書フォーマットとなっています。
-
- ユーザー辞書を編集する際は、ログオンユーザー権限で動作しているサーバープロセス
- (imcrvmgr.exe)をタスクマネージャなどで終了させた状態で行なって下さい。
-
- 編集後、以下のいずれかの操作を行うとサーバープロセスが自動的に起動します。
- ・IME OFF → ON
- ・仮名漢字変換開始
- ・補完開始
-
- ユーザー辞書は、サーバープロセスの起動時にメモリ上に読み込まれ、
- 追加、変更、削除があったとき、かつ、以下のいずれかのときに上書きされます。
- ・IME ON 状態から OFF 状態にするとき
- ・IME ON 状態のアプリケーションが終了するとき
- ・アプリケーションがフォーカスを失うとき
- ・サーバープロセス(imcrvmgr.exe)が終了するとき
-
-
-・SKK辞書
-
- SKK辞書の詳細はこちらを参照下さい。 http://openlab.jp/skk/wiki/wiki.cgi?page=FrontPage
- こちらから辞書をダウンロード出来ます。 http://openlab.ring.gr.jp/skk/skk/dic/
- 設定ダイアログのリストにSKK辞書を追加し、取込ボタンを押して下さい。
- 取込済SKK辞書に変換されて、使用可能となります。
- SKK辞書ファイルの文字コードは、EUC-JIS-2004、UTF-16(LE, BOMあり)、
- UTF-8(BOMあり)に対応しています。
-
-
-・SKK辞書サーバー
-
- 別途用意されたSKK辞書サーバーと通信して、skkservプロトコルのクライアントとして
- 辞書検索を行います。
- 同時に1つのみ使用可能です。IPv4、IPv6 に対応しています。
- 通信に使用する文字コードは、EUC-JIS-2004、UTF-8 に対応していますが、
- 通常のSKK辞書サーバーではデフォルトの EUC-JIS-2004 を使用して下さい。
- サーバーコンプリーション機能は未実装です。
-
-
-・動作
-
- || *機能* || *備考*
- ----------------------------------------------------------------------------
- || 初期入力モード || プログラム起動時の入力モードを指定します。
- || ||
- || 送り仮名が決定したとき変換を開始する || 送り仮名を入力したとき自動的に変換を開始します。接頭辞も同様です。
- || ||
- || 取消のとき変換位置を削除する || ▼モードから▽モードに遷移する際、送り仮名の位置情報を削除します。
- || ||
- || 取消のとき送り仮名を削除する || ▼モードから▽モードに遷移する際、送り仮名の部分を削除します。
- || ||
- || 後退に確定を含める || ▼モードのとき後退すると一文字削除した上で確定します。
- || || OFFでは▼モードのとき後退は前候補と同じ機能を有します。
- || ||
- || 候補に片仮名変換を追加する || 見出し語を片仮名に変換した候補を追加します。
- || ||
- || 送り仮名で撥音を送り出す || 送り仮名入力開始後の変換位置指定を含む「な/にゃ」行の入力で「ん」を送り出します。
- || || 例) ON:「NoNO」→「▽の*んお」/ OFF:「NoNO」→「▽の*の」
- || ||
- || 送り仮名が一致した候補を優先する || 送り仮名ブロックの送り仮名が一致する候補を優先して出力します。
- || ||
- || 複数補完を使用する || 通常の補完のとき補完された見出し語を7個ずつ表示します。
- || || 補完対象は「候補一覧の色」の「選択」、補完部分は「候補」の色が使用されます。
- || ||
- || 動的補完を使用する || 見出し語が入力されたとき補完された見出し語を表示します。
- || || 「▽表示属性」の「*送り」の色が使用されます。
- || ||
- || 複数動的補完を使用する || 見出し語が入力されたとき補完された見出し語を7個ずつ表示します。
- || || 補完対象は「候補一覧の色」の「選択」、補完部分は「候補」の色が使用されます。
- || ||
- || 補完のときユーザー辞書を検索する || 補完/複数補完/動的補完/複数動的補完のときユーザー辞書の検索結果を追加して表示します。
- || || 表示する候補の数は最大で「候補一覧表示に要する変換回数」-1 です。
- || || 補完/動的補完では「▽表示属性」の「*送り」の色が使用されます。
- || || 複数補完/複数動的補完では「候補一覧の色」の「注釈」の色が使用されます。
- ----------------------------------------------------------------------------
-
-・表示
-
- || *機能* || *備考*
- ----------------------------------------------------------------------------
- || 候補一覧のフォント || 候補一覧に表示するフォントの種類、スタイル、サイズを指定します。
- || ||
- || 候補一覧の最大幅 || 候補一覧の最大幅のサイズを指定します。
- || ||
- || 候補一覧の色 || 候補一覧の色を指定します。
- || ||
- || 候補一覧の描画API || 候補一覧の描画を行うAPIを指定します。
- || || Direct2Dと彩色の指定でカラーフォントをその色で表示します。(Windows8.1以降)
- || ||
- || 候補一覧表示に要する変換回数(0は表示無し) || 指定した回数変換すると候補一覧が表示されます。
- || ||
- || 候補一覧が表示無しのとき候補数を表示する || (<現在の候補の番号>/<候補数>) の形式を追加して表示します。
- || ||
- || 候補一覧を縦に表示する || 候補一覧で候補を縦に並べて表示します。
- || ||
- || 注釈を表示する || <候補><セミコロン><注釈> の形式で注釈を表示します。
- || ||
- || 入力モードを表示する || キャレットまたは辞書登録ウィンドウ付近に入力モードを表示します。
- || || タイミングは、IME ON、入力モード変更、「*無効*」キー押下のときです。
- || ||
- || ▽▼*マークを表示する || 大切なものは目に見えないようです。
- || ||
- || ローマ字を表示する || 仮名文字のローマ字プレフィックスを表示します。
- ----------------------------------------------------------------------------
-
-
-・表示属性
-
- 入力中文字列の表示属性を設定します。
- 「連続」のチェックボックスをチェックすると、表の左側の表示属性を継承し、
- 下線は繋って表示されます。
- 確定入力モードでのローマ字は連続のチェックの有無に関わらず見出し語と同じ
- 表示属性となります。
- 辞書削除の確認メッセージは注釈と同じ表示属性となります。
-
-
-・候補一覧選択キー
-
- 候補一覧での確定は、デフォルトで 1〜7 と ASDFJKL と asdfjkl を使用します。
- コマンドプロンプト等では、デフォルトで 1〜9 と ASDFJKLGH と asdfjklgh を使用
- します。
- 候補一覧が表示されているとき、Kanaキーロックは無視されます。
-
- ----------------------------------------------------------------------------
- || 数字 || 選択キー(1〜9で固定)
- || 表示 || 選択キー(必須、候補一覧の表示にも使用)
- || 予備 || 選択キー(空でもOK)
- ----------------------------------------------------------------------------
-
-
-・キー設定(ON/OFF)
-
- IME ON/OFF のキーを指定します。
- 仮想キーコード、Alt、Control、Shift の組合せを設定して下さい。
- 仮想キーコードの詳細はこちらを参照下さい。 http://msdn.microsoft.com/en-us/library/dd375731(v=vs.85).aspx
- 最大で8行です。
-
-
-・キー設定(文字)、キー設定(仮想キー)
+ CorvusSKK ver. 1.8.7
- 各機能に対してキーを正規表現で設定して下さい。
- Visual C++ 2013 の 正規表現で、文法は ECMAScript を使用しています。
- 正規表現の詳細はこちらを参照下さい。 http://msdn.microsoft.com/en-us/library/bb982727(v=vs.120).aspx
+ https://nathancorvussolis.github.io/
+ nathancorvussolis@gmail.com
- 無効な正規表現で設定するとその機能は無効となります。警告等は表示されません。
- キー設定(文字)とキー設定(仮想キー)とで重複する場合は、
- キー設定(仮想キー)のほうが優先されます。
- キー設定(文字)には ASCII の範囲内の文字を設定出来ます。
- キー設定(仮想キー)にはShiftキー(S)またはCtrlキー(C)をキーコードに
- 前置することで、修飾キーを設定出来ます。
- 例えば、Shift+Tabであれば「S\x09」、Ctrl+Returnであれば「C\x0D」と記述します。
-
-
-・キー設定デフォルト
-
- キー設定 ON/OFF
-
- || *機能* || *キー* || *備考*
- ----------------------------------------------------------------------------
- || ON / OFF || Alt+` || 0xC0 + Alt
- || || 漢字 || 0x19
- || || (Alt+半角/全角 Alt+`) || 0x19
- || || 半角/全角(Ctrl+`) || 0xF3, 0xF4
- ----------------------------------------------------------------------------
-
- キー設定(文字)
-
- || *機能* || *キー* || *備考*
- ----------------------------------------------------------------------------
- || かな/カナ || q || ひらがな/カタカナモード、かなカナ変換
- || カナ全英変換 || Ctrl+q || ひらがな/半角カタカナモード、
- || || || ひらがなカタカナ→半角カタカナ変換、abbrev→全角英数字変換
- || 全英 || L || 全英モード
- || ASCII || l || アスキーモード
- || ひらがな || || ひらがなモード
- || abbrev || / || abbrevモード
- || 接辞 || < > || 接頭辞・接尾辞
- || 次候補 || Space Ctrl+n || 辞書検索開始、次候補
- || 前候補 || x Ctrl+p || 「後退」のキーも使用可
- || 辞書削除 || X Ctrl+x || ユーザー辞書から候補を削除
- || 次補完 || Ctrl+i(Tab) || 補完開始、次見出し語候補
- || 前補完 || Ctrl+u || 前見出し語候補
- || 絞り込み || || 候補を絞り込む見出し語の入力開始 skk-hint-start-char
- || 変換位置 || || 変換位置指定 2回連続入力で文字自体が確定する skk-sticky-key
- || 直接入力 || 0〜9 || 見出し語入力でローマ字仮名変換しない
- || 確定 || Ctrl+m(Return) Ctrl+j ||
- || 取消 || Ctrl+g Ctrl+[(Escape) ||
- || 後退 || Ctrl+h(BS) ||
- || 削除 || Ctrl+d DEL(Ctrl+BS) ||
- || *無効* || || アプリケーション側に非通知、辞書登録の確定無効
- || 左移動 || Ctrl+b ||
- || 先頭移動 || Ctrl+a ||
- || 右移動 || Ctrl+f ||
- || 末尾移動 || Ctrl+e ||
- || 貼付 || Ctrl+y Ctrl+v || クリップボードの文字列を貼り付け
- ----------------------------------------------------------------------------
-
- キー設定(仮想キー)
-
- || *機能* || *キー* || *備考*
- ------------------------------------------------------------------------
- || かな/カナ || || ひらがな/カタカナモード、かなカナ変換
- || カナ全英変換 || || ひらがな/半角カタカナモード、
- || || || ひらがなカタカナ→半角カタカナ変換、abbrev→全角英数字変換
- || 全英 || || 全英モード
- || ASCII || || アスキーモード
- || ひらがな || Ctrl+0x4A (Ctrl+j) || ひらがなモード
- || abbrev || || abbrevモード
- || 接辞 || || 接頭辞・接尾辞
- || 次候補 || || 辞書検索開始、次候補
- || 前候補 || || 「後退」のキーも使用可
- || 辞書削除 || || ユーザー辞書から候補を削除
- || 次補完 || || 補完開始、次見出し語候補
- || 前補完 || Shift+0x09(Shift+Tab) || 前見出し語候補
- || 絞り込み || || 候補を絞り込む見出し語の入力開始 skk-hint-start-char
- || 変換位置 || || 変換位置指定 skk-sticky-key
- || 直接入力 || || 見出し語入力でローマ字仮名変換しない(不使用)
- || 確定 || ||
- || 取消 || ||
- || 後退 || ||
- || 削除 || 0x2E (Delete) ||
- || *無効* || Ctrl+0x4A (Ctrl+j) || アプリケーション側に非通知、辞書登録の確定無効
- || 左移動 || 0x25 (カーソル左) ||
- || 先頭移動 || 0x26 (カーソル上) ||
- || 右移動 || 0x27 (カーソル右) ||
- || 末尾移動 || 0x28 (カーソル下) ||
- || 貼付 || || クリップボードの文字列を貼り付け
- ----------------------------------------------------------------------------
-
-
-・キー設定と入力モード遷移図
-
- ┏━━━━━━━┓
- ┃半角カタカナモード┃ <────┐
- ┗━━━━━━━┛ │
- △ │ かな/カナ (q) │
- カナ全英変換 (C-q) │ │ カナ全英変換 (C-q) │
- │ ▽ ひらがな (C-j) │
- ┏━━━━━━━┓ │
- ┃ひらがなモード┃ │ カナ全英変換 (C-q)
- ┗━━━━━━━┛ │
- │ △ │
- かな/カナ (q) │ │ かな/カナ (q) │
- ▽ │ ひらがな (C-j) │
- ┏━━━━━━━┓ │
- ┃カタカナモード┃ ─────┘
- ┗━━━━━━━┛
-
-
- ASCII (l) ┏━━━━━━━┓ ASCII (l)
- ┌────> ┃ ASCIIモード ┃ <────┐
- │ ┗━━━━━━━┛ │
- │ △ │ │
- │ ASCII (l) │ │ ひらがな (C-j) │
- │ │ ▽ │
- ┏━━━━━━━┓┏━━━━━━━┓┏━━━━━━━┓
- ┃半角カタカナモード┃┃ひらがなモード┃┃カタカナモード┃
- ┗━━━━━━━┛┗━━━━━━━┛┗━━━━━━━┛
- │ │ △ │
- │ 全英 (L) │ │ ひらがな (C-j) │
- │ ▽ │ │
- │ ┏━━━━━━━┓ │
- └────> ┃ 全英モード ┃ <────┘
- 全英 (L) ┗━━━━━━━┛ 全英 (L)
-
-
-・半角カタカナモード
-
- 半角カタカナモードでは、ローマ字仮名変換のみ可能です。
- ひらがな/カタカナへの変換、仮名漢字変換は出来ません。
-
-
-・変換位置指定
-
- 変換位置での挙動を指定します。最大で256行です。
-
- ----------------------------------------------------------------------------
- || 開始 || 変換位置開始キー
- || 代替 || 変換位置開始キーに代わってローマ字仮名変換に使用する
- || 送り || 辞書検索に使用する送りローマ字
- ----------------------------------------------------------------------------
-
- 例1)AZIK風に、ローマ字仮名変換表で「q ん ン ン 0」と設定し、
- 開始「Q」代替「q」送り「n」と設定する。
- 「KaQ」と入力すると、表示「▽か*ん」、辞書検索キー「かn」と出来ます。
-
- 例2)開始「(空)」代替「あ」送り「a」と設定する。
- かな入力のとき、送り仮名の最初を「あ」の状態で辞書検索を開始すると
- 送りローマ字が「a」となります。
-
-
-・ローマ字・仮名変換表
-
- ローマ字、平仮名、片仮名、所謂半角片仮名、促音/撥音(ん)、待機の組み合せを
- 指定します。
-
- 「促/ん」がONのとき、仮名が決定したあとに最後の入力文字が入力状態となります。
-
- 「待機」がONのとき、入力した文字をローマ字仮名変換した結果(変換出来ないときは
- 入力した文字そのまま)がローマ字として扱われ、辞書検索開始、確定、補完開始、
- ローマ字に設定されていない組み合わせ、のいずれかになるまで仮名の最終的な決定が
- 遅延されます。
-
- 平仮名/片仮名変換では基本的に1文字ずつ変換されます。
- 例外として、「う゛」(う+濁点)は「ウ゛」(ウ+濁点)ではなく「ヴ」と変換されます。
-
- 例) 平仮名「きょう」を片仮名「キョウ」に変換する場合、
- 「きょ」→「キョ」、「う」→「ウ」ではなく、
- 「き」→「キ」、「ょ」→「ョ」、「う」→「ウ」と変換されます。
-
- 最大で32768行です。
-
- 「…」ボタンから、KanaTableファイルの読み込みと書き出しを行うことができます。
-
-
-・KanaTableファイル
-
- ・文字コード:UTF-16(LE,BOMあり) または UTF-8
- ・改行:CR+LF または LF
- ・フォーマット:<ローマ字><\t><ひらがな><\t><カタカナ><\t><カタカナ(半角)><\t><[促/ん]/[待機]><\r><\n>
- ・<ローマ字>、<ひらがな>、<カタカナ>、<カタカナ(半角)>は、
- それぞれUTF-16換算で最大14バイトです。
- ・[促/ん]は、ONのとき1、OFFのとき0です。
- ・[待機]は、ONのとき2、OFFのとき0です。
- ・<[促/ん]|[待機]>は、[促/ん]と[待機]の両方がONのとき3となりますが、
- [待機]のほうが優先されます。(0のときは無しでも可)
- ・空行やタブのみの行は読み飛ばされます。
- ・<\t>、<\r>、<\n>は、それぞれタブ、改行コードに読み替えて下さい。
- ・例1)a<\t>あ<\t>ア<\t>ア<\r><\n>
- ・例2)nn<\t>ん<\t>ン<\t>ン<\t>0<\r><\n>
- ・例3)np<\t>ん<\t>ン<\t>ン<\t>1<\r><\n>
- ・例4)コ<\t>こ<\t>コ<\t>コ<\t>2<\r><\n>
-
-
-・ASCII・全英変換表
-
- ASCII、全英文字の組み合せを指定します。最大で128行です。
-
-
-
-==============================================================================
- その他
==============================================================================
+ Windowsで動作するSKK風のIMEです。
-・Lua拡張
-
- サーバープロセス(imcrvmgr.exe)の各機能の拡張、プログラム実行変換もどき、
- 数値変換をLuaスクリプトで実装しています。
- 現在使用しているLuaのバージョンは5.3.0です。
- 詳細はこちらを参照下さい。http://www.lua.org/manual/5.3/manual.html
-
- Lua内部の文字コードをUTF-8に決め打ちして、Unicode版のWindowsAPIとCランタイム
- 関数を呼ぶようにパッチを当てています。
- よって、通常のスクリプトファイルの文字コードはUTF-8のみに対応しています。
-
- サーバープロセスのカレントディレクトリは、%AppData%\CorvusSKK になっています。
- サーバープロセスの起動時にスクリプトファイル(init.lua)が下記の優先順位でロード
- されます。
-
- 1. %AppData%\CorvusSKK\init.lua
- 2. サーバープロセスと同じディレクトリのinit.lua
- 通常、%SystemRoot%\System32\IME\IMCRVSKK\init.lua
- または、%SystemRoot%\SysWOW64\IME\IMCRVSKK\init.lua
-
- コンソールプログラムのlua.exeが %SystemRoot%\System32\IME\IMCRVSKK と
- %SystemRoot%\SysWOW64\IME\IMCRVSKK にあるので、カスタマイズする際のデバッグ用
- に使って下さい。
-
-
-・プログラム実行変換もどき
-
- 以下の見出し語の候補としてSKK辞書に記載のあるEmacs Lispのプログラム実行変換に
- 対応していますが、あくまで「もどき」なのでご了承下さい。
-
- #feet、#inch、#mile、#yard、bar、line、now、skk、time、today
- しょうわ#ねん、せいれき#ねん、たいしょう#ねん、へいせい#ねん、めいじ#ねん
-
- 以下の関数、値に大体対応しています。
-
- substring
- concat
- make-string
- string-to-char
- string-to-number
- current-time-string
- car (skk-num-list の先頭要素のみ)
- lambda
- 1+, 1-, +, -, *, /, %
- skk-version
- skk-server-version
- skk-gadget-units-conversion
- skk-ad-to-gengo
- skk-gengo-to-ad
- skk-current-date
- skk-default-current-date
- skk-relative-date
- skk-ignore-dic-word (デフォルト無効)
- skk-omikuji (引数なし、独自実装。おみくじを引くことができます)
- window-width (80で固定)
- fill-column (70で固定)
- comment-start ("/*")
- comment-end ("*/")
-
-
-・数値変換は、タイプ0〜3,5,8,9に対応しています。
- タイプ3と5での数値は0〜10^68-1の整数に対応しています。
- 独自実装としてタイプ6(ローマ数字)が、1〜3999の整数に対応しています。
- 見出し語として #⦅ナンバーサイン⦆を含み、候補として #と数字を含む
- エントリが辞書に存在する必要があります。(例:「めいじ#ねん /明治#3年/」)
-
- || *候補* || *説明* || *例*
- ----------------------------------------------------------------------------
- || #0 || タイプ0 無変換 ||「1234567890」→「1234567890」
- || #1 || タイプ1 全角 ||「1234567890」→「1234567890」
- || #2 || タイプ2 漢数字 位取りあり ||「1234567890」→「一二三四五六七八九〇」
- || #3 || タイプ3 漢数字 位取りなし ||「1234567890」→「十二億三千四百五十六万七千八百九十」
- || #5 || タイプ5 大字 ||「1234567890」→「拾弐億参千四百五拾六万七千八百九拾」
- || #6 || タイプ6 ローマ数字(独自) ||「1234」→「MCCXXXIV」
- || #8 || タイプ8 桁区切り ||「1234567890」→「1,234,567,890」
- || #9 || タイプ9 将棋 ||「12kin」→「1二金」
- ----------------------------------------------------------------------------
-
-
-・Unicodeコードポイント変換
-
- 「U+XXXXXX」( コードポイント XXXXXX : 0000-FFFF または 10000-10FFFF ) または
- 「uxxxxxx」( コードポイント xxxxxx : 0000-ffff または 10000-10ffff ) の
- フォーマットで変換して下さい。
- 例1)「▽U+30A2」→「▼ア」
- 例2)「▽u30a2」→「▼ア」
-
-
-・JIS X 0213面区点番号変換
-
- 「X-YY-ZZ」( 面 X : 1-2、 区 YY : 01-94、点 ZZ: 01-94 ) のフォーマットで
- 変換して下さい。Unicodeコードポイントが注釈として付加されます。
- 例)「▽1-05-02」→「▼ア;U+30A2」
-
-
-・文字コード表記変換
-
- 「?X」( X : 任意の1文字以上の文字列 ) のフォーマットで変換して下さい。
- ASCII(hex), JIS X 0201(片仮名, 8bit, hex), JIS X 0213面区点番号のカンマ区切りの候補および
- Unicodeコードポイントのカンマ区切りの候補に変換されます。
- ASCII, JIS X 0201, JIS X 0213に変換できない文字が含まれていた場合、
- Unicodeコードポイントの候補のみとなります。
-
- 例1)「▽?ア」→「▼1-05-02」/「▼U+30A2」
- 例2)「▽?あアアa」→「▼1-04-02,1-05-02,B1,61」/「▼U+3042,U+30A2,U+FF71,U+0061」
- 例3)「▽?🐧」→「▼U+1F427」
-
-
-・注釈の登録
-
- 辞書登録のとき、登録する候補の入力と同時に行います。
- 行頭以外の最後のセミコロン(いわゆる半角のセミコロン)以降が注釈となります。
- 注釈にセミコロンを含めることは出来ません。
-
- 例1)登録する見出し語「しょへい#ねん」、登録する候補「初平#3年」、
- 登録する注釈「後漢」の場合
- → 「初平#3年;後漢」と入力する。
-
- 例2)登録する見出し語「なき」、登録する候補「(;_;)」、
- 登録する注釈「顔文字」の場合
- → 「(;_;);顔文字」と入力する。
-
- 例3)登録する見出し語「せみころん」、登録する候補「;」、
- 登録する注釈「セミコロン」の場合
- → 「;;セミコロン」と入力する。
-
-
-・Windows 8, 8.1 のタッチキーボード
-
- タッチパネルを搭載したマシンでハードウェアキーボードに準拠したレイアウトを
- 使用するには、以下の操作を行って下さい。
-
- Windows 8 の場合
- 「PC設定」の画面 → 「全般」を選択 → 「タッチキーボード」の項目
- → 「ハードウェアキーボードに準拠したレイアウトを使えるようにする」をオン
+ ライセンス
- Windows 8.1 の場合
- 「PC設定」の画面 → 「PCとデバイス」の画面 → 「入力」を選択
- → 「ハードウェアキーボードに準拠したレイアウトをタッチキーボードオプションとして追加する」をオン
+ Microsoft Public License (MS-PL)
- タッチパネルを搭載していないマシンでハードウェアキーボードに準拠した
- レイアウトを使用するには、レジストリに以下の値を設定して下さい。
+ 詳細は LICENSE.TXT を見てください。
- [HKEY_CURRENT_USER\SOFTWARE\Microsoft\TabletTip\1.7]
- "EnableCompatibilityKeyboard"=dword:00000001
+ デジタル署名
+ 発行先 Open Source Developer, SASAKI Nobuyuki
+ 発行者 Certum Level III CA
-・開発環境
+ マニュアル
- Visual Studio Express 2013 for Windows Desktop Update 4
- WiX Toolset v3.9 R2
+ https://github.com/nathancorvussolis/corvusskk/blob/1.8.7/README.md
==============================================================================
diff --git a/installer/README_mode.png b/installer/README_mode.png
new file mode 100644
index 00000000..623afeef
Binary files /dev/null and b/installer/README_mode.png differ
diff --git a/installer/_build_x64.cmd b/installer/_build_x64.cmd
index 9873f18a..a5ac8bd4 100644
--- a/installer/_build_x64.cmd
+++ b/installer/_build_x64.cmd
@@ -1,11 +1,13 @@
@echo off
setlocal
-set TARGETDIR=build
pushd %~dp0
-"%WIX%bin\candle.exe" corvusskk-x64.wxs -nologo -out "%TARGETDIR%\corvusskk-x64.wixobj"
-"%WIX%bin\light.exe" "%TARGETDIR%\corvusskk-x64.wixobj" -nologo -out "%TARGETDIR%\corvusskk-x64.msi" -ext WixUIExtension -sw1056
+call _version.cmd
+set TARGETDIR=build
+
+"%WIX%bin\candle.exe" corvusskk-x64.wxs -nologo -out "%TARGETDIR%\corvusskk-%VERSION%-x64.wixobj"
+"%WIX%bin\light.exe" "%TARGETDIR%\corvusskk-%VERSION%-x64.wixobj" -nologo -out "%TARGETDIR%\corvusskk-%VERSION%-x64.msi" -ext WixUIExtension -sw1056
popd
diff --git a/installer/_build_x86.cmd b/installer/_build_x86.cmd
index 7514b3b2..e499b904 100644
--- a/installer/_build_x86.cmd
+++ b/installer/_build_x86.cmd
@@ -1,11 +1,13 @@
@echo off
setlocal
-set TARGETDIR=build
pushd %~dp0
-"%WIX%bin\candle.exe" corvusskk-x86.wxs -nologo -out "%TARGETDIR%\corvusskk-x86.wixobj"
-"%WIX%bin\light.exe" "%TARGETDIR%\corvusskk-x86.wixobj" -nologo -out "%TARGETDIR%\corvusskk-x86.msi" -ext WixUIExtension -sw1056
+call _version.cmd
+set TARGETDIR=build
+
+"%WIX%bin\candle.exe" corvusskk-x86.wxs -nologo -out "%TARGETDIR%\corvusskk-%VERSION%-x86.wixobj"
+"%WIX%bin\light.exe" "%TARGETDIR%\corvusskk-%VERSION%-x86.wixobj" -nologo -out "%TARGETDIR%\corvusskk-%VERSION%-x86.msi" -ext WixUIExtension -sw1056
popd
diff --git a/installer/_clean.cmd b/installer/_clean.cmd
index 37cb7ec3..432e527d 100644
--- a/installer/_clean.cmd
+++ b/installer/_clean.cmd
@@ -1,10 +1,12 @@
@echo off
setlocal
-set TARGETDIR=build
pushd %~dp0
+set TARGETDIR=build
+
del "%TARGETDIR%\*.zip"
+
call _clean_x64.cmd
call _clean_x86.cmd
diff --git a/installer/_clean_x64.cmd b/installer/_clean_x64.cmd
index 14b64986..794212e4 100644
--- a/installer/_clean_x64.cmd
+++ b/installer/_clean_x64.cmd
@@ -1,10 +1,12 @@
@echo off
setlocal
-set TARGETDIR=build
pushd %~dp0
-del "%TARGETDIR%\corvusskk-x64.*"
+call _version.cmd
+set TARGETDIR=build
+
+del "%TARGETDIR%\corvusskk-%VERSION%-x64.*"
popd
diff --git a/installer/_clean_x86.cmd b/installer/_clean_x86.cmd
index f6604d3c..2035b255 100644
--- a/installer/_clean_x86.cmd
+++ b/installer/_clean_x86.cmd
@@ -1,10 +1,12 @@
@echo off
setlocal
-set TARGETDIR=build
pushd %~dp0
-del "%TARGETDIR%\corvusskk-x86.*"
+call _version.cmd
+set TARGETDIR=build
+
+del "%TARGETDIR%\corvusskk-%VERSION%-x86.*"
popd
diff --git a/installer/_mkarc.cmd b/installer/_mkarc.cmd
index 6aa2b2e1..322a05b1 100644
--- a/installer/_mkarc.cmd
+++ b/installer/_mkarc.cmd
@@ -1,9 +1,11 @@
@echo off
setlocal
-set TARGETDIR=build
pushd %~dp0
+call _version.cmd
+set TARGETDIR=build
+
del "%TARGETDIR%\config-sample.zip"
pushd config-sample
@@ -19,7 +21,7 @@ popd
del "%TARGETDIR%\corvusskk.zip"
pushd "%TARGETDIR%"
-7za.exe a -tzip -mtc=off corvusskk.zip corvusskk-x64.msi corvusskk-x86.msi ..\README.TXT ..\..\LICENSE.TXT config-sample.zip config-lua.zip
+7za.exe a -tzip -mtc=off corvusskk-%VERSION%.zip corvusskk-*.msi ..\README.TXT ..\..\LICENSE.TXT config-sample.zip config-lua.zip
popd
popd
diff --git a/installer/_version.cmd b/installer/_version.cmd
new file mode 100644
index 00000000..ec0e5e28
--- /dev/null
+++ b/installer/_version.cmd
@@ -0,0 +1,2 @@
+
+set VERSION=1.8.7
diff --git a/installer/config-lua/init.lua b/installer/config-lua/init.lua
index 5326c0fd..f9da4135 100644
--- a/installer/config-lua/init.lua
+++ b/installer/config-lua/init.lua
@@ -356,11 +356,6 @@ local function skk_convert_num_type(num, type)
return ret
end
--- S式解析もどき (後で再定義)
-local function skk_convert_gadget_interpret(s)
- return ""
-end
-
-- concat
local function concat(t)
local ret = ""
@@ -677,7 +672,7 @@ local function skk_current_date(t)
if (pp_function == nil) then
ret = skk_default_current_date(nil)
else
- ret = skk_convert_gadget_interpret(pp_function)
+ ret = eval_table(pp_function)
end
return ret
@@ -710,7 +705,7 @@ local function skk_relative_date(t)
if (pp_function == "nil") then
ret = skk_default_current_date(nil)
else
- ret = skk_convert_gadget_interpret(pp_function)
+ ret = eval_table(pp_function)
end
skk_gadget_time = skk_gadget_time_bak
@@ -816,97 +811,98 @@ local function parse_string(s)
return ret
end
--- S式解析もどき
-skk_convert_gadget_interpret = function(s)
+-- S式をテーブル表記に変換
+function convert_s_to_table(s)
local ret = ""
- local pt = {}
- local ps = {}
- local func = ""
- local iparam = 1
- local bracket = 0
- local dquote = 0
- local space = 0
-
- s = string.match(s, "^%s*%(%s*(.-)%s*%)%s*$")
- if (s == nil) then
- return ""
- end
+ local e = ""
+ local q = 0
+ local c = ""
+ local b = ""
+ local r = ""
for i = 1, string.len(s) do
-
- local c = string.sub(s, i, i)
- local b = string.sub(s, i - 1, i - 1)
-
- if ((c == "\"") and (dquote == 0)) then
- dquote = 1
- elseif ((c == "\"") and (dquote == 1) and (b ~= "\\")) then
- dquote = 0
+ c = string.sub(s, i, i)
+ b = string.sub(s, i - 1, i - 1)
+ r = string.sub(ret, -1)
+
+ if (c == "\"" and q == 0) then
+ q = 1
+ elseif (c == "\"" and q == 1 and b ~= "\\") then
+ q = 0
end
- if (dquote == 0) then
+ if (q == 0) then
if (c == "(") then
- bracket = bracket + 1
- elseif (c == ")") then
- bracket = bracket - 1
- elseif (c == "\x20") then
- if (bracket == 0) then
- if (space == 0) then
- if (func == "") then
- func = string.sub(s, iparam, i - 1)
- else
- table.insert(pt, string.sub(s, iparam, i - 1))
- end
- iparam = i + 1
- space = space + 1
- else
- iparam = i + 1
- space = space + 1
+ if (ret ~= "") then
+ ret = ret .. ","
+ end
+ ret = ret .. "{"
+ elseif (c == ")" or c == "\x20") then
+ if (e ~= "") then
+ if (r ~= "{") then
+ ret = ret .. ","
end
+ -- 要素を文字列化
+ e = string.gsub(e, "\\", "\\\\")
+ e = string.gsub(e, "^\"(.*)\"$", "%1")
+ ret = ret .. "\"" .. e .. "\""
+ e = ""
end
else
- space = 0
+ e = e .. c
end
+
+ if (c == ")") then
+ ret = ret .. "}"
+ end
+ else
+ e = e .. c
end
end
- if (func == "") then
- func = string.sub(s, iparam)
- else
- table.insert(pt, string.sub(s, iparam))
- end
+ return ret
+end
- if (func == "lambda") then
- if (#pt > 1) then
- return pt[2]
- else
- return ""
+-- テーブル評価
+function eval_table(x)
+ if (type(x) == "table") then
+ if (x[1] == "lambda") then
+ if (#x >= 3) then
+ return x[3]
+ else
+ return ""
+ end
end
- end
- for i, value in ipairs(pt) do
- if (string.match(value, "^%(.+%)$")) then
- local retsub = skk_convert_gadget_interpret(value)
- table.insert(ps, retsub)
- else
- local pvalue = parse_string(value)
- for j, cvalue in ipairs(skk_gadget_const_table) do
- if (cvalue[1] == pvalue) then
- pvalue = cvalue[2]
- break
- end
+ local func
+ -- 関数名から関数を取得
+ for i, fv in ipairs(skk_gadget_func_table) do
+ if (fv[1] == x[1]) then
+ func = fv[2]
+ break
end
- table.insert(ps, pvalue)
end
- end
- for i, value in ipairs(skk_gadget_func_table) do
- if (value[1] == func) then
- ret = value[2](ps)
- break
+ if (func ~= nil) then
+ table.remove(x, 1)
+ for i, v in ipairs(x) do
+ -- 定数名から定数を取得
+ for j, cv in ipairs(skk_gadget_const_table) do
+ if (cv[1] == v) then
+ v = cv[2]
+ break
+ end
+ end
+ -- 引数を評価
+ x[i] = eval_table(v)
+ end
+ return func(x)
end
+ else
+ return parse_string(x)
end
- return ret
+ return ""
end
-- skk-ignore-dic-word
@@ -984,7 +980,7 @@ local function skk_convert_gadget(key, candidate)
-- 乱数
math.randomseed(skk_gadget_time)
- return skk_convert_gadget_interpret(candidate)
+ return eval_table(load("return " .. convert_s_to_table(candidate))())
end
-- 候補変換処理
diff --git a/installer/config-sample/config - act.xml b/installer/config-sample/config - act.xml
index 9abf7c3c..1df1fe90 100644
--- a/installer/config-sample/config - act.xml
+++ b/installer/config-sample/config - act.xml
@@ -6,7 +6,9 @@
-->
diff --git a/installer/config-sample/config - azik-jpkbd.xml b/installer/config-sample/config - azik-jpkbd.xml
index f37e2606..72d72ef1 100644
--- a/installer/config-sample/config - azik-jpkbd.xml
+++ b/installer/config-sample/config - azik-jpkbd.xml
@@ -6,7 +6,9 @@
-->
diff --git a/installer/config-sample/config - azik-uskbd.xml b/installer/config-sample/config - azik-uskbd.xml
index feac13dd..a93e901c 100644
--- a/installer/config-sample/config - azik-uskbd.xml
+++ b/installer/config-sample/config - azik-uskbd.xml
@@ -6,7 +6,9 @@
-->
diff --git a/installer/config-sample/config - gact10.xml b/installer/config-sample/config - gact10.xml
index 4f23f4dd..376b169e 100644
--- a/installer/config-sample/config - gact10.xml
+++ b/installer/config-sample/config - gact10.xml
@@ -41,7 +41,9 @@
-->
diff --git a/installer/config-sample/config - kana.xml b/installer/config-sample/config - kana.xml
index f2b35ecb..4f5c4bac 100644
--- a/installer/config-sample/config - kana.xml
+++ b/installer/config-sample/config - kana.xml
@@ -19,7 +19,9 @@
-->
diff --git a/installer/config-sample/config - roman.xml b/installer/config-sample/config - roman.xml
index cd91851c..7dae15d3 100644
--- a/installer/config-sample/config - roman.xml
+++ b/installer/config-sample/config - roman.xml
@@ -6,7 +6,9 @@
-->
diff --git a/installer/corvusskk-x64.wxs b/installer/corvusskk-x64.wxs
index e767e106..315a7967 100644
--- a/installer/corvusskk-x64.wxs
+++ b/installer/corvusskk-x64.wxs
@@ -1,10 +1,10 @@
-
+
-
+
diff --git a/installer/corvusskk-x86.wxs b/installer/corvusskk-x86.wxs
index d8dd926e..386396fc 100644
--- a/installer/corvusskk-x86.wxs
+++ b/installer/corvusskk-x86.wxs
@@ -1,10 +1,10 @@
-
+
-
+
diff --git a/installer/installer.vcxproj b/installer/installer.vcxproj
index d7560a65..e4673487 100644
--- a/installer/installer.vcxproj
+++ b/installer/installer.vcxproj
@@ -19,6 +19,7 @@
+
@@ -37,6 +38,7 @@
+
@@ -51,6 +53,9 @@
+
+
+
{C65505E2-5456-473C-91B1-C6D91B294DC3}
MakeFileProj
diff --git a/installer/installer.vcxproj.filters b/installer/installer.vcxproj.filters
index 19e15a69..afe33a9b 100644
--- a/installer/installer.vcxproj.filters
+++ b/installer/installer.vcxproj.filters
@@ -39,6 +39,9 @@
Installer Files
+
+ Installer Files
+
Installer Files
@@ -66,17 +69,20 @@
config-lua
+
+ Installer Files
+
-
- Installer Files
-
Installer Files
config-sample
+
+ Installer Files
+
@@ -98,4 +104,9 @@
config-sample
+
+
+ Installer Files
+
+
\ No newline at end of file