
    7jr-              
          d 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	 ddl
ZddlmZ dd	lmZ dd
lmZ dddddddddddddddZdddddddddddddddddddZ G d  d!      Zej*                  j-                   ej.                         d"      ej*                  j0                  z   Z ed#$      d%        Zd& Zd' Zd( Zd) Zd* Zd+ Z d, Z!d- Z" ed$      d.        Z#d/ Z$d0 Z%d7d1Z&d2 Z'd3 Z(d4 Z)d5 Z*d6 Z+y)8z,Functions that help us work with keyboards.
    )array)	lru_cache)ceil)PathN)glob)parse_config_h_file)	json_load)parse_rules_mk_fileu   ┌u   ┐u   └u   ┘u   │u   ─)tltrblbrvh |_)unicodeasciiu   ╭u   ╮u   ╰u   ╯u   ▲u   ▼)r   r   r   r   vlvrr   r   \/)r   r   r   r   r   r   r   r   c                   "    e Zd ZdZd Zd Zd Zy)AllKeyboardszRepresents all keyboards.
    c                      yNall selfs    E/home/hanthebot/chat/keyboard/qmk_firmware/lib/python/qmk/keyboard.py__str__zAllKeyboards.__str__<           c                      yr   r   r    s    r"   __repr__zAllKeyboards.__repr__?   r$   r%   c                 "    t        |t              S N)
isinstancer   )r!   others     r"   __eq__zAllKeyboards.__eq__B   s    %..r%   N)__name__
__module____qualname____doc__r#   r'   r,   r   r%   r"   r   r   9   s    /r%   r   	keyboards   )maxsizec                  *    t        t        d            S )N$data/mappings/keyboard_aliases.hjson)r	   r   r   r%   r"   keyboard_alias_definitionsr6   I   s    T@ABBr%   c                 L    t        | t              r| dk(  S t        | t              S )z<Returns True if the keyboard is an AllKeyboards object.
    r   )r*   strr   keyboards    r"   is_all_keyboardsr;   N   s&     (C E!"h--r%   c                  "   t         j                  j                         } | st         j                  j                         } | rt	        | j
                        dkD  r| j
                  d   dk(  rt        dj                  | j
                  dd             }d|j
                  v rCt	        |j
                        |j
                  j                  d      z
  dz
  }|j                  |   }t         j                  j                  |      rt        |      S yyyy)zCReturns a keyboard name based on the user's current directory.
    r2   r   r1   r   Nkeymaps)qmkpathunder_qmk_userspaceunder_qmk_firmwarelenpartsr   joinindexparentsis_keyboardr8   )relative_cwdcurrent_pathkeymap_indexs      r"   find_keyboard_from_dirrK   V   s     88//1Lxx224L../!38J8J18MQ\8\CHH\%7%7%;<=***|112\5G5G5M5Mi5XX[\\L'//=L88-|$$ . 9]3|r%   c                     t         j                  j                  |       }t        d      }|dz  j	                         s&||k(  ry|j
                  }|dz  j	                         s&|dz  S )z*Returns the readme for this keyboard.
    r1   z	readme.mdN)r>   r?   r:   r   existsparent)r:   cur_dirkeyboards_dirs      r"   find_readmerQ   j   sg     hh)G%M$,,.m#.. $,,.
 [  r%   c                     t               }| |v r"| }||    j                  d|       } | |k(  rn| |v r"t        j                  j	                  |       st        d|        | S )zlReturns the actual keyboard folder.

    This checks aliases to resolve the actual path for a keyboard.
    targetzInvalid keyboard: )r6   getr>   r?   rG   
ValueError)r:   aliaseslast_keyboards      r"   keyboard_folderrX   w   sq    
 )*G
