
    7j                         d Z ddlZddlmZ dZ G d dej
                        Z G d de      Z G d	 d
e      Z G d de      Z	 G d de      Z
y)z.Class that pretty-prints QMK info.json files.
    N)Decimal
c                   l     e Zd ZdZeeefZdZ fdZ	d Z
d Zd Zd Zg f fd	Zd	 Zed
        Z xZS )QMKJSONEncoderz*Base class for all QMK JSON encoders.
     c                 Z    t        |   |i | d| _        | j                  sd| _        y y )Nr      )super__init__indentation_levelindent)selfargskwargs	__class__s      J/home/hanthebot/chat/keyboard/qmk_firmware/lib/python/qmk/json_encoders.pyr   zQMKJSONEncoder.__init__   s0    $)&)!"{{DK     c                 J    |t        |      k(  rt        |      S t        |      S )z!Encode a decimal object.
        )intfloatr   objs     r   encode_decimalzQMKJSONEncoder.encode_decimal   s"     #c(?s8OSzr   c                    |r| xj                   dz  c_         | j                  r%t        |j                         | j                        n|j                         }|D cg c]@  \  }}| j
                  t        j                  |       d| j                  |||gz          z   B }}}| xj                   dz  c_         ddj                  |      z   dz   | j
                  z   dz   S yc c}}w )	z#Encode a dict-like object.
           key: z{
,
r   }z{})
r   	sort_keyssorteditems	sort_dict
indent_strjsondumpsencodejoin)r   r   pathr#   r   valueoutputs          r   encode_dictzQMKJSONEncoder.encode_dict   s     ""a'"?C~~F399;DNN;SVS\S\S^Esxyeoehjodoo4::c?*;2dkk%QUY\X]Q]>^=_(``yFy""a'"5::f--4tFLL zs   AC#c                      ddj                   fdt        |j                          j                        D              z   dz   S )z6Encode a dict-like object onto a single line.
        {, c              3      K   | ]5  \  }}t        j                  |       d j                  ||gz           7 yw)r   N)r&   r'   r(   ).0r   r+   r*   r   s      r   	<genexpr>z9QMKJSONEncoder.encode_dict_single_line.<locals>.<genexpr>0   sE       U\f\_af$**S/!2"T[[PSu5U4VW  Us   ;>r   r    )r)   r"   r#   sort_layout)r   r   r*   s   ` `r   encode_dict_single_linez&QMKJSONEncoder.encode_dict_single_line-   sd     TYY  Ujpqtqzqzq|  CG  CS  CS  kT  U  U  U  X[  [  	[r   c           
      >     j                  |      r*ddj                   fdt        |      D              z   dz   S  xj                  dz  c_        d   dv r?t        |      D cg c](  \  }} j                   j                  ||gz         z   * }}}n>t        |      D cg c](  \  }} j                   j                  ||gz         z   * }}} xj                  dz  c_        dd	j                  |      z   d
z    j                  z   dz   S c c}}w c c}}w )#Encode a list-like object.
        [r0   c              3   P   K   | ]  \  }}j                  ||gz           y wNr(   )r2   indexr+   r*   r   s      r   r3   z-QMKJSONEncoder.encode_list.<locals>.<genexpr>6   s'     "i,%QV4;;udeWn#E"is   #&]r   )layoutrotary[
r   r   )primitives_onlyr)   	enumerater   r%   r5   r(   )r   r   r*   r<   r+   r,   s   ` `   r   encode_listzQMKJSONEncoder.encode_list2   s&    $"iZcdgZh"iiilooo ""a'"Bx//t}  B  uC  Ddpdikp$//D,H,HPTX]W^P^,__  D  DclmpcqrS_SXZ_$//DKKtug~,NNrr""a'"5::f--4tFLL Drs   (-D'-Dc                     t        |t              r| j                  |      S t        |t        t        f      r| j                  ||      S t        |t              r| j                  ||      S t        | %  |      S )z%Encode JSON objects for QMK.
        )

isinstancer   r   listtuplerD   dictr-   r
   r(   )r   r   r*   r   s      r   r(   zQMKJSONEncoder.encodeE   so     c7#&&s++dE]+##C..T"##C.. 7>#&&r   c                 n     t        |t              r|j                         }t         fd|D               S )z`Returns true if the object doesn't have any container type objects (list, tuple, dict).
        c              3   J   K   | ]  }t        |j                          y wr:   )rF   container_typesr2   elementr   s     r   r3   z1QMKJSONEncoder.primitives_only.<locals>.<genexpr>Z   s     TWz'4+?+?@Ts    #)rF   rI   valuesanyr   s   ` r   rB   zQMKJSONEncoder.primitives_onlyT   s/     c4 **,CTPSTTTTr   c                 N    | j                   | j                  | j                  z  z  S r:   )indentation_charr   r   )r   s    r   r%   zQMKJSONEncoder.indent_str\   s"    $$(>(>(LMMr   )__name__
