두벌식에서 초성이 옛글에서만 사용되는 종성으로 변환되는 경우 처리
authorChoe Hwanjin <choe.hwanjin@gmail.com>
Sat, 25 Dec 2010 14:17:20 +0000 (23:17 +0900)
committerChoe Hwanjin <choe.hwanjin@gmail.com>
Sat, 25 Dec 2010 14:17:20 +0000 (23:17 +0900)
ㅃㅉㄸ은 옛글 자모 글자인데, 이번에 두벌식 옛글자판을 구현하면서
hangul_choseong_to_jongseong() 함수로 초성에서 종성으로 변환이 가능해진
자모 글자다. 그런데 저 글자는 현대 한글에서는 유효하지 않은 종성이므로
현대 한글 자판에서는 위 초성들이 종성으로 변환되어서는 안된다.
그래서 combination_table을 비교하여 conjoinable 자모인지 아닌지에
따라서 종성 변환을 할 것인지 말 것인지 처리한다.

git-svn-id: http://kldp.net/svn/hangul/libhangul/trunk@242 8f00fcd2-89fc-0310-932e-b01be5b65e01

hangul/hangulinputcontext.c

index 1b3c707..144ed28 100644 (file)
@@ -836,6 +836,23 @@ hangul_ic_save_commit_string(HangulInputContext *hic)
     hangul_buffer_clear(&hic->buffer);
 }
 
+static ucschar
+hangul_ic_choseong_to_jongseong(HangulInputContext* hic, ucschar cho)
+{
+    ucschar jong = hangul_choseong_to_jongseong(cho);
+    if (hangul_is_jongseong_conjoinable(jong)) {
+       return jong;
+    } else {
+       /* 옛글 조합 규칙을 사용하는 자판의 경우에는 종성이 conjoinable
+        * 하지 않아도 상관없다 */
+       if (hic->keyboard->combination_table == &hangul_combination_full) {
+           return jong;
+       }
+    }
+
+    return 0;
+}
+
 static bool
 hangul_ic_process_jamo(HangulInputContext *hic, ucschar ch)
 {
@@ -850,7 +867,7 @@ hangul_ic_process_jamo(HangulInputContext *hic, ucschar ch)
 
     if (hic->buffer.jongseong) {
        if (hangul_is_choseong(ch)) {
-           jong = hangul_choseong_to_jongseong(ch);
+           jong = hangul_ic_choseong_to_jongseong(hic, ch);
            combined = hangul_combination_combine(hic->combination,
                                              hic->buffer.jongseong, jong);
            if (hangul_is_jongseong(combined)) {
@@ -900,7 +917,7 @@ hangul_ic_process_jamo(HangulInputContext *hic, ucschar ch)
     } else if (hic->buffer.jungseong) {
        if (hangul_is_choseong(ch)) {
            if (hic->buffer.choseong) {
-               jong = hangul_choseong_to_jongseong(ch);
+               jong = hangul_ic_choseong_to_jongseong(hic, ch);
                if (hangul_is_jongseong(jong)) {
                    if (!hangul_ic_push(hic, jong)) {
                        if (!hangul_ic_push(hic, ch)) {
@@ -1090,7 +1107,7 @@ hangul_ic_process_romaja(HangulInputContext *hic, int ascii, ucschar ch)
            if (hangul_is_jongseong(ch))
                jong = ch;
            else
-               jong = hangul_choseong_to_jongseong(ch);
+               jong = hangul_ic_choseong_to_jongseong(hic, ch);
            combined = hangul_combination_combine(hic->combination,
                                              hic->buffer.jongseong, jong);
            if (hangul_is_jongseong(combined)) {
@@ -1118,6 +1135,7 @@ hangul_ic_process_romaja(HangulInputContext *hic, int ascii, ucschar ch)
                if (hangul_is_jungseong(peek)) {
                    if (pop == 0x11aa) {
                        hic->buffer.jongseong = 0x11a8;
+                       pop = 0x11ba;
                    } else {
                        hic->buffer.jongseong = 0;
                    }
@@ -1144,7 +1162,7 @@ hangul_ic_process_romaja(HangulInputContext *hic, int ascii, ucschar ch)
     } else if (hic->buffer.jungseong) {
        if (hangul_is_choseong(ch)) {
            if (hic->buffer.choseong) {
-               jong = hangul_choseong_to_jongseong(ch);
+               jong = hangul_ic_choseong_to_jongseong(hic, ch);
                if (hangul_is_jongseong(jong)) {
                    if (!hangul_ic_push(hic, jong)) {
                        if (!hangul_ic_push(hic, ch)) {