summaryrefslogtreecommitdiffstats
path: root/scripts/generate_cheatsheet.go
blob: 92d5880a575ad6fafc8807c0161504e988a7fe21 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// This "script" generates a file called Keybindings_{{.LANG}}.md
// in current working directory.
//
// The content of this generated file is a keybindings cheatsheet.
//
// To generate cheatsheet in english run:
//   LANG=en go run scripts/generate_cheatsheet.go

package main

import (
	"fmt"
	"log"
	"os"
	"strings"

	"github.com/jesseduffield/lazygit/pkg/app"
	"github.com/jesseduffield/lazygit/pkg/config"
	"github.com/jesseduffield/lazygit/pkg/gui"
)

func writeString(file *os.File, str string) {
	_, err := file.WriteString(str)
	if err != nil {
		log.Fatal(err)
	}
}

func localisedTitle(mApp *app.App, str string) string {
	viewTitle := strings.Title(str) + "Title"
	return mApp.Tr.SLocalize(viewTitle)
}

func formatTitle(title string) string {
	return fmt.Sprintf("\n## %s\n\n", title)
}

func writeBinding(file *os.File, binding *gui.Binding) {
	info := fmt.Sprintf("  <kbd>%s</kbd>: %s\n", binding.GetKey(), binding.Description)
	writeString(file, info)
}

// I should really just build an array of tuples, one thing with a string and the other with a list of bindings, and then build them like that.

func main() {
	mConfig, _ := config.NewAppConfig("", "", "", "", "", true)
	mApp, _ := app.NewApp(mConfig)
	lang := mApp.Tr.GetLanguage()
	file, _ := os.Create("Keybindings_" + lang + ".md")
	current := ""

	writeString(file, fmt.Sprintf("# Lazygit %s\n", mApp.Tr.SLocalize("menu")))
	writeString(file, formatTitle(localisedTitle(mApp, "global")))

	writeString(file, "<pre>\n")

	// TODO: add context-based keybindings
	for _, binding := range mApp.Gui.GetInitialKeybindings() {
		if binding.Description == "" {
			continue
		}

		if binding.ViewName != current {
			current = binding.ViewName
			writeString(file, "</pre>\n")
			writeString(file, formatTitle(localisedTitle(mApp, current)))
			writeString(file, "<pre>\n")
		}

		writeBinding(file, binding)
	}

	writeString(file, "</pre>\n")

	for view, contexts := range mApp.Gui.GetContextMap() {
		for contextName, contextBindings := range contexts {
			translatedView := localisedTitle(mApp, view)
			translatedContextName := localisedTitle(mApp, contextName)
			writeString(file, fmt.Sprintf("\n## %s (%s)\n\n", translatedView, translatedContextName))
			writeString(file, "<pre>\n")
			for _, binding := range contextBindings {
				if binding.Description == "" {
					continue
				}

				writeBinding(file, binding)
			}
			writeString(file, "</pre>\n")
		}
	}
}