__module____qualname____doc__rG   rH   rI   rL   rR   r   r   r-   r5   rD   r(   rB   propertyr%   __classcell__)r   s   @r   r   r   	   s[    UD)O[
M&  " 'U N Nr   r   c                       e Zd ZdZd Zd Zy)InfoJSONEncoderzDCustom encoder to make info.json's a little nicer to work with.
    c                 d    |d   }|dk(  ry|dk(  ry|dk(  ry|dk(  ry	|d
k(  ry|dk(  ry|dk(  ry|S )(Sorts the hashes in a nice way.
        r   label00labelmatrix01matrixx02xy03yw04wh05hflags06flags r   itemr   s      r   r4   zInfoJSONEncoder.sort_layoutd   sX     1g'>H_CZCZCZCZG^
r   c                     |d   }| j                   dk(  r2|dk(  ry|dk(  ry|dk(  ry|d	k(  ry
|dk(  ry|dk(  rydt        |      z   S |S )z5Forces layout to the back of the sort order.
        r   r   manufacturer10manufacturerkeyboard_name11keyboard_name
maintainer12maintainercommunity_layouts97community_layoutslayout_aliases98layout_aliaseslayouts	99layouts50r   strrl   s      r   r$   zInfoJSONEncoder.sort_dict   st     1g!!Q&n$''($%++,(()	!" c#h&
r   N)rS   rT   rU   rV   r4   r$   rk   r   r   rZ   rZ   a   s    8r   rZ   c                       e Zd ZdZd Zd Zy)KeymapJSONEncoderzFCustom encoder to make keymap.json's a little nicer to work with.
    c                 f     j                   dk(  r j                   dz   }g g}|D ]f  }|dk(  r|j                  g        t        |t              r%|d   j                   j	                  |              O|d   j                  d| d       h |D cg c]$  } j
                  |z   dj                  |       & }} j
                   dt        j                  |       d j
                   j                   z   d	S  j                  |      r d
dj                   fd|D              z   d	z   S  xj                   dz  c_         |D cg c]   } j
                   j	                  |      z   " }} xj                   dz  c_         ddj                  |      z   dz    j
                  z   d	z   S c c}w c c}w )r7      r   JSON_NEWLINEr>   "r0   rA   r   r=   r8   c              3   @   K   | ]  }j                  |        y wr:   r;   rM   s     r   r3   z0KeymapJSONEncoder.encode_list.<locals>.<genexpr>   s     "KG4;;w#7"Ks   r   )	r   appendrF   rI   r(   r%   r)   newlinerB   )	r   r   r*   indent_levellayerr   rowrN   r,   s	   `        r   rD   zKeymapJSONEncoder.encode_list   s    !!Q&11A5LDE 
5.(LL$!#t, b	((DKK,<+=?b	((1SE4
5 UZZS,67		#7GHZEZoo&c',,u*=)>bSWSiSiAi@jjkll!!#&"Ks"KKKcQQ ""a'"LOPdooG(<<PFP""a'"5::f--4tFLL [ Qs   )F)%F.c                     |d   }| j                   dk(  r,|dk(  ry|dk(  ry|dk(  ry|d	k(  ry
|dk(  rydt        |      z   S |S )r\   r   r   version	00versionauthor01authornotes02noteslayers98layersdocumentation99documentationr{   r|   rl   s      r   r$   zKeymapJSONEncoder.sort_dict   sd     1g!!Q&i"! !'( c#h&
r   N)rS   rT   rU   rV   rD   r$   rk   r   r   r   r      s     MDr   r   c                       e Zd ZdZd Zy)UserspaceJSONEncoderzMCustom encoder to make userspace qmk.json's a little nicer to work with.
    c                 F    |d   }| j                   dk(  r|dk(  ry|dk(  ry|S )r\   r   r   userspace_version00userspace_versionbuild_targets01build_targetsr   rl   s      r   r$   zUserspaceJSONEncoder.sort_dict   s7     1g!!Q&)),o%(
r   NrS   rT   rU   rV   r$   rk   r   r   r   r      s    r   r   c                       e Zd ZdZd Zy)CommunityModuleJSONEncoderzJCustom encoder to make qmk_module.json's a little nicer to work with.
    c                     |d   }| j                   dk(  r&|dk(  ry|dk(  ry|dk(  ry|d	k(  ry
|dk(  ry|dk(  ry|S | j                   dk(  r|dk(  ry|dk(  ry|S )r\   r   r   module_name00module_namers   01maintainerlicense	02licenseurl03urlfeatures
04featureskeycodes
05keycodes   r   00keyaliases	01aliasesr   rl   s      r   r$   z$CommunityModuleJSONEncoder.sort_dict   s     1g!!Q&m#&l"%i"e|j #j # 
 ##q(e|i"
r   Nr   rk   r   r   r   r      s    r   r   )rV   r&   decimalr   r   JSONEncoderr   rZ   r   r   r   rk   r   r   <module>r      s^     
UNT%% UNp:n :z= =@> $ r   