
    7j]?                     
   d dl 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
 d dlmZmZ d dlmZ d dlmZmZmZmZ d d	lmZmZmZ e j2                  d
        Zd Zd Zd?dZd Zd Zd Z d Z! ejD                  dddejF                  jH                  d       ejD                  ddddd       ejD                  ddddd       ejD                  dd deed!"       ejD                  d#d$dejF                  jK                  d%       ed&      d'(       ejL                  d)      d*                                           Z' ejD                  dddejF                  jH                  d       ejD                  ddddd       ejD                  dd deed+"       ejD                  d#d$ejF                  jK                  d%      d ed&      d,-       ejL                  d.      d/                                    Z( ejD                  dddejF                  jH                  d       ejD                  ddddd       ejD                  dd deed0"       ejD                  d#d$ejF                  jK                  d%      d ed&      d,-       ejL                  d1      d2                                    Z)d3 Z* ejD                  dddejF                  jH                  d       ejD                  ddddd       ejD                  dd deed4"       ejD                  d#d$ejF                  jK                  d%      d ed&      d,-       ejL                  d5      d6                                    Z+ ejD                  dddejF                  jH                  d       ejD                  ddddd       ejD                  dd deed0"       ejD                  d#d$ejF                  jK                  d%      d ed&      d,-       ejL                  d7      d8                                    Z, ejD                  dddejF                  jH                  d       ejD                  ddddd       ejD                  dd deed9"       ejD                  d#d$ejF                  jK                  d%      d ed&      d,-       ejL                  d:      d;                                    Z- ejD                  dddejF                  jH                  d       ejD                  ddddd       ejD                  dd deed<"       ejD                  d#d$ejF                  jK                  d%      d ed&      d,-       ejL                  d=      d>                                    Z.y)@    N)FilesCompleter)Pathcli)get_modules)keyboard_completerkeyboard_folder)