g
 8$((8<}$	 g
 88)-hZ899Or%   c                      t        t        d             v r    j                  d        t        t	         fdj                                     }|j                          t        t        |            }|S )z^Returns the list of aliases for the supplied keyboard.

    Includes the keyboard itself.
    r5   rS   c                 4    |    j                  dd      k(  S )NrS    )rT   )krV   r:   s    r"   <lambda>z"keyboard_aliases.<locals>.<lambda>   s    WQZ^^Hb%AX%M r%   )	r	   r   rT   setfilterkeysaddlistsorted)r:   r1   rV   s   ` @r"   keyboard_aliasesrd      sm    
 CDEG78$((8<FMw||~^_IMM(VI&'Ir%   c                 6    | dk(  r
t               S t        |       S )zReturns the actual keyboard folder.

    This checks aliases to resolve the actual path for a keyboard.
    If the supplied argument is "all", it returns an AllKeyboards object.
    r   )r   rX   r9   s    r"   keyboard_folder_or_allrf      s     5~8$$r%   c                     | j                  t        d      j                  t        j                  j
                  d      d   S )zMDetermine the keyboard name by stripping off the base_path and filename.
    r[   r2   r   )replace	base_pathrsplitosr?   sep)r?   s    r"   
_find_namerm      s/     <<	2&--bggkk1=a@@r%   c                     t               S )z4Returns a list of keyboards for tab completion.
    )list_keyboards)prefixactionparserparsed_argss       r"   keyboard_completerrt      s     r%   c                  b   t         j                  j                  t        dd      } t	        | d      D cg c]?  }t         j                  j
                  dz   t         j                  j
                  z   |vs>|A }}t        t        |      }t        d |      }t        t        |            S c c}w )z%Returns a list of all keyboards.
    z**zkeyboard.jsonT)	recursiver=   c                 F    t        t        |       j                               S r)   )r8   r   as_posix)xs    r"   r]   z list_keyboards.<locals>.<lambda>   s    #d1g..01 r%   )
rk   r?   rD   ri   r   rl   maprm   rc   r^   )kb_wildcardr?   pathsfounds       r"   ro   ro      s    
 '',,y$@K";$?ud277;;QZCZ]_]d]d]h]hChptCtTuEu
E"E 159E#e* vs   ?B,5B,c                     i }t        d      }t        |       } | j                  D ]  }||z  }i |t        |dz        } |S )zParses all the config.h files for a keyboard.

    Args:
        keyboard: name of the keyboard

    Returns:
        a dictionary representing the content of the entire config.h tree for a keyboard
    r1   zconfig.h)r   rC   r   )r:   configrO   dirs       r"   config_hr      s[     F;GH~H~~ IC-HFH1'J2FGHI Mr%   c                     t        d      }t        |       } t        || z  dz        }t        | j                        D ]  \  }}||z  }t        |dz  |      } |S )zGet a rules.mk for a keyboard

    Args:
        keyboard: name of the keyboard

    Returns:
        a dictionary representing the content of the entire rules.mk tree for a keyboard
    r1   zrules.mk)r   r
   	enumeraterC   )r:   rO   rulesir   s        r"   rules_mkr      sj     ;GH~H( 2Z ?@EHNN+ A3C-#Gj$8%@A Lr%   c           
         t        d      D cg c]  }t        dd       }}|rdnd}| D ]  }|j                  dd      }|j                  dd      }|j                  d	d
      }|j                  dd
      }	|r(|j                  d      }
|
j	                  d      r|
dd }
n|j                  dd      }
d|v rt        |||||	|
|       |dk\  r|dk(  r|	dk(  rt        |||||	|
|       |dk(  r|	dk(  rt        |||||	|
|       t        |||||	|
|        g }|D ]N  }|j                         j                         s"|j                  |j                         j                                P dj                  |      S c c}w )zRenders a single layout.
    d   uz                                                                                                                                                                                                        r   r   ry   r   ywr2   r   KC_   Nlabelr[   encoderg      ?g      ?   g      ?
)ranger   rT   pop
startswithrender_encoderrender_key_isoenterrender_key_baenterrender_key_rect	tounicodestripappendrstriprD   )layout_datarender_ascii
key_labelsry   textpadstylekeyr   r   r   r   lineslines                r"   render_layoutr      s    /4Cj9uS)$9G9#GE ?GGCOGGCOGGCOGGCONN1%E&ab	GGGR(E7Aq!Qu=$Y19aAq!UEB#X!q&w1aE5AGQ1a>)?, E 4>>!!#LL)00234 99U= :s   E>c                 R    i }| d   D ]  }| d   |   d   }t        ||      ||<    |S )z;Renders all the layouts from an `info_json` structure.
    layoutslayout)r   )	info_jsonr   r   r   r   s        r"   render_layoutsr     sJ     GI& C	*628<'\BC Nr%   c                 X   t         |   }t        |dz        }t        |dz        }t        |dz        }t        |dz        }|dz
  }|t        |      z
  }	t        |      |kD  r|d | }d|z  }
|d   |z  }|d|	z  z   }t        d|d   |z   |d   z         }t        d|d	   |z   |d	   z         }t        d|d	   |
z   |d	   z         }t        d|d
   |z   |d   z         }|| |   |||z    || |dz      |||z    t	        |dz
        D ]  }|| ||z   dz      |||z     || ||z   dz
     |||z    y )N   r   r   r   r   r   r   r   r   r   r   r2   )BOX_DRAWING_CHARACTERSr   rB   r   r   r   ry   r   r   r   r   r   	box_chars	label_lenlabel_leftoverlabel_blanklabel_borderlabel_middletop_linelab_linemid_linebot_liner   s                     r"   r   r     s   &u-IQUAQUAQUAQUAAIU+N
5zIjy!	/KS>I-L3//LS)D/L89T?JKHS)C.<7)C.HIHS)C.;63GHHS)D/L89T?JKH"GAJqQ&GAEN1QU1q5\ /&.A	1QU#/"*GAEAIqQr%   c                    t         |   }t        |dz        }t        |dz        }t        |dz        }t        |dz        }|dz
  }|t        |      z
  }	t        |      |kD  r|d | }d|dz
  z  }
|d   |z  }|d   |dz
  z  }|d|	z  z   }t        d|d   |z   |d   z         }t        d|d	   |z   |d	   z         }t        d|d
   |d   z   |
z   |d	   z         }t        d|d	   |
z   |d	   z         }t        d|d
   |z   |d   z         }|| |   |dz
  ||z    || |dz      |dz
  ||z    || |dz      |dz
  ||z    || |dz      |||z    || |dz      |||z    || |dz      |||z    y )Nr   r   r2   r   r   r   r   r   r   r   r   r      r   r   rB   r   )r   ry   r   r   r   r   r   r   r   r   r   label_border_toplabel_border_bottomr   r   r   crn_liner   r   s                      r"   r   r   7  s   &u-IQUAQUAQUAQUAAIU+N
5zIjy!Q'K ~	1#C.IM:3//LS)D/,<<yNOHS)C.<7)C.HIHS)D/IdO;kIIVYNZ[HS)C.;63GHHS)D/,??)D/QRH&GAJq1uQU"*GAEN1q5Q"*GAEN1q5Q&GAEN1QU&GAEN1QU&GAEN1QUr%   c                    t         |   }t        |dz        }t        |dz        }t        |dz        }t        |dz        }|dz   }|t        |      z
  }	t        |      |kD  r|d | }d|dz
  z  }
|d   |dz
  z  }|d   |z  }|d|	z  z   }t        d|d   |z   |d   z         }t        d|d	   |
z   |d	   z         }t        d|d   |d   z   |d   z   |d
   z   |
z   |d	   z         }t        d|d	   |z   |d	   z         }t        d|d   |z   |d
   z         }|| |   |||z    || |dz      |||z    || |dz      |||z    || |dz      |dz
  ||z    || |dz      |dz
  ||z    || |dz      |dz
  ||z    y )Nr   r   r2   r   r   r   r   r   r   r   r   r   r   r   )r   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s                      r"   r   r   W  s   &u-IQUAQUAQUAQUAAIU+N
5zIjy!Q'K ~Q7#C.943//LS)D/,<<yNOHS)C.;63GHHS)D/IcN:Ys^KiX\o]`kknwx{n||}HS)C.<7)C.HIHS)D/,??)D/QRH"GAJqQ&GAEN1QU&GAEN1QU"*GAEN1q5Q"*GAEN1q5Q"*GAEN1q5Qr%   c                 X   t         |   }t        |dz        }t        |dz        }t        |dz        }t        |dz        }|dz
  }|t        |      z
  }	t        |      |kD  r|d | }d|z  }
