hangul-unicode-composer 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,162 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { HangulUnicodeComposer } from "../HangulUnicodeComposer.js";
3
+
4
+ describe("HangulUnicodeComposer", () => {
5
+ it("should compose basic syllables", () => {
6
+ const composer = new HangulUnicodeComposer();
7
+
8
+ // Test '가' (ㄱ + ㅏ)
9
+ composer.addJamo("ㄱ");
10
+ expect(composer.extra).toBe("ㄱ");
11
+ composer.addJamo("ㅏ");
12
+ expect(composer.extra).toBe("가");
13
+ expect(composer.compositionString).toBe("");
14
+
15
+ // Clear and test '한' (ㅎ + ㅏ + ㄴ)
16
+ composer.reset();
17
+ composer.addJamo("ㅎ");
18
+ composer.addJamo("ㅏ");
19
+ composer.addJamo("ㄴ");
20
+ expect(composer.extra).toBe("한");
21
+ expect(composer.compositionString).toBe("");
22
+
23
+ // Test '한국' (ㅎ + ㅏ + ㄴ + ㄱ + ㅜ + ㄱ)
24
+ composer.reset();
25
+ composer.addJamo("ㅎ");
26
+ composer.addJamo("ㅏ");
27
+ composer.addJamo("ㄴ"); // 한
28
+ composer.addJamo("ㄱ"); // 한 -> ㄱ moves to next character
29
+ expect(composer.compositionString).toBe("한");
30
+ expect(composer.extra).toBe("ㄱ");
31
+
32
+ composer.addJamo("ㅜ"); // 한구
33
+ expect(composer.compositionString).toBe("한");
34
+ expect(composer.extra).toBe("구");
35
+
36
+ composer.addJamo("ㄱ"); // 한국
37
+ expect(composer.compositionString).toBe("한");
38
+ expect(composer.extra).toBe("국");
39
+ });
40
+
41
+ it("should compose complex vowels (diphthongs)", () => {
42
+ const composer = new HangulUnicodeComposer();
43
+
44
+ // Test '과' (ㄱ + ㅗ + ㅏ)
45
+ composer.addJamo("ㄱ");
46
+ composer.addJamo("ㅗ");
47
+ composer.addJamo("ㅏ");
48
+ expect(composer.extra).toBe("과");
49
+
50
+ // Test '관' (ㄱ + ㅗ + ㅏ + ㄴ)
51
+ composer.addJamo("ㄴ");
52
+ expect(composer.extra).toBe("관");
53
+ });
54
+
55
+ it("should handle double final consonants", () => {
56
+ const composer = new HangulUnicodeComposer();
57
+
58
+ // Test '닭' (ㄷ + ㅏ + ㄹ + ㄱ)
59
+ composer.addJamo("ㄷ");
60
+ composer.addJamo("ㅏ");
61
+ composer.addJamo("ㄹ");
62
+ composer.addJamo("ㄱ");
63
+ expect(composer.extra).toBe("닭"); // ㄹ + ㄱ combines to ㄺ
64
+ });
65
+
66
+ it("should process carry-over of final consonant to next syllable's initial", () => {
67
+ const composer = new HangulUnicodeComposer();
68
+
69
+ // Test '가마' typing (ㄱ + ㅏ + ㅁ + ㅏ)
70
+ composer.addJamo("ㄱ");
71
+ composer.addJamo("ㅏ");
72
+ composer.addJamo("ㅁ"); // 감
73
+ expect(composer.extra).toBe("감");
74
+
75
+ composer.addJamo("ㅏ"); // 'ㅁ' moves to initial of next syllable -> 가마
76
+ expect(composer.compositionString).toBe("가");
77
+ expect(composer.extra).toBe("마");
78
+ });
79
+
80
+ it("should process double consonant carry-over to next syllable's initial", () => {
81
+ const composer = new HangulUnicodeComposer();
82
+
83
+ // Test '앉아' typing (ㅇ + ㅏ + ㄴ + ㅈ + ㅏ)
84
+ composer.addJamo("ㅇ");
85
+ composer.addJamo("ㅏ");
86
+ composer.addJamo("ㄴ");
87
+ composer.addJamo("ㅈ"); // 앉
88
+ expect(composer.extra).toBe("앉");
89
+
90
+ composer.addJamo("ㅏ"); // 'ㅈ' moves to next syllable -> 안자
91
+ expect(composer.compositionString).toBe("안");
92
+ expect(composer.extra).toBe("자");
93
+ });
94
+
95
+ it("should handle backspace correctly", () => {
96
+ const composer = new HangulUnicodeComposer();
97
+
98
+ // Type '강' (ㄱ + ㅏ + ㅇ)
99
+ composer.addJamo("ㄱ");
100
+ composer.addJamo("ㅏ");
101
+ composer.addJamo("ㅇ");
102
+ expect(composer.extra).toBe("강");
103
+
104
+ // Backspace once -> '가'
105
+ composer.backSpace();
106
+ expect(composer.extra).toBe("가");
107
+
108
+ // Backspace twice -> 'ㄱ'
109
+ composer.backSpace();
110
+ expect(composer.extra).toBe("ㄱ");
111
+
112
+ // Backspace thrice -> ""
113
+ composer.backSpace();
114
+ expect(composer.extra).toBe("");
115
+ });
116
+
117
+ it("should handle space and special characters", () => {
118
+ const composer = new HangulUnicodeComposer();
119
+
120
+ // Type '한'
121
+ composer.addJamo("ㅎ");
122
+ composer.addJamo("ㅏ");
123
+ composer.addJamo("ㄴ");
124
+
125
+ // Add space
126
+ composer.space();
127
+ expect(composer.compositionString).toBe("한 ");
128
+ expect(composer.extra).toBe("");
129
+
130
+ // Add special character
131
+ composer.addSpecialChar("!");
132
+ expect(composer.compositionString).toBe("한 !");
133
+ });
134
+
135
+ it("should support archive and restore", () => {
136
+ const composer = new HangulUnicodeComposer();
137
+
138
+ // Type '한' in composer
139
+ composer.addJamo("ㅎ");
140
+ composer.addJamo("ㅏ");
141
+ composer.addJamo("ㄴ");
142
+
143
+ // Archive as 'field1'
144
+ composer.archive("field1");
145
+
146
+ // Clear typing state manually (reset() clears archives)
147
+ composer.compositionString = "";
148
+ composer.extra = "";
149
+ composer.instantChars = [];
150
+
151
+ // Type something else '글'
152
+ composer.addJamo("ㄱ");
153
+ composer.addJamo("ㅡ");
154
+ composer.addJamo("ㄹ");
155
+ expect(composer.compositionString + composer.extra).toBe("글");
156
+
157
+ // Restore 'field1'
158
+ const restored = composer.restore("field1");
159
+ expect(restored).toBe("한");
160
+ expect(composer.compositionString + composer.extra).toBe("한");
161
+ });
162
+ });
package/tsconfig.json ADDED
@@ -0,0 +1,16 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "NodeNext",
5
+ "moduleResolution": "NodeNext",
6
+ "declaration": true,
7
+ "outDir": "./dist",
8
+ "rootDir": "./src",
9
+ "strict": true,
10
+ "esModuleInterop": true,
11
+ "skipLibCheck": true,
12
+ "forceConsistentCasingInFileNames": true
13
+ },
14
+ "include": ["src/**/*"],
15
+ "exclude": ["src/**/__tests__/*", "node_modules", "dist"]
16
+ }