@@ -97,10 +97,10 @@ void CTextService::_AcquirePrecedingYomi(ITfContext *pContext, PostConvContext p
9797}
9898
9999// 文字列末尾にある連続するひらがなの最初の位置を返す
100- static size_t _BackwardWhileKana (const std::wstring &text)
100+ static size_t _BackwardWhileKana (const std::wstring &text, size_t idx )
101101{
102102 size_t st;
103- size_t prevst = text. size () ;
103+ size_t prevst = idx ;
104104 while ((st = BackwardMoji (text, prevst, 1 )) < prevst)
105105 {
106106 prevst = st;
@@ -125,6 +125,33 @@ static size_t _BackwardWhileKana(const std::wstring &text)
125125 return st;
126126}
127127
128+ // 文字列末尾にある連続するカタカナの最初の位置を返す
129+ static size_t _BackwardWhileKatakana (const std::wstring &text)
130+ {
131+ size_t st;
132+ size_t prevst = text.size ();
133+ while ((st = BackwardMoji (text, prevst, 1 )) < prevst)
134+ {
135+ prevst = st;
136+ // TRUEの文字が続く間、戻る
137+ #define IN_KATARANGE (m ) (0x30A0 <= (m[0 ]) && (m[0 ]) <= 0x30FF )
138+ if (!IN_KATARANGE (Get1Moji (text, st)))
139+ {
140+ // 先頭の「ー」は外す
141+ while ((st = ForwardMoji (text, prevst, 1 )) > prevst)
142+ {
143+ prevst = st;
144+ if (!TYOON (Get1Moji (text, st)))
145+ {
146+ break ;
147+ }
148+ }
149+ break ;
150+ }
151+ }
152+ return st;
153+ }
154+
128155/* *
129156 * 後置型かな漢字変換を開始する
130157 * @param isKatuyo 活用する語として変換を開始するか
@@ -136,7 +163,7 @@ HRESULT CTextService::_HandlePostKanaKan(TfEditCookie ec, ITfContext *pContext,
136163 // カーソル直前の文字列を取得
137164 std::wstring text;
138165 _AcquirePrecedingText (pContext, postconvctx, &text);
139- size_t st = _BackwardWhileKana (text);
166+ size_t st = _BackwardWhileKana (text, text. size () );
140167 if (st >= text.size ())
141168 {
142169 if (postconvctx == PCC_APP)
@@ -157,7 +184,8 @@ HRESULT CTextService::_HandlePostKanaKan(TfEditCookie ec, ITfContext *pContext,
157184}
158185
159186// 後置型カタカナ変換
160- HRESULT CTextService::_HandlePostKata (TfEditCookie ec, ITfContext *pContext, int count, PostConvContext postconvctx)
187+ // @param skipKata 末尾の連続するカタカナはスキップして、カタカナを伸ばす
188+ HRESULT CTextService::_HandlePostKata (TfEditCookie ec, ITfContext *pContext, int count, PostConvContext postconvctx, bool skipKata)
161189{
162190 // カーソル直前の文字列を取得
163191 std::wstring text;
@@ -176,22 +204,27 @@ HRESULT CTextService::_HandlePostKata(TfEditCookie ec, ITfContext *pContext, int
176204 return S_OK;
177205 }
178206
207+ size_t ed = size;
208+ if (skipKata) // 連続するカタカナをとばす
209+ {
210+ ed = _BackwardWhileKatakana (text);
211+ }
179212 // ひらがなをカタカナに変換
180213 std::wstring kata;
181214 size_t st;
182215 if (count > 0 )
183216 {
184- st = BackwardMoji (text, size , count);
217+ st = BackwardMoji (text, ed , count);
185218 }
186219 else // count==0: ひらがなが続く間、負: ひらがなとして残す文字数指定
187220 {
188- st = _BackwardWhileKana (text);
221+ st = _BackwardWhileKana (text, ed );
189222 if (count < 0 ) // 指定文字数を除いてカタカナに変換
190223 {
191224 st = ForwardMoji (text, st, -count);
192225 }
193226 }
194- if (size > st )
227+ if (st < ed )
195228 {
196229 std::wstring todel (text.substr (st));
197230 _ConvKanaToKana (todel, im_hiragana, kata, im_katakana);
0 commit comments