104 lines
2.9 KiB
Python
104 lines
2.9 KiB
Python
|
# -*- coding: utf-8 -*-
|
||
|
|
||
|
import codecs
|
||
|
import os
|
||
|
import sys
|
||
|
|
||
|
from argparse import ArgumentParser
|
||
|
|
||
|
from .core import XKeyboard
|
||
|
from .version import print_version
|
||
|
|
||
|
|
||
|
GET_CHOICES = ["num", "name", "symbol", "variant", "current_data",
|
||
|
"count", "names", "symbols", "variants", "all_data"]
|
||
|
SET_CHOICES = ["num", "name", "symbol"]
|
||
|
|
||
|
|
||
|
DATA_DEFAULT_FORMAT = "{num}: {symbol} - {name} - \"{variant}\""
|
||
|
|
||
|
def format_group_data(group_data):
|
||
|
return DATA_DEFAULT_FORMAT.format(
|
||
|
num=group_data.num,
|
||
|
name=group_data.name,
|
||
|
symbol=group_data.symbol,
|
||
|
variant=group_data.variant)
|
||
|
|
||
|
def xkb_get(args, xkb):
|
||
|
attrmap = {
|
||
|
"num": "group_num",
|
||
|
"name": "group_name",
|
||
|
"symbol": "group_symbol",
|
||
|
"variant": "group_variant",
|
||
|
"current_data": "group_data",
|
||
|
"count": "groups_count",
|
||
|
"names": "groups_names",
|
||
|
"symbols": "groups_symbols",
|
||
|
"variants": "groups_variants",
|
||
|
"all_data": "groups_data",
|
||
|
}
|
||
|
|
||
|
value = getattr(xkb, attrmap[args.attribute])
|
||
|
if args.attribute == "all_data":
|
||
|
value = [format_group_data(data) for data in value]
|
||
|
elif args.attribute == "current_data":
|
||
|
value = format_group_data(value)
|
||
|
value = "\n".join(value) if isinstance(value, list) else value
|
||
|
|
||
|
print(value)
|
||
|
|
||
|
def xkb_set(args, xkb):
|
||
|
value = int(args.value) if args.attribute == "num" else args.value
|
||
|
attrmap = {
|
||
|
"num": "group_num",
|
||
|
"name": "group_name",
|
||
|
"symbol": "group_symbol",
|
||
|
}
|
||
|
|
||
|
setattr(xkb, attrmap[args.attribute], value)
|
||
|
|
||
|
def xkb_format(args, xkb):
|
||
|
unescaped_format_str = codecs.decode(args.format_string, "unicode_escape")
|
||
|
print(xkb.format(unescaped_format_str), end="")
|
||
|
|
||
|
|
||
|
def create_argument_parser():
|
||
|
parser = ArgumentParser()
|
||
|
|
||
|
parser.add_argument("-V", "--version", action="store_true")
|
||
|
subparsers = parser.add_subparsers(title="actions", dest="cmd")
|
||
|
|
||
|
parser_get = subparsers.add_parser("get")
|
||
|
parser_get.set_defaults(func=xkb_get)
|
||
|
parser_get.add_argument("attribute", choices=GET_CHOICES)
|
||
|
|
||
|
parser_set = subparsers.add_parser("set")
|
||
|
parser_set.set_defaults(func=xkb_set)
|
||
|
parser_set.add_argument("attribute", choices=SET_CHOICES)
|
||
|
parser_set.add_argument("value")
|
||
|
|
||
|
parser_format = subparsers.add_parser("format")
|
||
|
parser_format.set_defaults(func=xkb_format)
|
||
|
parser_format.add_argument("format_string")
|
||
|
|
||
|
return parser
|
||
|
|
||
|
def main():
|
||
|
xkb = XKeyboard()
|
||
|
progname = os.path.basename(sys.argv[0])
|
||
|
|
||
|
parser = create_argument_parser()
|
||
|
args = parser.parse_args()
|
||
|
if args.version:
|
||
|
print_version(progname)
|
||
|
elif args.cmd:
|
||
|
args.func(args, xkb)
|
||
|
else:
|
||
|
parser.print_usage(sys.stderr)
|
||
|
parser.exit(2, "{prog}: error: {message}\n".format(
|
||
|
prog=progname,
|
||
|
message="the following arguments are required: cmd"))
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
main()
|