From 3541b4e8f7fd94cd0c6dc1fac185228a1f44a635 Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun Date: Sun, 29 Sep 2019 15:00:33 +0200 Subject: render: Add basic keyman support Works for simple keyboards only. --- lulua/render.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'lulua/render.py') diff --git a/lulua/render.py b/lulua/render.py index 9aa7204..dce8961 100644 --- a/lulua/render.py +++ b/lulua/render.py @@ -325,6 +325,40 @@ def renderXmodmap (args): fd.write (f'!! {btn.name}\nkeycode {btn.xorgKeycode} = {v}\n') fd.write ('\n'.join (['add Mod3 = ISO_First_Group', 'add Mod5 = ISO_Level3_Shift', ''])) +def renderKeyman (args): + """ Rudimentary keyman script generation. Note that keyman is somewhat + unflexible when it comes to shift states and therefore layouts with + non-standard shift keys/states won’t work. """ + + keyboard = defaultKeyboards[args.keyboard] + layout = defaultLayouts[args.layout].specialize (keyboard) + + with open (args.output, 'w') as fd: + fd.write ('\n'.join ([ + 'c Auto-generated file for Keyman 11.0', + f'c layout: {layout.name}', + f'c generated: {datetime.utcnow ()}', + '', + 'store(&version) "9.0"', + f'store(&name) "{layout.name}"', + 'store(&mnemoniclayout) "0"', + 'store(&targets) "any"', + '', + 'begin Unicode > use(main)', + 'group(main) using keys', + '', + ])) + for i, l in enumerate (layout.layers): + for m in l.modifier: + for x in m: + if x.keymanCode.startswith ('K_') or x.keymanCode == 'CAPS': + logging.error (f'Keyman does not support custom modifier like {m}. Your layout will not work correctly.') + break + for btn, text in l.layout.items (): + comb = ' '.join ([x.keymanCode for x in m] + [btn.keymanCode]) + text = ' '.join ([f'U+{ord (x):04X}' for x in text]) + fd.write (f'+ [{comb}] > {text}\n') + def render (): parser = argparse.ArgumentParser(description='Render keyboard into output format.') parser.add_argument('-l', '--layout', metavar='LAYOUT', help='Keyboard layout name') @@ -335,6 +369,8 @@ def render (): sp.set_defaults (func=renderSvg) sp = subparsers.add_parser('xmodmap') sp.set_defaults (func=renderXmodmap) + sp = subparsers.add_parser('keyman') + sp.set_defaults (func=renderKeyman) parser.add_argument('output', metavar='FILE', help='Output file') logging.basicConfig (level=logging.INFO) -- cgit v1.2.3