
    7j8a                     8   d Z ddlZddlZddlmZ ddlmZ ddlZddlm	Z	 ddl
mZ ddlmZ ddlmZ ddlZdd	lmZmZmZ dd
lmZmZmZ ddlmZ ddlmZ dZd Zd Z d Z!d Z"d Z#d Z$d Z%d!dZ&d"dZ'd Z(d Z)d"dZ*d"dZ+d Z,d#dZ-efdZ.d Z/d$dZ0d$d Z1y)%z/Functions that help you work with QMK keymaps.
    N)Path)DEVNULL)cli)CLexer)Token)lex)QMK_FIRMWAREQMK_USERSPACEHAS_QMK_USERSPACE)find_keyboard_from_dirkeyboard_folderkeyboard_aliases)CppError)	info_jsona  #include QMK_KEYBOARD_H
#if __has_include("keymap.h")
#    include "keymap.h"
#endif
__INCLUDES__

/* THIS FILE WAS GENERATED!
 *
 * This file was generated by qmk json2c. You may or may not want to
 * edit it directly.
 */

__KEYMAP_GOES_HERE__
__ENCODER_MAP_GOES_HERE__
__DIP_SWITCH_MAP_GOES_HERE__
__MACRO_OUTPUT_GOES_HERE__

#ifdef OTHER_KEYMAP_C
#    include OTHER_KEYMAP_C
#endif // OTHER_KEYMAP_C
c           
          dg}t        | d         D ]T  \  }}|dk7  r|d   dz   |d<   t        t        |      }dj                  |      }|j	                  d|d| d	   d
|d       V |j	                  d       |S )Nz>const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {layersr   ,,     [z] = layout()};)	enumeratemap
_strip_anyjoinappend)keymap_jsonlines	layer_numlayer
layer_keyss        C/home/hanthebot/chat/keyboard/qmk_firmware/lib/python/qmk/keymap.py_generate_keymap_tabler&   ,   s    MNE%k(&;< [	5>b	CE"IJ&YYu%
I{87LjYZ[ 
LLL    c                 6   ddg}t        | d         D ]k  \  }}|dk7  r|d   dz   |d<   dj                  |D cg c]#  }dt        |d	          dt        |d
          d% c}      }|j                  d|d|d       m |j	                  ddg       |S c c}w )Nz:#if defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE)zFconst uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {encodersr   r   r   r   zENCODER_CCW_CW(ccwcwr   r   z] = {}r   z@#endif // defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE))r   r   r   r   extend)r    r!   r"   r#   eencoder_keycode_txts         r%   _generate_encodermap_tabler0   8   s    DPE &k*&=> K	5>b	CE"I"iisx(yno?:ah;O:PPRS]^_`d^eSfRggh)i(yz)5HIJ	K
 
LL$Z[\L )zs   (B
c           
          ddg}t        | d         D ]E  \  }}|dk7  r|d   dz   |d<   |j                  dt        |d          d	t        |d
          d       G |j                  ddg       |S )Nz@#if defined(DIP_SWITCH_ENABLE) && defined(DIP_SWITCH_MAP_ENABLE)zKconst uint16_t PROGMEM dip_switch_map[NUM_DIP_SWITCHES][NUM_DIP_STATES] = {dip_switchesr   r   r   z    DIP_SWITCH_OFF_ON(offr   onr   r   zF#endif // defined(DIP_SWITCH_ENABLE) && defined(DIP_SWITCH_MAP_ENABLE))r   r   r   r-   )r    r!   indexswitchs       r%   _generate_dipswitchmap_tabler7   F   s    JUE #;~#>? hvA:b	CE"I-j.G-H:V\]aVbKcJddefgh 
