summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChoe Hwanjin <choe.hwanjin@gmail.com>2010-12-19 13:53:20 +0900
committerChoe Hwanjin <choe.hwanjin@gmail.com>2010-12-19 13:53:20 +0900
commitc9a9473e8ba5df76670237572e2150e404f05640 (patch)
tree921b3a00181ebb80722a47cdd8d69269d595b9b5
parent759613591ae49b4371f604b69814ec84f63516a1 (diff)
downloadlibhangul-c9a9473e8ba5df76670237572e2150e404f05640.tar.gz
완성 음절로 표현이 불가능한 경우 한글 자모로 표현
지금까지는 완성 음절로 표현이 불가능한 중성 + 종성 같은 음절의 경우 호환자모 중성과 종성을 나열하여 표현하였는데, 이제는 한글 자모 영역의 글자를 사용하여 초성채움 + 중성 + 종성으로 표현한다. 이렇게 기능을 수정하면, 옛한글 자판의 경우도 hangul_buffer_get_string() 함수를 그대로 사용할 수 있으므로 자판 관리가 좀더 편리해지는 측면이 있다. 그러나 단점으로 세벌식에서 모아치기 기능을 활용하는 중에 한글 자모로 표현한 글자가 나타날 수 있는데, 이때에 이 글자를 제대로 렌더링 하지 못할 가능성이 있다. git-svn-id: http://kldp.net/svn/hangul/libhangul/trunk@233 8f00fcd2-89fc-0310-932e-b01be5b65e01
-rw-r--r--hangul/hangulinputcontext.c46
-rw-r--r--test/test.c60
2 files changed, 94 insertions, 12 deletions
diff --git a/hangul/hangulinputcontext.c b/hangul/hangulinputcontext.c
index 90d0f7f..a34646d 100644
--- a/hangul/hangulinputcontext.c
+++ b/hangul/hangulinputcontext.c
@@ -610,38 +610,60 @@ hangul_jaso_to_string(ucschar cho, ucschar jung, ucschar jong,
if (jung) {
/* have cho, jung, jong or no jong */
ch = hangul_jamo_to_syllable(cho, jung, jong);
- buf[n++] = ch;
+ if (ch != 0) {
+ buf[n++] = ch;
+ } else {
+ /* 한글 음절로 표현 불가능한 경우 */
+ buf[n++] = cho;
+ buf[n++] = jung;
+ if (jong != 0)
+ buf[n++] = jong;
+ }
} else {
if (jong) {
/* have cho, jong */
- ch = hangul_jamo_to_cjamo(cho);
- buf[n++] = ch;
- ch = hangul_jamo_to_cjamo(jong);
- buf[n++] = ch;
+ buf[n++] = cho;
+ buf[n++] = HANGUL_JUNGSEONG_FILLER;
+ buf[n++] = jong;
} else {
/* have cho */
ch = hangul_jamo_to_cjamo(cho);
- buf[n++] = ch;
+ if (hangul_is_cjamo(ch)) {
+ buf[n++] = ch;
+ } else {
+ buf[n++] = cho;
+ buf[n++] = HANGUL_JUNGSEONG_FILLER;
+ }
}
}
} else {
if (jung) {
if (jong) {
/* have jung, jong */
- ch = hangul_jamo_to_cjamo(jung);
- buf[n++] = ch;
- ch = hangul_jamo_to_cjamo(jong);
- buf[n++] = ch;
+ buf[n++] = HANGUL_CHOSEONG_FILLER;
+ buf[n++] = jung;
+ buf[n++] = jong;
} else {
/* have jung */
ch = hangul_jamo_to_cjamo(jung);
- buf[n++] = ch;
+ if (hangul_is_cjamo(ch)) {
+ buf[n++] = ch;
+ } else {
+ buf[n++] = HANGUL_CHOSEONG_FILLER;
+ buf[n++] = jung;
+ }
}
} else {
if (jong) {
/* have jong */
ch = hangul_jamo_to_cjamo(jong);
- buf[n++] = ch;
+ if (hangul_is_cjamo(ch)) {
+ buf[n++] = ch;
+ } else {
+ buf[n++] = HANGUL_CHOSEONG_FILLER;
+ buf[n++] = HANGUL_JUNGSEONG_FILLER;
+ buf[n++] = jong;
+ }
} else {
/* have nothing */
buf[n] = 0;
diff --git a/test/test.c b/test/test.c
index 2b4b85f..ae20b6b 100644
--- a/test/test.c
+++ b/test/test.c
@@ -1,3 +1,4 @@
+#include <stdarg.h>
#include <stdlib.h>
#include <check.h>
@@ -5,6 +6,64 @@
#define countof(x) ((sizeof(x)) / (sizeof(x[0])))
+static bool
+check_preedit(const char* keyboard, const char* input, ...)
+{
+ HangulInputContext* ic;
+ const char* p;
+ const ucschar* preedit;
+ ucschar code;
+ va_list ap;
+
+ ic = hangul_ic_new(keyboard);
+
+ p = input;
+ while (*p != '\0') {
+ hangul_ic_process(ic, *p);
+ p++;
+ }
+
+ preedit = hangul_ic_get_preedit_string(ic);
+
+ va_start(ap, input);
+
+ code = va_arg(ap, ucschar);
+ while (code != 0) {
+ if (*preedit != code)
+ return false;
+
+ code = va_arg(ap, ucschar);
+ preedit++;
+ }
+
+ va_end(ap);
+
+ hangul_ic_delete(ic);
+
+ return true;
+}
+
+START_TEST(test_hangul_ic_process_3f)
+{
+ /* L V T */
+ /* ㅎ */
+ fail_unless(check_preedit("3f", "m", 0x314e, 0));
+ /* ㅗ */
+ fail_unless(check_preedit("3f", "v", 0x3157, 0));
+ /* ㅌ */
+ fail_unless(check_preedit("3f", "W", 0x314c, 0));
+
+ /* ㄱㅏㅇ */
+ fail_unless(check_preedit("3f", "kfa", 0xac15, 0));
+ /* ㄹㅐ */
+ fail_unless(check_preedit("3f", "yr", 0xb798, 0));
+ /* ㄴ ㅁ */
+ fail_unless(check_preedit("3f", "hz", 0x1102, 0x1160, 0x11b7, 0));
+ /* ㅜㅅ */
+ fail_unless(check_preedit("3f", "tq", 0x115f, 0x1165, 0x11ba, 0));
+}
+END_TEST
+
START_TEST(test_hangul_ic_process_romaja)
{
HangulInputContext* ic;
@@ -264,6 +323,7 @@ Suite* libhangul_suite()
Suite* s = suite_create("libhangul");
TCase* hangul = tcase_create("hangul");
+ tcase_add_test(hangul, test_hangul_ic_process_3f);
tcase_add_test(hangul, test_hangul_ic_process_romaja);
tcase_add_test(hangul, test_syllable_iterator);
tcase_add_test(hangul, test_hangul_keyboard);