|d   |z  }|d|	z  z   }t        d|d   |z   |d   z         }t        d|d	   |z   |d
   z         }t        d|d   |
z   |d   z         }t        d|d   |z   |d   z         }|| |   |||z    || |dz      |||z    t	        |dz
        D ]  }|| ||z   dz      |||z     || ||z   dz
     |||z    y )Nr   r   r   r   r   r   r   r   r   r   r   r   r   r2   )ENC_DRAWING_CHARACTERSr   rB   r   r   r   s                     r"   r   r   w  s   &u-IQUAQUAQUAQUAAIU+N
5zIjy!	/KS>I-L3//LS)D/L89T?JKHS)D/L89T?JKHS)C.;63GHHS)D/L89T?JKH"GAJqQ&GAEN1QU1q5\ /&.A	1QU#/"*GAEAIqQr%   r)   ),r0   r   	functoolsr   mathr   pathlibr   rk   r   qmk.pathr>   qmk.c_parser   qmk.json_schemar	   qmk.makefiler
   r   r   r   r?   rD   getcwdrl   ri   r6   r;   rK   rQ   rX   rd   rf   rm   rt   ro   r   r   r   r   r   r   r   r   r   r%   r"   <module>r      se       	   + % ,   ( 	 	 0
/ 
/ GGLLk2RWW[[@	 1C C.%(
!& 	%A 4 ((!H	+:'@+@+r%   