LL$`abLr'   c           
      2   g d}t        | d         D ]+  \  }}g }|D ]  }t        |t              r|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }|j                  d	d
      }|j                  dd      }|j	                  d| d       t        |t
              sg }|d   dk(  r|j	                  d|d    d       n|d   dk(  r|j	                  d       n|d   dk(  rt        |d         dkD  rp|d   j                         }|d   D ]  }|j	                  d| d        |j	                  d| d       t        |d         D ]  }|j	                  d| d        n3|d   D ]+  }|j	                  d|d   j                          d| d       - |j	                  dj                  |              dj                  |      }	|	j                  dd      }	|j	                  d| d       |j	                  d |	 d!       |j	                  d"       . |j	                  d#       |j	                  d$       |j	                  d%       |j	                  d&       |j	                  d       |S )'N)zAbool process_record_user(uint16_t keycode, keyrecord_t *record) {z     if (record->event.pressed) {z        switch (keycode) {macros\z\\z
z\n
	z\t"z\"actiondelayz	SS_DELAY(durationr   beepz"\a"tapkeycodes   z
SS_DOWN(X_z	SS_TAP(X_zSS_UP(X_SS_z(X_ z""z            case QK_MACRO_:z                SEND_STRING(z);z                return false;z	        }z    }z
    return true;r   )r   
isinstancestrreplacer   dictlenpopreversedupperr   )
r    	macro_txtimacro_arraymacromacro_fragment	newstringlast_keycodekeycode	new_macros
             r%   _generate_macros_functionrZ   S   s   I $K$9: ,:;) #	1N.#.!/!7!7f!E!/!7!7!F!/!7!7e!D!/!7!7e!D!/!7!7e!D!/!7!7U!Cq 023ND1	!(+w6$$y
1K0LA%NO#H-7$$W-#H-63~j?Y;Z]^;^#1*#=#A#A#CL#1*#= B!((:gYa)@AB $$ya%@A#+N:,F#G @!((8G9A)>?@ $2*#= `!((3~h/G/M/M/O.PPST[S\\])^_` RWWY/0G#	1J GGEN	%%dB/	5aS:;7	{"EF89Y,:\ [!W)*TRr'   c                 T    | j                  d      r| j                  d      r| dd } | S )z!Remove ANY() from a keycode.
    zANY(r      r   )
startswithendswith)rX   s    r%   r   r      s/     &!g&6&6s&;!B-Nr'   c                      d }t         r- |t        j                  j                  |        \  }}|r|r||fS  |t        j                  j                  |        \  }}|r|r||fS y)zZReturns `(keymap_name, source)` for the directory provided (or cwd if not specified).
    c                 <   | rt        | j                        dkD  r | j                  d   dk(  rd| j                  v rt        dj                  | j                  dd              }d|j                  v r\|j                  dk7  rM|j
                  j                  dk7  r&|j
                  }|j
                  j                  dk7  r&|j                  dfS y| j                  d   dk(  rt        |       r| j                  dfS | j                  d   d	k(  r| j                  d   d
fS y)NrE   r   	keyboardskeymaps/keymap_directorylayoutslayouts_directoryusersusers_directoryNN)rM   partsr   r   nameparentis_keymap_dir)relative_pathcurrent_paths     r%   _impl_find_keymap_from_dirz8find_keymap_from_dir.<locals>._impl_find_keymap_from_dir   s   S!4!459""1%4mFYFY9Y#CHH]-@-@-D$EF 2 22|7H7HI7U&--22i?'3':': '--22i? (,,.@@@  $$Q'94}9U$))+>>> $$Q'72$**1-/@@@r'   ri   )r   qmkpathunder_qmk_userspaceunder_qmk_firmware)argsrp   rk   sources       r%   find_keymap_from_dirrw      sh    , 1#((2N2NPT2UVfF<-chh.I.I4.PQLD&V|r'   c           	         	 |j                   rt        |j                         S t               }|rt        |      S 	 g S # t        $ rD}t	        j
                  d|j                  j                   dt        |              g cY d}~S d}~ww xY w)z2Returns a list of keymaps for tab completion.
    zError: z: N)	keyboardlist_keymapsr   	Exceptionargcompletewarn	__class____name__rJ   )prefixr?   parserparsed_argsry   r.   s         r%   keymap_completerr      s     4 455)+))  I	  71;;#7#7"83q6(CD	s    = = 	B
9B?B
B
c                     g }|r|j                  d       |r|j                  d       |D ]6  }| |z  j                         s|r|D ]  }| |z  j                         r  y  y y)a  Return True if Path object `keymap` has a keymap file inside.

    Args:
        keymap
            A Path() object for the keymap directory you want to check.

        c
            When true include `keymap.c` keymaps.

        json
            When true include `keymap.json` keymaps.

        additional_files
            A sequence of additional filenames to check against to determine if a directory is a keymap. All files must exist for a match to happen. For example, if you want to match a C keymap with both a `config.h` and `rules.mk` file: `is_keymap_dir(keymap_dir, json=False, additional_files=['config.h', 'rules.mk'])`
    keymap.ckeymap.jsonFTN)r   is_file)keymapcjsonadditional_filesfilesfileadditional_files          r%   rm   rm      sq      EZ ]# TM""$'7 %O"_4==?$% r'   c                 :    d|i}| |d<   ||d<   ||d<   |r||d<   |S )a  Returns a `keymap.json` for the specified keyboard, layout, and layers.

    Args:
        keymap
            A name for this keymap.

        keyboard
            The name of the keyboard.

        layout
            The LAYOUT macro this keymap uses.

        layers
            An array of arrays describing the keymap. Each item in the inner array should be a string that is a valid QMK keycode.

        macros
            A sequence of strings containing macros to implement for this keyboard.
    ry   r   r   r   r9    )r   ry   r   r   r9   
new_keymaps         r%   generate_jsonr      s?    & h'J!Jx!Jx!Jx%
8r'   c                 2   t         }d}d| v r!| d   t        |       }dj                  |      }|j                  d|      }d}d| v r!| d   t	        |       }dj                  |      }|j                  d|      }d}d| v r!| d   t        |       }dj                  |      }|j                  d|      }d}d	| v r!| d	   t        |       }	dj                  |	      }|j                  d
|      }d}
d| v r| d   d| d    d| d    d}
|j                  d|
      }|S )a  Returns a `keymap.c`.

    `keymap_json` is a dictionary with the following keys:

        keyboard
            The name of the keyboard

        layout
            The LAYOUT macro this keymap uses.

        layers
            An array of arrays describing the keymap. Each item in the inner array should be a string that is a valid QMK keycode.

        macros
            A sequence of strings containing macros to implement for this keyboard.
    rG   r   r;   __KEYMAP_GOES_HERE__r)   __ENCODER_MAP_GOES_HERE__r2   __DIP_SWITCH_MAP_GOES_HERE__r9   __MACRO_OUTPUT_GOES_HERE__host_languagez#include "keymap_z.h"
#include "sendstring_z.h"
__INCLUDES__)DEFAULT_KEYMAP_Cr&   r   rK   r0   r7   rZ   )r    r   r   	layer_txt
encodermapencoder_txtdipswitchmapdip_txtr9   rQ   hostlangs              r%   
generate_cr     sk   " "JF;;x#8#D*;7	9%##$:FCJJ[ [%<%H0=YY{+
##$?LJL$^)D)P.{;yy)##$BLQJF;;x#8#D-k:	9%##$@&IJH+%+o*F*R&{?'C&DD^_jkz_{^|  }B  C##NH=Jr'   c                     | j                   j                  dd       | j                  |       t        j                  j                  d|        | S )NT)parentsexist_okzWrote keymap to {fg_cyan}%s)rl   mkdir
write_textr   loginfo)keymap_filenamekeymap_contents     r%   
write_filer   C  sB       =~.GGLL.@r'   c                     t        | |||d      }t        j                  |      }t        j                  j                  |       d   |z  dz  }t        ||      S )a  Generate the `keymap.json` and write it to disk.

    Returns the filename written to.

    Args:
        keyboard
            The name of the keyboard

        keymap
            The name of the keymap

        layout
            The LAYOUT macro this keymap uses.

        layers
            An array of arrays describing the keymap. Each item in the inner array should be a string that is a valid QMK keycode.
    N)r9   r   r   )r   r   dumpsrq   rr   rb   r   )ry   r   r   r   r9   r    r   keymap_files           r%   
write_jsonr   L  sT    $  &&&NKZZ,N((""8,Q/&8=HKk>22r'   c                 .   t         j                  j                  |       st        dt	        |       z         d}t
        t        |       gi}t        r0t        t        t        |       gt        |                   |t        <   |j                         D ]  \  }}|D ]  }d}|j                  d      D ]t  }	|rdj                  ||	f      }n|	}t        |      t        d      z  |z  dz  }
|
|z  dz  j!                         r|
|z  dz  }|
|z  dz  j!                         sm|
|z  dz  }v  |s|c S  t#        | |      }t        t        d	      j%                  d
            }t        rAt        t              d	z  j!                         r!|j'                  t        t              d	z         |D ]j  }|j)                  dg       D ]S  }||z  |z  }|j!                         s|dz  j!                         r	|dz  c c S |dz  j!                         sL|dz  c c S  l y)z:Returns the path to a keymap for a specific keyboard.
    zInvalid keyboard: rG   rc   ra   rb   r   r   )force_layoutre   */community_layoutsN)rq   rr   is_keyboardKeyErrorreprr	   r   r   listsetr   r
   itemssplitr   r   existsr   globr   get)ry   r   r   keymap_pathsearch_conf
search_dirkeyboard_dirskeyboard_dirchecked_dirsfolder_name
keymap_dirr   community_parentscommunity_parentr   community_layouts                   r%   locate_keymapr   e  s&    88)+d8n<== K/(";!<=K &*#x/H.fK[\dKe.f*g%hM"%0%6%6%8 !
M) 	FLL+11#6 F#&88\;,G#HL#.L!*-[0AALPS\\
'*4<<>",v"5
"BK'-7??A",v"5"EKF	F #( XL9DT)_11$78d=1I=EEG  m!4y!@A- 9hh2B7 	9F/&86A&&($}4<<>+m;;$z199;+j88	99r'   c                 *    |dk(  ryt        | |      ryy)NallTF)r   )ry   r   s     r%   is_keymap_targetr     s    Xv&r'   c           	      R   t               }t        xr |}|rt        t        gnt        gD ]  }|t	        d      z  }	|	| z  }
|
|	k7  s|
dz  }|j                         rE|j                         D ]2  }t        ||||      s|r|n|j                  }|j                  |       4 |
j                  }
|
|	k7  rl t        |       }t        t	        d      j                  d            }|rAt	        t              dz  j                         r!|j                  t	        t              dz         |D ]t  }|j!                  dg       D ]]  }||z  }|j                         s|j                         D ]2  }t        ||||      s|r|n|j                  }|j                  |       4 _ v t#        |      S )a  List the available keymaps for a keyboard.

    Args:
        keyboard
            The keyboards full name with vendor and revision if necessary, example: clueboard/66/rev3

        c
            When true include `keymap.c` keymaps.

        json
            When true include `keymap.json` keymaps.

        additional_files
            A sequence of additional filenames to check against to determine if a directory is a keymap. All files must exist for a match to happen. For example, if you want to match a C keymap with both a `config.h` and `rules.mk` file: `is_keymap_dir(keymap_dir, json=False, additional_files=['config.h', 'rules.mk'])`

        fullpath
            When set to True the full path of the keymap relative to the `qmk_firmware` root will be provided.

        include_userspace
            When set to True, also search userspace for available keymaps

    Returns:
        a sorted list of valid keymap names.
    ra   rb   re   r   r   )r   r   r	   r
   r   is_diriterdirrm   rk   addrl   r   r   r   r   r   r   sorted)ry   r   r   r   fullpathinclude_userspacenameshas_userspacer   keyboards_dirkb_pathkeymaps_dirr   r   r   r   r   cl_paths                     r%   rz   rz     s   2 EE%;*;M 8E|]3<. %
"T+%66(*&!I-K!!#)113 *F$VQ6FG+3		&)*
 nnG &	% XDT)_11$78$}-	9AAC  m!4y!@A- *hh2B7 	*F&/G~~%oo/ *F$VQ6FG+3		&)*	** %=r'   c                     | rdt        |       gndg}t        j                  ||      }d|j                  v r/|j                  j	                  d      D ]  }d|v st        |       |j                  S )z Run a file through the C pre-processor

    Args:
        path: path of the keymap.c file (set None to use stdin)
        stdin: stdin pipe (e.g. sys.stdin)

    Returns:
        the stdout of the pre-processor
    cpp)stdinzfatal errorr;   )rJ   r   runstderrr   r   stdout)rr   r   cmdpre_processed_keymaplines        r%   _c_preprocessr     sx     !%5#d)
5'C773e4,333(//55d; 	'D$~&	'  &&&r'   c                    t               }d}d}dx}}dx}x}}t        ddt                     }	t        | t                     D ]  }
|
d   t        j
                  u r|r|	d   s?|
d   j                  d      s|
d   j                  d	      rd
|	d<   |
d   |	d<   V|
d   |	d<   _|	d   s	|
d   |	d<   m|sp|
d   dk(  rd}n|
d   dk(  rd}n|
d   }|r|	d   dxx   |z  cc<   |	d   j                  |       |
d   dk(  r|dk(  rd}|
d   dk(  r|dk(  rd}|
d   dk(  r|dk(  rd}|
d   dk(  s|dk(  sd}|
d   t        j                  u r|
d   dk(  s|dk(  sd}|
d   t        j                  j                  u r|
d   dk(  sH|dk(  sOd}S|
d   t        j                  u r|
d   |v rJ|dz  }|r.|rd}|	d   dxx   |
d   z  cc<   |
d   dk(  s|dk(  sd}|
d   dk(  s|dk(  sd}|
d   |v rx|dz  }|s|r|	d   dxx   |
d   z  cc<   |dk(  sd}|
d   d k(  r0|dk(  r+d}|j                  |	       t        ddt                     }	!|
d   d!k(  s+|dk(  s2d}d}8|s<|	d   dxx   |
d   z  cc<   Q|
d   t        j                  j                  j                  u r|r|s|	d   r|
d   |	d<   |s|	d   dxx   |
d   z  cc<    |S )"z Find the layers in a keymap.c file.

    Args:
        keymap: the content of the keymap.c file

    Returns:
        a dictionary containing the parsed keymap
    z({[z)}]r   F)rk   r   rD   rk   rE   LAYOUTKEYMAP0r   _______KC_TRNSXXXXXXXKC_NOrD   r   PROGMEM      rb   r\   MATRIX_ROWS   MATRIX_COLS   constuint16_tTr   {r   r,   )r   rL   r   r   r   Namer]   r   KeywordTypePunctuationLiteralNumberInteger)r   r   opening_bracesclosing_braceskeymap_certaintybrace_depth	is_keymapis_layer	is_adv_kcr#   r   kcs               r%   _get_layersr    sz    VFNN%&&{',,I,9eEDF;EFFH% d17ejj  V}Aw))(3tAw7I7I(7S ),f*.q'h(,Qfx&*1gE(O Aw)+&aI-$!!W  j)"-3-j)004 aI%*:a*?#$ aI%*:a*?#$ aM).>!.C#$ aM).>!.C#$ !W%Aw'!&6!&;#$ !W***Aw*$)9Q)>#$ !W)))Aw.(q $(	j)"-a8-aCK1,<#'!W^(8A(= $IaN*q  j)"-a8-&!+(-IaCK1,<#(e, $% OaCK1,<$)	+,( j!"%a0%!W,,4449 = $Qf j!"%a0%Id1L Mr'   c                 $   t        | t        t        f      r| dk(  r<|rt        dt        j
                        } n?t        j
                  j                         } n |rt        |       } n| j                  d      } t               }t        |       |d<   |S )a(   Parse a keymap.c file.

    Currently only cares about the keymaps array.

    Args:
        keymap_file: path of the keymap.c file (or '-' to use stdin)

        use_cpp: if True, pre-process the file with the C pre-processor

    Returns:
        a dictionary containing the parsed keymap
    -Nzutf-8)encodingr   )
rI   r   rJ   r   sysr   read	read_textrL   r  )r   use_cppr   s      r%   parse_keymap_cr  n  sw     kD#;/;#3E'cii8K))..*K'4K%///AKVF";/F8Mr'   c                 6   t        ||      }|j                  dd      }t               |d<   |D ]^  }|j                  d       |j                  d      }|j                  dd      s||d<   |d   j	                  |j                  d             ` | |d<   ||d<   |S )	ai   Convert keymap.c to keymap.json

    Args:
        keyboard: The name of the keyboard

        keymap: The name of the keymap

        layout: The LAYOUT macro this keymap uses.

        keymap_file: path of the keymap.c file

        use_cpp: if True, pre-process the file with the C pre-processor

    Returns:
        a dictionary in keymap.json format
    r   Nrk   r   FrD   ry   r   )r  rN   r   r   r   )ry   r   r   r  r    dirty_layersr#   r   s           r%   c2jsonr    s    " !g6K??8T2L FK <		&8$x/$*K!H$$UYYz%:;< 'K
"Kr'   )TTN)N)TTNFT)T)2__doc__r   r	  pathlibr   
subprocessr   r|   milcr   pygments.lexers.c_cppr   pygments.tokenr   pygmentsr   qmk.pathrq   qmk.constantsr	   r
   r   qmk.keyboardr   r   r   
qmk.errorsr   qmk.infor   r   r&   r0   r7   rZ   r   rw   r   rm   r   r   r   r   r   r   rz   r   r  r  r  r   r'   r%   <module>r     s     
     (     H H R R   .	
:z"J&D:0f3219h=@ & '&up:r'   