Skip to content

Commit

Permalink
(SourceForge sakura-editor#1098) 単語選択でひらがなカタカナ伸ばし濁点修正と文字マッピング追加
Browse files Browse the repository at this point in the history
  • Loading branch information
Moca authored and kengoide committed Dec 26, 2020
1 parent 501a682 commit e6885cb
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 20 deletions.
6 changes: 4 additions & 2 deletions sakura_core/charset/charcode.h
Original file line number Diff line number Diff line change
Expand Up @@ -216,14 +216,16 @@ namespace WCODE
inline bool IsHiragana(wchar_t c)
{
// 2009.06.26 syat 「ゝゞ」を追加
return (c>=0x3041 && c<=0x3096) || (c>=0x309D && c<=0x309E);
// 2017.02.26 Moca 「合字より」U+309Fを追加
return (c>=0x3041 && c<=0x3096) || (c>=0x309D && c<=0x309F);
}

//! カタカナかどうか
inline bool IsZenkakuKatakana(wchar_t c)
{
// 2009.06.26 syat 「ヽヾ」を追加
return (c>=0x30A1 && c<=0x30FA) || (c>=0x30FD && c<=0x30FE);
// 2017.02.26 Moca カタカナ拡張U+31F0-U+31FF/合字コトU+30FF 追加
return (c>=0x30A1 && c<=0x30FA) || (c>=0x30FD && c<=0x30FF) ||(c>=0x31f0 && c<=0x31ff);
}

//! ギリシャ文字かどうか
Expand Down
72 changes: 54 additions & 18 deletions sakura_core/parse/CWordParse.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -136,8 +136,36 @@ ECharKind CWordParse::WhatKindOfChar(

//その他
if( IsZenkakuSpace(c) )return CK_ZEN_SPACE; // 全角スペース
if( c==L'' )return CK_ZEN_NOBASU; // 伸ばす記号 'ー'
if( c==L'' || c==L'' )return CK_ZEN_DAKU; // 全角濁点 「゛゜」
// 2017.02.26 伸ばし・濁点処理変更。かならず前の文字と同じになるように前処理をする
struct SHirakataGousei{
static bool IsMatch(wchar_t c){
return (c == 0x30FC // 伸ばす記号 'ー'
|| c == 0x309B || c == 0x309C // 全角濁点 「゛゜」
|| c == 0x3099 || c == 0x309A); // 合成用濁点
}
};
if(SHirakataGousei::IsMatch(c)){
nIdx--; // 前の文字を探す
while( 0 <= nIdx ){
if(SHirakataGousei::IsMatch(pData[nIdx])){
// あーーー
// イーーー
// あ゛゛゛゛
// あ゛ーに対応→継続
}else if(IsHiragana(pData[nIdx])){
return CK_HIRA;
}else if(IsZenkakuKatakana(pData[nIdx])){
return CK_ZEN_KATA;
}else{
break;
}
nIdx--;
}
if(c == L''){
return CK_ZEN_NOBASU;
}
return CK_ZEN_DAKU;
}
if( isCSymbolZen(c) )return CK_ZEN_CSYM; // 全角版、識別子に使用可能な文字
if( IsZenkakuKigou(c) )return CK_ZEN_KIGO; // 全角の記号
if( IsHiragana(c) )return CK_HIRA; // ひらがな
Expand All @@ -155,8 +183,30 @@ ECharKind CWordParse::WhatKindOfChar(
if (IsUTF16High(pData[nIdx]) && IsUTF16Low(pData[nIdx+1])) {
int nCode = 0x10000 + ((pData[nIdx] & 0x3FF)<<10) + (pData[nIdx+1] & 0x3FF); // コードポイント
if (nCode >= 0x20000 && nCode <= 0x2FFFF) { // CJKV 拡張予約域 Ext-B/Ext-C...
if(0x2A708 == nCode){
// カナ合字とも
return CK_ZEN_KATA;
}
return CK_ZEN_ETC; // 全角のその他(漢字など)
}
if( nCode >= 0x1B000 && nCode <= 0x1B0FF ){
// Kana Supplement 仮名補助集合
int kanaIndex = nCode - 0x1B000;
char kanaSupplement[] = {2, 1};
if(kanaIndex < sizeof(kanaSupplement)){
switch(kanaSupplement[kanaIndex]){
case 0:
return CK_ETC;
case 1:
return CK_HIRA;
case 2:
return CK_ZEN_KATA;
default:
break;
}
}
return CK_ZEN_KATA; // 未実装文字はカタカナということにする
}
}
return CK_ETC; // 半角のその他
}
Expand All @@ -170,14 +220,7 @@ ECharKind CWordParse::WhatKindOfTwoChars( ECharKind kindPre, ECharKind kindCur )
{
if( kindPre == kindCur )return kindCur; // 同種ならその種別を返す

// 全角長音・全角濁点は前後の全角ひらがな・全角カタカナに引きずられる
if( ( kindPre == CK_ZEN_NOBASU || kindPre == CK_ZEN_DAKU ) &&
( kindCur == CK_ZEN_KATA || kindCur == CK_HIRA ) )return kindCur;
if( ( kindCur == CK_ZEN_NOBASU || kindCur == CK_ZEN_DAKU ) &&
( kindPre == CK_ZEN_KATA || kindPre == CK_HIRA ) )return kindPre;
// 全角濁点、全角長音の連続は、とりあえず同種の文字とみなす
if( ( kindPre == CK_ZEN_NOBASU || kindPre == CK_ZEN_DAKU ) &&
( kindCur == CK_ZEN_NOBASU || kindCur == CK_ZEN_DAKU ) )return kindCur;
// 2017.02.26 伸ばし記号と濁点の処理はWhatKindOfCharの段階で判定し「前」の文字のみ見るように

if( kindPre == CK_LATIN )kindPre = CK_CSYM; // ラテン系文字はアルファベットとみなす
if( kindCur == CK_LATIN )kindCur = CK_CSYM;
Expand All @@ -196,14 +239,7 @@ ECharKind CWordParse::WhatKindOfTwoChars4KW( ECharKind kindPre, ECharKind kindCu
{
if( kindPre == kindCur )return kindCur; // 同種ならその種別を返す

// 全角長音・全角濁点は前後の全角ひらがな・全角カタカナに引きずられる
if( ( kindPre == CK_ZEN_NOBASU || kindPre == CK_ZEN_DAKU ) &&
( kindCur == CK_ZEN_KATA || kindCur == CK_HIRA ) )return kindCur;
if( ( kindCur == CK_ZEN_NOBASU || kindCur == CK_ZEN_DAKU ) &&
( kindPre == CK_ZEN_KATA || kindPre == CK_HIRA ) )return kindPre;
// 全角濁点、全角長音の連続は、とりあえず同種の文字とみなす
if( ( kindPre == CK_ZEN_NOBASU || kindPre == CK_ZEN_DAKU ) &&
( kindCur == CK_ZEN_NOBASU || kindCur == CK_ZEN_DAKU ) )return kindCur;
// 2017.02.26 伸ばし記号と濁点の処理はWhatKindOfCharの段階で判定し「前」の文字のみ見るように

if( kindPre == CK_LATIN )kindPre = CK_CSYM; // ラテン系文字はアルファベットとみなす
if( kindCur == CK_LATIN )kindCur = CK_CSYM;
Expand Down

0 comments on commit e6885cb

Please sign in to comment.