
    h>)                     `    S r SS jrS rS	S jrS r\S:X  a  SSKr\R                  " 5         gg)
z
Conversion functions.
c                    [        U5      u  p4[        U R                  5       5       H  u  pVXQ;   a,  XR;  a'  UR                  S5      (       d  UR	                  U5        [        UR                  5       5       H:  nXq;   d  M
  Xr;  d  M  UR                  S5      (       a  M)  UR	                  U5        M<     M     0 nU H\  n[        UR                  5       5      [        UR                  5       5      -   n	UR                  SS5      n
SU
-   n
[        X5      n
XU'   M^     0 nU H\  n[        UR                  5       5      [        UR                  5       5      -   n	UR                  SS5      n
SU
-   n
[        X5      n
XU'   M^     0 n[        U R                  5       5       HS  u  pVUR                  XU5      n0 n[        UR                  5       5       H  u  p~UR                  Xw5      nXU'   M     XU'   MU     [        UR                  5       5      nU[        UR                  5       5      -  nU H  u  nn
[        UU   5      nUX'   M     X[        XS94$ )Nzpublic.kern1.zpublic.kern2.@MMK_L_ @MMK_R_)side1side2)
findKnownKerningGroupslistitems
startswithaddkeysreplacemakeUniqueGroupNamegetdict)kerninggroupsglyphSetfirstReferencedGroupssecondReferencedGroupsfirstsecondssecondfirstRenamedGroupsexistingGroupNamesnewNamesecondRenamedGroups
newKerning
newSecondsvalueallRenamedGroupsoldNamegroups                     M/var/www/html/env/lib/python3.13/site-packages/fontTools/ufoLib/converters.py%convertUFO1OrUFO2KerningToUFO3Kerningr%      s)   4J64R1w}}/?u4##O44%))%07<<>*FF$:((99*..v6 +	 0 &!&++-048J8O8O8Q3RR--	2.!G+%gB$+5! ' (!&++-048K8P8P8R3SS..B/!G+%gB&-F# ) Jw}}/"&&u4
!'--/2MF(,,V<F!&v 3 '5 0 .4467066899,VG_% - t*<XXX    c                 F   S/nS/n[        5       n[        5       n[        U R                  5       5       Hh  nU H,  nUR                  U5      (       d  M  UR	                  U5          O   U H-  nUR                  U5      (       d  M  UR	                  U5          Mf     Mj     X44$ )au  
This will find kerning groups with known prefixes.
In some cases not all kerning groups will be referenced
by the kerning pairs. The algorithm for locating groups
in convertUFO1OrUFO2KerningToUFO3Kerning will miss these
unreferenced groups. By scanning for known prefixes
this function will catch all of the prefixed groups.

These are the prefixes and sides that are handled:
@MMK_L_ - side 1
@MMK_R_ - side 2

>>> testGroups = {
...     "@MMK_L_1" : None,
...     "@MMK_L_2" : None,
...     "@MMK_L_3" : None,
...     "@MMK_R_1" : None,
...     "@MMK_R_2" : None,
...     "@MMK_R_3" : None,
...     "@MMK_l_1" : None,
...     "@MMK_r_1" : None,
...     "@MMK_X_1" : None,
...     "foo" : None,
... }
>>> first, second = findKnownKerningGroups(testGroups)
>>> sorted(first) == ['@MMK_L_1', '@MMK_L_2', '@MMK_L_3']
True
>>> sorted(second) == ['@MMK_R_1', '@MMK_R_2', '@MMK_R_3']
True
r   r   )setr	   r   r   r   )r   knownFirstGroupPrefixesknownSecondGroupPrefixesfirstGroupssecondGroups	groupNamefirstPrefixsecondPrefixs           r$   r   r   A   s    >  )k ){%K5L&++-(	2K##K00	* 3 5L##L11  + 5 ) $$r&       c                 J    U nUS:  a  SX24-  nX1;   a  [        XUS-   5      $ U$ )Nr0   z%s%d   )r   )name
groupNamescounterr   s       r$   r   r   p   s7    G{G--"4Wq[AANr&   c                      g)a  
No known prefixes.

>>> testKerning = {
...     "A" : {
...         "A" : 1,
...         "B" : 2,
...         "CGroup" : 3,
...         "DGroup" : 4
...     },
...     "BGroup" : {
...         "A" : 5,
...         "B" : 6,
...         "CGroup" : 7,
...         "DGroup" : 8
...     },
...     "CGroup" : {
...         "A" : 9,
...         "B" : 10,
...         "CGroup" : 11,
...         "DGroup" : 12
...     },
... }
>>> testGroups = {
...     "BGroup" : ["B"],
...     "CGroup" : ["C"],
...     "DGroup" : ["D"],
... }
>>> kerning, groups, maps = convertUFO1OrUFO2KerningToUFO3Kerning(
...     testKerning, testGroups, [])
>>> expected = {
...     "A" : {
...         "A": 1,
...         "B": 2,
...         "public.kern2.CGroup": 3,
...         "public.kern2.DGroup": 4
...     },
...     "public.kern1.BGroup": {
...         "A": 5,
...         "B": 6,
...         "public.kern2.CGroup": 7,
...         "public.kern2.DGroup": 8
...     },
...     "public.kern1.CGroup": {
...         "A": 9,
...         "B": 10,
...         "public.kern2.CGroup": 11,
...         "public.kern2.DGroup": 12
...     }
... }
>>> kerning == expected
True
>>> expected = {
...     "BGroup": ["B"],
...     "CGroup": ["C"],
...     "DGroup": ["D"],
...     "public.kern1.BGroup": ["B"],
...     "public.kern1.CGroup": ["C"],
...     "public.kern2.CGroup": ["C"],
...     "public.kern2.DGroup": ["D"],
... }
>>> groups == expected
True

Known prefixes.

>>> testKerning = {
...     "A" : {
...         "A" : 1,
...         "B" : 2,
...         "@MMK_R_CGroup" : 3,
...         "@MMK_R_DGroup" : 4
...     },
...     "@MMK_L_BGroup" : {
...         "A" : 5,
...         "B" : 6,
...         "@MMK_R_CGroup" : 7,
...         "@MMK_R_DGroup" : 8
...     },
...     "@MMK_L_CGroup" : {
...         "A" : 9,
...         "B" : 10,
...         "@MMK_R_CGroup" : 11,
...         "@MMK_R_DGroup" : 12
...     },
... }
>>> testGroups = {
...     "@MMK_L_BGroup" : ["B"],
...     "@MMK_L_CGroup" : ["C"],
...     "@MMK_L_XGroup" : ["X"],
...     "@MMK_R_CGroup" : ["C"],
...     "@MMK_R_DGroup" : ["D"],
...     "@MMK_R_XGroup" : ["X"],
... }
>>> kerning, groups, maps = convertUFO1OrUFO2KerningToUFO3Kerning(
...     testKerning, testGroups, [])
>>> expected = {
...     "A" : {
...         "A": 1,
...         "B": 2,
...         "public.kern2.CGroup": 3,
...         "public.kern2.DGroup": 4
...     },
...     "public.kern1.BGroup": {
...         "A": 5,
...         "B": 6,
...         "public.kern2.CGroup": 7,
...         "public.kern2.DGroup": 8
...     },
...     "public.kern1.CGroup": {
...         "A": 9,
...         "B": 10,
...         "public.kern2.CGroup": 11,
...         "public.kern2.DGroup": 12
...     }
... }
>>> kerning == expected
True
>>> expected = {
...     "@MMK_L_BGroup": ["B"],
...     "@MMK_L_CGroup": ["C"],
...     "@MMK_L_XGroup": ["X"],
...     "@MMK_R_CGroup": ["C"],
...     "@MMK_R_DGroup": ["D"],
...     "@MMK_R_XGroup": ["X"],
...     "public.kern1.BGroup": ["B"],
...     "public.kern1.CGroup": ["C"],
...     "public.kern1.XGroup": ["X"],
...     "public.kern2.CGroup": ["C"],
...     "public.kern2.DGroup": ["D"],
...     "public.kern2.XGroup": ["X"],
... }
>>> groups == expected
True

>>> from .validators import kerningValidator
>>> kerningValidator(kerning)
(True, None)

Mixture of known prefixes and groups without prefixes.

>>> testKerning = {
...     "A" : {
...         "A" : 1,
...         "B" : 2,
...         "@MMK_R_CGroup" : 3,
...         "DGroup" : 4
...     },
...     "BGroup" : {
...         "A" : 5,
...         "B" : 6,
...         "@MMK_R_CGroup" : 7,
...         "DGroup" : 8
...     },
...     "@MMK_L_CGroup" : {
...         "A" : 9,
...         "B" : 10,
...         "@MMK_R_CGroup" : 11,
...         "DGroup" : 12
...     },
... }
>>> testGroups = {
...     "BGroup" : ["B"],
...     "@MMK_L_CGroup" : ["C"],
...     "@MMK_R_CGroup" : ["C"],
...     "DGroup" : ["D"],
... }
>>> kerning, groups, maps = convertUFO1OrUFO2KerningToUFO3Kerning(
...     testKerning, testGroups, [])
>>> expected = {
...     "A" : {
...         "A": 1,
...         "B": 2,
...         "public.kern2.CGroup": 3,
...         "public.kern2.DGroup": 4
...     },
...     "public.kern1.BGroup": {
...         "A": 5,
...         "B": 6,
...         "public.kern2.CGroup": 7,
...         "public.kern2.DGroup": 8
...     },
...     "public.kern1.CGroup": {
...         "A": 9,
...         "B": 10,
...         "public.kern2.CGroup": 11,
...         "public.kern2.DGroup": 12
...     }
... }
>>> kerning == expected
True
>>> expected = {
...     "BGroup": ["B"],
...     "@MMK_L_CGroup": ["C"],
...     "@MMK_R_CGroup": ["C"],
...     "DGroup": ["D"],
...     "public.kern1.BGroup": ["B"],
...     "public.kern1.CGroup": ["C"],
...     "public.kern2.CGroup": ["C"],
...     "public.kern2.DGroup": ["D"],
... }
>>> groups == expected
True
N r7   r&   r$   testr8   |   s    r&   __main__N)r7   )r0   )__doc__r%   r   r   r8   __name__doctesttestmodr7   r&   r$   <module>r>      s?   6Yr,%^	L^ zOO r&   