dump_lines)GPL2_HEADER_C_LIKEGENERATED_HEADER_C_LIKEGPL2_HEADER_SH_LIKEGENERATED_HEADER_SH_LIKE)module_api_listload_module_jsonsfind_module_pathc              #      K   |j                   r| j                  d|j                           d  |j                   r| j                  d|j                           y y w)Nz#if z#endif  // )guardappend)linesapis     [/home/hanthebot/chat/keyboard/qmk_firmware/lib/python/qmk/cli/generate/community_modules.py_render_api_guardr      sJ     
yytCII;'(	
yy{399+./ s   AAc                     g }| j                   rG|j                  d       t        ||       5  |j                  d| j                    d       d d d        |S |S # 1 sw Y   |S xY w)N z
#include <>)headerr   r   )r   r   s     r   _render_api_headerr      s[    E
zzRuc* 	5LL:cjj\34	5L5L	5Ls    AA"c           
      p   g }|j                  d       |j                  d       d}| D ]  }t        |d         j                  }|j                  dg       }t	        |      dkD  s<|j                  d|        |D ]r  }|j                  dd       }|r|j                  d	| d
       d}n|j                  d	| d       |j                  dg       D ]  }|j                  d	| d| d        t |j                  d        |j                  d       |j                  d       |j                  d       |S )Nr   zenum {Tmodulekeycodesr   z    // From module: key    z = QK_COMMUNITY_MODULE,F,aliases = z    LAST_COMMUNITY_MODULE_KEYz};zxSTATIC_ASSERT((int)LAST_COMMUNITY_MODULE_KEY <= (int)(QK_COMMUNITY_MODULE_MAX+1), "Too many community module keycodes");)r   r   namegetlen)	module_jsonsr   firstmodule_jsonmodule_namer    keycoder!   aliass	            r   _render_keycodesr/   !   s?   E	LL	LLE# ;x0166??:r2x=1LL/}=># :kk%.LL4u,C!DE!ELL4uA/$[[B7 :ELL4wc#a!89:: LL 
LL01	LL	LL  L  ML    Tc                    g }|j                  d       t        ||       5  |rv|j                  | j                   d| j                   d| d| j                   d       |j                  | j                   d| j                   d| d| j                   d       |j                  | j                   d| j                   d| d| j                   d       d d d        |S # 1 sw Y   |S xY w)Nr    __user();_kb(()r   r   ret_typer&   args)r   r   user_kbr   s       r   _render_api_declarationsr;   ;   s    E	LL	5#	& ILLCLL>388*AfXVCHH:RPQLLCLL>388*AfXT#((2NO~Qsxxj&388*BGH	I
 LI
 Ls   B4CC(c                 @   t        |      j                  }g }|j                  d       t        ||       5  |j                  d| j                   d| j                   d| d| j
                   d	       | j                  dk(  r|j                  d       n/| j                  d	v r |j                  d
| j                   d       n	 |j                  d       |j                  d       |j                  d| j                   d| j                   d| d| j
                   d	       | j                  dk(  rA|j                  d| j                   d| d| j                   d       |j                  d       nm| j                  d	v r0|j                  d
| j                   d| d| j                   d       n/|j                  d| j                   d| d| j                   d       |j                  d       |j                  d       |j                  d| j                   d| j                   d| d| j
                   d	       | j                  dk(  rA|j                  d| j                   d| d| j                   d       |j                  d       nm| j                  d	v r0|j                  d
| j                   d| d| j                   d       n/|j                  d| j                   d| d| j                   d       |j                  d       d d d        |S # 1 sw Y   |S xY w)Nr   z__attribute__((weak)) r2   r3   r4   ) {boolz    return true;layer_state_treport_mouse_t    return ;}r6   z    if(!z)) { return false; }r5   r"   r7   )r   r&   r   r   r8   r9   call_params)r   r   r,   r   s       r   _render_api_implementationsrF   F   s   v,##KE	LL	5#	& !-cll^1SXXJa}TZ[^[c[cZddhij<<6!LL+,\\@@LL;s&7q9:SR 	-cll^1SXXJa}TXY\YaYaXbbfgh<<6!LL8CHH:Q{m6#//ARRhijLL+,\\@@LL;sxxj+fS__DUUWXYLL4z;-vcoo=NbQRSR 	-cll^1SXXJa}TUVYV^V^U__cde<<6!LL8CHH:Q{m4?PPfghLL+,\\@@LL;sxxj+d3??BSSUVWLL4z;-tCOO;LBOPSC!D LE!D Ls   KLLc                    g }|j                  d       t        ||       5  |j                  | j                   d| j                   d| j                   d       | j                  dk(  r|j                  d       |D ]  }t        |      j                  }| j                  dk(  r0|j                  d| j                   d| d	| j                   d
       W| j                  dv r=|j                  d| j                   d| j                   d| d	| j                   d	       |j                  d| j                   d| d	| j                   d        | j                  dk(  r|j                  d       n-| j                  dv r|j                  d| j                   d       |j                  d       d d d        |S # 1 sw Y   |S xY w)Nr   r2   z	_modules(r=   r>   z    return truez        && r3   r7   )r?   r"   r%   r5   z    ;rB   rC   rD   )r   r   r8   r&   r9   r   rE   )r   modulesr   r   r,   s        r   _render_core_implementationrJ   o   s   E	LL	5#	& ~Qsxxj	#((4HI<<6!LL*+ 	RFv,++K||v%{388*Ak]!COOCTTUVW!DDtCOO#4Cz;-qQTQ`Q`PaacdetCHH:Q{m1S__<MRPQ	R <<6!LL!\\@@LL;s&7q9:S!" L#" Ls   FF77Gc                     g }| j                         D ]1  \  }}|j                         }|rdnd}|j                  | d|        3 |S )Nyesnoz_ENABLE=)itemsupperr   )features_dictr   featureenableds       r   _generate_features_rulesrS      sV    E)//1 4--/"%y	234 Lr0   c                    g }t        | |      }t        |      dkD  r|j                  d       |j                  d       |D ]_  }t        j                  j                  t        |            }|st        d| d      |j                  d       |j                  d|j                          |j                  d|j                  j                          d       |j                  d	|        |j                  d
|        |j                  d| d|j                   d       |j                  d|j                  j                          d|j                          |j                  d|j                  j                          d|        |j                  d| d       b t        |      }|D ]L  }d|v s|j                  d       |j                  d|d           |j                  t        |d                N |S )Nr   r   z+OPT_DEFS += -DCOMMUNITY_MODULES_ENABLE=TRUEzModule 'z' not found.zCOMMUNITY_MODULES += zOPT_DEFS += -DCOMMUNITY_MODULE_z_ENABLE=TRUEzCOMMUNITY_MODULE_PATHS += z	VPATH += zSRC += $(wildcard /z.c)MODULE_NAME_z := MODULE_PATH_z	-include z	/rules.mkfeaturesz
# Module: r,   )r   r(   r   qmkpathunix_style_pathr   FileNotFoundErrorr&   rO   r   extendrS   )keyboardfilenamer   rI   r   module_pathr)   r+   s           r   _generate_modules_rulesra      s   E(H-G
7|aRBC 	=F((223CF3KLK'(6(,(GHHLLLL01A1A0BCDLL:;;K;K;Q;Q;S:TT`abLL5k]CDLL9[M23LL-k]!K<L<L;MSQRLL<(8(8(>(>(@'AkFVFVEWXYLL<(8(8(>(>(@'Ak]STLL9[M;<	= )1' 	PK[(R z+m*D)EFG5k*6MNO		P
 Lr0   z-oz--outputzFile to write to)arg_onlytypehelpz-qz--quiet
store_truez&Quiet mode, only output error messages)rb   actionrd   z-ez--escapezEscape spaces in quiet modez-kbz
--keyboardz"Keyboard to generate rules.mk for.)rb   rc   	completerrd   r_   ?rz.jsonzuA configurator export JSON to be compiled and flashed or a pre-compiled binary firmware file (bin/hex) to be flashed.)nargsrb   rc   rg   rd   z=Creates a community_modules_rules_mk from a keymap.json file.c                    t         t        g}|j                  t        | j                  j
                  | j                  j                               t        | j                  j                  |       | j                  j                  r| j                  j                  rt| j                  j                  r>t        | j                  j                  j                         j                  dd             y t        | j                  j                         y | j                  j                  d| j                  j                         y y )Nr2   z\ zWrote rules.mk to %s.)r   r   r]   ra   r9   r^   r_   r
   outputquietescapeprintas_posixreplaceloginfo)r   rules_mk_liness     r   #generate_community_modules_rules_mkru      s     *+CDN1#((2C2CSXXEVEVWX sxx/
xx88>>xxchhoo..088eDEchhoo&GGLL0#((//B r0   z-Keyboard to generate community_modules.h for.zConfigurator JSON file)rj   rc   rb   rg   rd   z6Creates a community_modules.h from a keymap.json file.c                    | j                   j                  r4| j                   j                  j                  dk(  rd| j                   _        t               \  }}}}}t        t
        dddddddd	d
| d| d| dd| ddddg}t        | j                   j                  | j                   j                        }t        |      }t        |      dkD  r|j                  t        |             |D ]  }	|j                  t        |	              |D ]\  }
|j                  d       |j                  d|
        |D ]0  }	|j                  t        |	t!        |
      j                               2 ^ |j                  d       |j                  d       |D ]  }	|j                  t        |	dd             ! t#        | j                   j                  || j                   j$                  d       y)z:Creates a community_modules.h from a keymap.json file
    -Nz#pragma oncez#include <stdint.h>z#include <stdbool.h>z#include <keycodes.h>r   z#include "compiler_support.h"z#define COMMUNITY_MODULES_API_VERSION_BUILDER(ver_major,ver_minor,ver_patch) (((((uint32_t)(ver_major))&0xFF) << 24) | ((((uint32_t)(ver_minor))&0xFF) << 16) | (((uint32_t)(ver_patch))&0xFF))zL#define COMMUNITY_MODULES_API_VERSION COMMUNITY_MODULES_API_VERSION_BUILDER(r#   rH   aD  #define ASSERT_COMMUNITY_MODULES_MIN_API_VERSION(ver_major,ver_minor,ver_patch) STATIC_ASSERT(COMMUNITY_MODULES_API_VERSION_BUILDER(ver_major,ver_minor,ver_patch) <= COMMUNITY_MODULES_API_VERSION, "Community module requires a newer version of QMK modules API -- needs: " #ver_major "." #ver_minor "." #ver_patch ", current: z.")zdtypedef struct keyrecord_t keyrecord_t; // forward declaration so we don't need to include quantum.hr   z// From module: z// Core wrapperrI   F)r:   Tremove_repeated_newlines)r9   rl   r&   r   r   r   r   r^   r_   r   r(   r]   r/   r   r   r;   r   r
   rm   )r   api_listapi_version	ver_major	ver_minor	ver_patchr   rI   r)   r   r   s              r   generate_community_modules_hr      s    xx388??//36=L=N:Hk9i 	
