fonttools 4.59.1__cp314-cp314t-musllinux_1_2_x86_64.whl

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.

Potentially problematic release.


This version of fonttools might be problematic. Click here for more details.

Files changed (346) hide show
  1. fontTools/__init__.py +8 -0
  2. fontTools/__main__.py +35 -0
  3. fontTools/afmLib.py +439 -0
  4. fontTools/agl.py +5233 -0
  5. fontTools/cffLib/CFF2ToCFF.py +233 -0
  6. fontTools/cffLib/CFFToCFF2.py +305 -0
  7. fontTools/cffLib/__init__.py +3694 -0
  8. fontTools/cffLib/specializer.py +927 -0
  9. fontTools/cffLib/transforms.py +495 -0
  10. fontTools/cffLib/width.py +210 -0
  11. fontTools/colorLib/__init__.py +0 -0
  12. fontTools/colorLib/builder.py +664 -0
  13. fontTools/colorLib/errors.py +2 -0
  14. fontTools/colorLib/geometry.py +143 -0
  15. fontTools/colorLib/table_builder.py +223 -0
  16. fontTools/colorLib/unbuilder.py +81 -0
  17. fontTools/config/__init__.py +90 -0
  18. fontTools/cu2qu/__init__.py +15 -0
  19. fontTools/cu2qu/__main__.py +6 -0
  20. fontTools/cu2qu/benchmark.py +54 -0
  21. fontTools/cu2qu/cli.py +198 -0
  22. fontTools/cu2qu/cu2qu.c +15560 -0
  23. fontTools/cu2qu/cu2qu.cpython-314t-x86_64-linux-musl.so +0 -0
  24. fontTools/cu2qu/cu2qu.py +531 -0
  25. fontTools/cu2qu/errors.py +77 -0
  26. fontTools/cu2qu/ufo.py +349 -0
  27. fontTools/designspaceLib/__init__.py +3338 -0
  28. fontTools/designspaceLib/__main__.py +6 -0
  29. fontTools/designspaceLib/split.py +475 -0
  30. fontTools/designspaceLib/statNames.py +260 -0
  31. fontTools/designspaceLib/types.py +147 -0
  32. fontTools/encodings/MacRoman.py +258 -0
  33. fontTools/encodings/StandardEncoding.py +258 -0
  34. fontTools/encodings/__init__.py +1 -0
  35. fontTools/encodings/codecs.py +135 -0
  36. fontTools/feaLib/__init__.py +4 -0
  37. fontTools/feaLib/__main__.py +78 -0
  38. fontTools/feaLib/ast.py +2143 -0
  39. fontTools/feaLib/builder.py +1802 -0
  40. fontTools/feaLib/error.py +22 -0
  41. fontTools/feaLib/lexer.c +17351 -0
  42. fontTools/feaLib/lexer.cpython-314t-x86_64-linux-musl.so +0 -0
  43. fontTools/feaLib/lexer.py +287 -0
  44. fontTools/feaLib/location.py +12 -0
  45. fontTools/feaLib/lookupDebugInfo.py +12 -0
  46. fontTools/feaLib/parser.py +2379 -0
  47. fontTools/feaLib/variableScalar.py +113 -0
  48. fontTools/fontBuilder.py +1014 -0
  49. fontTools/help.py +36 -0
  50. fontTools/merge/__init__.py +248 -0
  51. fontTools/merge/__main__.py +6 -0
  52. fontTools/merge/base.py +81 -0
  53. fontTools/merge/cmap.py +173 -0
  54. fontTools/merge/layout.py +526 -0
  55. fontTools/merge/options.py +85 -0
  56. fontTools/merge/tables.py +352 -0
  57. fontTools/merge/unicode.py +78 -0
  58. fontTools/merge/util.py +143 -0
  59. fontTools/misc/__init__.py +1 -0
  60. fontTools/misc/arrayTools.py +424 -0
  61. fontTools/misc/bezierTools.c +40151 -0
  62. fontTools/misc/bezierTools.cpython-314t-x86_64-linux-musl.so +0 -0
  63. fontTools/misc/bezierTools.py +1497 -0
  64. fontTools/misc/classifyTools.py +170 -0
  65. fontTools/misc/cliTools.py +53 -0
  66. fontTools/misc/configTools.py +349 -0
  67. fontTools/misc/cython.py +27 -0
  68. fontTools/misc/dictTools.py +83 -0
  69. fontTools/misc/eexec.py +119 -0
  70. fontTools/misc/encodingTools.py +72 -0
  71. fontTools/misc/etree.py +456 -0
  72. fontTools/misc/filenames.py +245 -0
  73. fontTools/misc/filesystem/__init__.py +68 -0
  74. fontTools/misc/filesystem/_base.py +134 -0
  75. fontTools/misc/filesystem/_copy.py +45 -0
  76. fontTools/misc/filesystem/_errors.py +54 -0
  77. fontTools/misc/filesystem/_info.py +75 -0
  78. fontTools/misc/filesystem/_osfs.py +164 -0
  79. fontTools/misc/filesystem/_path.py +67 -0
  80. fontTools/misc/filesystem/_subfs.py +92 -0
  81. fontTools/misc/filesystem/_tempfs.py +34 -0
  82. fontTools/misc/filesystem/_tools.py +34 -0
  83. fontTools/misc/filesystem/_walk.py +55 -0
  84. fontTools/misc/filesystem/_zipfs.py +204 -0
  85. fontTools/misc/fixedTools.py +253 -0
  86. fontTools/misc/intTools.py +25 -0
  87. fontTools/misc/iterTools.py +12 -0
  88. fontTools/misc/lazyTools.py +42 -0
  89. fontTools/misc/loggingTools.py +543 -0
  90. fontTools/misc/macCreatorType.py +56 -0
  91. fontTools/misc/macRes.py +261 -0
  92. fontTools/misc/plistlib/__init__.py +681 -0
  93. fontTools/misc/plistlib/py.typed +0 -0
  94. fontTools/misc/psCharStrings.py +1511 -0
  95. fontTools/misc/psLib.py +398 -0
  96. fontTools/misc/psOperators.py +572 -0
  97. fontTools/misc/py23.py +96 -0
  98. fontTools/misc/roundTools.py +110 -0
  99. fontTools/misc/sstruct.py +227 -0
  100. fontTools/misc/symfont.py +242 -0
  101. fontTools/misc/testTools.py +233 -0
  102. fontTools/misc/textTools.py +154 -0
  103. fontTools/misc/timeTools.py +88 -0
  104. fontTools/misc/transform.py +516 -0
  105. fontTools/misc/treeTools.py +45 -0
  106. fontTools/misc/vector.py +147 -0
  107. fontTools/misc/visitor.py +150 -0
  108. fontTools/misc/xmlReader.py +188 -0
  109. fontTools/misc/xmlWriter.py +231 -0
  110. fontTools/mtiLib/__init__.py +1400 -0
  111. fontTools/mtiLib/__main__.py +5 -0
  112. fontTools/otlLib/__init__.py +1 -0
  113. fontTools/otlLib/builder.py +3465 -0
  114. fontTools/otlLib/error.py +11 -0
  115. fontTools/otlLib/maxContextCalc.py +96 -0
  116. fontTools/otlLib/optimize/__init__.py +53 -0
  117. fontTools/otlLib/optimize/__main__.py +6 -0
  118. fontTools/otlLib/optimize/gpos.py +439 -0
  119. fontTools/pens/__init__.py +1 -0
  120. fontTools/pens/areaPen.py +52 -0
  121. fontTools/pens/basePen.py +475 -0
  122. fontTools/pens/boundsPen.py +98 -0
  123. fontTools/pens/cairoPen.py +26 -0
  124. fontTools/pens/cocoaPen.py +26 -0
  125. fontTools/pens/cu2quPen.py +325 -0
  126. fontTools/pens/explicitClosingLinePen.py +101 -0
  127. fontTools/pens/filterPen.py +241 -0
  128. fontTools/pens/freetypePen.py +462 -0
  129. fontTools/pens/hashPointPen.py +89 -0
  130. fontTools/pens/momentsPen.c +13466 -0
  131. fontTools/pens/momentsPen.cpython-314t-x86_64-linux-musl.so +0 -0
  132. fontTools/pens/momentsPen.py +879 -0
  133. fontTools/pens/perimeterPen.py +69 -0
  134. fontTools/pens/pointInsidePen.py +192 -0
  135. fontTools/pens/pointPen.py +609 -0
  136. fontTools/pens/qtPen.py +29 -0
  137. fontTools/pens/qu2cuPen.py +105 -0
  138. fontTools/pens/quartzPen.py +43 -0
  139. fontTools/pens/recordingPen.py +335 -0
  140. fontTools/pens/reportLabPen.py +79 -0
  141. fontTools/pens/reverseContourPen.py +96 -0
  142. fontTools/pens/roundingPen.py +130 -0
  143. fontTools/pens/statisticsPen.py +312 -0
  144. fontTools/pens/svgPathPen.py +310 -0
  145. fontTools/pens/t2CharStringPen.py +88 -0
  146. fontTools/pens/teePen.py +55 -0
  147. fontTools/pens/transformPen.py +115 -0
  148. fontTools/pens/ttGlyphPen.py +335 -0
  149. fontTools/pens/wxPen.py +29 -0
  150. fontTools/qu2cu/__init__.py +15 -0
  151. fontTools/qu2cu/__main__.py +7 -0
  152. fontTools/qu2cu/benchmark.py +56 -0
  153. fontTools/qu2cu/cli.py +125 -0
  154. fontTools/qu2cu/qu2cu.c +16753 -0
  155. fontTools/qu2cu/qu2cu.cpython-314t-x86_64-linux-musl.so +0 -0
  156. fontTools/qu2cu/qu2cu.py +405 -0
  157. fontTools/subset/__init__.py +3929 -0
  158. fontTools/subset/__main__.py +6 -0
  159. fontTools/subset/cff.py +184 -0
  160. fontTools/subset/svg.py +253 -0
  161. fontTools/subset/util.py +25 -0
  162. fontTools/svgLib/__init__.py +3 -0
  163. fontTools/svgLib/path/__init__.py +65 -0
  164. fontTools/svgLib/path/arc.py +154 -0
  165. fontTools/svgLib/path/parser.py +322 -0
  166. fontTools/svgLib/path/shapes.py +183 -0
  167. fontTools/t1Lib/__init__.py +648 -0
  168. fontTools/tfmLib.py +460 -0
  169. fontTools/ttLib/__init__.py +30 -0
  170. fontTools/ttLib/__main__.py +148 -0
  171. fontTools/ttLib/macUtils.py +54 -0
  172. fontTools/ttLib/removeOverlaps.py +393 -0
  173. fontTools/ttLib/reorderGlyphs.py +285 -0
  174. fontTools/ttLib/scaleUpem.py +436 -0
  175. fontTools/ttLib/sfnt.py +661 -0
  176. fontTools/ttLib/standardGlyphOrder.py +271 -0
  177. fontTools/ttLib/tables/B_A_S_E_.py +14 -0
  178. fontTools/ttLib/tables/BitmapGlyphMetrics.py +64 -0
  179. fontTools/ttLib/tables/C_B_D_T_.py +113 -0
  180. fontTools/ttLib/tables/C_B_L_C_.py +19 -0
  181. fontTools/ttLib/tables/C_F_F_.py +61 -0
  182. fontTools/ttLib/tables/C_F_F__2.py +26 -0
  183. fontTools/ttLib/tables/C_O_L_R_.py +165 -0
  184. fontTools/ttLib/tables/C_P_A_L_.py +305 -0
  185. fontTools/ttLib/tables/D_S_I_G_.py +158 -0
  186. fontTools/ttLib/tables/D__e_b_g.py +35 -0
  187. fontTools/ttLib/tables/DefaultTable.py +49 -0
  188. fontTools/ttLib/tables/E_B_D_T_.py +835 -0
  189. fontTools/ttLib/tables/E_B_L_C_.py +718 -0
  190. fontTools/ttLib/tables/F_F_T_M_.py +52 -0
  191. fontTools/ttLib/tables/F__e_a_t.py +149 -0
  192. fontTools/ttLib/tables/G_D_E_F_.py +13 -0
  193. fontTools/ttLib/tables/G_M_A_P_.py +148 -0
  194. fontTools/ttLib/tables/G_P_K_G_.py +133 -0
  195. fontTools/ttLib/tables/G_P_O_S_.py +14 -0
  196. fontTools/ttLib/tables/G_S_U_B_.py +13 -0
  197. fontTools/ttLib/tables/G_V_A_R_.py +5 -0
  198. fontTools/ttLib/tables/G__l_a_t.py +235 -0
  199. fontTools/ttLib/tables/G__l_o_c.py +85 -0
  200. fontTools/ttLib/tables/H_V_A_R_.py +13 -0
  201. fontTools/ttLib/tables/J_S_T_F_.py +13 -0
  202. fontTools/ttLib/tables/L_T_S_H_.py +58 -0
  203. fontTools/ttLib/tables/M_A_T_H_.py +13 -0
  204. fontTools/ttLib/tables/M_E_T_A_.py +352 -0
  205. fontTools/ttLib/tables/M_V_A_R_.py +13 -0
  206. fontTools/ttLib/tables/O_S_2f_2.py +752 -0
  207. fontTools/ttLib/tables/S_I_N_G_.py +99 -0
  208. fontTools/ttLib/tables/S_T_A_T_.py +15 -0
  209. fontTools/ttLib/tables/S_V_G_.py +223 -0
  210. fontTools/ttLib/tables/S__i_l_f.py +1040 -0
  211. fontTools/ttLib/tables/S__i_l_l.py +92 -0
  212. fontTools/ttLib/tables/T_S_I_B_.py +13 -0
  213. fontTools/ttLib/tables/T_S_I_C_.py +14 -0
  214. fontTools/ttLib/tables/T_S_I_D_.py +13 -0
  215. fontTools/ttLib/tables/T_S_I_J_.py +13 -0
  216. fontTools/ttLib/tables/T_S_I_P_.py +13 -0
  217. fontTools/ttLib/tables/T_S_I_S_.py +13 -0
  218. fontTools/ttLib/tables/T_S_I_V_.py +26 -0
  219. fontTools/ttLib/tables/T_S_I__0.py +70 -0
  220. fontTools/ttLib/tables/T_S_I__1.py +163 -0
  221. fontTools/ttLib/tables/T_S_I__2.py +17 -0
  222. fontTools/ttLib/tables/T_S_I__3.py +22 -0
  223. fontTools/ttLib/tables/T_S_I__5.py +60 -0
  224. fontTools/ttLib/tables/T_T_F_A_.py +14 -0
  225. fontTools/ttLib/tables/TupleVariation.py +884 -0
  226. fontTools/ttLib/tables/V_A_R_C_.py +12 -0
  227. fontTools/ttLib/tables/V_D_M_X_.py +249 -0
  228. fontTools/ttLib/tables/V_O_R_G_.py +165 -0
  229. fontTools/ttLib/tables/V_V_A_R_.py +13 -0
  230. fontTools/ttLib/tables/__init__.py +98 -0
  231. fontTools/ttLib/tables/_a_n_k_r.py +15 -0
  232. fontTools/ttLib/tables/_a_v_a_r.py +191 -0
  233. fontTools/ttLib/tables/_b_s_l_n.py +15 -0
  234. fontTools/ttLib/tables/_c_i_d_g.py +24 -0
  235. fontTools/ttLib/tables/_c_m_a_p.py +1591 -0
  236. fontTools/ttLib/tables/_c_v_a_r.py +94 -0
  237. fontTools/ttLib/tables/_c_v_t.py +56 -0
  238. fontTools/ttLib/tables/_f_e_a_t.py +15 -0
  239. fontTools/ttLib/tables/_f_p_g_m.py +62 -0
  240. fontTools/ttLib/tables/_f_v_a_r.py +261 -0
  241. fontTools/ttLib/tables/_g_a_s_p.py +63 -0
  242. fontTools/ttLib/tables/_g_c_i_d.py +13 -0
  243. fontTools/ttLib/tables/_g_l_y_f.py +2311 -0
  244. fontTools/ttLib/tables/_g_v_a_r.py +340 -0
  245. fontTools/ttLib/tables/_h_d_m_x.py +127 -0
  246. fontTools/ttLib/tables/_h_e_a_d.py +130 -0
  247. fontTools/ttLib/tables/_h_h_e_a.py +147 -0
  248. fontTools/ttLib/tables/_h_m_t_x.py +164 -0
  249. fontTools/ttLib/tables/_k_e_r_n.py +289 -0
  250. fontTools/ttLib/tables/_l_c_a_r.py +13 -0
  251. fontTools/ttLib/tables/_l_o_c_a.py +70 -0
  252. fontTools/ttLib/tables/_l_t_a_g.py +72 -0
  253. fontTools/ttLib/tables/_m_a_x_p.py +147 -0
  254. fontTools/ttLib/tables/_m_e_t_a.py +112 -0
  255. fontTools/ttLib/tables/_m_o_r_t.py +14 -0
  256. fontTools/ttLib/tables/_m_o_r_x.py +15 -0
  257. fontTools/ttLib/tables/_n_a_m_e.py +1237 -0
  258. fontTools/ttLib/tables/_o_p_b_d.py +14 -0
  259. fontTools/ttLib/tables/_p_o_s_t.py +319 -0
  260. fontTools/ttLib/tables/_p_r_e_p.py +16 -0
  261. fontTools/ttLib/tables/_p_r_o_p.py +12 -0
  262. fontTools/ttLib/tables/_s_b_i_x.py +129 -0
  263. fontTools/ttLib/tables/_t_r_a_k.py +332 -0
  264. fontTools/ttLib/tables/_v_h_e_a.py +139 -0
  265. fontTools/ttLib/tables/_v_m_t_x.py +19 -0
  266. fontTools/ttLib/tables/asciiTable.py +20 -0
  267. fontTools/ttLib/tables/grUtils.py +92 -0
  268. fontTools/ttLib/tables/otBase.py +1464 -0
  269. fontTools/ttLib/tables/otConverters.py +2068 -0
  270. fontTools/ttLib/tables/otData.py +6400 -0
  271. fontTools/ttLib/tables/otTables.py +2703 -0
  272. fontTools/ttLib/tables/otTraverse.py +163 -0
  273. fontTools/ttLib/tables/sbixGlyph.py +149 -0
  274. fontTools/ttLib/tables/sbixStrike.py +177 -0
  275. fontTools/ttLib/tables/table_API_readme.txt +91 -0
  276. fontTools/ttLib/tables/ttProgram.py +594 -0
  277. fontTools/ttLib/ttCollection.py +125 -0
  278. fontTools/ttLib/ttFont.py +1148 -0
  279. fontTools/ttLib/ttGlyphSet.py +490 -0
  280. fontTools/ttLib/ttVisitor.py +32 -0
  281. fontTools/ttLib/woff2.py +1680 -0
  282. fontTools/ttx.py +479 -0
  283. fontTools/ufoLib/__init__.py +2472 -0
  284. fontTools/ufoLib/converters.py +398 -0
  285. fontTools/ufoLib/errors.py +30 -0
  286. fontTools/ufoLib/etree.py +6 -0
  287. fontTools/ufoLib/filenames.py +346 -0
  288. fontTools/ufoLib/glifLib.py +2024 -0
  289. fontTools/ufoLib/kerning.py +121 -0
  290. fontTools/ufoLib/plistlib.py +47 -0
  291. fontTools/ufoLib/pointPen.py +6 -0
  292. fontTools/ufoLib/utils.py +79 -0
  293. fontTools/ufoLib/validators.py +1184 -0
  294. fontTools/unicode.py +50 -0
  295. fontTools/unicodedata/Blocks.py +801 -0
  296. fontTools/unicodedata/Mirrored.py +446 -0
  297. fontTools/unicodedata/OTTags.py +50 -0
  298. fontTools/unicodedata/ScriptExtensions.py +826 -0
  299. fontTools/unicodedata/Scripts.py +3617 -0
  300. fontTools/unicodedata/__init__.py +304 -0
  301. fontTools/varLib/__init__.py +1517 -0
  302. fontTools/varLib/__main__.py +6 -0
  303. fontTools/varLib/avar.py +260 -0
  304. fontTools/varLib/avarPlanner.py +1004 -0
  305. fontTools/varLib/builder.py +215 -0
  306. fontTools/varLib/cff.py +631 -0
  307. fontTools/varLib/errors.py +219 -0
  308. fontTools/varLib/featureVars.py +703 -0
  309. fontTools/varLib/hvar.py +113 -0
  310. fontTools/varLib/instancer/__init__.py +2014 -0
  311. fontTools/varLib/instancer/__main__.py +5 -0
  312. fontTools/varLib/instancer/featureVars.py +190 -0
  313. fontTools/varLib/instancer/names.py +388 -0
  314. fontTools/varLib/instancer/solver.py +309 -0
  315. fontTools/varLib/interpolatable.py +1209 -0
  316. fontTools/varLib/interpolatableHelpers.py +396 -0
  317. fontTools/varLib/interpolatablePlot.py +1269 -0
  318. fontTools/varLib/interpolatableTestContourOrder.py +82 -0
  319. fontTools/varLib/interpolatableTestStartingPoint.py +107 -0
  320. fontTools/varLib/interpolate_layout.py +124 -0
  321. fontTools/varLib/iup.c +19845 -0
  322. fontTools/varLib/iup.cpython-314t-x86_64-linux-musl.so +0 -0
  323. fontTools/varLib/iup.py +490 -0
  324. fontTools/varLib/merger.py +1717 -0
  325. fontTools/varLib/models.py +642 -0
  326. fontTools/varLib/multiVarStore.py +253 -0
  327. fontTools/varLib/mutator.py +529 -0
  328. fontTools/varLib/mvar.py +40 -0
  329. fontTools/varLib/plot.py +238 -0
  330. fontTools/varLib/stat.py +149 -0
  331. fontTools/varLib/varStore.py +739 -0
  332. fontTools/voltLib/__init__.py +5 -0
  333. fontTools/voltLib/__main__.py +206 -0
  334. fontTools/voltLib/ast.py +452 -0
  335. fontTools/voltLib/error.py +12 -0
  336. fontTools/voltLib/lexer.py +99 -0
  337. fontTools/voltLib/parser.py +664 -0
  338. fontTools/voltLib/voltToFea.py +911 -0
  339. fonttools-4.59.1.data/data/share/man/man1/ttx.1 +225 -0
  340. fonttools-4.59.1.dist-info/METADATA +2175 -0
  341. fonttools-4.59.1.dist-info/RECORD +346 -0
  342. fonttools-4.59.1.dist-info/WHEEL +5 -0
  343. fonttools-4.59.1.dist-info/entry_points.txt +5 -0
  344. fonttools-4.59.1.dist-info/licenses/LICENSE +21 -0
  345. fonttools-4.59.1.dist-info/licenses/LICENSE.external +388 -0
  346. fonttools-4.59.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,398 @@
