You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
277 lines
11 KiB
277 lines
11 KiB
import json |
|
|
|
fallbackProfile = "DCS" |
|
|
|
labelMap = [ |
|
# 0 1 2 3 4 5 6 7 8 9 10 11 // align flags |
|
[0, 6, 2, 8, 9, 11, 3, 5, 1, 4, 7, 10], # 0 = no centering |
|
[1, 7, -1, -1, 9, 11, 4, -1, -1, -1, -1, 10], # 1 = center x |
|
[3, -1, 5, -1, 9, 11, -1, -1, 4, -1, -1, 10], # 2 = center y |
|
[4, -1, -1, -1, 9, 11, -1, -1, -1, -1, -1, 10], # 3 = center x & y |
|
[0, 6, 2, 8, 10, -1, 3, 5, 1, 4, 7, -1], # 4 = center front (default) |
|
[1, 7, -1, -1, 10, -1, 4, -1, -1, -1, -1, -1], # 5 = center front & x |
|
[3, -1, 5, -1, 10, -1, -1, -1, 4, -1, -1, -1], # 6 = center front & y |
|
[4, -1, -1, -1, 10, -1, -1, -1, -1, -1, -1, -1], # 7 = center front & x & y |
|
] |
|
|
|
def parse_profile(profileString, homing): |
|
"""Parse profile strings into standard models""" |
|
ret = profileString.upper().replace("R", "").replace("0", "").replace("5", "").replace( |
|
"6", "").replace("7", "").replace("8", "").replace("9", "").replace(" ", "") |
|
|
|
if ret != "SASPACE": |
|
ret = ret.replace("SPACE", "") |
|
|
|
# Normalize unsculpted SA profile to SA ROW 3 |
|
if ret == "SA": |
|
ret = "SA3" |
|
|
|
if ret == "" or ret not in ["DSA", "DCS", "SA1", "SA2", "SA3", "SA4", "SASPACE"]: |
|
ret = fallbackProfile |
|
|
|
# Set homing profile for supported profiles (currently only SA) |
|
if homing and ret in ["SA1", "SA2", "SA3", "SA4"]: |
|
ret = "SA3D" |
|
|
|
return ret |
|
|
|
def reorder_labels(labels, align): |
|
"""Reorders labels based on alignment""" |
|
ret = ["", "", "", "", "", "", "", "", "", "", "", ""] |
|
for pos, label in enumerate(labels): |
|
ret[labelMap[align][pos]] = label |
|
return ret |
|
|
|
|
|
def reorder_sizes(primary, secondary, individual, align): |
|
"""Reorders font sizes for labels""" |
|
if secondary is None: |
|
secondary = primary |
|
ret = [primary, secondary, secondary, secondary, secondary, secondary, |
|
secondary, secondary, secondary, secondary, secondary, secondary] |
|
if individual: |
|
for pos, size in enumerate(individual): |
|
if size == 0: |
|
ret[labelMap[align][pos]] = primary |
|
else: |
|
ret[labelMap[align][pos]] = size |
|
else: |
|
ret = [primary, secondary, secondary, secondary, secondary, secondary, |
|
secondary, secondary, secondary, secondary, secondary, secondary] |
|
return ret |
|
|
|
|
|
def reorder_colors(default, colors, align): |
|
"""Reorders label colors""" |
|
ret = [default, default, default, default, default, default, |
|
default, default, default, default, default, default] |
|
|
|
individual = colors.split('\n') |
|
|
|
if len(individual) > 1: |
|
for pos, color in enumerate(individual): |
|
if color is not None and color is not '': |
|
ret[labelMap[align][pos]] = color |
|
else: |
|
ret = [individual[0], individual[0], individual[0], individual[0], individual[0], individual[ |
|
0], individual[0], individual[0], individual[0], individual[0], individual[0], individual[0]] |
|
return ret |
|
|
|
def load(filePath): |
|
"""Parses KLE Raw JSON into dict""" |
|
# load JSON file |
|
layout = json.load(open(filePath, encoding="UTF-8", |
|
errors="replace"), strict=False) |
|
# make empty keyboard dict |
|
keyboard = {} |
|
rowData = {} |
|
# add list of keyboard rows |
|
keyboard["rows"] = [] |
|
keyboard["keyCount"] = 0 |
|
y = 0 |
|
# default align |
|
align = 4 |
|
# iterate over rows |
|
for rowNum, row in enumerate(layout): |
|
x = 0 |
|
# add empty row |
|
keyboard["rows"].append([]) |
|
# check if item is a row or if it is a dict of keyboard properties |
|
if type(row) != dict: |
|
# get row data from previous row |
|
rowData = rowData |
|
rowData["y"] = y |
|
# iterate over keys in row |
|
for pos, value in enumerate(row): |
|
# check if item is a key or dict of key properties |
|
if type(value) == str: |
|
# key is a dict with all the key's properties |
|
key = {} |
|
# if the previous item is a dict add the data to the rest |
|
# of the row, or the current key, depending on what the |
|
# property is |
|
if type(row[pos - 1]) == dict: |
|
# prev is the previous item in the row |
|
prev = row[pos - 1] |
|
# if prev has property set then add it to key |
|
if "x" in prev: |
|
key["xCoord"] = prev["x"] |
|
x += key["xCoord"] |
|
else: |
|
key["xCoord"] = 0 |
|
if "y" in prev: |
|
rowData["yCoord"] = prev["y"] |
|
rowData["y"] += prev["y"] |
|
y += prev["y"] |
|
if "w" in prev: |
|
key["w"] = prev["w"] |
|
else: |
|
key["w"] = 1 |
|
if "h" in prev: |
|
key["h"] = prev["h"] |
|
else: |
|
key["h"] = 1 |
|
if "fa" in prev: |
|
key["fa"] = prev["fa"] |
|
if "x2" in prev: |
|
key["x2"] = prev["x2"] |
|
if "y2" in prev: |
|
key["y2"] = prev["y2"] |
|
if "w2" in prev: |
|
key["w2"] = prev["w2"] |
|
if "h2" in prev: |
|
key["h2"] = prev["h2"] |
|
if "l" in prev: |
|
key["l"] = prev["l"] |
|
if "n" in prev: |
|
key["n"] = prev["n"] |
|
if "c" in prev: |
|
rowData["c"] = prev["c"] |
|
if "t" in prev: |
|
rowData["t"] = prev["t"] |
|
if "g" in prev: |
|
rowData["g"] = prev["g"] |
|
if "a" in prev: |
|
rowData["a"] = prev["a"] |
|
if "f" in prev: |
|
rowData["f"] = prev["f"] |
|
if "f2" in prev: |
|
rowData["f2"] = prev["f2"] |
|
if "p" in prev: |
|
rowData["p"] = prev["p"] |
|
if "d" in prev: |
|
key["d"] = prev["d"] |
|
else: |
|
key["d"] = False |
|
if "r" in prev: |
|
rowData["r"] = prev["r"] |
|
rowData["rRow"] = 0 |
|
if "rx" in prev: |
|
rowData["rx"] = prev["rx"] |
|
if "ry" in prev: |
|
if "yCoord" in rowData: |
|
rowData["ry"] = prev["ry"] |
|
rowData["y"] = prev["ry"] + rowData["yCoord"] |
|
y = prev["ry"] + rowData["yCoord"] |
|
else: |
|
rowData["ry"] = prev["ry"] |
|
rowData["y"] = prev["ry"] |
|
y = prev["ry"] |
|
elif "r" in prev and "ry" in rowData: |
|
if "yCoord" in rowData: |
|
rowData["y"] = rowData["ry"] + rowData["yCoord"] |
|
y = rowData["ry"] + rowData["yCoord"] |
|
else: |
|
rowData["y"] = rowData["ry"] |
|
y = rowData["ry"] |
|
elif "r" in prev: |
|
if "yCoord" in rowData: |
|
rowData["ry"] = 0 |
|
rowData["y"] = rowData["yCoord"] |
|
y = rowData["yCoord"] |
|
else: |
|
rowData["ry"] = 0 |
|
rowData["y"] = 0 |
|
y = 0 |
|
|
|
# if rowData has property set then add it to key |
|
if "a" in rowData: |
|
align = rowData["a"] |
|
|
|
# if the previous item isn't a dict |
|
else: |
|
key["xCoord"] = 0 |
|
key["d"] = False |
|
key["w"] = 1 |
|
key["h"] = 1 |
|
|
|
# if rowData has property set then add it to key |
|
if "c" in rowData: |
|
key["c"] = rowData["c"] |
|
else: |
|
key["c"] = "#cccccc" |
|
if "t" in rowData: |
|
key["t"] = rowData["t"] |
|
else: |
|
key["t"] = "#111111" |
|
if "g" in rowData: |
|
key["g"] = rowData["g"] |
|
if "a" in rowData: |
|
key["a"] = rowData["a"] |
|
if "f" in rowData: |
|
key["f"] = rowData["f"] |
|
else: |
|
key["f"] = 3 |
|
if "f2" in rowData: |
|
key["f2"] = rowData["f2"] |
|
else: |
|
key["f2"] = None |
|
if "r" in rowData: |
|
key["r"] = rowData["r"] |
|
if "rx" in rowData: |
|
key["rx"] = rowData["rx"] |
|
if "ry" in rowData: |
|
key["ry"] = rowData["ry"] |
|
|
|
if "p" not in rowData: |
|
key["p"] = fallbackProfile |
|
else: |
|
key["p"] = parse_profile(rowData["p"], "n" in key) |
|
|
|
if "fa" not in key: |
|
key["fa"] = None |
|
|
|
# set the text on the key |
|
key["v"] = {} |
|
key["v"]["labels"] = reorder_labels(value.split('\n'), align) |
|
key["f"] = reorder_sizes(key["f"], key["f2"], key["fa"], align) |
|
key["t"] = reorder_colors(None, key["t"], align) |
|
key["v"]["raw"] = value |
|
|
|
# set the row and column of the key |
|
key["row"] = rowNum |
|
key["col"] = pos |
|
# set x and y coordinates of key |
|
key["x"] = x |
|
key["y"] = rowData["y"] |
|
|
|
if "rx" in key: |
|
key["x"] += key["rx"] |
|
|
|
# add the key to the current row |
|
keyboard["rows"][key["row"]].append(key) |
|
keyboard["keyCount"] += 1 |
|
x += key["w"] |
|
y += 1 |
|
else: |
|
# if the current item is a dict then add the backcolor property to |
|
# the keyboard |
|
if "backcolor" in row: |
|
keyboard["backcolor"] = row["backcolor"] |
|
if "switchType" in row: |
|
keyboard["switchType"] = row["switchType"] |
|
if "led" in row: |
|
keyboard["led"] = row["led"] |
|
if "css" in row: |
|
keyboard["css"] = row["css"] |
|
return keyboard
|
|
|