'
 	J
VW`Vaabclbmmnoxnyyz{ O  P[  O\  \_  	`
o
E$ #((++SXX->->?G$W-L
7|a%l34 	2CLL+C01	2  	OFLLLL+F845 O5c4<;L;LMNO	O
 	R&' 	RCLL1#y%PQ	R sxxsxx~~PTUr0   z-Keyboard to generate community_modules.c for.z6Creates a community_modules.c from a keymap.json file.c           
         | j                   j                  r4| j                   j                  j                  dk(  rd| j                   _        t               \  }}}}}t        t
        ddg}t        | j                   j                  | j                   j                        }t        |      dkD  r^|D ]7  }|D ]0  }|j                  t        |t        |      j                               2 9 |D ]  }|j                  t        ||              t        | j                   j                  || j                   j                  d       y)z:Creates a community_modules.c from a keymap.json file
    rw   Nr   z#include "community_modules.h"r   Trx   )r9   rl   r&   r   r   r   r   r^   r_   r(   r]   rF   r   rJ   r
   rm   )r   rz   r3   r   rI   r   r   s          r   generate_community_modules_cr      s    xx388??//36*,HaAq 	
(	E #((++SXX->->?G
7|a 	RF R8d6l>O>OPQR	R  	DCLL4S'BC	D sxxsxx~~PTUr0   c                 P   | j                   j                  r4| j                   j                  j                  dk(  rd| j                   _        t        t        g}t        | j                   j                  | j                   j                        D ]b  }t        |       d| }|j                  d       |j                  d| d       |j                  d| d       |j                  d	| d       d t        | j                   j                  || j                   j                  d
       y)zNGenerates C code to include "<module_path>/include_file_name" for each module.rw   NrU   r   z#if __has_include("z")z
