#!/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()

#!/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()

#!/usr/bin/env python3