qmk_keymaps/cmd/qmkasciigen/draw.go

232 lines
5.2 KiB
Go
Raw Normal View History

2023-07-22 22:04:21 +00:00
package main
2023-07-22 22:49:09 +00:00
import (
2023-07-22 23:55:16 +00:00
"fmt"
2023-07-22 22:49:09 +00:00
"strings"
)
2023-07-22 22:04:21 +00:00
const (
scaleX = 8
scaleY = 3
)
2023-07-22 23:07:23 +00:00
// https://github.com/qmk/qmk_firmware/blob/master/docs/keycodes.md
2023-07-22 22:49:09 +00:00
var mapSpecialKey = map[string]string{
"KC_TRNS": "",
"KC_NO": "",
2023-07-22 23:07:23 +00:00
"KC_ENT": "ENTER",
"KC_BSPC": "BACKSPACE",
"KC_SPC": "SPACE",
2023-07-22 23:50:02 +00:00
"KC_MINS": "-",
"KC_EQL": "=",
"KC_LBRC": "[",
"KC_RBRC": "]",
"KC_BSLS": "\\",
"KC_SCLN": ";",
"KC_QUOT": "'",
"KC_GRV": "`",
"KC_COMM": ",",
"KC_DOT": ".",
"KC_SLSH": "/",
2023-07-22 23:07:23 +00:00
"KC_CAPS": "CAPSLOCK",
"KC_LALT": "ALT",
"KC_RALT": "ALT",
"KC_LGUI": "CMD",
"KC_RGUI": "CMD",
"KC_LSFT": "SHIFT",
"KC_RSFT": "SHIFT",
2023-07-22 23:47:32 +00:00
"RGB_TOG": "RGBTO",
"RGB_MOD": "RGBMO",
"RGB_HUI": "RGBH",
"RGB_SAI": "RGBS",
"RGB_VAI": "RGBV",
2023-07-22 23:07:23 +00:00
// Custom
2023-07-23 00:14:16 +00:00
"CTL_T(KC_ESC)": "CTRL ESC",
"RSFT_T(KC_ENT)": "SHIFT ENTER",
2023-07-22 22:49:09 +00:00
}
2023-07-22 22:04:21 +00:00
func Draw(
layouts map[string]map[string][]QMKKeyDictionary,
keymap QMKKeymap,
) string {
2023-07-23 00:06:12 +00:00
layoutsStr := make([]string, 0, len(layouts))
2023-07-22 22:04:21 +00:00
2023-07-23 00:06:12 +00:00
// Each keyboard has many layouts
2023-07-22 22:04:21 +00:00
for layout := range layouts {
if keymap.Layout != layout {
continue
}
keys, ok := layouts[layout]["layout"]
if !ok {
continue
}
2023-07-23 00:06:12 +00:00
layoutStr := fmt.Sprintf("Layout %s\n", layout)
2023-07-22 22:04:21 +00:00
// Preprocess keys
// Y aka row -> X aka col
2023-07-22 23:33:10 +00:00
var newMaxX, newMaxY int
2023-07-22 22:04:21 +00:00
for i := range keys {
if int(keys[i].W) == 0 {
keys[i].W = 1
}
if int(keys[i].H) == 0 {
keys[i].H = 1
}
// Because 0.25
keys[i].NewX = int(keys[i].X * scaleX)
keys[i].NewY = int(keys[i].Y * scaleY)
keys[i].NewW = int(keys[i].W * scaleX)
keys[i].NewH = int(keys[i].H * scaleY)
2023-07-22 23:33:10 +00:00
if keys[i].NewX+keys[i].NewW > newMaxX {
newMaxX = keys[i].NewX + keys[i].NewW
2023-07-22 22:04:21 +00:00
}
2023-07-22 23:33:10 +00:00
if keys[i].NewY+keys[i].NewH > newMaxY {
newMaxY = keys[i].NewY + keys[i].NewH
2023-07-22 22:04:21 +00:00
}
}
2023-07-23 11:28:18 +00:00
if newMaxX == 0 || newMaxY == 0 {
continue
}
2023-07-23 09:01:42 +00:00
// Each keymap has many layers
2023-07-23 00:06:12 +00:00
layersStr := make([]string, 0, len(keymap.Layers))
2023-07-22 23:55:16 +00:00
for iLayer, layer := range keymap.Layers {
// Preprocess table with space
2023-07-22 23:33:10 +00:00
table := make([][]string, newMaxY)
for i := 0; i < newMaxY; i++ {
2023-07-23 11:28:18 +00:00
// Padding 1 in the right
table[i] = make([]string, newMaxX+1)
for j := 0; j <= newMaxX; j++ {
table[i][j] = " "
}
2023-07-22 22:04:21 +00:00
}
// Fill layout
count := 0
for _, key := range keys {
keyStr := layer[count]
2023-07-22 22:49:09 +00:00
// Process keyStr
if newKeyStr, ok := mapSpecialKey[keyStr]; ok {
keyStr = newKeyStr
} else if strings.HasPrefix(keyStr, "KC_") {
keyStr = strings.TrimPrefix(keyStr, "KC_")
} else if strings.HasPrefix(keyStr, "QK_") {
keyStr = strings.TrimPrefix(keyStr, "QK_")
}
2023-07-22 23:33:10 +00:00
// Padding to center key
2023-07-23 09:01:42 +00:00
// Why / 2, why - 1 ?
// Base on my feeling of course
padding := (key.NewW-len(keyStr))/2 - 1
2023-07-22 23:45:18 +00:00
if padding <= 0 {
2023-07-22 23:33:10 +00:00
padding = 1
}
2023-07-22 23:07:23 +00:00
2023-07-23 09:31:16 +00:00
// Draw strategy
// Draw 4 + in corner
// Draw - on top and bottom
// Draw | on left and right
2023-07-22 22:04:21 +00:00
for i := key.NewY; i < key.NewY+key.NewH; i++ {
2023-07-23 11:28:18 +00:00
for j := key.NewX; j <= key.NewX+key.NewW; j++ {
if i == key.NewY || i == key.NewY+key.NewH-1 {
if j == key.NewX || j == key.NewX+key.NewW {
2023-07-22 22:04:21 +00:00
table[i][j] = "+"
} else if table[i][j] != "+" {
2023-07-22 22:04:21 +00:00
table[i][j] = "-"
}
} else if i == key.NewY+key.NewH/2 {
// Write key in the middle
2023-07-23 11:28:18 +00:00
if j == key.NewX || j == key.NewX+key.NewW {
2023-07-22 22:04:21 +00:00
table[i][j] = "|"
} else if len(keyStr) > 0 && j > key.NewX+padding && j < key.NewX+len(keyStr)+padding+1 && j <= key.NewX+key.NewW-padding {
2023-07-23 09:31:16 +00:00
// Only handle ASCII keyStr
2023-07-22 23:45:18 +00:00
table[i][j] = string(keyStr[j-key.NewX-padding-1])
2023-07-22 22:04:21 +00:00
}
} else {
2023-07-23 11:28:18 +00:00
if j == key.NewX || j == key.NewX+key.NewW {
table[i][j] = "|"
}
2023-07-22 22:04:21 +00:00
}
}
}
count++
}
// Debug table
// for i := range table {
// s := ""
// for j := range table[i] {
// s += table[i][j]
// }
// fmt.Println(s)
// }
2023-07-23 09:01:42 +00:00
// Process new table
2023-07-23 11:28:18 +00:00
newTable := make([][]string, 0, newMaxY)
for i := 0; i < newMaxY; i++ {
// Merge 2 row lines into 1
// + + ? = +
// Merge
// +--+---+
// +----+--
// Into
// +--+-+-+
if i+1 < newMaxY && table[i][0] == "+" && table[i+1][0] == "+" {
// fmt.Println("From")
// fmt.Println(strings.Join(table[i], ""))
// fmt.Println(strings.Join(table[i+1], ""))
2023-07-23 11:28:18 +00:00
newTableI := make([]string, newMaxX+1)
for j := 0; j <= newMaxX; j++ {
if table[i][j] == "+" || table[i+1][j] == "+" {
// fmt.Printf("+ [%s] [%s] %d %d\n", table[i][j], table[i+1][j], i, j)
2023-07-23 11:28:18 +00:00
newTableI[j] = "+"
continue
}
if table[i][j] == "-" || table[i+1][j] == "-" {
// fmt.Printf("- [%s] [%s] %d %d\n", table[i][j], table[i+1][j], i, j)
2023-07-23 11:28:18 +00:00
newTableI[j] = "-"
continue
2023-07-23 11:28:18 +00:00
}
// fmt.Printf("S [%s] [%s] %d %d\n", table[i][j], table[i+1][j], i, j)
newTableI[j] = " "
2023-07-22 22:04:21 +00:00
}
// fmt.Println(strings.Join(newTableI, ""))
2023-07-22 22:04:21 +00:00
2023-07-23 11:28:18 +00:00
newTable = append(newTable, newTableI)
i++
2023-07-22 22:04:21 +00:00
continue
}
2023-07-23 11:28:18 +00:00
newTable = append(newTable, table[i])
2023-07-23 09:01:42 +00:00
}
2023-07-23 00:06:12 +00:00
layerStr := fmt.Sprintf("Layer %d\n", iLayer)
2023-07-22 22:04:21 +00:00
for i := range newTable {
for j := range newTable[i] {
2023-07-23 00:06:12 +00:00
layerStr += newTable[i][j]
2023-07-22 22:04:21 +00:00
}
2023-07-23 00:06:12 +00:00
layerStr += "\n"
2023-07-22 22:04:21 +00:00
}
2023-07-23 00:06:12 +00:00
layersStr = append(layersStr, layerStr)
2023-07-22 22:04:21 +00:00
}
2023-07-23 00:06:12 +00:00
layoutStr += strings.Join(layersStr, "\n")
layoutsStr = append(layoutsStr, layoutStr)
2023-07-22 22:04:21 +00:00
}
2023-07-23 00:06:12 +00:00
return strings.Join(layoutsStr, "\n")
2023-07-22 22:04:21 +00:00
}