collect_terminfo.py

  1#!/usr/bin/env python
  2
  3import sys, os, subprocess
  4
  5def escaped(s):
  6	return repr(s)[1:-1]
  7
  8def tput(term, name):
  9	try:
 10		return subprocess.check_output(['tput', '-T%s' % term, name]).decode()
 11	except subprocess.CalledProcessError as e:
 12		return e.output.decode()
 13
 14
 15def w(s):
 16	if s == None:
 17		return
 18	sys.stdout.write(s)
 19
 20terminals = {
 21	'xterm' : 'xterm',
 22	'rxvt-256color' : 'rxvt_256color',
 23	'rxvt-unicode' : 'rxvt_unicode',
 24	'linux' : 'linux',
 25	'Eterm' : 'eterm',
 26	'screen' : 'screen'
 27}
 28
 29keys = [
 30	"F1",		"kf1",
 31	"F2",		"kf2",
 32	"F3",		"kf3",
 33	"F4",		"kf4",
 34	"F5",		"kf5",
 35	"F6",		"kf6",
 36	"F7",		"kf7",
 37	"F8",		"kf8",
 38	"F9",		"kf9",
 39	"F10",		"kf10",
 40	"F11",		"kf11",
 41	"F12",		"kf12",
 42	"INSERT",	"kich1",
 43	"DELETE",	"kdch1",
 44	"HOME",		"khome",
 45	"END",		"kend",
 46	"PGUP",		"kpp",
 47	"PGDN",		"knp",
 48	"KEY_UP",	"kcuu1",
 49	"KEY_DOWN",	"kcud1",
 50	"KEY_LEFT",	"kcub1",
 51	"KEY_RIGHT",	"kcuf1"
 52]
 53
 54funcs = [
 55	"T_ENTER_CA",		"smcup",
 56	"T_EXIT_CA",		"rmcup",
 57	"T_SHOW_CURSOR",	"cnorm",
 58	"T_HIDE_CURSOR",	"civis",
 59	"T_CLEAR_SCREEN",	"clear",
 60	"T_SGR0",		"sgr0",
 61	"T_UNDERLINE",		"smul",
 62	"T_BOLD",		"bold",
 63	"T_BLINK",		"blink",
 64	"T_REVERSE",            "rev",
 65	"T_ENTER_KEYPAD",	"smkx",
 66	"T_EXIT_KEYPAD",	"rmkx"
 67]
 68
 69def iter_pairs(iterable):
 70	iterable = iter(iterable)
 71	while True:
 72		yield (next(iterable), next(iterable))
 73
 74def do_term(term, nick):
 75	w("// %s\n" % term)
 76	w("var %s_keys = []string{\n\t" % nick)
 77	for k, v in iter_pairs(keys):
 78		w('"')
 79		w(escaped(tput(term, v)))
 80		w('",')
 81	w("\n}\n")
 82	w("var %s_funcs = []string{\n\t" % nick)
 83	for k,v in iter_pairs(funcs):
 84		w('"')
 85		if v == "sgr":
 86			w("\\033[3%d;4%dm")
 87		elif v == "cup":
 88			w("\\033[%d;%dH")
 89		else:
 90			w(escaped(tput(term, v)))
 91		w('", ')
 92	w("\n}\n\n")
 93
 94def do_terms(d):
 95	w("var terms = []struct {\n")
 96	w("\tname  string\n")
 97	w("\tkeys  []string\n")
 98	w("\tfuncs []string\n")
 99	w("}{\n")
100	for k, v in d.items():
101		w('\t{"%s", %s_keys, %s_funcs},\n' % (k, v, v))
102	w("}\n\n")
103
104w("// +build !windows\n\npackage termbox\n\n")
105
106for k,v in terminals.items():
107	do_term(k, v)
108
109do_terms(terminals)
110