yosina 0.1.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.
Files changed (43) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.yml +36 -0
  3. data/Gemfile +6 -0
  4. data/README.ja.md +229 -0
  5. data/README.md +229 -0
  6. data/Rakefile +30 -0
  7. data/codegen/dataset.rb +215 -0
  8. data/codegen/emitters/circled_or_squared_transliterator_data.rb +30 -0
  9. data/codegen/emitters/combined_transliterator_data.rb +28 -0
  10. data/codegen/emitters/hyphens_transliterator_data.rb +48 -0
  11. data/codegen/emitters/ivs_svs_base_transliterator_data.rb +121 -0
  12. data/codegen/emitters/simple_transliterator.rb +76 -0
  13. data/codegen/emitters/utils.rb +45 -0
  14. data/codegen/emitters.rb +8 -0
  15. data/codegen/main.rb +109 -0
  16. data/lib/yosina/char.rb +65 -0
  17. data/lib/yosina/chars.rb +152 -0
  18. data/lib/yosina/recipes.rb +359 -0
  19. data/lib/yosina/transliterator.rb +49 -0
  20. data/lib/yosina/transliterators/circled_or_squared.rb +67 -0
  21. data/lib/yosina/transliterators/circled_or_squared_data.rb +469 -0
  22. data/lib/yosina/transliterators/combined.rb +52 -0
  23. data/lib/yosina/transliterators/combined_data.rb +495 -0
  24. data/lib/yosina/transliterators/hira_kata.rb +106 -0
  25. data/lib/yosina/transliterators/hira_kata_composition.rb +103 -0
  26. data/lib/yosina/transliterators/hira_kata_table.rb +116 -0
  27. data/lib/yosina/transliterators/hyphens.rb +83 -0
  28. data/lib/yosina/transliterators/hyphens_data.rb +60 -0
  29. data/lib/yosina/transliterators/ideographic_annotations.rb +73 -0
  30. data/lib/yosina/transliterators/ivs_svs_base.rb +169 -0
  31. data/lib/yosina/transliterators/ivs_svs_base_data.rb +0 -0
  32. data/lib/yosina/transliterators/japanese_iteration_marks.rb +261 -0
  33. data/lib/yosina/transliterators/jisx0201_and_alike.rb +451 -0
  34. data/lib/yosina/transliterators/kanji_old_new.rb +1137 -0
  35. data/lib/yosina/transliterators/mathematical_alphanumerics.rb +799 -0
  36. data/lib/yosina/transliterators/prolonged_sound_marks.rb +206 -0
  37. data/lib/yosina/transliterators/radicals.rb +361 -0
  38. data/lib/yosina/transliterators/spaces.rb +79 -0
  39. data/lib/yosina/transliterators.rb +57 -0
  40. data/lib/yosina/version.rb +5 -0
  41. data/lib/yosina.rb +62 -0
  42. data/yosina.gemspec +41 -0
  43. metadata +159 -0