1
+ """
2
+ Functions for converting UFO1 or UFO2 files into UFO3 format.
3
+
4
+ Currently provides functionality for converting kerning rules
5
+ and kerning groups. Conversion is only supported _from_ UFO1
6
+ or UFO2, and _to_ UFO3.
7
+ """
8
+
9
+ # adapted from the UFO spec
10
+
11
+
12
+ def convertUFO1OrUFO2KerningToUFO3Kerning(kerning, groups, glyphSet=()):
13
+ """Convert kerning data in UFO1 or UFO2 syntax into UFO3 syntax.
14
+
15
+ Args:
16
+ kerning:
17
+ A dictionary containing the kerning rules defined in
18
+ the UFO font, as used in :class:`.UFOReader` objects.
19
+ groups:
20
+ A dictionary containing the groups defined in the UFO
21
+ font, as used in :class:`.UFOReader` objects.
22
+ glyphSet:
23
+ Optional; a set of glyph objects to skip (default: None).
24
+
25
+ Returns:
26
+ 1. A dictionary representing the converted kerning data.
27
+ 2. A copy of the groups dictionary, with all groups renamed to UFO3 syntax.
28
+ 3. A dictionary containing the mapping of old group names to new group names.
29
+
30
+ """
31
+ # gather known kerning groups based on the prefixes
32
+ firstReferencedGroups, secondReferencedGroups = findKnownKerningGroups(groups)
33
+ # Make lists of groups referenced in kerning pairs.
34
+ for first, seconds in list(kerning.items()):
35
+ if first in groups and first not in glyphSet:
36
+ if not first.startswith("public.kern1."):
37
+ firstReferencedGroups.add(first)
38
+ for second in list(seconds.keys()):
39
+ if second in groups and second not in glyphSet:
40
+ if not second.startswith("public.kern2."):
41
+ secondReferencedGroups.add(second)
42
+ # Create new names for these groups.
43
+ firstRenamedGroups = {}
44
+ for first in firstReferencedGroups:
45
+ # Make a list of existing group names.
46
+ existingGroupNames = list(groups.keys()) + list(firstRenamedGroups.keys())
47
+ # Remove the old prefix from the name
48
+ newName = first.replace("@MMK_L_", "")
49
+ # Add the new prefix to the name.
50
+ newName = "public.kern1." + newName
51
+ # Make a unique group name.
52
+ newName = makeUniqueGroupName(newName, existingGroupNames)
53
+ # Store for use later.
54
+ firstRenamedGroups[first] = newName
55
+ secondRenamedGroups = {}
56
+ for second in secondReferencedGroups:
57
+ # Make a list of existing group names.
58
+ existingGroupNames = list(groups.keys()) + list(secondRenamedGroups.keys())
59
+ # Remove the old prefix from the name
60
+ newName = second.replace("@MMK_R_", "")
61
+ # Add the new prefix to the name.
62
+ newName = "public.kern2." + newName
63
+ # Make a unique group name.
64
+ newName = makeUniqueGroupName(newName, existingGroupNames)
65
+ # Store for use later.
66
+ secondRenamedGroups[second] = newName
67
+ # Populate the new group names into the kerning dictionary as needed.
68
+ newKerning = {}
69
+ for first, seconds in list(kerning.items()):
70
+ first = firstRenamedGroups.get(first, first)
71
+ newSeconds = {}
72
+ for second, value in list(seconds.items()):
73
+ second = secondRenamedGroups.get(second, second)
74
+ newSeconds[second] = value
75
+ newKerning[first] = newSeconds
76
+ # Make copies of the referenced groups and store them
77
+ # under the new names in the overall groups dictionary.
78
+ allRenamedGroups = list(firstRenamedGroups.items())
79
+ allRenamedGroups += list(secondRenamedGroups.items())
80
+ for oldName, newName in allRenamedGroups:
81
+ group = list(groups[oldName])
82
+ groups[newName] = group
83
+ # Return the kerning and the groups.
84
+ return newKerning, groups, dict(side1=firstRenamedGroups, side2=secondRenamedGroups)
85
+
86
+
87
+ def findKnownKerningGroups(groups):
88
+ """Find all kerning groups in a UFO1 or UFO2 font that use known prefixes.
89
+
90
+ In some cases, not all kerning groups will be referenced
91
+ by the kerning pairs in a UFO. The algorithm for locating
92
+ groups in :func:`convertUFO1OrUFO2KerningToUFO3Kerning` will
93
+ miss these unreferenced groups. By scanning for known prefixes,
94
+ this function will catch all of the prefixed groups.
95
+
96
+ The prefixes and sides by this function are:
97
+
98
+ @MMK_L_ - side 1
99
+ @MMK_R_ - side 2
100
+
101
+ as defined in the UFO1 specification.
102
+
103
+ Args:
104
+ groups:
105
+ A dictionary containing the groups defined in the UFO
106
+ font, as read by :class:`.UFOReader`.
107
+
108
+ Returns:
109
+ Two sets; the first containing the names of all
110
+ first-side kerning groups identified in the ``groups``
111
+ dictionary, and the second containing the names of all
112
+ second-side kerning groups identified.
113
+
114
+ "First-side" and "second-side" are with respect to the
115
+ writing direction of the script.
116
+
117
+ Example::
118
+
119
+ >>> testGroups = {
120
+ ... "@MMK_L_1" : None,
121
+ ... "@MMK_L_2" : None,
122
+ ... "@MMK_L_3" : None,
123
+ ... "@MMK_R_1" : None,
124
+ ... "@MMK_R_2" : None,
125
+ ... "@MMK_R_3" : None,
126
+ ... "@MMK_l_1" : None,
127
+ ... "@MMK_r_1" : None,
128
+ ... "@MMK_X_1" : None,
129
+ ... "foo" : None,
130
+ ... }
131
+ >>> first, second = findKnownKerningGroups(testGroups)
132
+ >>> sorted(first) == ['@MMK_L_1', '@MMK_L_2', '@MMK_L_3']
133
+ True
134
+ >>> sorted(second) == ['@MMK_R_1', '@MMK_R_2', '@MMK_R_3']
135
+ True
136
+ """
137
+ knownFirstGroupPrefixes = ["@MMK_L_"]
138
+ knownSecondGroupPrefixes = ["@MMK_R_"]
139
+ firstGroups = set()
140
+ secondGroups = set()
141
+ for groupName in list(groups.keys()):
142
+ for firstPrefix in knownFirstGroupPrefixes:
143
+ if groupName.startswith(firstPrefix):
144
+ firstGroups.add(groupName)
145
+ break
146
+ for secondPrefix in knownSecondGroupPrefixes:
147
+ if groupName.startswith(secondPrefix):
148
+ secondGroups.add(groupName)
149
+ break
150
+ return firstGroups, secondGroups
151
+
152
+
153
+ def makeUniqueGroupName(name, groupNames, counter=0):
154
+ """Make a kerning group name that will be unique within the set of group names.
155
+
156
+ If the requested kerning group name already exists within the set, this
157
+ will return a new name by adding an incremented counter to the end
158
+ of the requested name.
159
+
160
+ Args:
161
+ name:
162
+ The requested kerning group name.
163
+ groupNames:
164
+ A list of the existing kerning group names.
165
+ counter:
166
+ Optional; a counter of group names already seen (default: 0). If
167
+ :attr:`.counter` is not provided, the function will recurse,
168
+ incrementing the value of :attr:`.counter` until it finds the
169
+ first unused ``name+counter`` combination, and return that result.
170
+
171
+ Returns:
172
+ A unique kerning group name composed of the requested name suffixed
173
+ by the smallest available integer counter.
174
+ """
175
+ # Add a number to the name if the counter is higher than zero.
176
+ newName = name
177
+ if counter > 0:
178
+ newName = "%s%d" % (newName, counter)
179
+ # If the new name is in the existing group names, recurse.
180
+ if newName in groupNames:
181
+ return makeUniqueGroupName(name, groupNames, counter + 1)
182
+ # Otherwise send back the new name.
183
+ return newName
184
+
185
+
186
+ def test():
187
+ """
188
+ Tests for :func:`.convertUFO1OrUFO2KerningToUFO3Kerning`.
189
+
190
+ No known prefixes.
191
+
192
+ >>> testKerning = {
193
+ ... "A" : {
194
+ ... "A" : 1,
195
+ ... "B" : 2,
196
+ ... "CGroup" : 3,
197
+ ... "DGroup" : 4
198
+ ... },
199
+ ... "BGroup" : {
200
+ ... "A" : 5,
201
+ ... "B" : 6,
202
+ ... "CGroup" : 7,
203
+ ... "DGroup" : 8
204
+ ... },
205
+ ... "CGroup" : {
206
+ ... "A" : 9,
207
+ ... "B" : 10,
208
+ ... "CGroup" : 11,
209
+ ... "DGroup" : 12
210
+ ... },
211
+ ... }
212
+ >>> testGroups = {
213
+ ... "BGroup" : ["B"],
214
+ ... "CGroup" : ["C"],
215
+ ... "DGroup" : ["D"],
216
+ ... }
217
+ >>> kerning, groups, maps = convertUFO1OrUFO2KerningToUFO3Kerning(
218
+ ... testKerning, testGroups, [])
219
+ >>> expected = {
220
+ ... "A" : {
221
+ ... "A": 1,
222
+ ... "B": 2,
223
+ ... "public.kern2.CGroup": 3,
224
+ ... "public.kern2.DGroup": 4
225
+ ... },
226
+ ... "public.kern1.BGroup": {
227
+ ... "A": 5,
228
+ ... "B": 6,
229
+ ... "public.kern2.CGroup": 7,
230
+ ... "public.kern2.DGroup": 8
231
+ ... },
232
+ ... "public.kern1.CGroup": {
233
+ ... "A": 9,
234
+ ... "B": 10,
235
+ ... "public.kern2.CGroup": 11,
236
+ ... "public.kern2.DGroup": 12
237
+ ... }
238
+ ... }
239
+ >>> kerning == expected
240
+ True
241
+ >>> expected = {
242
+ ... "BGroup": ["B"],
243
+ ... "CGroup": ["C"],
244
+ ... "DGroup": ["D"],
245
+ ... "public.kern1.BGroup": ["B"],
246
+ ... "public.kern1.CGroup": ["C"],
247
+ ... "public.kern2.CGroup": ["C"],
248
+ ... "public.kern2.DGroup": ["D"],
249
+ ... }
250
+ >>> groups == expected
251
+ True
252
+
253
+ Known prefixes.
254
+
255
+ >>> testKerning = {
256
+ ... "A" : {
257
+ ... "A" : 1,
258
+ ... "B" : 2,
259
+ ... "@MMK_R_CGroup" : 3,
260
+ ... "@MMK_R_DGroup" : 4
261
+ ... },
262
+ ... "@MMK_L_BGroup" : {
263
+ ... "A" : 5,
264
+ ... "B" : 6,
265
+ ... "@MMK_R_CGroup" : 7,
266
+ ... "@MMK_R_DGroup" : 8
267
+ ... },
268
+ ... "@MMK_L_CGroup" : {
269
+ ... "A" : 9,
270
+ ... "B" : 10,
271
+ ... "@MMK_R_CGroup" : 11,
272
+ ... "@MMK_R_DGroup" : 12
273
+ ... },
274
+ ... }
275
+ >>> testGroups = {
276
+ ... "@MMK_L_BGroup" : ["B"],
277
+ ... "@MMK_L_CGroup" : ["C"],
278
+ ... "@MMK_L_XGroup" : ["X"],
279
+ ... "@MMK_R_CGroup" : ["C"],
280
+ ... "@MMK_R_DGroup" : ["D"],
281
+ ... "@MMK_R_XGroup" : ["X"],
282
+ ... }
283
+ >>> kerning, groups, maps = convertUFO1OrUFO2KerningToUFO3Kerning(
284
+ ... testKerning, testGroups, [])
285
+ >>> expected = {
286
+ ... "A" : {
287
+ ... "A": 1,
288
+ ... "B": 2,
289
+ ... "public.kern2.CGroup": 3,
290
+ ... "public.kern2.DGroup": 4
291
+ ... },
292
+ ... "public.kern1.BGroup": {
293
+ ... "A": 5,
294
+ ... "B": 6,
295
+ ... "public.kern2.CGroup": 7,
296
+ ... "public.kern2.DGroup": 8
297
+ ... },
298
+ ... "public.kern1.CGroup": {
299
+ ... "A": 9,
300
+ ... "B": 10,
301
+ ... "public.kern2.CGroup": 11,
302
+ ... "public.kern2.DGroup": 12
303
+ ... }
304
+ ... }
305
+ >>> kerning == expected
306
+ True
307
+ >>> expected = {
308
+ ... "@MMK_L_BGroup": ["B"],
309
+ ... "@MMK_L_CGroup": ["C"],
310
+ ... "@MMK_L_XGroup": ["X"],
311
+ ... "@MMK_R_CGroup": ["C"],
312
+ ... "@MMK_R_DGroup": ["D"],
313
+ ... "@MMK_R_XGroup": ["X"],
314
+ ... "public.kern1.BGroup": ["B"],
315
+ ... "public.kern1.CGroup": ["C"],
316
+ ... "public.kern1.XGroup": ["X"],
317
+ ... "public.kern2.CGroup": ["C"],
318
+ ... "public.kern2.DGroup": ["D"],
319
+ ... "public.kern2.XGroup": ["X"],
320
+ ... }
321
+ >>> groups == expected
322
+ True
323
+
324
+ >>> from .validators import kerningValidator
325
+ >>> kerningValidator(kerning)
326
+ (True, None)
327
+
328
+ Mixture of known prefixes and groups without prefixes.
329
+
330
+ >>> testKerning = {
331
+ ... "A" : {
332
+ ... "A" : 1,
333
+ ... "B" : 2,
334
+ ... "@MMK_R_CGroup" : 3,
335
+ ... "DGroup" : 4
336
+ ... },
337
+ ... "BGroup" : {
338
+ ... "A" : 5,
339
+ ... "B" : 6,
340
+ ... "@MMK_R_CGroup" : 7,
341
+ ... "DGroup" : 8
342
+ ... },
343
+ ... "@MMK_L_CGroup" : {
344
+ ... "A" : 9,
345
+ ... "B" : 10,
346
+ ... "@MMK_R_CGroup" : 11,
347
+ ... "DGroup" : 12
348
+ ... },
349
+ ... }
350
+ >>> testGroups = {
351
+ ... "BGroup" : ["B"],
352
+ ... "@MMK_L_CGroup" : ["C"],
353
+ ... "@MMK_R_CGroup" : ["C"],
354
+ ... "DGroup" : ["D"],
355
+ ... }
356
+ >>> kerning, groups, maps = convertUFO1OrUFO2KerningToUFO3Kerning(
357
+ ... testKerning, testGroups, [])
358
+ >>> expected = {
359
+ ... "A" : {
360
+ ... "A": 1,
361
+ ... "B": 2,
362
+ ... "public.kern2.CGroup": 3,
363
+ ... "public.kern2.DGroup": 4
364
+ ... },
365
+ ... "public.kern1.BGroup": {
366
+ ... "A": 5,
367
+ ... "B": 6,
368
+ ... "public.kern2.CGroup": 7,
369
+ ... "public.kern2.DGroup": 8
370
+ ... },
371
+ ... "public.kern1.CGroup": {
372
+ ... "A": 9,
373
+ ... "B": 10,
374
+ ... "public.kern2.CGroup": 11,
375
+ ... "public.kern2.DGroup": 12
376
+ ... }
377
+ ... }
378
+ >>> kerning == expected
379
+ True
380
+ >>> expected = {
381
+ ... "BGroup": ["B"],
382
+ ... "@MMK_L_CGroup": ["C"],
383
+ ... "@MMK_R_CGroup": ["C"],
384
+ ... "DGroup": ["D"],
385
+ ... "public.kern1.BGroup": ["B"],
386
+ ... "public.kern1.CGroup": ["C"],
387
+ ... "public.kern2.CGroup": ["C"],
388
+ ... "public.kern2.DGroup": ["D"],
389
+ ... }
390
+ >>> groups == expected
391
+ True
392
+ """
393
+
394
+
395
+ if __name__ == "__main__":
396
+ import doctest
397
+
398
+ doctest.testmod()
@@ -0,0 +1,30 @@
1
+ from __future__ import annotations
2
+
3
+
4
+ class UFOLibError(Exception):
5
+ pass
6
+
7
+
8
+ class UnsupportedUFOFormat(UFOLibError):
9
+ pass
10
+
11
+
12
+ class GlifLibError(UFOLibError):
13
+ """An error raised by glifLib.
14
+
15
+ This class is a loose backport of PEP 678, adding a :attr:`.note`
16
+ attribute that can hold additional context for errors encountered.
17
+
18
+ It will be maintained until only Python 3.11-and-later are supported.
19
+ """
20
+
21
+ def _add_note(self, note: str) -> None:
22
+ # Loose backport of PEP 678 until we only support Python 3.11+, used for
23
+ # adding additional context to errors.
24
+ # TODO: Replace with https://docs.python.org/3.11/library/exceptions.html#BaseException.add_note
25
+ (message, *rest) = self.args
26
+ self.args = ((message + "\n" + note), *rest)
27
+
28
+
29
+ class UnsupportedGLIFFormat(GlifLibError):
30
+ pass
@@ -0,0 +1,6 @@
1
+ """DEPRECATED - This module is kept here only as a backward compatibility shim
2
+ for the old ufoLib.etree module, which was moved to :mod:`fontTools.misc.etree`.
3
+ Please use the latter instead.
4
+ """
5
+
6
+ from fontTools.misc.etree import *