#include ""z#endif  // __has_include("Trx   )r9   rl   r&   r   r   r   r^   r_   r   r   r
   rm   )r   include_file_namer   r   	full_paths        r   _generate_include_per_moduler     s    
xx388??//36!89Echh//1B1BC A'/02C1DE	R*9+R89z)A./1)B?@A sxxsxx~~PTUr0   z;Keyboard to generate community_modules_introspection.h for.zDCreates a community_modules_introspection.h from a keymap.json file.c                     t        | d       y)zHCreates a community_modules_introspection.h from a keymap.json file
    zintrospection.hNr   r   s    r   *generate_community_modules_introspection_hr   ,       !&78r0   zDCreates a community_modules_introspection.c from a keymap.json file.c                     t        | d       y)zHCreates a community_modules_introspection.c from a keymap.json file
    zintrospection.cNr   r   s    r   *generate_community_modules_introspection_cr   7  r   r0   z:Keyboard to generate led_matrix_community_modules.inc for.zDCreates an led_matrix_community_modules.inc from a keymap.json file.c                     t        | d       y)zHCreates an led_matrix_community_modules.inc from a keymap.json file
    zled_matrix_module.incNr   r   s    r   )generate_led_matrix_community_modules_incr   B       !&=>r0   z:Keyboard to generate rgb_matrix_community_modules.inc for.zDCreates an rgb_matrix_community_modules.inc from a keymap.json file.c                     t        | d       y)zHCreates an rgb_matrix_community_modules.inc from a keymap.json file
    zrgb_matrix_module.incNr   r   s    r   )generate_rgb_matrix_community_modules_incr   M  r   r0   )T)/
contextlibargcomplete.completersr   pathlibr   milcr   qmk.pathrY   qmk.infor   qmk.keyboardr   r	   qmk.commandsr
   qmk.constantsr   r   r   r   qmk.community_modulesr   r   r   contextmanagerr   r   r/   r;   rF   rJ   rS   ra   argumentrZ   normpathFileType
subcommandru   r   r   r   r   r   r   r    r0   r   <module>r      s	    1      < # t t V V 0 04&R.: dJCHH4E4EL^_dI\HpqdJlIfge\DRd  lP  Qjd9J9J39O[ijq[r  zq  rOPC Q r Q h r `C& dJCHH4E4EL^_dI\Hpqe\DRd  l[  \j#((*;*;C*@4[ijq[r  zR  SHI-V J S \ r `
-V` dJCHH4E4EL^_dI\Hpqe\DRd  l[  \j#((*;*;C*@4[ijq[r  zR  SHIV J S \ r `
V8V" dJCHH4E4EL^_dI\Hpqe\DRd  li  jj#((*;*;C*@4[ijq[r  zR  SVW9 X S j r `
9 dJCHH4E4EL^_dI\Hpqe\DRd  l[  \j#((*;*;C*@4[ijq[r  zR  SVW9 X S \ r `
9 dJCHH4E4EL^_dI\Hpqe\DRd  lh  ij#((*;*;C*@4[ijq[r  zR  SVW? X S i r `
? dJCHH4E4EL^_dI\Hpqe\DRd  lh  ij#((*;*;C*@4[ijq[r  zR  SVW? X S i r `
?r0   