@@ -0,0 +1,469 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Yosina
4
+ module Transliterators
5
+ # Replace circled or squared characters with their corresponding templates
6
+ module CircledOrSquared
7
+ # Generated mapping data from circled-or-squared.json
8
+ CIRCLED_OR_SQUARED_MAPPINGS = {
9
+ "\u{a9}" => { rendering: 'C', type: 'c', emoji: false },
10
+ "\u{2117}" => { rendering: 'P', type: 'c', emoji: false },
11
+ "\u{2460}" => { rendering: '1', type: 'c', emoji: false },
12
+ "\u{2461}" => { rendering: '2', type: 'c', emoji: false },
13
+ "\u{2462}" => { rendering: '3', type: 'c', emoji: false },
14
+ "\u{2463}" => { rendering: '4', type: 'c', emoji: false },
15
+ "\u{2464}" => { rendering: '5', type: 'c', emoji: false },
16
+ "\u{2465}" => { rendering: '6', type: 'c', emoji: false },
17
+ "\u{2466}" => { rendering: '7', type: 'c', emoji: false },
18
+ "\u{2467}" => { rendering: '8', type: 'c', emoji: false },
19
+ "\u{2468}" => { rendering: '9', type: 'c', emoji: false },
20
+ "\u{2469}" => { rendering: '10', type: 'c', emoji: false },
21
+ "\u{246a}" => { rendering: '11', type: 'c', emoji: false },
22
+ "\u{246b}" => { rendering: '12', type: 'c', emoji: false },
23
+ "\u{246c}" => { rendering: '13', type: 'c', emoji: false },
24
+ "\u{246d}" => { rendering: '14', type: 'c', emoji: false },
25
+ "\u{246e}" => { rendering: '15', type: 'c', emoji: false },
26
+ "\u{246f}" => { rendering: '16', type: 'c', emoji: false },
27
+ "\u{2470}" => { rendering: '17', type: 'c', emoji: false },
28
+ "\u{2471}" => { rendering: '18', type: 'c', emoji: false },
29
+ "\u{2472}" => { rendering: '19', type: 'c', emoji: false },
30
+ "\u{2473}" => { rendering: '20', type: 'c', emoji: false },
31
+ "\u{24b6}" => { rendering: 'A', type: 'c', emoji: false },
32
+ "\u{24b7}" => { rendering: 'B', type: 'c', emoji: false },
33
+ "\u{24b8}" => { rendering: 'C', type: 'c', emoji: false },
34
+ "\u{24b9}" => { rendering: 'D', type: 'c', emoji: false },
35
+ "\u{24ba}" => { rendering: 'E', type: 'c', emoji: false },
36
+ "\u{24bb}" => { rendering: 'F', type: 'c', emoji: false },
37
+ "\u{24bc}" => { rendering: 'G', type: 'c', emoji: false },
38
+ "\u{24bd}" => { rendering: 'H', type: 'c', emoji: false },
39
+ "\u{24be}" => { rendering: 'I', type: 'c', emoji: false },
40
+ "\u{24bf}" => { rendering: 'J', type: 'c', emoji: false },
41
+ "\u{24c0}" => { rendering: 'K', type: 'c', emoji: false },
42
+ "\u{24c1}" => { rendering: 'L', type: 'c', emoji: false },
43
+ "\u{24c2}" => { rendering: 'M', type: 'c', emoji: false },
44
+ "\u{24c3}" => { rendering: 'N', type: 'c', emoji: false },
45
+ "\u{24c4}" => { rendering: 'O', type: 'c', emoji: false },
46
+ "\u{24c5}" => { rendering: 'P', type: 'c', emoji: false },
47
+ "\u{24c6}" => { rendering: 'Q', type: 'c', emoji: false },
48
+ "\u{24c7}" => { rendering: 'R', type: 'c', emoji: false },
49
+ "\u{24c8}" => { rendering: 'S', type: 'c', emoji: false },
50
+ "\u{24c9}" => { rendering: 'T', type: 'c', emoji: false },
51
+ "\u{24ca}" => { rendering: 'U', type: 'c', emoji: false },
52
+ "\u{24cb}" => { rendering: 'V', type: 'c', emoji: false },
53
+ "\u{24cc}" => { rendering: 'W', type: 'c', emoji: false },
54
+ "\u{24cd}" => { rendering: 'X', type: 'c', emoji: false },
55
+ "\u{24ce}" => { rendering: 'Y', type: 'c', emoji: false },
56
+ "\u{24cf}" => { rendering: 'Z', type: 'c', emoji: false },
57
+ "\u{24d0}" => { rendering: 'a', type: 'c', emoji: false },
58
+ "\u{24d1}" => { rendering: 'b', type: 'c', emoji: false },
59
+ "\u{24d2}" => { rendering: 'c', type: 'c', emoji: false },
60
+ "\u{24d3}" => { rendering: 'd', type: 'c', emoji: false },
61
+ "\u{24d4}" => { rendering: 'e', type: 'c', emoji: false },
62
+ "\u{24d5}" => { rendering: 'f', type: 'c', emoji: false },
63
+ "\u{24d6}" => { rendering: 'g', type: 'c', emoji: false },
64
+ "\u{24d7}" => { rendering: 'h', type: 'c', emoji: false },
65
+ "\u{24d8}" => { rendering: 'i', type: 'c', emoji: false },
66
+ "\u{24d9}" => { rendering: 'j', type: 'c', emoji: false },
67
+ "\u{24da}" => { rendering: 'k', type: 'c', emoji: false },
68
+ "\u{24db}" => { rendering: 'l', type: 'c', emoji: false },
69
+ "\u{24dc}" => { rendering: 'm', type: 'c', emoji: false },
70
+ "\u{24dd}" => { rendering: 'n', type: 'c', emoji: false },
71
+ "\u{24de}" => { rendering: 'o', type: 'c', emoji: false },
72
+ "\u{24df}" => { rendering: 'p', type: 'c', emoji: false },
73
+ "\u{24e0}" => { rendering: 'q', type: 'c', emoji: false },
74
+ "\u{24e1}" => { rendering: 'r', type: 'c', emoji: false },
75
+ "\u{24e2}" => { rendering: 's', type: 'c', emoji: false },
76
+ "\u{24e3}" => { rendering: 't', type: 'c', emoji: false },
77
+ "\u{24e4}" => { rendering: 'u', type: 'c', emoji: false },
78
+ "\u{24e5}" => { rendering: 'v', type: 'c', emoji: false },
79
+ "\u{24e6}" => { rendering: 'w', type: 'c', emoji: false },
80
+ "\u{24e7}" => { rendering: 'x', type: 'c', emoji: false },
81
+ "\u{24e8}" => { rendering: 'y', type: 'c', emoji: false },
82
+ "\u{24e9}" => { rendering: 'z', type: 'c', emoji: false },
83
+ "\u{24ea}" => { rendering: '0', type: 'c', emoji: false },
84
+ "\u{24eb}" => { rendering: '11', type: 'c', emoji: false },
85
+ "\u{24ec}" => { rendering: '12', type: 'c', emoji: false },
86
+ "\u{24ed}" => { rendering: '13', type: 'c', emoji: false },
87
+ "\u{24ee}" => { rendering: '14', type: 'c', emoji: false },
88
+ "\u{24ef}" => { rendering: '15', type: 'c', emoji: false },
89
+ "\u{24f0}" => { rendering: '16', type: 'c', emoji: false },
90
+ "\u{24f1}" => { rendering: '17', type: 'c', emoji: false },
91
+ "\u{24f2}" => { rendering: '18', type: 'c', emoji: false },
92
+ "\u{24f3}" => { rendering: '19', type: 'c', emoji: false },
93
+ "\u{24f4}" => { rendering: '20', type: 'c', emoji: false },
94
+ "\u{24f5}" => { rendering: '1', type: 'c', emoji: false },
95
+ "\u{24f6}" => { rendering: '2', type: 'c', emoji: false },
96
+ "\u{24f7}" => { rendering: '3', type: 'c', emoji: false },
97
+ "\u{24f8}" => { rendering: '4', type: 'c', emoji: false },
98
+ "\u{24f9}" => { rendering: '5', type: 'c', emoji: false },
99
+ "\u{24fa}" => { rendering: '6', type: 'c', emoji: false },
100
+ "\u{24fb}" => { rendering: '7', type: 'c', emoji: false },
101
+ "\u{24fc}" => { rendering: '8', type: 'c', emoji: false },
102
+ "\u{24fd}" => { rendering: '9', type: 'c', emoji: false },
103
+ "\u{24fe}" => { rendering: '10', type: 'c', emoji: false },
104
+ "\u{24ff}" => { rendering: '0', type: 'c', emoji: false },
105
+ "\u{2776}" => { rendering: '1', type: 'c', emoji: false },
106
+ "\u{2777}" => { rendering: '2', type: 'c', emoji: false },
107
+ "\u{2778}" => { rendering: '3', type: 'c', emoji: false },
108
+ "\u{2779}" => { rendering: '4', type: 'c', emoji: false },
109
+ "\u{277a}" => { rendering: '5', type: 'c', emoji: false },
110
+ "\u{277b}" => { rendering: '6', type: 'c', emoji: false },
111
+ "\u{277c}" => { rendering: '7', type: 'c', emoji: false },
112
+ "\u{277d}" => { rendering: '8', type: 'c', emoji: false },
113
+ "\u{277e}" => { rendering: '9', type: 'c', emoji: false },
114
+ "\u{277f}" => { rendering: '10', type: 'c', emoji: false },
115
+ "\u{2780}" => { rendering: '1', type: 'c', emoji: false },
116
+ "\u{2781}" => { rendering: '2', type: 'c', emoji: false },
117
+ "\u{2782}" => { rendering: '3', type: 'c', emoji: false },
118
+ "\u{2783}" => { rendering: '4', type: 'c', emoji: false },
119
+ "\u{2784}" => { rendering: '5', type: 'c', emoji: false },
120
+ "\u{2785}" => { rendering: '6', type: 'c', emoji: false },
121
+ "\u{2786}" => { rendering: '7', type: 'c', emoji: false },
122
+ "\u{2787}" => { rendering: '8', type: 'c', emoji: false },
123
+ "\u{2788}" => { rendering: '9', type: 'c', emoji: false },
124
+ "\u{2789}" => { rendering: '10', type: 'c', emoji: false },
125
+ "\u{278a}" => { rendering: '1', type: 'c', emoji: false },
126
+ "\u{278b}" => { rendering: '2', type: 'c', emoji: false },
127
+ "\u{278c}" => { rendering: '3', type: 'c', emoji: false },
128
+ "\u{278d}" => { rendering: '4', type: 'c', emoji: false },
129
+ "\u{278e}" => { rendering: '5', type: 'c', emoji: false },
130
+ "\u{278f}" => { rendering: '6', type: 'c', emoji: false },
131
+ "\u{2790}" => { rendering: '7', type: 'c', emoji: false },
132
+ "\u{2791}" => { rendering: '8', type: 'c', emoji: false },
133
+ "\u{2792}" => { rendering: '9', type: 'c', emoji: false },
134
+ "\u{2793}" => { rendering: '10', type: 'c', emoji: false },
135
+ "\u{3244}" => { rendering: "\u{554f}", type: 'c', emoji: false },
136
+ "\u{3245}" => { rendering: "\u{5e7c}", type: 'c', emoji: false },
137
+ "\u{3246}" => { rendering: "\u{6587}", type: 'c', emoji: false },
138
+ "\u{3247}" => { rendering: "\u{7b8f}", type: 'c', emoji: false },
139
+ "\u{3248}" => { rendering: '21', type: 'c', emoji: false },
140
+ "\u{3252}" => { rendering: '22', type: 'c', emoji: false },
141
+ "\u{3253}" => { rendering: '23', type: 'c', emoji: false },
142
+ "\u{3254}" => { rendering: '24', type: 'c', emoji: false },
143
+ "\u{3255}" => { rendering: '25', type: 'c', emoji: false },
144
+ "\u{3256}" => { rendering: '26', type: 'c', emoji: false },
145
+ "\u{3257}" => { rendering: '27', type: 'c', emoji: false },
146
+ "\u{3258}" => { rendering: '28', type: 'c', emoji: false },
147
+ "\u{3259}" => { rendering: '29', type: 'c', emoji: false },
148
+ "\u{325a}" => { rendering: '30', type: 'c', emoji: false },
149
+ "\u{325b}" => { rendering: '31', type: 'c', emoji: false },
150
+ "\u{325c}" => { rendering: '32', type: 'c', emoji: false },
151
+ "\u{325d}" => { rendering: '33', type: 'c', emoji: false },
152
+ "\u{325e}" => { rendering: '34', type: 'c', emoji: false },
153
+ "\u{325f}" => { rendering: '35', type: 'c', emoji: false },
154
+ "\u{3280}" => { rendering: "\u{4e00}", type: 'c', emoji: false },
155
+ "\u{3281}" => { rendering: "\u{4e8c}", type: 'c', emoji: false },
156
+ "\u{3282}" => { rendering: "\u{4e09}", type: 'c', emoji: false },
157
+ "\u{3283}" => { rendering: "\u{56db}", type: 'c', emoji: false },
158
+ "\u{3284}" => { rendering: "\u{4e94}", type: 'c', emoji: false },
159
+ "\u{3285}" => { rendering: "\u{516d}", type: 'c', emoji: false },
160
+ "\u{3286}" => { rendering: "\u{4e03}", type: 'c', emoji: false },
161
+ "\u{3287}" => { rendering: "\u{516b}", type: 'c', emoji: false },
162
+ "\u{3288}" => { rendering: "\u{4e5d}", type: 'c', emoji: false },
163
+ "\u{3289}" => { rendering: "\u{5341}", type: 'c', emoji: false },
164
+ "\u{328a}" => { rendering: "\u{6708}", type: 'c', emoji: false },
165
+ "\u{328b}" => { rendering: "\u{706b}", type: 'c', emoji: false },
166
+ "\u{328c}" => { rendering: "\u{6c34}", type: 'c', emoji: false },
167
+ "\u{328d}" => { rendering: "\u{6728}", type: 'c', emoji: false },
168
+ "\u{328e}" => { rendering: "\u{91d1}", type: 'c', emoji: false },
169
+ "\u{328f}" => { rendering: "\u{571f}", type: 'c', emoji: false },
170
+ "\u{3290}" => { rendering: "\u{65e5}", type: 'c', emoji: false },
171
+ "\u{3291}" => { rendering: "\u{682a}", type: 'c', emoji: false },
172
+ "\u{3292}" => { rendering: "\u{6709}", type: 'c', emoji: false },
173
+ "\u{3293}" => { rendering: "\u{793e}", type: 'c', emoji: false },
174
+ "\u{3294}" => { rendering: "\u{540d}", type: 'c', emoji: false },
175
+ "\u{3295}" => { rendering: "\u{7279}", type: 'c', emoji: false },
176
+ "\u{3296}" => { rendering: "\u{8ca1}", type: 'c', emoji: false },
177
+ "\u{3297}" => { rendering: "\u{795d}", type: 'c', emoji: false },
178
+ "\u{3298}" => { rendering: "\u{52b4}", type: 'c', emoji: false },
179
+ "\u{3299}" => { rendering: "\u{79d8}", type: 'c', emoji: false },
180
+ "\u{329a}" => { rendering: "\u{7537}", type: 'c', emoji: false },
181
+ "\u{329b}" => { rendering: "\u{5973}", type: 'c', emoji: false },
182
+ "\u{329c}" => { rendering: "\u{9069}", type: 'c', emoji: false },
183
+ "\u{329d}" => { rendering: "\u{512a}", type: 'c', emoji: false },
184
+ "\u{329e}" => { rendering: "\u{5370}", type: 'c', emoji: false },
185
+ "\u{329f}" => { rendering: "\u{6ce8}", type: 'c', emoji: false },
186
+ "\u{32a0}" => { rendering: "\u{9805}", type: 'c', emoji: false },
187
+ "\u{32a1}" => { rendering: "\u{4f11}", type: 'c', emoji: false },
188
+ "\u{32a2}" => { rendering: "\u{5199}", type: 'c', emoji: false },
189
+ "\u{32a3}" => { rendering: "\u{6b63}", type: 'c', emoji: false },
190
+ "\u{32a4}" => { rendering: "\u{4e0a}", type: 'c', emoji: false },
191
+ "\u{32a5}" => { rendering: "\u{4e2d}", type: 'c', emoji: false },
192
+ "\u{32a6}" => { rendering: "\u{4e0b}", type: 'c', emoji: false },
193
+ "\u{32a7}" => { rendering: "\u{5de6}", type: 'c', emoji: false },
194
+ "\u{32a8}" => { rendering: "\u{53f3}", type: 'c', emoji: false },
195
+ "\u{32a9}" => { rendering: "\u{533b}", type: 'c', emoji: false },
196
+ "\u{32aa}" => { rendering: "\u{5b97}", type: 'c', emoji: false },
197
+ "\u{32ab}" => { rendering: "\u{5b66}", type: 'c', emoji: false },
198
+ "\u{32ac}" => { rendering: "\u{76e3}", type: 'c', emoji: false },
199
+ "\u{32ad}" => { rendering: "\u{4f01}", type: 'c', emoji: false },
200
+ "\u{32ae}" => { rendering: "\u{8cc7}", type: 'c', emoji: false },
201
+ "\u{32af}" => { rendering: "\u{5354}", type: 'c', emoji: false },
202
+ "\u{32b0}" => { rendering: "\u{591c}", type: 'c', emoji: false },
203
+ "\u{32b1}" => { rendering: '36', type: 'c', emoji: false },
204
+ "\u{32b2}" => { rendering: '37', type: 'c', emoji: false },
205
+ "\u{32b3}" => { rendering: '38', type: 'c', emoji: false },
206
+ "\u{32b4}" => { rendering: '39', type: 'c', emoji: false },
207
+ "\u{32b5}" => { rendering: '40', type: 'c', emoji: false },
208
+ "\u{32b6}" => { rendering: '41', type: 'c', emoji: false },
209
+ "\u{32b7}" => { rendering: '42', type: 'c', emoji: false },
210
+ "\u{32b8}" => { rendering: '43', type: 'c', emoji: false },
211
+ "\u{32b9}" => { rendering: '44', type: 'c', emoji: false },
212
+ "\u{32ba}" => { rendering: '45', type: 'c', emoji: false },
213
+ "\u{32bb}" => { rendering: '46', type: 'c', emoji: false },
214
+ "\u{32bc}" => { rendering: '47', type: 'c', emoji: false },
215
+ "\u{32bd}" => { rendering: '48', type: 'c', emoji: false },
216
+ "\u{32be}" => { rendering: '49', type: 'c', emoji: false },
217
+ "\u{32bf}" => { rendering: '50', type: 'c', emoji: false },
218
+ "\u{32d0}" => { rendering: "\u{30a2}", type: 'c', emoji: false },
219
+ "\u{32d1}" => { rendering: "\u{30a4}", type: 'c', emoji: false },
220
+ "\u{32d2}" => { rendering: "\u{30a6}", type: 'c', emoji: false },
221
+ "\u{32d3}" => { rendering: "\u{30a8}", type: 'c', emoji: false },
222
+ "\u{32d4}" => { rendering: "\u{30aa}", type: 'c', emoji: false },
223
+ "\u{32d5}" => { rendering: "\u{30ab}", type: 'c', emoji: false },
224
+ "\u{32d6}" => { rendering: "\u{30ad}", type: 'c', emoji: false },
225
+ "\u{32d7}" => { rendering: "\u{30af}", type: 'c', emoji: false },
226
+ "\u{32d8}" => { rendering: "\u{30b1}", type: 'c', emoji: false },
227
+ "\u{32d9}" => { rendering: "\u{30b3}", type: 'c', emoji: false },
228
+ "\u{32da}" => { rendering: "\u{30b5}", type: 'c', emoji: false },
229
+ "\u{32db}" => { rendering: "\u{30b7}", type: 'c', emoji: false },
230
+ "\u{32dc}" => { rendering: "\u{30b9}", type: 'c', emoji: false },
231
+ "\u{32dd}" => { rendering: "\u{30bb}", type: 'c', emoji: false },
232
+ "\u{32de}" => { rendering: "\u{30bd}", type: 'c', emoji: false },
233
+ "\u{32df}" => { rendering: "\u{30bf}", type: 'c', emoji: false },
234
+ "\u{32e0}" => { rendering: "\u{30c1}", type: 'c', emoji: false },
235
+ "\u{32e1}" => { rendering: "\u{30c4}", type: 'c', emoji: false },
236
+ "\u{32e2}" => { rendering: "\u{30c6}", type: 'c', emoji: false },
237
+ "\u{32e3}" => { rendering: "\u{30c8}", type: 'c', emoji: false },
238
+ "\u{32e4}" => { rendering: "\u{30ca}", type: 'c', emoji: false },
239
+ "\u{32e5}" => { rendering: "\u{30cb}", type: 'c', emoji: false },
240
+ "\u{32e6}" => { rendering: "\u{30cc}", type: 'c', emoji: false },
241
+ "\u{32e7}" => { rendering: "\u{30cd}", type: 'c', emoji: false },
242
+ "\u{32e8}" => { rendering: "\u{30ce}", type: 'c', emoji: false },
243
+ "\u{32e9}" => { rendering: "\u{30cf}", type: 'c', emoji: false },
244
+ "\u{32ea}" => { rendering: "\u{30d2}", type: 'c', emoji: false },
245
+ "\u{32eb}" => { rendering: "\u{30d5}", type: 'c', emoji: false },
246
+ "\u{32ec}" => { rendering: "\u{30d8}", type: 'c', emoji: false },
247
+ "\u{32ed}" => { rendering: "\u{30db}", type: 'c', emoji: false },
248
+ "\u{32ee}" => { rendering: "\u{30de}", type: 'c', emoji: false },
249
+ "\u{32ef}" => { rendering: "\u{30df}", type: 'c', emoji: false },
250
+ "\u{32f0}" => { rendering: "\u{30e0}", type: 'c', emoji: false },
251
+ "\u{32f1}" => { rendering: "\u{30e1}", type: 'c', emoji: false },
252
+ "\u{32f2}" => { rendering: "\u{30e2}", type: 'c', emoji: false },
253
+ "\u{32f3}" => { rendering: "\u{30e4}", type: 'c', emoji: false },
254
+ "\u{32f4}" => { rendering: "\u{30e6}", type: 'c', emoji: false },
255
+ "\u{32f5}" => { rendering: "\u{30e8}", type: 'c', emoji: false },
256
+ "\u{32f6}" => { rendering: "\u{30e9}", type: 'c', emoji: false },
257
+ "\u{32f7}" => { rendering: "\u{30ea}", type: 'c', emoji: false },
258
+ "\u{32f8}" => { rendering: "\u{30eb}", type: 'c', emoji: false },
259
+ "\u{32f9}" => { rendering: "\u{30ec}", type: 'c', emoji: false },
260
+ "\u{32fa}" => { rendering: "\u{30ed}", type: 'c', emoji: false },
261
+ "\u{32fb}" => { rendering: "\u{30ef}", type: 'c', emoji: false },
262
+ "\u{32fc}" => { rendering: "\u{30f0}", type: 'c', emoji: false },
263
+ "\u{32fd}" => { rendering: "\u{30f1}", type: 'c', emoji: false },
264
+ "\u{32fe}" => { rendering: "\u{30f2}", type: 'c', emoji: false },
265
+ "\u{1f10b}" => { rendering: '0', type: 'c', emoji: false },
266
+ "\u{1f10c}" => { rendering: '0', type: 'c', emoji: false },
267
+ "\u{1f12b}" => { rendering: 'C', type: 'c', emoji: false },
268
+ "\u{1f12c}" => { rendering: 'R', type: 'c', emoji: false },
269
+ "\u{1f12d}" => { rendering: 'CD', type: 'c', emoji: false },
270
+ "\u{1f12e}" => { rendering: 'WZ', type: 'c', emoji: false },
271
+ "\u{1f130}" => { rendering: 'A', type: 's', emoji: false },
272
+ "\u{1f131}" => { rendering: 'B', type: 's', emoji: false },
273
+ "\u{1f132}" => { rendering: 'C', type: 's', emoji: false },
274
+ "\u{1f133}" => { rendering: 'D', type: 's', emoji: false },
275
+ "\u{1f134}" => { rendering: 'E', type: 's', emoji: false },
276
+ "\u{1f135}" => { rendering: 'F', type: 's', emoji: false },
277
+ "\u{1f136}" => { rendering: 'G', type: 's', emoji: false },
278
+ "\u{1f137}" => { rendering: 'H', type: 's', emoji: false },
279
+ "\u{1f138}" => { rendering: 'I', type: 's', emoji: false },
280
+ "\u{1f139}" => { rendering: 'J', type: 's', emoji: false },
281
+ "\u{1f13a}" => { rendering: 'K', type: 's', emoji: false },
282
+ "\u{1f13b}" => { rendering: 'L', type: 's', emoji: false },
283
+ "\u{1f13c}" => { rendering: 'M', type: 's', emoji: false },
284
+ "\u{1f13d}" => { rendering: 'N', type: 's', emoji: false },
285
+ "\u{1f13e}" => { rendering: 'O', type: 's', emoji: false },
286
+ "\u{1f13f}" => { rendering: 'P', type: 's', emoji: false },
287
+ "\u{1f140}" => { rendering: 'Q', type: 's', emoji: false },
288
+ "\u{1f141}" => { rendering: 'R', type: 's', emoji: false },
289
+ "\u{1f142}" => { rendering: 'S', type: 's', emoji: false },
290
+ "\u{1f143}" => { rendering: 'T', type: 's', emoji: false },
291
+ "\u{1f144}" => { rendering: 'U', type: 's', emoji: false },
292
+ "\u{1f145}" => { rendering: 'V', type: 's', emoji: false },
293
+ "\u{1f146}" => { rendering: 'W', type: 's', emoji: false },
294
+ "\u{1f147}" => { rendering: 'X', type: 's', emoji: false },
295
+ "\u{1f148}" => { rendering: 'Y', type: 's', emoji: false },
296
+ "\u{1f149}" => { rendering: 'Z', type: 's', emoji: false },
297
+ "\u{1f14a}" => { rendering: 'HV', type: 's', emoji: false },
298
+ "\u{1f14b}" => { rendering: 'MV', type: 's', emoji: false },
299
+ "\u{1f14c}" => { rendering: 'SD', type: 's', emoji: false },
300
+ "\u{1f14d}" => { rendering: 'SS', type: 's', emoji: false },
301
+ "\u{1f14e}" => { rendering: 'PPV', type: 's', emoji: false },
302
+ "\u{1f14f}" => { rendering: 'WC', type: 's', emoji: false },
303
+ "\u{1f150}" => { rendering: 'A', type: 'c', emoji: false },
304
+ "\u{1f151}" => { rendering: 'B', type: 'c', emoji: false },
305
+ "\u{1f152}" => { rendering: 'C', type: 'c', emoji: false },
306
+ "\u{1f153}" => { rendering: 'D', type: 'c', emoji: false },
307
+ "\u{1f154}" => { rendering: 'E', type: 'c', emoji: false },
308
+ "\u{1f155}" => { rendering: 'F', type: 'c', emoji: false },
309
+ "\u{1f156}" => { rendering: 'G', type: 'c', emoji: false },
310
+ "\u{1f157}" => { rendering: 'H', type: 'c', emoji: false },
311
+ "\u{1f158}" => { rendering: 'I', type: 'c', emoji: false },
312
+ "\u{1f159}" => { rendering: 'J', type: 'c', emoji: false },
313
+ "\u{1f15a}" => { rendering: 'K', type: 'c', emoji: false },
314
+ "\u{1f15b}" => { rendering: 'L', type: 'c', emoji: false },
315
+ "\u{1f15c}" => { rendering: 'M', type: 'c', emoji: false },
316
+ "\u{1f15d}" => { rendering: 'N', type: 'c', emoji: false },
317
+ "\u{1f15e}" => { rendering: 'O', type: 'c', emoji: false },
318
+ "\u{1f15f}" => { rendering: 'P', type: 'c', emoji: false },
319
+ "\u{1f160}" => { rendering: 'Q', type: 'c', emoji: false },
320
+ "\u{1f161}" => { rendering: 'R', type: 'c', emoji: false },
321
+ "\u{1f162}" => { rendering: 'S', type: 'c', emoji: false },
322
+ "\u{1f163}" => { rendering: 'T', type: 'c', emoji: false },
323
+ "\u{1f164}" => { rendering: 'U', type: 'c', emoji: false },
324
+ "\u{1f165}" => { rendering: 'V', type: 'c', emoji: false },
325
+ "\u{1f166}" => { rendering: 'W', type: 'c', emoji: false },
326
+ "\u{1f167}" => { rendering: 'X', type: 'c', emoji: false },
327
+ "\u{1f168}" => { rendering: 'Y', type: 'c', emoji: false },
328
+ "\u{1f169}" => { rendering: 'Z', type: 'c', emoji: false },
329
+ "\u{1f170}" => { rendering: 'A', type: 's', emoji: false },
330
+ "\u{1f171}" => { rendering: 'B', type: 's', emoji: false },
331
+ "\u{1f172}" => { rendering: 'C', type: 's', emoji: false },
332
+ "\u{1f173}" => { rendering: 'D', type: 's', emoji: false },
333
+ "\u{1f174}" => { rendering: 'E', type: 's', emoji: false },
334
+ "\u{1f175}" => { rendering: 'F', type: 's', emoji: false },
335
+ "\u{1f176}" => { rendering: 'G', type: 's', emoji: false },
336
+ "\u{1f177}" => { rendering: 'H', type: 's', emoji: false },
337
+ "\u{1f178}" => { rendering: 'I', type: 's', emoji: false },
338
+ "\u{1f179}" => { rendering: 'J', type: 's', emoji: false },
339
+ "\u{1f17a}" => { rendering: 'K', type: 's', emoji: false },
340
+ "\u{1f17b}" => { rendering: 'L', type: 's', emoji: false },
341
+ "\u{1f17c}" => { rendering: 'M', type: 's', emoji: false },
342
+ "\u{1f17d}" => { rendering: 'N', type: 's', emoji: false },
343
+ "\u{1f17e}" => { rendering: 'O', type: 's', emoji: false },
344
+ "\u{1f17f}" => { rendering: 'P', type: 's', emoji: false },
345
+ "\u{1f180}" => { rendering: 'Q', type: 's', emoji: false },
346
+ "\u{1f181}" => { rendering: 'R', type: 's', emoji: false },
347
+ "\u{1f182}" => { rendering: 'S', type: 's', emoji: false },
348
+ "\u{1f183}" => { rendering: 'T', type: 's', emoji: false },
349
+ "\u{1f184}" => { rendering: 'U', type: 's', emoji: false },
350
+ "\u{1f185}" => { rendering: 'V', type: 's', emoji: false },
351
+ "\u{1f186}" => { rendering: 'W', type: 's', emoji: false },
352
+ "\u{1f187}" => { rendering: 'X', type: 's', emoji: false },
353
+ "\u{1f188}" => { rendering: 'Y', type: 's', emoji: false },
354
+ "\u{1f189}" => { rendering: 'Z', type: 's', emoji: false },
355
+ "\u{1f18b}" => { rendering: 'IC', type: 's', emoji: false },
356
+ "\u{1f18c}" => { rendering: 'PA', type: 's', emoji: false },
357
+ "\u{1f18d}" => { rendering: 'SA', type: 's', emoji: false },
358
+ "\u{1f18e}" => { rendering: 'AB', type: 's', emoji: true },
359
+ "\u{1f18f}" => { rendering: 'WC', type: 's', emoji: false },
360
+ "\u{1f190}" => { rendering: 'DJ', type: 's', emoji: false },
361
+ "\u{1f191}" => { rendering: 'CL', type: 's', emoji: true },
362
+ "\u{1f192}" => { rendering: 'COOL', type: 's', emoji: true },
363
+ "\u{1f193}" => { rendering: 'FREE', type: 's', emoji: true },
364
+ "\u{1f194}" => { rendering: 'ID', type: 's', emoji: true },
365
+ "\u{1f195}" => { rendering: 'NEW', type: 's', emoji: true },
366
+ "\u{1f196}" => { rendering: 'NG', type: 's', emoji: true },
367
+ "\u{1f197}" => { rendering: 'OK', type: 's', emoji: true },
368
+ "\u{1f198}" => { rendering: 'SOS', type: 's', emoji: true },
369
+ "\u{1f199}" => { rendering: 'UP!', type: 's', emoji: true },
370
+ "\u{1f19a}" => { rendering: 'VS', type: 's', emoji: true },
371
+ "\u{1f19b}" => { rendering: '3D', type: 's', emoji: false },
372
+ "\u{1f19c}" => { rendering: '2ndScr', type: 's', emoji: false },
373
+ "\u{1f19d}" => { rendering: '2K', type: 's', emoji: false },
374
+ "\u{1f19e}" => { rendering: '4K', type: 's', emoji: false },
375
+ "\u{1f19f}" => { rendering: '8K', type: 's', emoji: false },
376
+ "\u{1f1a0}" => { rendering: '5.1', type: 's', emoji: false },
377
+ "\u{1f1a1}" => { rendering: '7.1', type: 's', emoji: false },
378
+ "\u{1f1a2}" => { rendering: '22.2', type: 's', emoji: false },
379
+ "\u{1f1a3}" => { rendering: '60P', type: 's', emoji: false },
380
+ "\u{1f1a4}" => { rendering: '120P', type: 's', emoji: false },
381
+ "\u{1f1a5}" => { rendering: 'd', type: 's', emoji: false },
382
+ "\u{1f1a6}" => { rendering: 'HC', type: 's', emoji: false },
383
+ "\u{1f1a7}" => { rendering: 'HDR', type: 's', emoji: false },
384
+ "\u{1f1a8}" => { rendering: 'Hi-Res', type: 's', emoji: false },
385
+ "\u{1f1a9}" => { rendering: 'Lossless', type: 's', emoji: false },
386
+ "\u{1f1aa}" => { rendering: 'SHV', type: 's', emoji: false },
387
+ "\u{1f1ab}" => { rendering: 'UHD', type: 's', emoji: false },
388
+ "\u{1f1ac}" => { rendering: 'VOD', type: 's', emoji: false },
389
+ "\u{1f1ad}" => { rendering: 'VOD', type: 's', emoji: false },
390
+ "\u{1f1e6}" => { rendering: 'A', type: 's', emoji: false },
391
+ "\u{1f1e7}" => { rendering: 'B', type: 's', emoji: false },
392
+ "\u{1f1e8}" => { rendering: 'C', type: 's', emoji: false },
393
+ "\u{1f1e9}" => { rendering: 'D', type: 's', emoji: false },
394
+ "\u{1f1ea}" => { rendering: 'E', type: 's', emoji: false },
395
+ "\u{1f1eb}" => { rendering: 'F', type: 's', emoji: false },
396
+ "\u{1f1ec}" => { rendering: 'G', type: 's', emoji: false },
397
+ "\u{1f1ed}" => { rendering: 'H', type: 's', emoji: false },
398
+ "\u{1f1ee}" => { rendering: 'I', type: 's', emoji: false },
399
+ "\u{1f1ef}" => { rendering: 'J', type: 's', emoji: false },
400
+ "\u{1f1f0}" => { rendering: 'K', type: 's', emoji: false },
401
+ "\u{1f1f1}" => { rendering: 'L', type: 's', emoji: false },
402
+ "\u{1f1f2}" => { rendering: 'M', type: 's', emoji: false },
403
+ "\u{1f1f3}" => { rendering: 'N', type: 's', emoji: false },
404
+ "\u{1f1f4}" => { rendering: 'O', type: 's', emoji: false },
405
+ "\u{1f1f5}" => { rendering: 'P', type: 's', emoji: false },
406
+ "\u{1f1f6}" => { rendering: 'Q', type: 's', emoji: false },
407
+ "\u{1f1f7}" => { rendering: 'R', type: 's', emoji: false },
408
+ "\u{1f1f8}" => { rendering: 'S', type: 's', emoji: false },
409
+ "\u{1f1f9}" => { rendering: 'T', type: 's', emoji: false },
410
+ "\u{1f1fa}" => { rendering: 'U', type: 's', emoji: false },
411
+ "\u{1f1fb}" => { rendering: 'V', type: 's', emoji: false },
412
+ "\u{1f1fc}" => { rendering: 'W', type: 's', emoji: false },
413
+ "\u{1f1fd}" => { rendering: 'X', type: 's', emoji: false },
414
+ "\u{1f1fe}" => { rendering: 'Y', type: 's', emoji: false },
415
+ "\u{1f1ff}" => { rendering: 'Z', type: 's', emoji: false },
416
+ "\u{1f6be}" => { rendering: 'WC', type: 's', emoji: true },
417
+ "\u{1f200}" => { rendering: "\u{307b}\u{304b}", type: 's', emoji: false },
418
+ "\u{1f201}" => { rendering: "\u{30b3}\u{30b3}", type: 's', emoji: true },
419
+ "\u{1f202}" => { rendering: "\u{30b5}", type: 's', emoji: false },
420
+ "\u{1f210}" => { rendering: "\u{624b}", type: 's', emoji: false },
421
+ "\u{1f211}" => { rendering: "\u{5b57}", type: 's', emoji: false },
422
+ "\u{1f212}" => { rendering: "\u{53cc}", type: 's', emoji: false },
423
+ "\u{1f213}" => { rendering: "\u{30c7}", type: 's', emoji: false },
424
+ "\u{1f214}" => { rendering: "\u{4e8c}", type: 's', emoji: false },
425
+ "\u{1f215}" => { rendering: "\u{591a}", type: 's', emoji: false },
426
+ "\u{1f216}" => { rendering: "\u{89e3}", type: 's', emoji: false },
427
+ "\u{1f217}" => { rendering: "\u{5929}", type: 's', emoji: false },
428
+ "\u{1f218}" => { rendering: "\u{4ea4}", type: 's', emoji: false },
429
+ "\u{1f219}" => { rendering: "\u{6620}", type: 's', emoji: false },
430
+ "\u{1f21a}" => { rendering: "\u{7121}", type: 's', emoji: true },
431
+ "\u{1f21b}" => { rendering: "\u{6599}", type: 's', emoji: false },
432
+ "\u{1f21c}" => { rendering: "\u{524d}", type: 's', emoji: false },
433
+ "\u{1f21d}" => { rendering: "\u{5f8c}", type: 's', emoji: false },
434
+ "\u{1f21e}" => { rendering: "\u{518d}", type: 's', emoji: false },
435
+ "\u{1f21f}" => { rendering: "\u{65b0}", type: 's', emoji: false },
436
+ "\u{1f220}" => { rendering: "\u{521d}", type: 's', emoji: false },
437
+ "\u{1f221}" => { rendering: "\u{7d42}", type: 's', emoji: false },
438
+ "\u{1f222}" => { rendering: "\u{751f}", type: 's', emoji: false },
439
+ "\u{1f223}" => { rendering: "\u{8ca9}", type: 's', emoji: false },
440
+ "\u{1f224}" => { rendering: "\u{58f0}", type: 's', emoji: false },
441
+ "\u{1f225}" => { rendering: "\u{5439}", type: 's', emoji: false },
442
+ "\u{1f226}" => { rendering: "\u{6f14}", type: 's', emoji: false },
443
+ "\u{1f227}" => { rendering: "\u{6295}", type: 's', emoji: false },
444
+ "\u{1f228}" => { rendering: "\u{6355}", type: 's', emoji: false },
445
+ "\u{1f229}" => { rendering: "\u{4e00}", type: 's', emoji: false },
446
+ "\u{1f22a}" => { rendering: "\u{4e09}", type: 's', emoji: false },
447
+ "\u{1f22b}" => { rendering: "\u{904a}", type: 's', emoji: false },
448
+ "\u{1f22c}" => { rendering: "\u{5de6}", type: 's', emoji: false },
449
+ "\u{1f22d}" => { rendering: "\u{4e2d}", type: 's', emoji: false },
450
+ "\u{1f22e}" => { rendering: "\u{53f3}", type: 's', emoji: false },
451
+ "\u{1f22f}" => { rendering: "\u{6307}", type: 's', emoji: true },
452
+ "\u{1f230}" => { rendering: "\u{8d70}", type: 's', emoji: false },
453
+ "\u{1f231}" => { rendering: "\u{6253}", type: 's', emoji: false },
454
+ "\u{1f232}" => { rendering: "\u{7981}", type: 's', emoji: true },
455
+ "\u{1f233}" => { rendering: "\u{7a7a}", type: 's', emoji: true },
456
+ "\u{1f234}" => { rendering: "\u{5408}", type: 's', emoji: true },
457
+ "\u{1f235}" => { rendering: "\u{6e80}", type: 's', emoji: true },
458
+ "\u{1f236}" => { rendering: "\u{6709}", type: 's', emoji: true },
459
+ "\u{1f237}" => { rendering: "\u{6708}", type: 's', emoji: false },
460
+ "\u{1f238}" => { rendering: "\u{7533}", type: 's', emoji: true },
461
+ "\u{1f239}" => { rendering: "\u{5272}", type: 's', emoji: true },
462
+ "\u{1f23a}" => { rendering: "\u{55b6}", type: 's', emoji: true },
463
+ "\u{1f23b}" => { rendering: "\u{914d}", type: 's', emoji: false },
464
+ "\u{1f250}" => { rendering: "\u{5f97}", type: 'c', emoji: true },
465
+ "\u{1f251}" => { rendering: "\u{53ef}", type: 'c', emoji: true }
466
+ }.freeze
467
+ end
468
+ end
469
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'combined_data'
4
+
5
+ module Yosina
6
+ module Transliterators
7
+ # Replace each combined character with its corresponding individual characters
8
+ module Combined
9
+ # Transliterator for combined characters
10
+ class Transliterator < Yosina::BaseTransliterator
11
+ # Initialize the transliterator with options
12
+ #
13
+ # @param _options [Hash] Configuration options (currently unused)
14
+ def initialize(_options = {})
15
+ # Options currently unused for combined transliterator
16
+ super()
17
+ end
18
+
19
+ # Replace each combined character with its corresponding individual characters
20
+ #
21
+ # @param input_chars [Enumerable<Char>] The characters to transliterate
22
+ # @return [Enumerable<Char>] The transliterated characters
23
+ def call(input_chars)
24
+ offset = 0
25
+
26
+ Chars.enum do |y|
27
+ input_chars.each do |char|
28
+ replacement_array = COMBINED_MAPPINGS[char.c]
29
+ if replacement_array
30
+ replacement_array.each do |replacement_char|
31
+ y << Char.new(c: replacement_char, offset: offset, source: char)
32
+ offset += replacement_char.length
33
+ end
34
+ else
35
+ y << Char.new(c: char.c, offset: offset, source: char.source)
36
+ offset += char.c.length
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+
43
+ # Factory method to create a combined transliterator
44
+ #
45
+ # @param _options [Hash] Configuration options
46
+ # @return [Transliterator] A new combined transliterator instance
47
+ def self.call(_options = {})
48
+ Transliterator.new
49
+ end
50
+ end
51
+ end
52
+ end