Coverage for adhoc-cicd-odoo-odoo / odoo / tools / arabic_reshaper / letters.py: 42%
25 statements
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-09 18:05 +0000
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-09 18:05 +0000
1# The following code was copied from the original author's repository
2# at https://github.com/mpcabd/python-arabic-reshaper/tree/v3.0.0/arabic_reshaper
3# Version: 3.0.0
5# This work is licensed under the MIT License.
6# To view a copy of this license, visit https://opensource.org/licenses/MIT
8# Written by Abdullah Diab (mpcabd)
9# Email: mpcabd@gmail.com
10# Website: http://mpcabd.xyz
12# Each letter is of the format:
13#
14# ('<letter>', <replacement>)
15#
16# And replacement is of the format:
17#
18# ('<isolated>', '<initial>', '<medial>', '<final>')
19#
20# Where <letter> is the string to replace, and <isolated> is the replacement in
21# case <letter> should be in isolated form, <initial> is the replacement in
22# case <letter> should be in initial form, <medial> is the replacement in case
23# <letter> should be in medial form, and <final> is the replacement in case
24# <letter> should be in final form. If no replacement is specified for a form,
25# then no that means the letter doesn't support this form.
27UNSHAPED = 255
28ISOLATED = 0
29INITIAL = 1
30MEDIAL = 2
31FINAL = 3
33TATWEEL = '\u0640'
34ZWJ = '\u200D'
35LETTERS_ARABIC = {
36 # ARABIC LETTER HAMZA
37 '\u0621': ('\uFE80', '', '', ''),
38 # ARABIC LETTER ALEF WITH MADDA ABOVE
39 '\u0622': ('\uFE81', '', '', '\uFE82'),
40 # ARABIC LETTER ALEF WITH HAMZA ABOVE
41 '\u0623': ('\uFE83', '', '', '\uFE84'),
42 # ARABIC LETTER WAW WITH HAMZA ABOVE
43 '\u0624': ('\uFE85', '', '', '\uFE86'),
44 # ARABIC LETTER ALEF WITH HAMZA BELOW
45 '\u0625': ('\uFE87', '', '', '\uFE88'),
46 # ARABIC LETTER YEH WITH HAMZA ABOVE
47 '\u0626': ('\uFE89', '\uFE8B', '\uFE8C', '\uFE8A'),
48 # ARABIC LETTER ALEF
49 '\u0627': ('\uFE8D', '', '', '\uFE8E'),
50 # ARABIC LETTER BEH
51 '\u0628': ('\uFE8F', '\uFE91', '\uFE92', '\uFE90'),
52 # ARABIC LETTER TEH MARBUTA
53 '\u0629': ('\uFE93', '', '', '\uFE94'),
54 # ARABIC LETTER TEH
55 '\u062A': ('\uFE95', '\uFE97', '\uFE98', '\uFE96'),
56 # ARABIC LETTER THEH
57 '\u062B': ('\uFE99', '\uFE9B', '\uFE9C', '\uFE9A'),
58 # ARABIC LETTER JEEM
59 '\u062C': ('\uFE9D', '\uFE9F', '\uFEA0', '\uFE9E'),
60 # ARABIC LETTER HAH
61 '\u062D': ('\uFEA1', '\uFEA3', '\uFEA4', '\uFEA2'),
62 # ARABIC LETTER KHAH
63 '\u062E': ('\uFEA5', '\uFEA7', '\uFEA8', '\uFEA6'),
64 # ARABIC LETTER DAL
65 '\u062F': ('\uFEA9', '', '', '\uFEAA'),
66 # ARABIC LETTER THAL
67 '\u0630': ('\uFEAB', '', '', '\uFEAC'),
68 # ARABIC LETTER REH
69 '\u0631': ('\uFEAD', '', '', '\uFEAE'),
70 # ARABIC LETTER ZAIN
71 '\u0632': ('\uFEAF', '', '', '\uFEB0'),
72 # ARABIC LETTER SEEN
73 '\u0633': ('\uFEB1', '\uFEB3', '\uFEB4', '\uFEB2'),
74 # ARABIC LETTER SHEEN
75 '\u0634': ('\uFEB5', '\uFEB7', '\uFEB8', '\uFEB6'),
76 # ARABIC LETTER SAD
77 '\u0635': ('\uFEB9', '\uFEBB', '\uFEBC', '\uFEBA'),
78 # ARABIC LETTER DAD
79 '\u0636': ('\uFEBD', '\uFEBF', '\uFEC0', '\uFEBE'),
80 # ARABIC LETTER TAH
81 '\u0637': ('\uFEC1', '\uFEC3', '\uFEC4', '\uFEC2'),
82 # ARABIC LETTER ZAH
83 '\u0638': ('\uFEC5', '\uFEC7', '\uFEC8', '\uFEC6'),
84 # ARABIC LETTER AIN
85 '\u0639': ('\uFEC9', '\uFECB', '\uFECC', '\uFECA'),
86 # ARABIC LETTER GHAIN
87 '\u063A': ('\uFECD', '\uFECF', '\uFED0', '\uFECE'),
88 # ARABIC TATWEEL
89 TATWEEL: (TATWEEL, TATWEEL, TATWEEL, TATWEEL),
90 # ARABIC LETTER FEH
91 '\u0641': ('\uFED1', '\uFED3', '\uFED4', '\uFED2'),
92 # ARABIC LETTER QAF
93 '\u0642': ('\uFED5', '\uFED7', '\uFED8', '\uFED6'),
94 # ARABIC LETTER KAF
95 '\u0643': ('\uFED9', '\uFEDB', '\uFEDC', '\uFEDA'),
96 # ARABIC LETTER LAM
97 '\u0644': ('\uFEDD', '\uFEDF', '\uFEE0', '\uFEDE'),
98 # ARABIC LETTER MEEM
99 '\u0645': ('\uFEE1', '\uFEE3', '\uFEE4', '\uFEE2'),
100 # ARABIC LETTER NOON
101 '\u0646': ('\uFEE5', '\uFEE7', '\uFEE8', '\uFEE6'),
102 # ARABIC LETTER HEH
103 '\u0647': ('\uFEE9', '\uFEEB', '\uFEEC', '\uFEEA'),
104 # ARABIC LETTER WAW
105 '\u0648': ('\uFEED', '', '', '\uFEEE'),
106 # ARABIC LETTER (UIGHUR KAZAKH KIRGHIZ)? ALEF MAKSURA
107 '\u0649': ('\uFEEF', '\uFBE8', '\uFBE9', '\uFEF0'),
108 # ARABIC LETTER YEH
109 '\u064A': ('\uFEF1', '\uFEF3', '\uFEF4', '\uFEF2'),
110 # ARABIC LETTER ALEF WASLA
111 '\u0671': ('\uFB50', '', '', '\uFB51'),
112 # ARABIC LETTER U WITH HAMZA ABOVE
113 '\u0677': ('\uFBDD', '', '', ''),
114 # ARABIC LETTER TTEH
115 '\u0679': ('\uFB66', '\uFB68', '\uFB69', '\uFB67'),
116 # ARABIC LETTER TTEHEH
117 '\u067A': ('\uFB5E', '\uFB60', '\uFB61', '\uFB5F'),
118 # ARABIC LETTER BEEH
119 '\u067B': ('\uFB52', '\uFB54', '\uFB55', '\uFB53'),
120 # ARABIC LETTER PEH
121 '\u067E': ('\uFB56', '\uFB58', '\uFB59', '\uFB57'),
122 # ARABIC LETTER TEHEH
123 '\u067F': ('\uFB62', '\uFB64', '\uFB65', '\uFB63'),
124 # ARABIC LETTER BEHEH
125 '\u0680': ('\uFB5A', '\uFB5C', '\uFB5D', '\uFB5B'),
126 # ARABIC LETTER NYEH
127 '\u0683': ('\uFB76', '\uFB78', '\uFB79', '\uFB77'),
128 # ARABIC LETTER DYEH
129 '\u0684': ('\uFB72', '\uFB74', '\uFB75', '\uFB73'),
130 # ARABIC LETTER TCHEH
131 '\u0686': ('\uFB7A', '\uFB7C', '\uFB7D', '\uFB7B'),
132 # ARABIC LETTER TCHEHEH
133 '\u0687': ('\uFB7E', '\uFB80', '\uFB81', '\uFB7F'),
134 # ARABIC LETTER DDAL
135 '\u0688': ('\uFB88', '', '', '\uFB89'),
136 # ARABIC LETTER DAHAL
137 '\u068C': ('\uFB84', '', '', '\uFB85'),
138 # ARABIC LETTER DDAHAL
139 '\u068D': ('\uFB82', '', '', '\uFB83'),
140 # ARABIC LETTER DUL
141 '\u068E': ('\uFB86', '', '', '\uFB87'),
142 # ARABIC LETTER RREH
143 '\u0691': ('\uFB8C', '', '', '\uFB8D'),
144 # ARABIC LETTER JEH
145 '\u0698': ('\uFB8A', '', '', '\uFB8B'),
146 # ARABIC LETTER VEH
147 '\u06A4': ('\uFB6A', '\uFB6C', '\uFB6D', '\uFB6B'),
148 # ARABIC LETTER PEHEH
149 '\u06A6': ('\uFB6E', '\uFB70', '\uFB71', '\uFB6F'),
150 # ARABIC LETTER KEHEH
151 '\u06A9': ('\uFB8E', '\uFB90', '\uFB91', '\uFB8F'),
152 # ARABIC LETTER NG
153 '\u06AD': ('\uFBD3', '\uFBD5', '\uFBD6', '\uFBD4'),
154 # ARABIC LETTER GAF
155 '\u06AF': ('\uFB92', '\uFB94', '\uFB95', '\uFB93'),
156 # ARABIC LETTER NGOEH
157 '\u06B1': ('\uFB9A', '\uFB9C', '\uFB9D', '\uFB9B'),
158 # ARABIC LETTER GUEH
159 '\u06B3': ('\uFB96', '\uFB98', '\uFB99', '\uFB97'),
160 # ARABIC LETTER NOON GHUNNA
161 '\u06BA': ('\uFB9E', '', '', '\uFB9F'),
162 # ARABIC LETTER RNOON
163 '\u06BB': ('\uFBA0', '\uFBA2', '\uFBA3', '\uFBA1'),
164 # ARABIC LETTER HEH DOACHASHMEE
165 '\u06BE': ('\uFBAA', '\uFBAC', '\uFBAD', '\uFBAB'),
166 # ARABIC LETTER HEH WITH YEH ABOVE
167 '\u06C0': ('\uFBA4', '', '', '\uFBA5'),
168 # ARABIC LETTER HEH GOAL
169 '\u06C1': ('\uFBA6', '\uFBA8', '\uFBA9', '\uFBA7'),
170 # ARABIC LETTER KIRGHIZ OE
171 '\u06C5': ('\uFBE0', '', '', '\uFBE1'),
172 # ARABIC LETTER OE
173 '\u06C6': ('\uFBD9', '', '', '\uFBDA'),
174 # ARABIC LETTER U
175 '\u06C7': ('\uFBD7', '', '', '\uFBD8'),
176 # ARABIC LETTER YU
177 '\u06C8': ('\uFBDB', '', '', '\uFBDC'),
178 # ARABIC LETTER KIRGHIZ YU
179 '\u06C9': ('\uFBE2', '', '', '\uFBE3'),
180 # ARABIC LETTER VE
181 '\u06CB': ('\uFBDE', '', '', '\uFBDF'),
182 # ARABIC LETTER FARSI YEH
183 '\u06CC': ('\uFBFC', '\uFBFE', '\uFBFF', '\uFBFD'),
184 # ARABIC LETTER E
185 '\u06D0': ('\uFBE4', '\uFBE6', '\uFBE7', '\uFBE5'),
186 # ARABIC LETTER YEH BARREE
187 '\u06D2': ('\uFBAE', '', '', '\uFBAF'),
188 # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
189 '\u06D3': ('\uFBB0', '', '', '\uFBB1'),
191 # ZWJ
192 ZWJ: (ZWJ, ZWJ, ZWJ, ZWJ),
193}
195LETTERS_ARABIC_V2 = {
196 # ARABIC LETTER HAMZA
197 '\u0621': ('\uFE80', '', '', ''),
198 # ARABIC LETTER ALEF WITH MADDA ABOVE
199 '\u0622': ('\u0622', '', '', '\uFE82'),
200 # ARABIC LETTER ALEF WITH HAMZA ABOVE
201 '\u0623': ('\u0623', '', '', '\uFE84'),
202 # ARABIC LETTER WAW WITH HAMZA ABOVE
203 '\u0624': ('\u0624', '', '', '\uFE86'),
204 # ARABIC LETTER ALEF WITH HAMZA BELOW
205 '\u0625': ('\u0625', '', '', '\uFE88'),
206 # ARABIC LETTER YEH WITH HAMZA ABOVE
207 '\u0626': ('\u0626', '\uFE8B', '\uFE8C', '\uFE8A'),
208 # ARABIC LETTER ALEF
209 '\u0627': ('\u0627', '', '', '\uFE8E'),
210 # ARABIC LETTER BEH
211 '\u0628': ('\u0628', '\uFE91', '\uFE92', '\uFE90'),
212 # ARABIC LETTER TEH MARBUTA
213 '\u0629': ('\u0629', '', '', '\uFE94'),
214 # ARABIC LETTER TEH
215 '\u062A': ('\u062A', '\uFE97', '\uFE98', '\uFE96'),
216 # ARABIC LETTER THEH
217 '\u062B': ('\u062B', '\uFE9B', '\uFE9C', '\uFE9A'),
218 # ARABIC LETTER JEEM
219 '\u062C': ('\u062C', '\uFE9F', '\uFEA0', '\uFE9E'),
220 # ARABIC LETTER HAH
221 '\u062D': ('\uFEA1', '\uFEA3', '\uFEA4', '\uFEA2'),
222 # ARABIC LETTER KHAH
223 '\u062E': ('\u062E', '\uFEA7', '\uFEA8', '\uFEA6'),
224 # ARABIC LETTER DAL
225 '\u062F': ('\u062F', '', '', '\uFEAA'),
226 # ARABIC LETTER THAL
227 '\u0630': ('\u0630', '', '', '\uFEAC'),
228 # ARABIC LETTER REH
229 '\u0631': ('\u0631', '', '', '\uFEAE'),
230 # ARABIC LETTER ZAIN
231 '\u0632': ('\u0632', '', '', '\uFEB0'),
232 # ARABIC LETTER SEEN
233 '\u0633': ('\u0633', '\uFEB3', '\uFEB4', '\uFEB2'),
234 # ARABIC LETTER SHEEN
235 '\u0634': ('\u0634', '\uFEB7', '\uFEB8', '\uFEB6'),
236 # ARABIC LETTER SAD
237 '\u0635': ('\u0635', '\uFEBB', '\uFEBC', '\uFEBA'),
238 # ARABIC LETTER DAD
239 '\u0636': ('\u0636', '\uFEBF', '\uFEC0', '\uFEBE'),
240 # ARABIC LETTER TAH
241 '\u0637': ('\u0637', '\uFEC3', '\uFEC4', '\uFEC2'),
242 # ARABIC LETTER ZAH
243 '\u0638': ('\u0638', '\uFEC7', '\uFEC8', '\uFEC6'),
244 # ARABIC LETTER AIN
245 '\u0639': ('\u0639', '\uFECB', '\uFECC', '\uFECA'),
246 # ARABIC LETTER GHAIN
247 '\u063A': ('\u063A', '\uFECF', '\uFED0', '\uFECE'),
248 # ARABIC TATWEEL
249 TATWEEL: (TATWEEL, TATWEEL, TATWEEL, TATWEEL),
250 # ARABIC LETTER FEH
251 '\u0641': ('\u0641', '\uFED3', '\uFED4', '\uFED2'),
252 # ARABIC LETTER QAF
253 '\u0642': ('\u0642', '\uFED7', '\uFED8', '\uFED6'),
254 # ARABIC LETTER KAF
255 '\u0643': ('\u0643', '\uFEDB', '\uFEDC', '\uFEDA'),
256 # ARABIC LETTER LAM
257 '\u0644': ('\u0644', '\uFEDF', '\uFEE0', '\uFEDE'),
258 # ARABIC LETTER MEEM
259 '\u0645': ('\u0645', '\uFEE3', '\uFEE4', '\uFEE2'),
260 # ARABIC LETTER NOON
261 '\u0646': ('\u0646', '\uFEE7', '\uFEE8', '\uFEE6'),
262 # ARABIC LETTER HEH
263 '\u0647': ('\u0647', '\uFEEB', '\uFEEC', '\uFEEA'),
264 # ARABIC LETTER WAW
265 '\u0648': ('\u0648', '', '', '\uFEEE'),
266 # ARABIC LETTER (UIGHUR KAZAKH KIRGHIZ)? ALEF MAKSURA
267 '\u0649': ('\u0649', '\uFBE8', '\uFBE9', '\uFEF0'),
268 # ARABIC LETTER YEH
269 '\u064A': ('\u064A', '\uFEF3', '\uFEF4', '\uFEF2'),
270 # ARABIC LETTER ALEF WASLA
271 '\u0671': ('\u0671', '', '', '\uFB51'),
272 # ARABIC LETTER U WITH HAMZA ABOVE
273 '\u0677': ('\u0677', '', '', ''),
274 # ARABIC LETTER TTEH
275 '\u0679': ('\u0679', '\uFB68', '\uFB69', '\uFB67'),
276 # ARABIC LETTER TTEHEH
277 '\u067A': ('\u067A', '\uFB60', '\uFB61', '\uFB5F'),
278 # ARABIC LETTER BEEH
279 '\u067B': ('\u067B', '\uFB54', '\uFB55', '\uFB53'),
280 # ARABIC LETTER PEH
281 '\u067E': ('\u067E', '\uFB58', '\uFB59', '\uFB57'),
282 # ARABIC LETTER TEHEH
283 '\u067F': ('\u067F', '\uFB64', '\uFB65', '\uFB63'),
284 # ARABIC LETTER BEHEH
285 '\u0680': ('\u0680', '\uFB5C', '\uFB5D', '\uFB5B'),
286 # ARABIC LETTER NYEH
287 '\u0683': ('\u0683', '\uFB78', '\uFB79', '\uFB77'),
288 # ARABIC LETTER DYEH
289 '\u0684': ('\u0684', '\uFB74', '\uFB75', '\uFB73'),
290 # ARABIC LETTER TCHEH
291 '\u0686': ('\u0686', '\uFB7C', '\uFB7D', '\uFB7B'),
292 # ARABIC LETTER TCHEHEH
293 '\u0687': ('\u0687', '\uFB80', '\uFB81', '\uFB7F'),
294 # ARABIC LETTER DDAL
295 '\u0688': ('\u0688', '', '', '\uFB89'),
296 # ARABIC LETTER DAHAL
297 '\u068C': ('\u068C', '', '', '\uFB85'),
298 # ARABIC LETTER DDAHAL
299 '\u068D': ('\u068D', '', '', '\uFB83'),
300 # ARABIC LETTER DUL
301 '\u068E': ('\u068E', '', '', '\uFB87'),
302 # ARABIC LETTER RREH
303 '\u0691': ('\u0691', '', '', '\uFB8D'),
304 # ARABIC LETTER JEH
305 '\u0698': ('\u0698', '', '', '\uFB8B'),
306 # ARABIC LETTER VEH
307 '\u06A4': ('\u06A4', '\uFB6C', '\uFB6D', '\uFB6B'),
308 # ARABIC LETTER PEHEH
309 '\u06A6': ('\u06A6', '\uFB70', '\uFB71', '\uFB6F'),
310 # ARABIC LETTER KEHEH
311 '\u06A9': ('\u06A9', '\uFB90', '\uFB91', '\uFB8F'),
312 # ARABIC LETTER NG
313 '\u06AD': ('\u06AD', '\uFBD5', '\uFBD6', '\uFBD4'),
314 # ARABIC LETTER GAF
315 '\u06AF': ('\u06AF', '\uFB94', '\uFB95', '\uFB93'),
316 # ARABIC LETTER NGOEH
317 '\u06B1': ('\u06B1', '\uFB9C', '\uFB9D', '\uFB9B'),
318 # ARABIC LETTER GUEH
319 '\u06B3': ('\u06B3', '\uFB98', '\uFB99', '\uFB97'),
320 # ARABIC LETTER NOON GHUNNA
321 '\u06BA': ('\u06BA', '', '', '\uFB9F'),
322 # ARABIC LETTER RNOON
323 '\u06BB': ('\u06BB', '\uFBA2', '\uFBA3', '\uFBA1'),
324 # ARABIC LETTER HEH DOACHASHMEE
325 '\u06BE': ('\u06BE', '\uFBAC', '\uFBAD', '\uFBAB'),
326 # ARABIC LETTER HEH WITH YEH ABOVE
327 '\u06C0': ('\u06C0', '', '', '\uFBA5'),
328 # ARABIC LETTER HEH GOAL
329 '\u06C1': ('\u06C1', '\uFBA8', '\uFBA9', '\uFBA7'),
330 # ARABIC LETTER KIRGHIZ OE
331 '\u06C5': ('\u06C5', '', '', '\uFBE1'),
332 # ARABIC LETTER OE
333 '\u06C6': ('\u06C6', '', '', '\uFBDA'),
334 # ARABIC LETTER U
335 '\u06C7': ('\u06C7', '', '', '\uFBD8'),
336 # ARABIC LETTER YU
337 '\u06C8': ('\u06C8', '', '', '\uFBDC'),
338 # ARABIC LETTER KIRGHIZ YU
339 '\u06C9': ('\u06C9', '', '', '\uFBE3'),
340 # ARABIC LETTER VE
341 '\u06CB': ('\u06CB', '', '', '\uFBDF'),
342 # ARABIC LETTER FARSI YEH
343 '\u06CC': ('\u06CC', '\uFBFE', '\uFBFF', '\uFBFD'),
344 # ARABIC LETTER E
345 '\u06D0': ('\u06D0', '\uFBE6', '\uFBE7', '\uFBE5'),
346 # ARABIC LETTER YEH BARREE
347 '\u06D2': ('\u06D2', '', '', '\uFBAF'),
348 # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
349 '\u06D3': ('\u06D3', '', '', '\uFBB1'),
350 # Kurdish letter YEAH
351 '\u06ce': ('\uE004', '\uE005', '\uE006', '\uE004'),
352 # Kurdish letter Hamza same as arabic Teh without the point
353 '\u06d5': ('\u06d5', '', '', '\uE000'),
354 # ZWJ
355 ZWJ: (ZWJ, ZWJ, ZWJ, ZWJ),
356}
357LETTERS_KURDISH = {
358 # ARABIC LETTER HAMZA
359 '\u0621': ('\uFE80', '', '', ''),
360 # ARABIC LETTER ALEF WITH MADDA ABOVE
361 '\u0622': ('\u0622', '', '', '\uFE82'),
362 # ARABIC LETTER ALEF WITH HAMZA ABOVE
363 '\u0623': ('\u0623', '', '', '\uFE84'),
364 # ARABIC LETTER WAW WITH HAMZA ABOVE
365 '\u0624': ('\u0624', '', '', '\uFE86'),
366 # ARABIC LETTER ALEF WITH HAMZA BELOW
367 '\u0625': ('\u0625', '', '', '\uFE88'),
368 # ARABIC LETTER YEH WITH HAMZA ABOVE
369 '\u0626': ('\u0626', '\uFE8B', '\uFE8C', '\uFE8A'),
370 # ARABIC LETTER ALEF
371 '\u0627': ('\u0627', '', '', '\uFE8E'),
372 # ARABIC LETTER BEH
373 '\u0628': ('\u0628', '\uFE91', '\uFE92', '\uFE90'),
374 # ARABIC LETTER TEH MARBUTA
375 '\u0629': ('\u0629', '', '', '\uFE94'),
376 # ARABIC LETTER TEH
377 '\u062A': ('\u062A', '\uFE97', '\uFE98', '\uFE96'),
378 # ARABIC LETTER THEH
379 '\u062B': ('\u062B', '\uFE9B', '\uFE9C', '\uFE9A'),
380 # ARABIC LETTER JEEM
381 '\u062C': ('\u062C', '\uFE9F', '\uFEA0', '\uFE9E'),
382 # ARABIC LETTER HAH
383 '\u062D': ('\uFEA1', '\uFEA3', '\uFEA4', '\uFEA2'),
384 # ARABIC LETTER KHAH
385 '\u062E': ('\u062E', '\uFEA7', '\uFEA8', '\uFEA6'),
386 # ARABIC LETTER DAL
387 '\u062F': ('\u062F', '', '', '\uFEAA'),
388 # ARABIC LETTER THAL
389 '\u0630': ('\u0630', '', '', '\uFEAC'),
390 # ARABIC LETTER REH
391 '\u0631': ('\u0631', '', '', '\uFEAE'),
392 # ARABIC LETTER ZAIN
393 '\u0632': ('\u0632', '', '', '\uFEB0'),
394 # ARABIC LETTER SEEN
395 '\u0633': ('\u0633', '\uFEB3', '\uFEB4', '\uFEB2'),
396 # ARABIC LETTER SHEEN
397 '\u0634': ('\u0634', '\uFEB7', '\uFEB8', '\uFEB6'),
398 # ARABIC LETTER SAD
399 '\u0635': ('\u0635', '\uFEBB', '\uFEBC', '\uFEBA'),
400 # ARABIC LETTER DAD
401 '\u0636': ('\u0636', '\uFEBF', '\uFEC0', '\uFEBE'),
402 # ARABIC LETTER TAH
403 '\u0637': ('\u0637', '\uFEC3', '\uFEC4', '\uFEC2'),
404 # ARABIC LETTER ZAH
405 '\u0638': ('\u0638', '\uFEC7', '\uFEC8', '\uFEC6'),
406 # ARABIC LETTER AIN
407 '\u0639': ('\u0639', '\uFECB', '\uFECC', '\uFECA'),
408 # ARABIC LETTER GHAIN
409 '\u063A': ('\u063A', '\uFECF', '\uFED0', '\uFECE'),
410 # ARABIC TATWEEL
411 TATWEEL: (TATWEEL, TATWEEL, TATWEEL, TATWEEL),
412 # ARABIC LETTER FEH
413 '\u0641': ('\u0641', '\uFED3', '\uFED4', '\uFED2'),
414 # ARABIC LETTER QAF
415 '\u0642': ('\u0642', '\uFED7', '\uFED8', '\uFED6'),
416 # ARABIC LETTER KAF
417 '\u0643': ('\u0643', '\uFEDB', '\uFEDC', '\uFEDA'),
418 # ARABIC LETTER LAM
419 '\u0644': ('\u0644', '\uFEDF', '\uFEE0', '\uFEDE'),
420 # ARABIC LETTER MEEM
421 '\u0645': ('\u0645', '\uFEE3', '\uFEE4', '\uFEE2'),
422 # ARABIC LETTER NOON
423 '\u0646': ('\u0646', '\uFEE7', '\uFEE8', '\uFEE6'),
424 # ARABIC LETTER HEH
425 '\u0647': ('\uFBAB', '\uFBAB', '\uFBAB', '\uFBAB'),
426 # ARABIC LETTER WAW
427 '\u0648': ('\u0648', '', '', '\uFEEE'),
428 # ARABIC LETTER (UIGHUR KAZAKH KIRGHIZ)? ALEF MAKSURA
429 '\u0649': ('\u0649', '\uFBE8', '\uFBE9', '\uFEF0'),
430 # ARABIC LETTER YEH
431 '\u064A': ('\u064A', '\uFEF3', '\uFEF4', '\uFEF2'),
432 # ARABIC LETTER ALEF WASLA
433 '\u0671': ('\u0671', '', '', '\uFB51'),
434 # ARABIC LETTER U WITH HAMZA ABOVE
435 '\u0677': ('\u0677', '', '', ''),
436 # ARABIC LETTER TTEH
437 '\u0679': ('\u0679', '\uFB68', '\uFB69', '\uFB67'),
438 # ARABIC LETTER TTEHEH
439 '\u067A': ('\u067A', '\uFB60', '\uFB61', '\uFB5F'),
440 # ARABIC LETTER BEEH
441 '\u067B': ('\u067B', '\uFB54', '\uFB55', '\uFB53'),
442 # ARABIC LETTER PEH
443 '\u067E': ('\u067E', '\uFB58', '\uFB59', '\uFB57'),
444 # ARABIC LETTER TEHEH
445 '\u067F': ('\u067F', '\uFB64', '\uFB65', '\uFB63'),
446 # ARABIC LETTER BEHEH
447 '\u0680': ('\u0680', '\uFB5C', '\uFB5D', '\uFB5B'),
448 # ARABIC LETTER NYEH
449 '\u0683': ('\u0683', '\uFB78', '\uFB79', '\uFB77'),
450 # ARABIC LETTER DYEH
451 '\u0684': ('\u0684', '\uFB74', '\uFB75', '\uFB73'),
452 # ARABIC LETTER TCHEH
453 '\u0686': ('\u0686', '\uFB7C', '\uFB7D', '\uFB7B'),
454 # ARABIC LETTER TCHEHEH
455 '\u0687': ('\u0687', '\uFB80', '\uFB81', '\uFB7F'),
456 # ARABIC LETTER DDAL
457 '\u0688': ('\u0688', '', '', '\uFB89'),
458 # ARABIC LETTER DAHAL
459 '\u068C': ('\u068C', '', '', '\uFB85'),
460 # ARABIC LETTER DDAHAL
461 '\u068D': ('\u068D', '', '', '\uFB83'),
462 # ARABIC LETTER DUL
463 '\u068E': ('\u068E', '', '', '\uFB87'),
464 # ARABIC LETTER RREH
465 '\u0691': ('\u0691', '', '', '\uFB8D'),
466 # ARABIC LETTER JEH
467 '\u0698': ('\u0698', '', '', '\uFB8B'),
468 # ARABIC LETTER VEH
469 '\u06A4': ('\u06A4', '\uFB6C', '\uFB6D', '\uFB6B'),
470 # ARABIC LETTER PEHEH
471 '\u06A6': ('\u06A6', '\uFB70', '\uFB71', '\uFB6F'),
472 # ARABIC LETTER KEHEH
473 '\u06A9': ('\u06A9', '\uFB90', '\uFB91', '\uFB8F'),
474 # ARABIC LETTER NG
475 '\u06AD': ('\u06AD', '\uFBD5', '\uFBD6', '\uFBD4'),
476 # ARABIC LETTER GAF
477 '\u06AF': ('\u06AF', '\uFB94', '\uFB95', '\uFB93'),
478 # ARABIC LETTER NGOEH
479 '\u06B1': ('\u06B1', '\uFB9C', '\uFB9D', '\uFB9B'),
480 # ARABIC LETTER GUEH
481 '\u06B3': ('\u06B3', '\uFB98', '\uFB99', '\uFB97'),
482 # ARABIC LETTER NOON GHUNNA
483 '\u06BA': ('\u06BA', '', '', '\uFB9F'),
484 # ARABIC LETTER RNOON
485 '\u06BB': ('\u06BB', '\uFBA2', '\uFBA3', '\uFBA1'),
486 # ARABIC LETTER HEH DOACHASHMEE
487 '\u06BE': ('\u06BE', '\uFBAC', '\uFBAD', '\uFBAB'),
488 # ARABIC LETTER HEH WITH YEH ABOVE
489 '\u06C0': ('\u06C0', '', '', '\uFBA5'),
490 # ARABIC LETTER HEH GOAL
491 '\u06C1': ('\u06C1', '\uFBA8', '\uFBA9', '\uFBA7'),
492 # ARABIC LETTER KIRGHIZ OE
493 '\u06C5': ('\u06C5', '', '', '\uFBE1'),
494 # ARABIC LETTER OE
495 '\u06C6': ('\u06C6', '', '', '\uFBDA'),
496 # ARABIC LETTER U
497 '\u06C7': ('\u06C7', '', '', '\uFBD8'),
498 # ARABIC LETTER YU
499 '\u06C8': ('\u06C8', '', '', '\uFBDC'),
500 # ARABIC LETTER KIRGHIZ YU
501 '\u06C9': ('\u06C9', '', '', '\uFBE3'),
502 # ARABIC LETTER VE
503 '\u06CB': ('\u06CB', '', '', '\uFBDF'),
504 # ARABIC LETTER FARSI YEH
505 '\u06CC': ('\u06CC', '\uFBFE', '\uFBFF', '\uFBFD'),
506 # ARABIC LETTER E
507 '\u06D0': ('\u06D0', '\uFBE6', '\uFBE7', '\uFBE5'),
508 # ARABIC LETTER YEH BARREE
509 '\u06D2': ('\u06D2', '', '', '\uFBAF'),
510 # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
511 '\u06D3': ('\u06D3', '', '', '\uFBB1'),
512 # Kurdish letter YEAH
513 '\u06ce': ('\uE004', '\uE005', '\uE006', '\uE004'),
514 # Kurdish letter Hamza same as arabic Teh without the point
515 '\u06d5': ('\u06d5', '', '', '\uE000'),
516 # ZWJ
517 ZWJ: (ZWJ, ZWJ, ZWJ, ZWJ),
518}
521def connects_with_letter_before(letter, LETTERS):
522 if letter not in LETTERS:
523 return False
524 forms = LETTERS[letter]
525 return forms[FINAL] or forms[MEDIAL]
528def connects_with_letter_after(letter, LETTERS):
529 if letter not in LETTERS:
530 return False
531 forms = LETTERS[letter]
532 return forms[INITIAL] or forms[MEDIAL]
535def connects_with_letters_before_and_after(letter, LETTERS):
536 if letter not in LETTERS:
537 return False
538 forms = LETTERS[letter]
539 return forms[MEDIAL]