1111
1212# %%
1313columns = [
14- ("hut" , ";hut::HUT" ),
15- ("winput" , "winput::Vk" ),
16- ("vk" , "windows::VIRTUAL_KEY" ),
17- ("vk_value" , "vkcode" ),
18- ("hut_value" , "hkcode" ),
19- ("enigo_attr " , "#[cfg( enigo::Key)] " ),
20- ("enigo " , "enigo::Key " ),
21- ("keysym" , "xkeysym::Keysym" ),
22- ("cg" , "macos::KeyCode" ),
14+ ("hut" , ";hut::HUT" , "todo!(HUT)" ),
15+ ("winput" , "winput::Vk" , "na!(Vk)" ),
16+ ("vk" , "windows::VIRTUAL_KEY" , "todo!(VK_)" ),
17+ ("vk_value" , "vkcode" , "n!()" ),
18+ ("hut_value" , "hkcode" , "n!()" ),
19+ ("enigo " , " enigo::Key" , "todo!(Enigo) " ),
20+ ("enigo_attr " , "#[cfg(enigo::Key)]" , " " ),
21+ ("keysym" , "xkeysym::Keysym" , "todo!(Keysym)" ),
22+ ("cg" , "macos::KeyCode" , "todo!(CG)" ),
2323]
2424col_map = {col [0 ]: col [1 ] for col in columns }
25+ col_default = {col [0 ]: col [2 ] for col in columns }
2526col_map_rev = {col [1 ]: col [0 ] for col in columns }
2627def load_csv (filename : str ):
2728 df = pl .read_csv (filename )
@@ -51,11 +52,7 @@ def get_col_name(col: str, length: int):
5152 (pl .col (col ).str .pad_end (max_col_lengths [col ] - 1 if max_col_lengths [col ] >= 10 else max_col_lengths [col ] - 2 ).str .pad_start (max_col_lengths [col ])
5253 .alias (get_col_name (col , max_col_lengths [col ]))) for col in df .columns
5354 ]+ [pl .lit (None ).alias (" " )]).write_csv (filename )
54- df = load_csv (csv_filename )
55- save_csv (df , csv_filename )
56- df
5755
58- # %%
5956def parse_rs_match (code : str , starts_with : str = "" , blocking : tuple [str , str ] | None = None ) -> list [tuple [str , str ]]:
6057 result = []
6158 starts = blocking is None
@@ -84,62 +81,34 @@ def df_check_key_map(df: pl.DataFrame, df_map: pl.DataFrame):
8481 col_key = df_map .columns [0 ]
8582 col_value = df_map .columns [1 ]
8683 col_value_right = f"{ col_value } _right"
87- mismatched_keys = df .join (df_map , on = col_key ).select ([col_key , col_value , col_value_right ]).filter (pl .col (col_value ).eq (pl .col (col_value_right )).not_ ())
84+ mismatched_keys = df .join (df_map , on = col_key , how = "right" , nulls_equal = True ).select ([col_key , col_value , col_value_right ]).filter (pl .col (col_value ).eq_missing (pl .col (col_value_right )).not_ ())
8885 if not mismatched_keys .is_empty ():
8986 print (f"Mismatch found in { col_key } -> { col_value } mapping:" )
9087 print (mismatched_keys )
9188 return mismatched_keys
9289
93- def df_insert_key_map (df : pl .DataFrame , df_map : pl .DataFrame , index : int , default : str | None = None , force : bool = False ):
90+ def df_insert_key_map (df : pl .DataFrame , df_map : pl .DataFrame , after : str , default : str | None = None , force : bool = False ):
9491 col_key = df_map .columns [0 ]
9592 col_value = df_map .columns [1 ]
9693 if default is None :
97- default = f"todo!({ col_value } )"
98- if force and col_value in df .columns :
99- df = df .drop (col_value )
100- if col_value not in df .columns :
101- df1 = df .join (df_map , on = col_key , how = "left" ).select (col_value ).fill_null (pl .lit (default ))
102- columns = [pl .col (col ) for col in df .columns ]
103- columns .insert (index , pl .lit (default ))
104- df = df .select (columns ).replace_column (index , df1 [col_value ])
94+ default = col_default .get (col_value , f"todo!({ col_value } )" )
95+ if not force and col_value in df .columns :
96+ return df
97+ df1 = df .select (col_key ).join (df_map , how = "full" , on = col_key ).select (col_value ).fill_null (pl .lit (default ))
98+ df = df .select (df .columns )
99+ if col_value in df .columns :
100+ df .replace_column (df .get_column_index (col_value ), df1 [col_value ])
101+ else :
102+ index = df .get_column_index (after )
103+ print (df .columns , after , index )
104+ df = df .insert_column (index , df1 [col_value ])
105105 return df
106106
107- with open (enigo__keycodes_rs ) as rsfile :
108- content = rsfile .read ()
109-
110- data = parse_rs_match (content , blocking = ('impl From<Key> for xkeysym::Keysym {' , '}' ))
111- key_map_enigo_keysym = {k .replace ("Key::" , "Enigo::" ): v for k ,v in data if "Key::" in k and "(" not in k }
112- df_map_enigo_keysym = pl .DataFrame ({
113- "enigo" : key_map_enigo_keysym .keys (),
114- "keysym" : key_map_enigo_keysym .values ()
115- })
116- df_check_key_map (df , df_map_enigo_keysym )
117-
118- data = parse_rs_match (content , blocking = ('impl TryFrom<Key> for windows::Win32::UI::Input::KeyboardAndMouse::VIRTUAL_KEY {' , '}' ))
119- key_map_enigo_vk = {k .replace ("Key::" , "Enigo::" ): v for k ,v in data if "Key::" in k and "(" not in k }
120- df_map_enigo_vk = pl .DataFrame ({
121- "enigo" : key_map_enigo_vk .keys (),
122- "vk" : key_map_enigo_vk .values ()
123- })
124- df_check_key_map (df , df_map_enigo_vk )
125-
126- with open (enigo__macos_impl_rs ) as rsfile :
127- content = rsfile .read ()
128- data = parse_rs_match (content , blocking = ('impl TryFrom<Key> for core_graphics::event::CGKeyCode {' , '}' ))
129- def fix_macos_impl_value (v : str ):
130- if v .startswith ("ANSI_" ): return "KeyCode::" + v
131- try : return f"KeyCode::from({ int (v )} )"
132- except : pass
133- return v
134- key_map_enigo_cg = {k .replace ("Key::" , "Enigo::" ): fix_macos_impl_value (v ) for k ,v in data if "Key::" in k and "(" not in k }
135- df_map_enigo_cg = pl .DataFrame ({
136- "enigo" : key_map_enigo_cg .keys (),
137- "cg" : key_map_enigo_cg .values ()
138- })
139- df = df_insert_key_map (df , df_map_enigo_cg ,index = df .get_column_index ("keysym" )+ 1 )
140- df_check_key_map (df , df_map_enigo_cg )
107+ def df_fill_na (df : pl .DataFrame ):
108+ return df .select ([
109+ pl .col (col ).fill_null (pl .lit (col_default .get (col , f"todo!({ col } )" ))).alias (col ) for col in df .columns
110+ ])
141111
142- # %%
143112def parse_rs_attr (code : str , line_starts : str = "#[cfg(" , line_not_starts : list [str ] = ["#[" , "//" ], blocking : tuple [str , str ] | None = None ):
144113 result = []
145114 starts = blocking is None
@@ -174,6 +143,10 @@ def parse_rs_attr(code: str, line_starts: str = "#[cfg(", line_not_starts: list[
174143 '#[cfg(any(target_os = "windows", all(unix, not(target_os = "macos"))))]' : 'windows|linux'
175144}
176145
146+ # %%
147+ df = load_csv (csv_filename )
148+ save_csv (df , csv_filename )
149+
177150with open (enigo__keycodes_rs ) as rsfile :
178151 content = rsfile .read ()
179152enigo_attrs = parse_rs_attr (content , blocking = ("pub enum Key {" , "}" ))
@@ -183,12 +156,53 @@ def parse_rs_attr(code: str, line_starts: str = "#[cfg(", line_not_starts: list[
183156 "enigo_attr" : map_enigo_attrs .values (),
184157})
185158
186- df = df_insert_key_map (df , df_map_enigo_keysym , df .get_column_index ("enigo" ) + 1 , default = "" , force = True )
159+ df = df_fill_na (df .join (df_map_enigo_attrs .select ('enigo' ), on = "enigo" , coalesce = True , how = "full" , maintain_order = "left_right" ))
160+ df = df_insert_key_map (df , df_map_enigo_attrs , after = "enigo" )
187161df_check_key_map (df , df_map_enigo_attrs )
162+ df
188163
189164# %%
190- save_csv (df , csv_filename )
165+ with open (enigo__keycodes_rs ) as rsfile :
166+ content = rsfile .read ()
167+
168+ data = parse_rs_match (content , blocking = ('impl From<Key> for xkeysym::Keysym {' , '}' ))
169+ key_map_enigo_keysym = {k .replace ("Key::" , "Enigo::" ): v for k ,v in data if "Key::" in k and "(" not in k }
170+ df_map_enigo_keysym = pl .DataFrame ({
171+ "enigo" : key_map_enigo_keysym .keys (),
172+ "keysym" : key_map_enigo_keysym .values ()
173+ })
174+ df_check_key_map (df , df_map_enigo_keysym )
175+
176+ data = parse_rs_match (content , blocking = ('impl TryFrom<Key> for windows::Win32::UI::Input::KeyboardAndMouse::VIRTUAL_KEY {' , '}' ))
177+ key_map_enigo_vk = {k .replace ("Key::" , "Enigo::" ): v for k ,v in data if "Key::" in k and "(" not in k }
178+ df_map_enigo_vk = pl .DataFrame ({
179+ "enigo" : key_map_enigo_vk .keys (),
180+ "vk" : key_map_enigo_vk .values ()
181+ })
182+ df_check_key_map (df , df_map_enigo_vk )
183+
184+ with open (enigo__macos_impl_rs ) as rsfile :
185+ content = rsfile .read ()
186+ data = parse_rs_match (content , blocking = ('impl TryFrom<Key> for core_graphics::event::CGKeyCode {' , '}' ))
187+ def fix_macos_impl_value (v : str ):
188+ # if v.startswith("ANSI_"): return "KeyCode::" + v
189+ if v .startswith ("return Err(())" ): return None
190+ if v .startswith ("ANSI_" ): return "KeyCodeExt::kVK_ANSI_" + v .removeprefix ("ANSI_" ).title ().replace ("_" , "" )
191+ try : return f"KeyCode::from({ int (v )} )"
192+ except : pass
193+ return v
194+ key_map_enigo_cg = {k .replace ("Key::" , "Enigo::" ): fix_macos_impl_value (v ) for k ,v in data if "Key::" in k and "(" not in k } | \
195+ {f"Enigo::Num{ i } " : f"KeyCodeExt::kVK_ANSI_{ i } " for i in range (10 )} | {f"Enigo::{ chr (X )} " : f"KeyCodeExt::kVK_ANSI_{ chr (X )} " for X in range (ord ('A' ), ord ('Z' )+ 1 )}
196+
197+ df_map_enigo_cg = pl .DataFrame ({
198+ "enigo" : key_map_enigo_cg .keys (),
199+ "cg" : key_map_enigo_cg .values ()
200+ })
201+ df = df_insert_key_map (df , df_map_enigo_cg , after = "keysym" , force = True )
202+ df_check_key_map (df , df_map_enigo_cg )
203+ df
191204
192205# %%
193- i
206+ save_csv (df , csv_filename )
207+
194208# %%
0 commit comments