From 6e7b61c70c3206162245ef972ab3e05b23417c2b Mon Sep 17 00:00:00 2001 From: KIHARA Hideto Date: Wed, 5 Apr 2017 19:38:43 +0900 Subject: [PATCH] =?UTF-8?q?=E5=BE=8C=E7=BD=AE=E5=9E=8B=E3=82=AB=E3=82=BF?= =?UTF-8?q?=E3=82=AB=E3=83=8A=E5=A4=89=E6=8F=9B=E3=81=A7=E3=80=81=E3=82=AB?= =?UTF-8?q?=E3=82=BF=E3=82=AB=E3=83=8A=E3=82=92=E4=BC=B8=E3=81=B0=E3=81=99?= =?UTF-8?q?=E6=A9=9F=E8=83=BD=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 文字数指定でカタカナ置換後、指定した文字数が足りなかったので伸ばしたい場合用。 --- README.md | 25 ++++++---- imcrvcnf/convtable.cpp | 6 +++ imcrvcnf/convtable.h | 2 +- imcrvtip/KeyHandlerControl.cpp | 20 ++++++-- imcrvtip/KeyHandlerPostConv.cpp | 47 ++++++++++++++++--- imcrvtip/TextService.h | 2 +- installer/config-sample/kanatable-tutcode.txt | 6 +++ installer/config-share/config.xml | 6 +++ 8 files changed, 92 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 3cd2267b..824d0d34 100644 --- a/README.md +++ b/README.md @@ -154,6 +154,11 @@ IMR_DOCUMENTFEEDにも対応していないアプリの場合は、tsf-tutcode →「例エバアプリケーション」l2(Kata>2機能:2文字縮める) →「例えばアプリケーション」 +#### カタカナを伸ばす + 例)「例えばあぷりけーしょん」k7(Kata7機能) + →「例えばあプリケーション」h1(Kata<1機能:1文字伸ばす) + →「例えばアプリケーション」 + ### 後置型漢字→入力シーケンス変換 指定した文字数を入力シーケンスに置換。 @@ -300,12 +305,7 @@ SKK辞書ファイルの文字コードは、EUC-JIS-2004、UTF-8 (BOMなし/あ リストの選択されている行をクリックするとインライン編集することができます。 -漢直Win等のkwmaze.dicを取込むには、文字コードをUTF-8等に変換した後、以下の2行をファイルの先頭に挿入しておいてください。 - -``` -;; okuri-ari entries. -;; okuri-nasi entries. -``` +漢直Win等のkwmaze.dicを取込むには、文字コードをUTF-8等に変換してください。 SKK辞書のURLを追加した場合は、取込処理のときにディレクトリ %TMP%\tsf-tutcode または %TEMP%\tsf-tutcode にダウンロードされてから取り込まれます。 @@ -592,6 +592,12 @@ Visual C++ 2015 の 正規表現で、文法は ECMAScript を使用していま | Kata>2 | 後置型カタカナ変換。直前のカタカナ変換を2文字縮める | | ... | | | Kata>6 | 後置型カタカナ変換。直前のカタカナ変換を6文字縮める | +| Kata<0 | 後置型カタカナ変換。カタカナを伸ばす。連続するひらがな | +| Kata<-1 | 後置型カタカナ変換。カタカナを伸ばす。連続するひらがな(1文字残す) | +| Kata<1 | 後置型カタカナ変換。カタカナを1文字伸ばす | +| Kata<2 | 後置型カタカナ変換。カタカナを2文字伸ばす | +| ... | | +| Kata<6 | 後置型カタカナ変換。カタカナを6文字伸ばす | | KtoS0 | 後置型漢字→入力シーケンス変換。改行/タブ/空白までを置換 | | KtoS1 | 後置型漢字→入力シーケンス変換。1文字を置換 | | KtoS2 | 後置型漢字→入力シーケンス変換。2文字を置換 | @@ -879,7 +885,7 @@ tsf-tutcodeは未実装機能が多いため。 * Surrounding Text関係は、[Mozc](https://github.com/google/mozc)から一部ソースを取り込んでいます。 * 部首合成変換は、[漢直Win](https://github.com/kanchoku/kw)から一部ソースと部首合成変換辞書を取り込んでいます。 サンプルの部首合成変換ユーザー辞書bushudict.txtは、[tc2](https://github.com/kanchoku/tc)に含まれるbushu34h.helpに、bushu34h.revのコメントアウトされている文字を追加してUTF-8に変換したものです。 - 交ぜ書き変換辞書mazedict.txtは、漢直Winのkwmaze.dicの漢字コードを変換して、取込みできるように;; okuri-ari entries.等を追加して取込んだものです。 + 交ぜ書き変換辞書mazedict.txtは、漢直Winのkwmaze.dicに対し76エントリを追加して漢字コードを変換して取込んだものです。 ### 制限事項、既知の問題 @@ -916,12 +922,15 @@ pandoc 1.19.2.1 ### 履歴 -#### v0.7.0 (2017-XXX) +#### v0.7.0 (2017-04-05) +* 後置型カタカナ変換で、カタカナを伸ばす機能(`Kata<1`等) * 後置型かな漢字変換(連続するひらがなを漢字に変換):`KanaK`, `KanaKK`, `KanaKk` (漢直でなくローマ字かな入力で、後置型変換を使いたいケース向け) * 後置型交ぜ書き変換の、読み/語幹の伸縮関係: + キー設定の左移動と右移動キーでも可能に + キー設定の接辞キーに`<|>`設定時(CorvusSKKデフォルト)でも読み/語幹の伸縮可能に +* 辞書取込を、;; okuri-ari行の無いファイルに対応(mazegaki.dic等) +* ベースのCorvusSKKを2.5.1に更新。 #### v0.6.0 (2016-10-24) * 後置型交ぜ書き変換を、読みの文字数指定無しでも開始可能に:`Maze0`,`MazeK0` diff --git a/imcrvcnf/convtable.cpp b/imcrvcnf/convtable.cpp index eb77396e..51af28bc 100644 --- a/imcrvcnf/convtable.cpp +++ b/imcrvcnf/convtable.cpp @@ -52,6 +52,12 @@ const ROMAN_KANA_CONV roman_kana_conv_default[ROMAN_KANA_TBL_DEF_NUM] = {L"l4", L"Kata>4", L"Kata>4", L"Kata>4", FALSE, FALSE, TRUE}, {L"l5", L"Kata>5", L"Kata>5", L"Kata>5", FALSE, FALSE, TRUE}, {L"l6", L"Kata>6", L"Kata>6", L"Kata>6", FALSE, FALSE, TRUE}, + {L"h1", L"Kata<1", L"Kata<1", L"Kata<1", FALSE, FALSE, TRUE}, + {L"h2", L"Kata<2", L"Kata<2", L"Kata<2", FALSE, FALSE, TRUE}, + {L"h3", L"Kata<3", L"Kata<3", L"Kata<3", FALSE, FALSE, TRUE}, + {L"h4", L"Kata<4", L"Kata<4", L"Kata<4", FALSE, FALSE, TRUE}, + {L"h5", L"Kata<5", L"Kata<5", L"Kata<5", FALSE, FALSE, TRUE}, + {L"h6", L"Kata<6", L"Kata<6", L"Kata<6", FALSE, FALSE, TRUE}, {L"z0", L"StoK0", L"StoK0", L"StoK0", FALSE, FALSE, TRUE}, {L"z1", L"StoK1", L"StoK1", L"StoK1", FALSE, FALSE, TRUE}, {L"z2", L"StoK2", L"StoK2", L"StoK2", FALSE, FALSE, TRUE}, diff --git a/imcrvcnf/convtable.h b/imcrvcnf/convtable.h index bd666e32..85d94d5c 100644 --- a/imcrvcnf/convtable.h +++ b/imcrvcnf/convtable.h @@ -4,7 +4,7 @@ #include "convtype.h" -#define ROMAN_KANA_TBL_DEF_NUM 3135 +#define ROMAN_KANA_TBL_DEF_NUM 3141 //変換テーブル extern const ROMAN_KANA_CONV roman_kana_conv_default[ROMAN_KANA_TBL_DEF_NUM]; diff --git a/imcrvtip/KeyHandlerControl.cpp b/imcrvtip/KeyHandlerControl.cpp index 06354144..b38cb8f4 100644 --- a/imcrvtip/KeyHandlerControl.cpp +++ b/imcrvtip/KeyHandlerControl.cpp @@ -1219,14 +1219,24 @@ void CTextService::_HandleFunc(TfEditCookie ec, ITfContext *pContext, const ROMA offset++; isShrink = 1; } - int count = _wtoi(rkc.hiragana + offset); - if(isShrink) + else if(rkc.hiragana[offset] == L'<') //カタカナを伸ばす { - _HandlePostKataShrink(ec, pContext, count, postconvctx); + offset++; + isShrink = -1; } - else + int count = _wtoi(rkc.hiragana + offset); + switch(isShrink) { - _HandlePostKata(ec, pContext, count, postconvctx); + case 1: + _HandlePostKataShrink(ec, pContext, count, postconvctx); + break; + case -1: + _HandlePostKata(ec, pContext, count, postconvctx, true); + break; + case 0: + default: + _HandlePostKata(ec, pContext, count, postconvctx, false); + break; } return; } diff --git a/imcrvtip/KeyHandlerPostConv.cpp b/imcrvtip/KeyHandlerPostConv.cpp index 02ceab98..16295aea 100644 --- a/imcrvtip/KeyHandlerPostConv.cpp +++ b/imcrvtip/KeyHandlerPostConv.cpp @@ -97,10 +97,10 @@ void CTextService::_AcquirePrecedingYomi(ITfContext *pContext, PostConvContext p } //文字列末尾にある連続するひらがなの最初の位置を返す -static size_t _BackwardWhileKana(const std::wstring &text) +static size_t _BackwardWhileKana(const std::wstring &text, size_t idx) { size_t st; - size_t prevst = text.size(); + size_t prevst = idx; while((st = BackwardMoji(text, prevst, 1)) < prevst) { prevst = st; @@ -125,6 +125,33 @@ static size_t _BackwardWhileKana(const std::wstring &text) return st; } +//文字列末尾にある連続するカタカナの最初の位置を返す +static size_t _BackwardWhileKatakana(const std::wstring &text) +{ + size_t st; + size_t prevst = text.size(); + while((st = BackwardMoji(text, prevst, 1)) < prevst) + { + prevst = st; +//TRUEの文字が続く間、戻る +#define IN_KATARANGE(m) (0x30A0 <= (m[0]) && (m[0]) <= 0x30FF) + if(!IN_KATARANGE(Get1Moji(text, st))) + { + // 先頭の「ー」は外す + while((st = ForwardMoji(text, prevst, 1)) > prevst) + { + prevst = st; + if(!TYOON(Get1Moji(text, st))) + { + break; + } + } + break; + } + } + return st; +} + /** * 後置型かな漢字変換を開始する * @param isKatuyo 活用する語として変換を開始するか @@ -136,7 +163,7 @@ HRESULT CTextService::_HandlePostKanaKan(TfEditCookie ec, ITfContext *pContext, //カーソル直前の文字列を取得 std::wstring text; _AcquirePrecedingText(pContext, postconvctx, &text); - size_t st = _BackwardWhileKana(text); + size_t st = _BackwardWhileKana(text, text.size()); if(st >= text.size()) { if(postconvctx == PCC_APP) @@ -157,7 +184,8 @@ HRESULT CTextService::_HandlePostKanaKan(TfEditCookie ec, ITfContext *pContext, } //後置型カタカナ変換 -HRESULT CTextService::_HandlePostKata(TfEditCookie ec, ITfContext *pContext, int count, PostConvContext postconvctx) +// @param skipKata 末尾の連続するカタカナはスキップして、カタカナを伸ばす +HRESULT CTextService::_HandlePostKata(TfEditCookie ec, ITfContext *pContext, int count, PostConvContext postconvctx, bool skipKata) { //カーソル直前の文字列を取得 std::wstring text; @@ -176,22 +204,27 @@ HRESULT CTextService::_HandlePostKata(TfEditCookie ec, ITfContext *pContext, int return S_OK; } + size_t ed = size; + if(skipKata) //連続するカタカナをとばす + { + ed = _BackwardWhileKatakana(text); + } //ひらがなをカタカナに変換 std::wstring kata; size_t st; if(count > 0) { - st = BackwardMoji(text, size, count); + st = BackwardMoji(text, ed, count); } else //count==0: ひらがなが続く間、負: ひらがなとして残す文字数指定 { - st = _BackwardWhileKana(text); + st = _BackwardWhileKana(text, ed); if(count < 0) // 指定文字数を除いてカタカナに変換 { st = ForwardMoji(text, st, -count); } } - if(size > st) + if(st < ed) { std::wstring todel(text.substr(st)); _ConvKanaToKana(todel, im_hiragana, kata, im_katakana); diff --git a/imcrvtip/TextService.h b/imcrvtip/TextService.h index 86e2802a..7f9e16f0 100644 --- a/imcrvtip/TextService.h +++ b/imcrvtip/TextService.h @@ -204,7 +204,7 @@ class CTextService : HRESULT _HandlePostMaze(TfEditCookie ec, ITfContext *pContext, int count, PostConvContext postconvctx, bool isKatuyo, bool resizeWithInflection); void _AcquirePrecedingYomi(ITfContext *pContext, PostConvContext postconvctx, std::wstring *yomi, size_t count); HRESULT _HandlePostKanaKan(TfEditCookie ec, ITfContext *pContext, PostConvContext postconvctx, bool isKatuyo, bool resizeWithInflection); - HRESULT _HandlePostKata(TfEditCookie ec, ITfContext *pContext, int count, PostConvContext postconvctx); + HRESULT _HandlePostKata(TfEditCookie ec, ITfContext *pContext, int count, PostConvContext postconvctx, bool skipKata); HRESULT _HandlePostKataShrink(TfEditCookie ec, ITfContext *pContext, int count, PostConvContext postconvctx); HRESULT _HandlePostBushu(TfEditCookie ec, ITfContext *pContext, PostConvContext postconvctx); HRESULT _HandlePostSeq2Kanji(TfEditCookie ec, ITfContext *pContext, int count, PostConvContext postconvctx); diff --git a/installer/config-sample/kanatable-tutcode.txt b/installer/config-sample/kanatable-tutcode.txt index 1d16f415..01b77006 100644 --- a/installer/config-sample/kanatable-tutcode.txt +++ b/installer/config-sample/kanatable-tutcode.txt @@ -43,6 +43,12 @@ l3 Kata>3 Kata>3 Kata>3 4 l4 Kata>4 Kata>4 Kata>4 4 l5 Kata>5 Kata>5 Kata>5 4 l6 Kata>6 Kata>6 Kata>6 4 +h1 Kata<1 Kata<1 Kata<1 4 +h2 Kata<2 Kata<2 Kata<2 4 +h3 Kata<3 Kata<3 Kata<3 4 +h4 Kata<4 Kata<4 Kata<4 4 +h5 Kata<5 Kata<5 Kata<5 4 +h6 Kata<6 Kata<6 Kata<6 4 z0 StoK0 StoK0 StoK0 4 z1 StoK1 StoK1 StoK1 4 z2 StoK2 StoK2 StoK2 4 diff --git a/installer/config-share/config.xml b/installer/config-share/config.xml index cbc8cab9..c9758f9f 100644 --- a/installer/config-share/config.xml +++ b/installer/config-share/config.xml @@ -201,6 +201,12 @@ + + + + + +