77 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/env python3
 | 
						|
 | 
						|
import argparse
 | 
						|
import sys
 | 
						|
import json
 | 
						|
 | 
						|
indent_level=4
 | 
						|
 | 
						|
def parse_cli():
 | 
						|
    parser = argparse.ArgumentParser(description='Ferris keymap formatter')
 | 
						|
    parser.add_argument("--input", type=argparse.FileType('r'),
 | 
						|
        default=sys.stdin, help="Input keymap (json file produced by qmk configurator)")
 | 
						|
    return parser.parse_args()
 | 
						|
 | 
						|
def col_index(key_index):
 | 
						|
    if key_index < 30:
 | 
						|
        col = key_index % 5
 | 
						|
    else:
 | 
						|
        col = key_index % 2
 | 
						|
    return col
 | 
						|
 | 
						|
def format_layers(layers):
 | 
						|
    formatted = indent_level * " " + "\"layers\": [\n"
 | 
						|
    max_key_length = {}
 | 
						|
    for layer in layers:
 | 
						|
        for (index, keycode) in enumerate(layer):
 | 
						|
            col = col_index(index)
 | 
						|
            max_length = max_key_length.get(col)
 | 
						|
            if (not max_length) or len(keycode) > max_length:
 | 
						|
                max_key_length.update({col: len(keycode)})
 | 
						|
    for (layer_index, layer) in enumerate(layers):
 | 
						|
        formatted += 2 * indent_level * " "
 | 
						|
        formatted += "["
 | 
						|
        for (index, keycode) in enumerate(layer):
 | 
						|
            if index > 30 and index % 2 == 0 or index % 5 == 0 and index != 0:
 | 
						|
                formatted += (1 + 2 * indent_level) * " "
 | 
						|
            formatted += json.dumps(keycode)
 | 
						|
            if index == 33:
 | 
						|
                formatted += "\n"
 | 
						|
            elif index > 30 and index % 2 == 1 or index % 5 == 4:
 | 
						|
                formatted += ",\n"
 | 
						|
            else:
 | 
						|
                n_spaces = max_key_length[col_index(index)] - len(keycode)
 | 
						|
                formatted += n_spaces * " "
 | 
						|
                formatted += ", "
 | 
						|
            if index % 10 == 9:
 | 
						|
                formatted += "\n"
 | 
						|
        formatted += 2 * indent_level * " "
 | 
						|
        if layer_index < len(layers) - 1:
 | 
						|
            formatted += "],\n"
 | 
						|
        else:
 | 
						|
            formatted += "]\n"
 | 
						|
    formatted += indent_level * " "
 | 
						|
    formatted += "]"
 | 
						|
 | 
						|
    return formatted
 | 
						|
 | 
						|
def format_keymap(keymap_json):
 | 
						|
    formatted = "{"
 | 
						|
    for (index, k) in enumerate(keymap_json):
 | 
						|
        if k == "layers":
 | 
						|
            formatted += format_layers(keymap_json[k])
 | 
						|
        else:
 | 
						|
            formatted += f"{indent_level * ' '}{json.dumps(k)}: {json.dumps(keymap_json[k])}"
 | 
						|
        if index < len(keymap_json) - 1:
 | 
						|
            formatted += ","
 | 
						|
        formatted += "\n"
 | 
						|
    formatted += "}"
 | 
						|
    return formatted
 | 
						|
 | 
						|
def main():
 | 
						|
    args=parse_cli()
 | 
						|
    keymap_json = json.loads(args.input.read())
 | 
						|
    print(format_keymap(keymap_json))
 | 
						|
 | 
						|
main()
 |