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:15 +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 

4 

5# This work is licensed under the MIT License. 

6# To view a copy of this license, visit https://opensource.org/licenses/MIT 

7 

8# Written by Abdullah Diab (mpcabd) 

9# Email: mpcabd@gmail.com 

10# Website: http://mpcabd.xyz 

11 

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. 

26 

27UNSHAPED = 255 

28ISOLATED = 0 

29INITIAL = 1 

30MEDIAL = 2 

31FINAL = 3 

32 

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'), 

190 

191 # ZWJ 

192 ZWJ: (ZWJ, ZWJ, ZWJ, ZWJ), 

193} 

194 

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} 

519 

520 

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] 

526 

527 

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] 

533 

534 

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]