From 7084817dab2bb8eb349d2895456c0bbd7c1a4946 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20F=C3=B6rtsch?= Date: Tue, 3 Mar 2026 17:06:48 +0100 Subject: [PATCH] add validation infrastructure, fix "6" key bug in v1.3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - add keylayout XML parser (parse_keylayout.py) that extracts all key mappings, dead key compositions, modifier layers from .keylayout files - add validation script (validate_layouts.py) that compares layouts against v1.3 reference with per-version exception support - fix action id="6" outputting "p" instead of "6" in v1.3 - generate reference JSON for all 4 layout versions - document known intentional differences: v1.2 (no ¬ dead key, § vs ẞ), v1.4 (ẞ on §/` caps, extra ¬ composition) Co-Authored-By: Claude Opus 4.6 --- .../Contents/Resources/EurKEY v1.3.keylayout | 2 +- scripts/parse_keylayout.py | 355 +++ scripts/validate-layouts.sh | 8 + scripts/validate_layouts.py | 306 +++ spec/eurkey-v1.2-parsed.json | 2282 ++++++++++++++++ spec/eurkey-v1.3-reference.json | 2293 +++++++++++++++++ spec/eurkey-v1.4-parsed.json | 2276 ++++++++++++++++ spec/eurkey-v2.0-parsed.json | 2281 ++++++++++++++++ 8 files changed, 9802 insertions(+), 1 deletion(-) create mode 100644 scripts/parse_keylayout.py create mode 100755 scripts/validate-layouts.sh create mode 100644 scripts/validate_layouts.py create mode 100644 spec/eurkey-v1.2-parsed.json create mode 100644 spec/eurkey-v1.3-reference.json create mode 100644 spec/eurkey-v1.4-parsed.json create mode 100644 spec/eurkey-v2.0-parsed.json diff --git a/EurKey-macOS.bundle/Contents/Resources/EurKEY v1.3.keylayout b/EurKey-macOS.bundle/Contents/Resources/EurKEY v1.3.keylayout index 22de1d0..7a0d8af 100644 --- a/EurKey-macOS.bundle/Contents/Resources/EurKEY v1.3.keylayout +++ b/EurKey-macOS.bundle/Contents/Resources/EurKEY v1.3.keylayout @@ -1123,7 +1123,7 @@ - + diff --git a/scripts/parse_keylayout.py b/scripts/parse_keylayout.py new file mode 100644 index 0000000..6fd19ed --- /dev/null +++ b/scripts/parse_keylayout.py @@ -0,0 +1,355 @@ +#!/usr/bin/env python3 +"""Parse Apple .keylayout XML files into a flat JSON representation. + +Extracts all key mappings across modifier layers (base, Shift, Caps, Option, +Shift+Option, Caps+Option, Command+Option) and resolves dead key states to +their composed outputs. + +Usage: + python3 scripts/parse_keylayout.py [--output file.json] + +Output JSON structure: +{ + "name": "EurKEY v1.3", + "modifierMap": { ... }, + "keyMaps": { + "0": { "label": "Base", "keys": { "0": {"output": "a", ...}, ... } }, + ... + }, + "actions": { + "a": { + "none": "a", + "dead: ^": "â", + ... + }, + ... + }, + "deadKeys": { + "dead: ^": { "terminator": "^", "compositions": { "a": "â", "A": "Â", ... } }, + ... + } +} +""" + +import json +import re +import sys +import xml.etree.ElementTree as ET +from pathlib import Path + +# macOS key code → physical key name (US ANSI/ISO layout) +KEY_CODE_NAMES = { + 0: "A", 1: "S", 2: "D", 3: "F", 4: "H", 5: "G", + 6: "Z", 7: "X", 8: "C", 9: "V", 10: "§/`", + 11: "B", 12: "Q", 13: "W", 14: "E", 15: "R", + 16: "Y", 17: "T", 18: "1", 19: "2", 20: "3", + 21: "4", 22: "6", 23: "5", 24: "=", 25: "9", + 26: "7", 27: "-", 28: "8", 29: "0", 30: "]", + 31: "O", 32: "U", 33: "[", 34: "I", 35: "P", + 36: "Return", 37: "L", 38: "J", 39: "'", 40: "K", + 41: ";", 42: "\\", 43: ",", 44: "/", 45: "N", + 46: "M", 47: ".", 48: "Tab", 49: "Space", 50: "`", + 51: "Delete", 52: "Enter", 53: "Escape", + # numpad + 65: "KP.", 67: "KP*", 69: "KP+", 75: "KP/", + 76: "KPEnter", 78: "KP-", 81: "KP=", + 82: "KP0", 83: "KP1", 84: "KP2", 85: "KP3", + 86: "KP4", 87: "KP5", 88: "KP6", 89: "KP7", + 91: "KP8", 92: "KP9", + # iso extra key + 93: "ISO§", 94: "ISO_backslash", 95: "ISO_comma", + # function/navigation keys + 96: "F5", 97: "F6", 98: "F7", 99: "F3", + 100: "F8", 101: "F9", 103: "F11", 105: "F13", + 107: "F14", 109: "F10", 111: "F12", 113: "F15", + 114: "Help/Insert", 115: "Home", 116: "PageUp", + 117: "ForwardDelete", 118: "F4", 119: "End", + 120: "F2", 121: "PageDown", 122: "F1", + 123: "Left", 124: "Right", 125: "Down", 126: "Up", +} + +# modifier map index → human-readable label +MODIFIER_LABELS = { + 0: "Base", + 1: "Shift", + 2: "Caps", + 3: "Option", + 4: "Shift+Option", + 5: "Caps+Option", + 6: "Command+Option", + 7: "Control", +} + +# key codes that are "typing" keys (not function/navigation/control) +TYPING_KEY_CODES = set(range(0, 50)) | {50, 93, 94, 95} + + +def _read_keylayout_xml(filepath): + """Read a .keylayout file, working around XML 1.1 control character references. + + Apple .keylayout files declare XML 1.1 and use numeric character references + for control characters ( through ) that are invalid in XML 1.0. + Python's ElementTree only supports XML 1.0, so we convert control character + references to placeholder tokens, parse, then restore them. + """ + with open(filepath, "r", encoding="utf-8") as f: + content = f.read() + + # downgrade XML declaration from 1.1 to 1.0 + content = content.replace('version="1.1"', 'version="1.0"') + + # strip the DOCTYPE (references local DTD that may not exist) + content = re.sub(r']*>', '', content) + + # replace control character references with placeholder strings + #  through  and  are problematic in XML 1.0 + def replace_control_ref(m): + code_point = int(m.group(1), 16) + return f"__CTRL_U{code_point:04X}__" + + content = re.sub( + r'&#x(000[0-9A-Fa-f]|001[0-9A-Fa-f]|007[Ff]);', + replace_control_ref, + content, + ) + + return content + + +def _restore_control_chars(text): + """Restore placeholder tokens back to actual characters.""" + if text is None: + return None + + def restore(m): + code_point = int(m.group(1), 16) + return chr(code_point) + + return re.sub(r'__CTRL_U([0-9A-F]{4})__', restore, text) + + +def parse_keylayout(filepath): + """Parse a .keylayout XML file and return a structured dict.""" + xml_content = _read_keylayout_xml(filepath) + root = ET.fromstring(xml_content) + + result = { + "name": root.get("name", ""), + "group": root.get("group", ""), + "id": root.get("id", ""), + } + + # parse modifier map + result["modifierMap"] = parse_modifier_map(root) + + # parse all keyMapSets + key_map_sets = {} + for kms in root.findall(".//keyMapSet"): + kms_id = kms.get("id") + key_map_sets[kms_id] = parse_key_map_set(kms, key_map_sets) + + # parse actions (dead key compositions) + actions = parse_actions(root) + result["actions"] = actions + + # parse terminators + terminators = {} + for term in root.findall(".//terminators/when"): + state = term.get("state", "") + output = _restore_control_chars(term.get("output", "")) + terminators[state] = output + result["terminators"] = terminators + + # resolve layouts + layouts = root.findall(".//layout") + + # build resolved key maps with all key codes from all layout entries + resolved = {} + for layout in layouts: + map_set_id = layout.get("mapSet") + first_code = int(layout.get("first", "0")) + last_code = int(layout.get("last", "0")) + kms = key_map_sets.get(map_set_id, {}) + + for idx_str, keys in kms.items(): + if idx_str not in resolved: + resolved[idx_str] = {} + for code_str, entry in keys.items(): + code = int(code_str) + if first_code <= code <= last_code: + resolved[idx_str][code_str] = entry + + # build the final keyMaps output + key_maps = {} + for idx_str in sorted(resolved.keys(), key=int): + idx = int(idx_str) + label = MODIFIER_LABELS.get(idx, f"Index {idx}") + keys = {} + for code_str in sorted(resolved[idx_str].keys(), key=int): + code = int(code_str) + entry = resolved[idx_str][code_str] + key_name = KEY_CODE_NAMES.get(code, f"code{code}") + key_info = {"code": code, "keyName": key_name} + + if "output" in entry: + key_info["output"] = entry["output"] + if "action" in entry: + action_id = entry["action"] + key_info["action"] = action_id + # resolve the action's base output + if action_id in actions: + action_data = actions[action_id] + if "none" in action_data: + key_info["output"] = action_data["none"] + elif "next" in action_data: + key_info["deadKey"] = action_data["next"] + + keys[code_str] = key_info + key_maps[idx_str] = {"label": label, "keys": keys} + + result["keyMaps"] = key_maps + + # build dead key summary + dead_keys = {} + for state_name, terminator in terminators.items(): + compositions = {} + for action_id, action_data in actions.items(): + if state_name in action_data: + compositions[action_id] = action_data[state_name] + dead_keys[state_name] = { + "terminator": terminator, + "compositions": compositions, + } + result["deadKeys"] = dead_keys + + return result + + +def parse_modifier_map(root): + """Parse the modifierMap element.""" + mod_map = {} + for mm in root.findall(".//modifierMap"): + mm_id = mm.get("id") + default_index = mm.get("defaultIndex", "") + selects = [] + for kms in mm.findall("keyMapSelect"): + map_index = kms.get("mapIndex", "") + modifiers = [] + for mod in kms.findall("modifier"): + modifiers.append(mod.get("keys", "")) + selects.append({"mapIndex": map_index, "modifiers": modifiers}) + mod_map[mm_id] = {"defaultIndex": default_index, "selects": selects} + return mod_map + + +def parse_key_map_set(kms_element, all_key_map_sets): + """Parse a keyMapSet element, resolving baseMapSet/baseIndex references.""" + result = {} + for km in kms_element.findall("keyMap"): + index = km.get("index") + keys = {} + + # resolve base map set if specified + base_map_set_id = km.get("baseMapSet") + base_index = km.get("baseIndex") + if base_map_set_id and base_index: + base_kms = all_key_map_sets.get(base_map_set_id, {}) + base_keys = base_kms.get(base_index, {}) + keys.update(base_keys) + + # parse keys in this keyMap (override base) + for key in km.findall("key"): + code = key.get("code") + entry = {} + if key.get("output") is not None: + entry["output"] = _restore_control_chars(key.get("output")) + if key.get("action") is not None: + entry["action"] = key.get("action") + keys[code] = entry + + result[index] = keys + return result + + +def parse_actions(root): + """Parse all action elements into a dict of action_id → {state → output/next}.""" + actions = {} + for action in root.findall(".//actions/action"): + action_id = action.get("id") + states = {} + for when in action.findall("when"): + state = when.get("state", "none") + if when.get("output") is not None: + states[state] = _restore_control_chars(when.get("output")) + elif when.get("next") is not None: + if state == "none": + states["next"] = when.get("next") + else: + states[state] = f"→{when.get('next')}" + actions[action_id] = states + return actions + + +def format_char(c): + """Format a character for display, showing control chars as hex.""" + if len(c) == 1: + cp = ord(c) + if cp < 0x20 or cp == 0x7F: + return f"U+{cp:04X}" + if cp == 0xA0: + return "NBSP" + return c + + +def print_summary(data): + """Print a human-readable summary of the parsed layout.""" + print(f"Layout: {data['name']}") + print(f"Dead key states: {', '.join(data['deadKeys'].keys())}") + print() + + for idx_str in sorted(data["keyMaps"].keys(), key=int): + km = data["keyMaps"][idx_str] + print(f"--- {km['label']} (index {idx_str}) ---") + for code_str in sorted(km["keys"].keys(), key=int): + code = int(code_str) + if code not in TYPING_KEY_CODES: + continue + ki = km["keys"][code_str] + key_name = ki["keyName"] + output = ki.get("output", "") + dead = ki.get("deadKey", "") + formatted = format_char(output) if output else "" + extra = f" [dead: {dead}]" if dead else "" + action = f" (action: {ki['action']})" if "action" in ki else "" + print(f" {key_name:>12s} (code {code:>3d}): {formatted}{extra}{action}") + print() + + +def main(): + import argparse + + parser = argparse.ArgumentParser(description="Parse Apple .keylayout XML files") + parser.add_argument("keylayout", help="Path to .keylayout file") + parser.add_argument("--output", "-o", help="Output JSON file path") + parser.add_argument("--summary", "-s", action="store_true", + help="Print human-readable summary") + args = parser.parse_args() + + data = parse_keylayout(args.keylayout) + + if args.summary: + print_summary(data) + + if args.output: + output_path = Path(args.output) + output_path.parent.mkdir(parents=True, exist_ok=True) + with open(output_path, "w", encoding="utf-8") as f: + json.dump(data, f, ensure_ascii=False, indent="\t") + print(f"Written to {output_path}") + elif not args.summary: + json.dump(data, sys.stdout, ensure_ascii=False, indent="\t") + print() + + +if __name__ == "__main__": + main() diff --git a/scripts/validate-layouts.sh b/scripts/validate-layouts.sh new file mode 100755 index 0000000..91e3480 --- /dev/null +++ b/scripts/validate-layouts.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# Validate all EurKEY keylayout files against the v1.3 reference spec. +# Exit code 0 if all pass, 1 if any unexpected mismatches. +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +exec python3 "${SCRIPT_DIR}/validate_layouts.py" "$@" diff --git a/scripts/validate_layouts.py b/scripts/validate_layouts.py new file mode 100644 index 0000000..0058be8 --- /dev/null +++ b/scripts/validate_layouts.py @@ -0,0 +1,306 @@ +#!/usr/bin/env python3 +"""Validate .keylayout files against the EurKEY v1.3 reference spec. + +Compares each layout version's key mappings and dead key compositions against +the reference, reporting mismatches. Supports per-version exception lists for +intentional differences. + +Usage: + python3 scripts/validate_layouts.py [--verbose] + +Exit code 0 if all layouts pass validation, 1 if any unexpected mismatches. +""" + +import sys +from pathlib import Path + +# import the parser +sys.path.insert(0, str(Path(__file__).parent)) +from parse_keylayout import parse_keylayout, TYPING_KEY_CODES, MODIFIER_LABELS, KEY_CODE_NAMES + +BUNDLE_DIR = Path(__file__).parent.parent / "EurKey-macOS.bundle" / "Contents" / "Resources" + +# modifier indices that contain meaningful typing output +# (exclude index 6 = Command+Option and 7 = Control — these are system shortcuts) +VALIDATED_MODIFIER_INDICES = {"0", "1", "2", "3", "4", "5"} + + +def load_layout(version): + """Parse a keylayout file for the given version string.""" + path = BUNDLE_DIR / f"EurKEY {version}.keylayout" + if not path.exists(): + print(f"ERROR: {path} not found") + sys.exit(2) + return parse_keylayout(str(path)) + + +def compare_key_maps(reference, target, exceptions): + """Compare key maps between reference and target layouts. + + Returns a list of (modifier_label, key_name, code, ref_output, target_output) tuples + for each mismatch that is not in the exceptions list. + """ + mismatches = [] + + # build terminator→state name maps for dead key comparison + # build state_name→terminator for both versions + ref_state_to_term = {name: dk["terminator"] for name, dk in reference["deadKeys"].items()} + tgt_state_to_term = {name: dk["terminator"] for name, dk in target["deadKeys"].items()} + + for idx_str in VALIDATED_MODIFIER_INDICES: + ref_km = reference["keyMaps"].get(idx_str, {}).get("keys", {}) + tgt_km = target["keyMaps"].get(idx_str, {}).get("keys", {}) + mod_label = MODIFIER_LABELS.get(int(idx_str), f"Index {idx_str}") + + for code_str in ref_km: + code = int(code_str) + if code not in TYPING_KEY_CODES: + continue + + ref_key = ref_km[code_str] + tgt_key = tgt_km.get(code_str, {}) + + ref_output = ref_key.get("output", "") + tgt_output = tgt_key.get("output", "") + ref_dead = ref_key.get("deadKey", "") + tgt_dead = tgt_key.get("deadKey", "") + + key_name = KEY_CODE_NAMES.get(code, f"code{code}") + + # check for exception + exc_key = f"{idx_str}:{code_str}" + if exc_key in exceptions: + expected = exceptions[exc_key] + if expected.get("output") == tgt_output or expected.get("deadKey") == tgt_dead: + continue + # exception exists but value doesn't match → still a mismatch + mismatches.append(( + mod_label, key_name, code, + f"{ref_output or ref_dead} (ref)", + f"{tgt_output or tgt_dead} (got, expected exception: {expected})", + )) + continue + + # compare dead keys by terminator (state names may differ) + if ref_dead or tgt_dead: + ref_term = ref_state_to_term.get(ref_dead, ref_dead) + tgt_term = tgt_state_to_term.get(tgt_dead, tgt_dead) + if ref_term == tgt_term: + continue # same dead key, different name + # dead keys differ + ref_display = f"[dead: {ref_dead} → {ref_term}]" + tgt_display = f"[dead: {tgt_dead} → {tgt_term}]" if tgt_dead else tgt_output or "[missing]" + mismatches.append((mod_label, key_name, code, ref_display, tgt_display)) + continue + + # compare regular outputs + if ref_output != tgt_output: + if not tgt_output and not tgt_dead: + tgt_display = "[missing]" + else: + tgt_display = tgt_output + mismatches.append((mod_label, key_name, code, ref_output, tgt_display)) + + return mismatches + + +def _build_terminator_map(data): + """Build a mapping from terminator character → dead key data. + + Different layout versions may use different state names (e.g., "dead: ^" vs "7") + but the same terminator character. This allows matching by terminator. + """ + return {dk["terminator"]: (name, dk) for name, dk in data["deadKeys"].items()} + + +def _composition_output_set(compositions): + """Extract the set of output characters from a dead key's compositions. + + Since action IDs differ between versions (e.g., "a" vs "a61"), we compare + by the set of output characters produced, not by action ID. + """ + return set(compositions.values()) + + +def compare_dead_keys(reference, target, exceptions): + """Compare dead key compositions between reference and target. + + Matches dead key states by their terminator character (since state names + may differ between versions). Compares composition output sets. + + Returns a list of (dead_key_state, detail, ref_value, target_value) tuples. + """ + mismatches = [] + + ref_by_term = _build_terminator_map(reference) + tgt_by_term = _build_terminator_map(target) + + for terminator, (ref_name, ref_dk) in ref_by_term.items(): + if ref_name in exceptions.get("_dead_key_skip", []): + continue + + if terminator not in tgt_by_term: + mismatches.append((ref_name, "*", "present", "missing")) + continue + + _, tgt_dk = tgt_by_term[terminator] + + # compare composition output sets + ref_outputs = _composition_output_set(ref_dk["compositions"]) + tgt_outputs = _composition_output_set(tgt_dk["compositions"]) + + only_ref = ref_outputs - tgt_outputs + only_tgt = tgt_outputs - ref_outputs + + for out in sorted(only_ref): + exc_key = f"dead:{ref_name}:output:{out}" + if exc_key not in exceptions: + mismatches.append((ref_name, f"output {out}", "present", "missing")) + + for out in sorted(only_tgt): + exc_key = f"dead:{ref_name}:extra:{out}" + if exc_key not in exceptions: + mismatches.append((ref_name, f"output {out}", "missing", "present")) + + return mismatches + + +def format_char_display(c): + """Format a character for display.""" + if not c or c in ("[missing]", "missing", "present"): + return c + if len(c) == 1: + cp = ord(c) + if cp < 0x20 or cp == 0x7F: + return f"U+{cp:04X}" + return c + + +# --- per-version exception definitions --- +# format: {"modifierIndex:keyCode": {"output": "expected_value"}} +# or {"_dead_key_skip": ["state_name", ...]} to skip entire dead key states + +# v1.2 predates v1.3 — known differences documented here +V1_2_EXCEPTIONS = { + # Shift+Option S: v1.2 has § where v1.3 has ẞ (capital sharp s) + "4:1": {"output": "§"}, + # v1.2 does not have the ¬ (negation) dead key — added in v1.3 + "_dead_key_skip": ["dead: ¬"], +} + +# v1.4 differences from v1.3: +# - §/` key (code 10) in Caps/Caps+Option outputs ẞ instead of § +# - ¬ dead key has an extra ¬ composition (self-referencing) +V1_4_EXCEPTIONS = { + "2:10": {"output": "ẞ"}, # Caps: §/` → ẞ (capital sharp s) + "5:10": {"output": "ẞ"}, # Caps+Option: §/` → ẞ + "dead:dead: ¬:extra:¬": True, # extra ¬ composition in negation dead key +} + +# v2.0 is a custom edition — skip validation for now, just document diffs +V2_0_EXCEPTIONS = { + "_skip_validation": True, +} + +VERSIONS = { + "v1.2": {"file": "v1.2", "exceptions": V1_2_EXCEPTIONS, "label": "EurKEY v1.2"}, + "v1.3": {"file": "v1.3", "exceptions": {}, "label": "EurKEY v1.3 (reference)"}, + "v1.4": {"file": "v1.4", "exceptions": V1_4_EXCEPTIONS, "label": "EurKEY v1.4"}, + "v2.0": {"file": "v2.0", "exceptions": V2_0_EXCEPTIONS, "label": "EurKEY v2.0 (custom)"}, +} + + +def validate_version(version_key, reference): + """Validate a single version against the reference. Returns (pass, mismatch_count).""" + config = VERSIONS[version_key] + exceptions = config["exceptions"] + + if exceptions.get("_skip_validation"): + print(f"\n{'='*60}") + print(f" {config['label']} — SKIPPED (custom edition)") + print(f"{'='*60}") + return True, 0 + + target = load_layout(config["file"]) + + print(f"\n{'='*60}") + print(f" Validating {config['label']} against v1.3 reference") + print(f"{'='*60}") + + # compare key maps + key_mismatches = compare_key_maps(reference, target, exceptions) + dk_mismatches = compare_dead_keys(reference, target, exceptions) + + total = len(key_mismatches) + len(dk_mismatches) + + if key_mismatches: + print(f"\n Key mapping mismatches ({len(key_mismatches)}):") + for mod_label, key_name, code, ref_out, tgt_out in key_mismatches: + print(f" {mod_label:>14s} | {key_name:>12s} (code {code:>3d}): " + f"ref={format_char_display(ref_out)} got={format_char_display(tgt_out)}") + + if dk_mismatches: + print(f"\n Dead key mismatches ({len(dk_mismatches)}):") + for state, action_id, ref_out, tgt_out in dk_mismatches: + print(f" {state:>12s} + {action_id}: " + f"ref={format_char_display(ref_out)} got={format_char_display(tgt_out)}") + + if total == 0: + print(f"\n PASS — no unexpected mismatches") + else: + print(f"\n FAIL — {total} unexpected mismatch(es)") + + return total == 0, total + + +def self_validate(reference): + """Validate that v1.3 matches itself (sanity check).""" + target = load_layout("v1.3") + key_mismatches = compare_key_maps(reference, target, {}) + dk_mismatches = compare_dead_keys(reference, target, {}) + total = len(key_mismatches) + len(dk_mismatches) + if total > 0: + print("INTERNAL ERROR: v1.3 does not match itself!") + for m in key_mismatches: + print(f" key: {m}") + for m in dk_mismatches: + print(f" dead: {m}") + return False + print(" Self-check: v1.3 matches itself ✓") + return True + + +def main(): + print("EurKEY-macOS Layout Validation") + print("Reference: EurKEY v1.3") + + # load reference + reference = load_layout("v1.3") + + # sanity check + if not self_validate(reference): + sys.exit(2) + + all_pass = True + total_mismatches = 0 + + for version_key in VERSIONS: + if version_key == "v1.3": + continue # skip self-comparison + passed, count = validate_version(version_key, reference) + if not passed: + all_pass = False + total_mismatches += count + + print(f"\n{'='*60}") + if all_pass: + print(" ALL LAYOUTS PASS ✓") + else: + print(f" VALIDATION FAILED — {total_mismatches} total mismatch(es)") + print(f"{'='*60}") + + sys.exit(0 if all_pass else 1) + + +if __name__ == "__main__": + main() diff --git a/spec/eurkey-v1.2-parsed.json b/spec/eurkey-v1.2-parsed.json new file mode 100644 index 0000000..0ce17c4 --- /dev/null +++ b/spec/eurkey-v1.2-parsed.json @@ -0,0 +1,2282 @@ +{ + "name": "EurKEY v1.2", + "group": "126", + "id": "-26839", + "modifierMap": { + "f4": { + "defaultIndex": "7", + "selects": [ + { + "mapIndex": "0", + "modifiers": [ + "command?", + "anyShift? caps? command" + ] + }, + { + "mapIndex": "1", + "modifiers": [ + "anyShift caps?" + ] + }, + { + "mapIndex": "2", + "modifiers": [ + "caps" + ] + }, + { + "mapIndex": "3", + "modifiers": [ + "anyOption" + ] + }, + { + "mapIndex": "4", + "modifiers": [ + "anyShift caps? anyOption command?" + ] + }, + { + "mapIndex": "5", + "modifiers": [ + "caps anyOption" + ] + }, + { + "mapIndex": "6", + "modifiers": [ + "caps? anyOption command" + ] + }, + { + "mapIndex": "7", + "modifiers": [ + "anyShift caps? option? command? control", + "shift? caps? anyOption command? control", + "caps? anyOption? command? control" + ] + } + ] + } + }, + "actions": { + "!": { + "none": "!", + "dead: Ω": "₁", + "dead: √": "≠" + }, + "\"": { + "none": "\"", + "dead: Ω": "₊", + "dead: √": "″" + }, + "#": { + "none": "#", + "dead: ˇ": "Ǯ", + "dead: Ω": "₃" + }, + "$": { + "none": "$", + "dead: Ω": "₄" + }, + "%": { + "none": "%", + "dead: Ω": "₅", + "dead: √": "‰" + }, + "&": { + "none": "&", + "dead: Ω": "₇", + "dead: √": "∧" + }, + "'": { + "none": "'", + "dead: Ω": "₌", + "dead: √": "′" + }, + "(": { + "none": "(", + "dead: Ω": "₉" + }, + ")": { + "none": ")", + "dead: Ω": "₀" + }, + "*": { + "none": "*", + "dead: Ω": "₈", + "dead: √": "⊗" + }, + "+": { + "none": "+", + "dead: ©": "⇔", + "dead: Ω": "⁺", + "dead: √": "⊕" + }, + "-": { + "none": "-", + "dead: Ω": "⁻", + "dead: √": "±" + }, + ".": { + "none": ".", + "dead: √": "⋅" + }, + "0": { + "none": "0", + "dead: Ω": "⁰" + }, + "1": { + "none": "1", + "dead: ©": "¼", + "dead: ¯": "‐", + "dead: Ω": "¹" + }, + "2": { + "none": "2", + "dead: ©": "½", + "dead: ¯": "–", + "dead: Ω": "²" + }, + "3": { + "none": "3", + "dead: ©": "¾", + "dead: ¯": "—", + "dead: ˇ": "ǯ", + "dead: Ω": "³", + "dead: √": "∛" + }, + "4": { + "none": "4", + "dead: ©": "⅓", + "dead: Ω": "⁴", + "dead: √": "∜" + }, + "5": { + "none": "5", + "dead: ©": "⅔", + "dead: ¯": "¯", + "dead: ´": "´", + "dead: ˇ": "ˇ", + "dead: ˚": "˚", + "dead: Ω": "⁵" + }, + "6": { + "none": "6", + "dead: Ω": "⁶" + }, + "6 option": { + "next": "dead: ^" + }, + "7": { + "none": "7", + "dead: Ω": "⁷", + "dead: √": "∡" + }, + "8": { + "none": "8", + "dead: Ω": "⁸", + "dead: √": "∠" + }, + "9": { + "none": "9", + "dead: Ω": "⁹", + "dead: √": "∟" + }, + ":": { + "none": ":", + "dead: √": "∴" + }, + ";": { + "none": ";", + "dead: Ω": "₋", + "dead: √": "∵" + }, + "<": { + "none": "<", + "dead: √": "≤" + }, + "=": { + "none": "=", + "dead: ©": "↔", + "dead: Ω": "⁼", + "dead: √": "≝" + }, + ">": { + "none": ">", + "dead: √": "≥" + }, + "@": { + "none": "@", + "dead: Ω": "₂" + }, + "A": { + "none": "A", + "dead: ^": "Â", + "dead: `": "À", + "dead: ~": "Ã", + "dead: ¨": "Ä", + "dead: ¯": "Ā", + "dead: ´": "Á", + "dead: ˇ": "Ǎ", + "dead: ˚": "Å", + "dead: Ω": "Α", + "dead: √": "∀" + }, + "B": { + "none": "B", + "dead: ¯": "Ƀ", + "dead: ´": "Ɓ", + "dead: Ω": "Β", + "dead: √": "⊇" + }, + "C": { + "none": "C", + "dead: ^": "Ĉ", + "dead: ©": "©", + "dead: ´": "Ć", + "dead: ˇ": "Č", + "dead: ˚": "Ċ", + "dead: Ω": "Χ", + "dead: √": "ℂ" + }, + "D": { + "none": "D", + "dead: ¯": "Đ", + "dead: ˇ": "Ď", + "dead: Ω": "Δ", + "dead: √": "∇" + }, + "E": { + "none": "E", + "dead: ^": "Ê", + "dead: `": "È", + "dead: ¨": "Ë", + "dead: ¯": "Ē", + "dead: ´": "É", + "dead: ˇ": "Ě", + "dead: ˚": "Ė", + "dead: Ω": "Ε", + "dead: √": "∃" + }, + "F": { + "none": "F", + "dead: Ω": "Φ", + "dead: √": "∎" + }, + "G": { + "none": "G", + "dead: ^": "Ĝ", + "dead: ¯": "Ḡ", + "dead: ´": "Ǵ", + "dead: ˇ": "Ǧ", + "dead: ˚": "Ġ", + "dead: Ω": "Γ", + "dead: √": "⊃" + }, + "H": { + "none": "H", + "dead: ^": "Ĥ", + "dead: ¨": "Ḧ", + "dead: ©": "⇐", + "dead: ¯": "Ħ", + "dead: ˇ": "Ȟ", + "dead: Ω": "Θ", + "dead: √": "⊅" + }, + "I": { + "none": "I", + "dead: ^": "Î", + "dead: `": "Ì", + "dead: ~": "Ĩ", + "dead: ¨": "Ï", + "dead: ©": "⇗", + "dead: ¯": "Ī", + "dead: ´": "Í", + "dead: ˇ": "Ǐ", + "dead: ˚": "İ", + "dead: Ω": "Η" + }, + "J": { + "none": "J", + "dead: ^": "Ĵ", + "dead: ©": "⇓", + "dead: Ω": "Ι" + }, + "K": { + "none": "K", + "dead: ©": "⇑", + "dead: ´": "Ḱ", + "dead: ˇ": "Ǩ", + "dead: Ω": "Κ", + "dead: √": "∌" + }, + "L": { + "none": "L", + "dead: ©": "⇒", + "dead: ¯": "Ḻ", + "dead: ´": "Ł", + "dead: ˇ": "Ľ", + "dead: Ω": "Λ", + "dead: √": "∦" + }, + "M": { + "none": "M", + "dead: ©": "⇘", + "dead: ´": "Ḿ", + "dead: Ω": "Μ", + "dead: √": "∉" + }, + "N": { + "none": "N", + "dead: ~": "Ñ", + "dead: ©": "⇙", + "dead: ´": "Ń", + "dead: ˇ": "Ň", + "dead: Ω": "Ν", + "dead: √": "ℕ" + }, + "O": { + "none": "O", + "dead: ^": "Ô", + "dead: `": "Ò", + "dead: ~": "Õ", + "dead: ¨": "Ö", + "dead: ¯": "Ō", + "dead: ´": "Ó", + "dead: ˇ": "Ǒ", + "dead: Ω": "Ο", + "dead: √": "∅" + }, + "P": { + "none": "P", + "dead: ©": "℗", + "dead: ´": "Ṕ", + "dead: Ω": "Π", + "dead: √": "ℙ" + }, + "Q": { + "none": "Q", + "dead: Ω": "Ω", + "dead: √": "ℚ" + }, + "R": { + "none": "R", + "dead: ©": "®", + "dead: ´": "Ŕ", + "dead: ˇ": "Ř", + "dead: Ω": "Ρ", + "dead: √": "ℝ" + }, + "S": { + "none": "S", + "dead: ^": "Ŝ", + "dead: ©": "℠", + "dead: ´": "Ś", + "dead: ˇ": "Š", + "dead: Ω": "Σ", + "dead: √": "∫" + }, + "T": { + "none": "T", + "dead: ©": "™", + "dead: ¯": "Ŧ", + "dead: ˇ": "Ť", + "dead: Ω": "Τ" + }, + "U": { + "none": "U", + "dead: ^": "Û", + "dead: `": "Ù", + "dead: ~": "Ũ", + "dead: ¨": "Ü", + "dead: ©": "⇖", + "dead: ¯": "Ū", + "dead: ´": "Ú", + "dead: ˇ": "Ǔ", + "dead: ˚": "Ů", + "dead: Ω": "Ω", + "dead: √": "∖" + }, + "V": { + "none": "V", + "dead: Ω": "Β" + }, + "W": { + "none": "W", + "dead: ^": "Ŵ", + "dead: ¨": "Ẅ", + "dead: ´": "Ẃ", + "dead: Ω": "Ψ" + }, + "X": { + "none": "X", + "dead: ¨": "Ẍ", + "dead: Ω": "Ξ", + "dead: √": "∄" + }, + "Y": { + "none": "Y", + "dead: ^": "Ŷ", + "dead: ~": "Ỹ", + "dead: ¨": "Ÿ", + "dead: ¯": "Ȳ", + "dead: ´": "Ý", + "dead: Ω": "Υ" + }, + "Z": { + "none": "Z", + "dead: ´": "Ź", + "dead: ˇ": "Ž", + "dead: ˚": "Ż", + "dead: Ω": "Ζ", + "dead: √": "ℤ" + }, + "[": { + "none": "[", + "dead: Ω": "⁽" + }, + "]": { + "none": "]", + "dead: Ω": "⁾" + }, + "^": { + "none": "^", + "dead: Ω": "₆", + "dead: √": "℘" + }, + "_": { + "none": "_" + }, + "`": { + "next": "dead: `" + }, + "a": { + "none": "a", + "dead: ^": "â", + "dead: `": "à", + "dead: ~": "ã", + "dead: ¨": "ä", + "dead: ¯": "ā", + "dead: ´": "á", + "dead: ˇ": "ǎ", + "dead: ˚": "å", + "dead: Ω": "α" + }, + "b": { + "none": "b", + "dead: ¯": "ƀ", + "dead: ´": "ɓ", + "dead: Ω": "β", + "dead: √": "⊆" + }, + "c": { + "none": "c", + "dead: ^": "ĉ", + "dead: ©": "©", + "dead: ´": "ć", + "dead: ˇ": "č", + "dead: ˚": "ċ", + "dead: Ω": "χ", + "dead: √": "∝" + }, + "d": { + "none": "d", + "dead: ¯": "đ", + "dead: ˇ": "ď", + "dead: Ω": "δ", + "dead: √": "Δ" + }, + "e": { + "none": "e", + "dead: ^": "ê", + "dead: `": "è", + "dead: ¨": "ë", + "dead: ¯": "ē", + "dead: ´": "é", + "dead: ˇ": "ě", + "dead: ˚": "ė", + "dead: Ω": "ε" + }, + "f": { + "none": "f", + "dead: Ω": "φ", + "dead: √": "ƒ" + }, + "g": { + "none": "g", + "dead: ^": "ĝ", + "dead: ¯": "ḡ", + "dead: ´": "ǵ", + "dead: ˇ": "ǧ", + "dead: ˚": "ġ", + "dead: Ω": "γ", + "dead: √": "⊂" + }, + "h": { + "none": "h", + "dead: ^": "ĥ", + "dead: ¨": "ḧ", + "dead: ©": "←", + "dead: ¯": "ħ", + "dead: ˇ": "ȟ", + "dead: Ω": "θ", + "dead: √": "⊄" + }, + "i": { + "none": "i", + "dead: ^": "î", + "dead: `": "ì", + "dead: ~": "ĩ", + "dead: ¨": "ï", + "dead: ©": "↗", + "dead: ¯": "ī", + "dead: ´": "í", + "dead: ˇ": "ǐ", + "dead: Ω": "η", + "dead: √": "∞" + }, + "j": { + "none": "j", + "dead: ^": "ĵ", + "dead: ©": "↓", + "dead: ˇ": "ǰ", + "dead: Ω": "ι" + }, + "k": { + "none": "k", + "dead: ©": "↑", + "dead: ´": "ḱ", + "dead: ˇ": "ǩ", + "dead: Ω": "κ", + "dead: √": "∋" + }, + "l": { + "none": "l", + "dead: ©": "→", + "dead: ¯": "ḻ", + "dead: ´": "ł", + "dead: ˇ": "ľ", + "dead: Ω": "λ", + "dead: √": "∥" + }, + "m": { + "none": "m", + "dead: ©": "↘", + "dead: ´": "ḿ", + "dead: Ω": "μ", + "dead: √": "∈" + }, + "n": { + "none": "n", + "dead: ~": "ñ", + "dead: ©": "↙", + "dead: ´": "ń", + "dead: ˇ": "ň", + "dead: Ω": "ν", + "dead: √": "ⁿ" + }, + "o": { + "none": "o", + "dead: ^": "ô", + "dead: `": "ò", + "dead: ~": "õ", + "dead: ¨": "ö", + "dead: ¯": "ō", + "dead: ´": "ó", + "dead: ˇ": "ǒ", + "dead: Ω": "ο", + "dead: √": "∘" + }, + "p": { + "none": "p", + "dead: ©": "℗", + "dead: ´": "ṕ", + "dead: Ω": "π", + "dead: √": "∂" + }, + "q": { + "none": "q", + "dead: Ω": "ω" + }, + "r": { + "none": "r", + "dead: ©": "®", + "dead: ´": "ŕ", + "dead: ˇ": "ř", + "dead: Ω": "ρ", + "dead: √": "√" + }, + "s": { + "none": "s", + "dead: ^": "ŝ", + "dead: ©": "℠", + "dead: ´": "ś", + "dead: ˇ": "š", + "dead: Ω": "σ", + "dead: √": "∩" + }, + "space": { + "none": " ", + "dead: ^": "^", + "dead: `": "`", + "dead: ~": "~", + "dead: ¨": "¨", + "dead: ©": "©", + "dead: ¯": "¯", + "dead: ´": "´", + "dead: ˇ": "ˇ", + "dead: ˚": "˚", + "dead: √": "√" + }, + "t": { + "none": "t", + "dead: ¨": "ẗ", + "dead: ©": "™", + "dead: ¯": "ŧ", + "dead: ˇ": "ť", + "dead: Ω": "τ" + }, + "u": { + "none": "u", + "dead: ^": "û", + "dead: `": "ù", + "dead: ~": "ũ", + "dead: ¨": "ü", + "dead: ©": "↖", + "dead: ¯": "ū", + "dead: ´": "ú", + "dead: ˇ": "ǔ", + "dead: ˚": "ů", + "dead: Ω": "ω", + "dead: √": "∪" + }, + "v": { + "none": "v", + "dead: Ω": "β" + }, + "w": { + "none": "w", + "dead: ^": "ŵ", + "dead: ¨": "ẅ", + "dead: ´": "ẃ", + "dead: ˚": "ẘ", + "dead: Ω": "ψ" + }, + "x": { + "none": "x", + "dead: ¨": "ẍ", + "dead: Ω": "ξ" + }, + "y": { + "none": "y", + "dead: ^": "ŷ", + "dead: ~": "ỹ", + "dead: ¨": "ÿ", + "dead: ¯": "ȳ", + "dead: ´": "ý", + "dead: ˚": "ẙ", + "dead: Ω": "υ" + }, + "z": { + "none": "z", + "dead: ´": "ź", + "dead: ˇ": "ž", + "dead: ˚": "ż", + "dead: Ω": "ζ", + "dead: √": "↯" + }, + "{": { + "none": "{", + "dead: Ω": "₍" + }, + "|": { + "none": "|", + "dead: √": "∨" + }, + "}": { + "none": "}", + "dead: Ω": "₎" + }, + "~": { + "none": "~", + "dead: √": "≈" + }, + "~ option": { + "next": "dead: ~" + }, + "¨": { + "next": "dead: ¨" + }, + "©": { + "next": "dead: ©" + }, + "¯": { + "next": "dead: ¯" + }, + "´": { + "next": "dead: ´" + }, + "Ä": { + "none": "Ä", + "dead: `": "Ą" + }, + "Æ": { + "none": "Æ", + "dead: ¯": "Ǣ", + "dead: ´": "Ǽ" + }, + "Ë": { + "none": "Ë", + "dead: `": "Ę" + }, + "Ï": { + "none": "Ï", + "dead: `": "Į" + }, + "Ö": { + "none": "Ö", + "dead: `": "Ǫ" + }, + "Ø": { + "none": "Ø", + "dead: ´": "Ǿ" + }, + "Ü": { + "none": "Ü", + "dead: `": "Ų", + "dead: ˇ": "Ǚ" + }, + "ä": { + "none": "ä", + "dead: `": "ą" + }, + "æ": { + "none": "æ", + "dead: ¯": "ǣ", + "dead: ´": "ǽ" + }, + "ë": { + "none": "ë", + "dead: `": "ę" + }, + "ï": { + "none": "ï", + "dead: `": "į" + }, + "ö": { + "none": "ö", + "dead: `": "ǫ" + }, + "ø": { + "none": "ø", + "dead: ´": "ǿ" + }, + "ü": { + "none": "ü", + "dead: `": "ų", + "dead: ˇ": "ǚ" + }, + "ˇ": { + "next": "dead: ˇ" + }, + "˚": { + "next": "dead: ˚" + }, + "Ω": { + "next": "dead: Ω" + }, + "√": { + "next": "dead: √" + } + }, + "terminators": { + "dead: ^": "^", + "dead: `": "`", + "dead: ~": "~", + "dead: ¨": "¨", + "dead: ©": "©", + "dead: ¯": "¯", + "dead: ´": "´", + "dead: ˇ": "ˇ", + "dead: ˚": "˚", + "dead: Ω": "Ω", + "dead: √": " " + }, + "keyMaps": { + "0": { + "label": "Base", + "keys": { + "0": { + "code": 0, + "keyName": "A", + "action": "a", + "output": "a" + }, + "1": { + "code": 1, + "keyName": "S", + "action": "s", + "output": "s" + }, + "2": { + "code": 2, + "keyName": "D", + "action": "d", + "output": "d" + }, + "3": { + "code": 3, + "keyName": "F", + "action": "f", + "output": "f" + }, + "4": { + "code": 4, + "keyName": "H", + "action": "h", + "output": "h" + }, + "5": { + "code": 5, + "keyName": "G", + "action": "g", + "output": "g" + }, + "6": { + "code": 6, + "keyName": "Z", + "action": "z", + "output": "z" + }, + "7": { + "code": 7, + "keyName": "X", + "action": "x", + "output": "x" + }, + "8": { + "code": 8, + "keyName": "C", + "action": "c", + "output": "c" + }, + "9": { + "code": 9, + "keyName": "V", + "action": "v", + "output": "v" + }, + "10": { + "code": 10, + "keyName": "§/`", + "output": "§" + }, + "11": { + "code": 11, + "keyName": "B", + "action": "b", + "output": "b" + }, + "12": { + "code": 12, + "keyName": "Q", + "action": "q", + "output": "q" + }, + "13": { + "code": 13, + "keyName": "W", + "action": "w", + "output": "w" + }, + "14": { + "code": 14, + "keyName": "E", + "action": "e", + "output": "e" + }, + "15": { + "code": 15, + "keyName": "R", + "action": "r", + "output": "r" + }, + "16": { + "code": 16, + "keyName": "Y", + "action": "y", + "output": "y" + }, + "17": { + "code": 17, + "keyName": "T", + "action": "t", + "output": "t" + }, + "18": { + "code": 18, + "keyName": "1", + "action": "1", + "output": "1" + }, + "21": { + "code": 21, + "keyName": "4", + "action": "4", + "output": "4" + }, + "22": { + "code": 22, + "keyName": "6", + "action": "6", + "output": "6" + }, + "23": { + "code": 23, + "keyName": "5", + "action": "5", + "output": "5" + }, + "30": { + "code": 30, + "keyName": "]", + "output": "[" + } + } + }, + "1": { + "label": "Shift", + "keys": { + "0": { + "code": 0, + "keyName": "A", + "action": "A", + "output": "A" + }, + "1": { + "code": 1, + "keyName": "S", + "action": "S", + "output": "S" + }, + "2": { + "code": 2, + "keyName": "D", + "action": "D", + "output": "D" + }, + "3": { + "code": 3, + "keyName": "F", + "action": "F", + "output": "F" + }, + "4": { + "code": 4, + "keyName": "H", + "action": "H", + "output": "H" + }, + "5": { + "code": 5, + "keyName": "G", + "action": "G", + "output": "G" + }, + "6": { + "code": 6, + "keyName": "Z", + "action": "Z", + "output": "Z" + }, + "7": { + "code": 7, + "keyName": "X", + "action": "X", + "output": "X" + }, + "8": { + "code": 8, + "keyName": "C", + "action": "C", + "output": "C" + }, + "9": { + "code": 9, + "keyName": "V", + "action": "V", + "output": "V" + }, + "10": { + "code": 10, + "keyName": "§/`", + "output": "±" + }, + "11": { + "code": 11, + "keyName": "B", + "action": "B", + "output": "B" + }, + "12": { + "code": 12, + "keyName": "Q", + "action": "Q", + "output": "Q" + }, + "13": { + "code": 13, + "keyName": "W", + "action": "W", + "output": "W" + }, + "14": { + "code": 14, + "keyName": "E", + "action": "E", + "output": "E" + }, + "15": { + "code": 15, + "keyName": "R", + "action": "R", + "output": "R" + }, + "16": { + "code": 16, + "keyName": "Y", + "action": "Y", + "output": "Y" + }, + "17": { + "code": 17, + "keyName": "T", + "action": "T", + "output": "T" + }, + "18": { + "code": 18, + "keyName": "1", + "action": "!", + "output": "!" + }, + "21": { + "code": 21, + "keyName": "4", + "action": "$", + "output": "$" + }, + "22": { + "code": 22, + "keyName": "6", + "output": "&" + }, + "23": { + "code": 23, + "keyName": "5", + "action": "%", + "output": "%" + }, + "30": { + "code": 30, + "keyName": "]", + "output": "{" + } + } + }, + "2": { + "label": "Caps", + "keys": { + "0": { + "code": 0, + "keyName": "A", + "action": "A", + "output": "A" + }, + "1": { + "code": 1, + "keyName": "S", + "action": "S", + "output": "S" + }, + "2": { + "code": 2, + "keyName": "D", + "action": "D", + "output": "D" + }, + "3": { + "code": 3, + "keyName": "F", + "action": "F", + "output": "F" + }, + "4": { + "code": 4, + "keyName": "H", + "action": "H", + "output": "H" + }, + "5": { + "code": 5, + "keyName": "G", + "action": "G", + "output": "G" + }, + "6": { + "code": 6, + "keyName": "Z", + "action": "Z", + "output": "Z" + }, + "7": { + "code": 7, + "keyName": "X", + "action": "X", + "output": "X" + }, + "8": { + "code": 8, + "keyName": "C", + "action": "C", + "output": "C" + }, + "9": { + "code": 9, + "keyName": "V", + "action": "V", + "output": "V" + }, + "10": { + "code": 10, + "keyName": "§/`", + "output": "§" + }, + "11": { + "code": 11, + "keyName": "B", + "action": "B", + "output": "B" + }, + "12": { + "code": 12, + "keyName": "Q", + "action": "Q", + "output": "Q" + }, + "13": { + "code": 13, + "keyName": "W", + "action": "W", + "output": "W" + }, + "14": { + "code": 14, + "keyName": "E", + "action": "E", + "output": "E" + }, + "15": { + "code": 15, + "keyName": "R", + "action": "R", + "output": "R" + }, + "16": { + "code": 16, + "keyName": "Y", + "action": "Y", + "output": "Y" + }, + "17": { + "code": 17, + "keyName": "T", + "action": "T", + "output": "T" + }, + "18": { + "code": 18, + "keyName": "1", + "action": "1", + "output": "1" + }, + "21": { + "code": 21, + "keyName": "4", + "action": "4", + "output": "4" + }, + "22": { + "code": 22, + "keyName": "6", + "action": "6", + "output": "6" + }, + "23": { + "code": 23, + "keyName": "5", + "action": "5", + "output": "5" + }, + "30": { + "code": 30, + "keyName": "]", + "output": "[" + } + } + }, + "3": { + "label": "Option", + "keys": { + "0": { + "code": 0, + "keyName": "A", + "action": "ä", + "output": "ä" + }, + "1": { + "code": 1, + "keyName": "S", + "output": "ß" + }, + "2": { + "code": 2, + "keyName": "D", + "output": "đ" + }, + "3": { + "code": 3, + "keyName": "F", + "output": "è" + }, + "4": { + "code": 4, + "keyName": "H", + "output": "ù" + }, + "5": { + "code": 5, + "keyName": "G", + "output": "é" + }, + "6": { + "code": 6, + "keyName": "Z", + "output": "à" + }, + "7": { + "code": 7, + "keyName": "X", + "output": "á" + }, + "8": { + "code": 8, + "keyName": "C", + "output": "ç" + }, + "9": { + "code": 9, + "keyName": "V", + "output": "ì" + }, + "10": { + "code": 10, + "keyName": "§/`", + "output": "§" + }, + "11": { + "code": 11, + "keyName": "B", + "output": "í" + }, + "12": { + "code": 12, + "keyName": "Q", + "action": "æ", + "output": "æ" + }, + "13": { + "code": 13, + "keyName": "W", + "output": "å" + }, + "14": { + "code": 14, + "keyName": "E", + "action": "ë", + "output": "ë" + }, + "15": { + "code": 15, + "keyName": "R", + "output": "ý" + }, + "16": { + "code": 16, + "keyName": "Y", + "output": "ÿ" + }, + "17": { + "code": 17, + "keyName": "T", + "output": "þ" + }, + "18": { + "code": 18, + "keyName": "1", + "output": "¡" + }, + "21": { + "code": 21, + "keyName": "4", + "output": "£" + }, + "22": { + "code": 22, + "keyName": "6", + "action": "6 option", + "deadKey": "dead: ^" + }, + "23": { + "code": 23, + "keyName": "5", + "output": "€" + }, + "30": { + "code": 30, + "keyName": "]", + "output": "»" + } + } + }, + "4": { + "label": "Shift+Option", + "keys": { + "0": { + "code": 0, + "keyName": "A", + "action": "Ä", + "output": "Ä" + }, + "1": { + "code": 1, + "keyName": "S", + "output": "§" + }, + "2": { + "code": 2, + "keyName": "D", + "output": "Đ" + }, + "3": { + "code": 3, + "keyName": "F", + "output": "È" + }, + "4": { + "code": 4, + "keyName": "H", + "output": "Ù" + }, + "5": { + "code": 5, + "keyName": "G", + "output": "É" + }, + "6": { + "code": 6, + "keyName": "Z", + "output": "À" + }, + "7": { + "code": 7, + "keyName": "X", + "output": "Á" + }, + "8": { + "code": 8, + "keyName": "C", + "output": "Ç" + }, + "9": { + "code": 9, + "keyName": "V", + "output": "Ì" + }, + "10": { + "code": 10, + "keyName": "§/`", + "output": "±" + }, + "11": { + "code": 11, + "keyName": "B", + "output": "Í" + }, + "12": { + "code": 12, + "keyName": "Q", + "action": "Æ", + "output": "Æ" + }, + "13": { + "code": 13, + "keyName": "W", + "output": "Å" + }, + "14": { + "code": 14, + "keyName": "E", + "action": "Ë", + "output": "Ë" + }, + "15": { + "code": 15, + "keyName": "R", + "output": "Ý" + }, + "16": { + "code": 16, + "keyName": "Y", + "output": "Ÿ" + }, + "17": { + "code": 17, + "keyName": "T", + "output": "Þ" + }, + "18": { + "code": 18, + "keyName": "1", + "output": "¹" + }, + "21": { + "code": 21, + "keyName": "4", + "output": "¥" + }, + "22": { + "code": 22, + "keyName": "6", + "action": "ˇ", + "deadKey": "dead: ˇ" + }, + "23": { + "code": 23, + "keyName": "5", + "output": "¢" + }, + "30": { + "code": 30, + "keyName": "]", + "output": "›" + } + } + }, + "5": { + "label": "Caps+Option", + "keys": { + "0": { + "code": 0, + "keyName": "A", + "output": "Ä" + }, + "1": { + "code": 1, + "keyName": "S", + "output": "ß" + }, + "2": { + "code": 2, + "keyName": "D", + "output": "Ð" + }, + "3": { + "code": 3, + "keyName": "F", + "output": "È" + }, + "4": { + "code": 4, + "keyName": "H", + "output": "Ù" + }, + "5": { + "code": 5, + "keyName": "G", + "output": "É" + }, + "6": { + "code": 6, + "keyName": "Z", + "output": "À" + }, + "7": { + "code": 7, + "keyName": "X", + "output": "Á" + }, + "8": { + "code": 8, + "keyName": "C", + "output": "Ç" + }, + "9": { + "code": 9, + "keyName": "V", + "output": "Ì" + }, + "10": { + "code": 10, + "keyName": "§/`", + "output": "§" + }, + "11": { + "code": 11, + "keyName": "B", + "output": "Í" + }, + "12": { + "code": 12, + "keyName": "Q", + "action": "Æ", + "output": "Æ" + }, + "13": { + "code": 13, + "keyName": "W", + "output": "Å" + }, + "14": { + "code": 14, + "keyName": "E", + "output": "Ë" + }, + "15": { + "code": 15, + "keyName": "R", + "output": "Ý" + }, + "16": { + "code": 16, + "keyName": "Y", + "output": "Ÿ" + }, + "17": { + "code": 17, + "keyName": "T", + "output": "Þ" + }, + "18": { + "code": 18, + "keyName": "1", + "output": "¡" + }, + "21": { + "code": 21, + "keyName": "4", + "output": "£" + }, + "22": { + "code": 22, + "keyName": "6", + "action": "^", + "output": "^" + }, + "23": { + "code": 23, + "keyName": "5", + "output": "€" + }, + "30": { + "code": 30, + "keyName": "]", + "output": "»" + } + } + }, + "6": { + "label": "Command+Option", + "keys": { + "0": { + "code": 0, + "keyName": "A", + "output": "å" + }, + "1": { + "code": 1, + "keyName": "S", + "output": "ß" + }, + "2": { + "code": 2, + "keyName": "D", + "output": "∂" + }, + "3": { + "code": 3, + "keyName": "F", + "output": "ƒ" + }, + "4": { + "code": 4, + "keyName": "H", + "output": "˙" + }, + "5": { + "code": 5, + "keyName": "G", + "output": "©" + }, + "6": { + "code": 6, + "keyName": "Z", + "output": "Ω" + }, + "7": { + "code": 7, + "keyName": "X", + "output": "≈" + }, + "8": { + "code": 8, + "keyName": "C", + "output": "ç" + }, + "9": { + "code": 9, + "keyName": "V", + "output": "√" + }, + "10": { + "code": 10, + "keyName": "§/`", + "output": "§" + }, + "11": { + "code": 11, + "keyName": "B", + "output": "∫" + }, + "12": { + "code": 12, + "keyName": "Q", + "output": "œ" + }, + "13": { + "code": 13, + "keyName": "W", + "output": "∑" + }, + "14": { + "code": 14, + "keyName": "E", + "output": "´" + }, + "15": { + "code": 15, + "keyName": "R", + "output": "®" + }, + "16": { + "code": 16, + "keyName": "Y", + "output": "¥" + }, + "17": { + "code": 17, + "keyName": "T", + "output": "†" + }, + "18": { + "code": 18, + "keyName": "1", + "output": "¡" + }, + "21": { + "code": 21, + "keyName": "4", + "output": "¢" + }, + "22": { + "code": 22, + "keyName": "6", + "output": "§" + }, + "23": { + "code": 23, + "keyName": "5", + "output": "∞" + }, + "30": { + "code": 30, + "keyName": "]", + "output": "‘" + } + } + }, + "7": { + "label": "Control", + "keys": { + "0": { + "code": 0, + "keyName": "A", + "output": "\u0001" + }, + "1": { + "code": 1, + "keyName": "S", + "output": "\u0013" + }, + "2": { + "code": 2, + "keyName": "D", + "output": "\u0004" + }, + "3": { + "code": 3, + "keyName": "F", + "output": "\u0006" + }, + "4": { + "code": 4, + "keyName": "H", + "output": "\b" + }, + "5": { + "code": 5, + "keyName": "G", + "output": "\u0007" + }, + "6": { + "code": 6, + "keyName": "Z", + "output": "\u001a" + }, + "7": { + "code": 7, + "keyName": "X", + "output": "\u0018" + }, + "8": { + "code": 8, + "keyName": "C", + "output": "\u0003" + }, + "9": { + "code": 9, + "keyName": "V", + "output": "\u0016" + }, + "10": { + "code": 10, + "keyName": "§/`", + "output": "0" + }, + "11": { + "code": 11, + "keyName": "B", + "output": "\u0002" + }, + "12": { + "code": 12, + "keyName": "Q", + "output": "\u0011" + }, + "13": { + "code": 13, + "keyName": "W", + "output": "\u0017" + }, + "14": { + "code": 14, + "keyName": "E", + "output": "\u0005" + }, + "15": { + "code": 15, + "keyName": "R", + "output": "\u0012" + }, + "16": { + "code": 16, + "keyName": "Y", + "output": "\u0019" + }, + "17": { + "code": 17, + "keyName": "T", + "output": "\u0014" + }, + "18": { + "code": 18, + "keyName": "1", + "output": "1" + }, + "21": { + "code": 21, + "keyName": "4", + "output": "4" + }, + "22": { + "code": 22, + "keyName": "6", + "output": "6" + }, + "23": { + "code": 23, + "keyName": "5", + "output": "5" + }, + "30": { + "code": 30, + "keyName": "]", + "output": "\u001d" + } + } + } + }, + "deadKeys": { + "dead: ^": { + "terminator": "^", + "compositions": { + "A": "Â", + "C": "Ĉ", + "E": "Ê", + "G": "Ĝ", + "H": "Ĥ", + "I": "Î", + "J": "Ĵ", + "O": "Ô", + "S": "Ŝ", + "U": "Û", + "W": "Ŵ", + "Y": "Ŷ", + "a": "â", + "c": "ĉ", + "e": "ê", + "g": "ĝ", + "h": "ĥ", + "i": "î", + "j": "ĵ", + "o": "ô", + "s": "ŝ", + "space": "^", + "u": "û", + "w": "ŵ", + "y": "ŷ" + } + }, + "dead: `": { + "terminator": "`", + "compositions": { + "A": "À", + "E": "È", + "I": "Ì", + "O": "Ò", + "U": "Ù", + "a": "à", + "e": "è", + "i": "ì", + "o": "ò", + "space": "`", + "u": "ù", + "Ä": "Ą", + "Ë": "Ę", + "Ï": "Į", + "Ö": "Ǫ", + "Ü": "Ų", + "ä": "ą", + "ë": "ę", + "ï": "į", + "ö": "ǫ", + "ü": "ų" + } + }, + "dead: ~": { + "terminator": "~", + "compositions": { + "A": "Ã", + "I": "Ĩ", + "N": "Ñ", + "O": "Õ", + "U": "Ũ", + "Y": "Ỹ", + "a": "ã", + "i": "ĩ", + "n": "ñ", + "o": "õ", + "space": "~", + "u": "ũ", + "y": "ỹ" + } + }, + "dead: ¨": { + "terminator": "¨", + "compositions": { + "A": "Ä", + "E": "Ë", + "H": "Ḧ", + "I": "Ï", + "O": "Ö", + "U": "Ü", + "W": "Ẅ", + "X": "Ẍ", + "Y": "Ÿ", + "a": "ä", + "e": "ë", + "h": "ḧ", + "i": "ï", + "o": "ö", + "space": "¨", + "t": "ẗ", + "u": "ü", + "w": "ẅ", + "x": "ẍ", + "y": "ÿ" + } + }, + "dead: ©": { + "terminator": "©", + "compositions": { + "+": "⇔", + "1": "¼", + "2": "½", + "3": "¾", + "4": "⅓", + "5": "⅔", + "=": "↔", + "C": "©", + "H": "⇐", + "I": "⇗", + "J": "⇓", + "K": "⇑", + "L": "⇒", + "M": "⇘", + "N": "⇙", + "P": "℗", + "R": "®", + "S": "℠", + "T": "™", + "U": "⇖", + "c": "©", + "h": "←", + "i": "↗", + "j": "↓", + "k": "↑", + "l": "→", + "m": "↘", + "n": "↙", + "p": "℗", + "r": "®", + "s": "℠", + "space": "©", + "t": "™", + "u": "↖" + } + }, + "dead: ¯": { + "terminator": "¯", + "compositions": { + "1": "‐", + "2": "–", + "3": "—", + "5": "¯", + "A": "Ā", + "B": "Ƀ", + "D": "Đ", + "E": "Ē", + "G": "Ḡ", + "H": "Ħ", + "I": "Ī", + "L": "Ḻ", + "O": "Ō", + "T": "Ŧ", + "U": "Ū", + "Y": "Ȳ", + "a": "ā", + "b": "ƀ", + "d": "đ", + "e": "ē", + "g": "ḡ", + "h": "ħ", + "i": "ī", + "l": "ḻ", + "o": "ō", + "space": "¯", + "t": "ŧ", + "u": "ū", + "y": "ȳ", + "Æ": "Ǣ", + "æ": "ǣ" + } + }, + "dead: ´": { + "terminator": "´", + "compositions": { + "5": "´", + "A": "Á", + "B": "Ɓ", + "C": "Ć", + "E": "É", + "G": "Ǵ", + "I": "Í", + "K": "Ḱ", + "L": "Ł", + "M": "Ḿ", + "N": "Ń", + "O": "Ó", + "P": "Ṕ", + "R": "Ŕ", + "S": "Ś", + "U": "Ú", + "W": "Ẃ", + "Y": "Ý", + "Z": "Ź", + "a": "á", + "b": "ɓ", + "c": "ć", + "e": "é", + "g": "ǵ", + "i": "í", + "k": "ḱ", + "l": "ł", + "m": "ḿ", + "n": "ń", + "o": "ó", + "p": "ṕ", + "r": "ŕ", + "s": "ś", + "space": "´", + "u": "ú", + "w": "ẃ", + "y": "ý", + "z": "ź", + "Æ": "Ǽ", + "Ø": "Ǿ", + "æ": "ǽ", + "ø": "ǿ" + } + }, + "dead: ˇ": { + "terminator": "ˇ", + "compositions": { + "#": "Ǯ", + "3": "ǯ", + "5": "ˇ", + "A": "Ǎ", + "C": "Č", + "D": "Ď", + "E": "Ě", + "G": "Ǧ", + "H": "Ȟ", + "I": "Ǐ", + "K": "Ǩ", + "L": "Ľ", + "N": "Ň", + "O": "Ǒ", + "R": "Ř", + "S": "Š", + "T": "Ť", + "U": "Ǔ", + "Z": "Ž", + "a": "ǎ", + "c": "č", + "d": "ď", + "e": "ě", + "g": "ǧ", + "h": "ȟ", + "i": "ǐ", + "j": "ǰ", + "k": "ǩ", + "l": "ľ", + "n": "ň", + "o": "ǒ", + "r": "ř", + "s": "š", + "space": "ˇ", + "t": "ť", + "u": "ǔ", + "z": "ž", + "Ü": "Ǚ", + "ü": "ǚ" + } + }, + "dead: ˚": { + "terminator": "˚", + "compositions": { + "5": "˚", + "A": "Å", + "C": "Ċ", + "E": "Ė", + "G": "Ġ", + "I": "İ", + "U": "Ů", + "Z": "Ż", + "a": "å", + "c": "ċ", + "e": "ė", + "g": "ġ", + "space": "˚", + "u": "ů", + "w": "ẘ", + "y": "ẙ", + "z": "ż" + } + }, + "dead: Ω": { + "terminator": "Ω", + "compositions": { + "!": "₁", + "\"": "₊", + "#": "₃", + "$": "₄", + "%": "₅", + "&": "₇", + "'": "₌", + "(": "₉", + ")": "₀", + "*": "₈", + "+": "⁺", + "-": "⁻", + "0": "⁰", + "1": "¹", + "2": "²", + "3": "³", + "4": "⁴", + "5": "⁵", + "6": "⁶", + "7": "⁷", + "8": "⁸", + "9": "⁹", + ";": "₋", + "=": "⁼", + "@": "₂", + "A": "Α", + "B": "Β", + "C": "Χ", + "D": "Δ", + "E": "Ε", + "F": "Φ", + "G": "Γ", + "H": "Θ", + "I": "Η", + "J": "Ι", + "K": "Κ", + "L": "Λ", + "M": "Μ", + "N": "Ν", + "O": "Ο", + "P": "Π", + "Q": "Ω", + "R": "Ρ", + "S": "Σ", + "T": "Τ", + "U": "Ω", + "V": "Β", + "W": "Ψ", + "X": "Ξ", + "Y": "Υ", + "Z": "Ζ", + "[": "⁽", + "]": "⁾", + "^": "₆", + "a": "α", + "b": "β", + "c": "χ", + "d": "δ", + "e": "ε", + "f": "φ", + "g": "γ", + "h": "θ", + "i": "η", + "j": "ι", + "k": "κ", + "l": "λ", + "m": "μ", + "n": "ν", + "o": "ο", + "p": "π", + "q": "ω", + "r": "ρ", + "s": "σ", + "t": "τ", + "u": "ω", + "v": "β", + "w": "ψ", + "x": "ξ", + "y": "υ", + "z": "ζ", + "{": "₍", + "}": "₎" + } + }, + "dead: √": { + "terminator": " ", + "compositions": { + "!": "≠", + "\"": "″", + "%": "‰", + "&": "∧", + "'": "′", + "*": "⊗", + "+": "⊕", + "-": "±", + ".": "⋅", + "3": "∛", + "4": "∜", + "7": "∡", + "8": "∠", + "9": "∟", + ":": "∴", + ";": "∵", + "<": "≤", + "=": "≝", + ">": "≥", + "A": "∀", + "B": "⊇", + "C": "ℂ", + "D": "∇", + "E": "∃", + "F": "∎", + "G": "⊃", + "H": "⊅", + "K": "∌", + "L": "∦", + "M": "∉", + "N": "ℕ", + "O": "∅", + "P": "ℙ", + "Q": "ℚ", + "R": "ℝ", + "S": "∫", + "U": "∖", + "X": "∄", + "Z": "ℤ", + "^": "℘", + "b": "⊆", + "c": "∝", + "d": "Δ", + "f": "ƒ", + "g": "⊂", + "h": "⊄", + "i": "∞", + "k": "∋", + "l": "∥", + "m": "∈", + "n": "ⁿ", + "o": "∘", + "p": "∂", + "r": "√", + "s": "∩", + "space": "√", + "u": "∪", + "z": "↯", + "|": "∨", + "~": "≈" + } + } + } +} \ No newline at end of file diff --git a/spec/eurkey-v1.3-reference.json b/spec/eurkey-v1.3-reference.json new file mode 100644 index 0000000..bfd563d --- /dev/null +++ b/spec/eurkey-v1.3-reference.json @@ -0,0 +1,2293 @@ +{ + "name": "EurKEY v1.3", + "group": "126", + "id": "-17356", + "modifierMap": { + "f4": { + "defaultIndex": "7", + "selects": [ + { + "mapIndex": "0", + "modifiers": [ + "command?", + "anyShift? caps? command" + ] + }, + { + "mapIndex": "1", + "modifiers": [ + "anyShift caps?" + ] + }, + { + "mapIndex": "2", + "modifiers": [ + "caps" + ] + }, + { + "mapIndex": "3", + "modifiers": [ + "anyOption" + ] + }, + { + "mapIndex": "4", + "modifiers": [ + "anyShift caps? anyOption command?" + ] + }, + { + "mapIndex": "5", + "modifiers": [ + "caps anyOption" + ] + }, + { + "mapIndex": "6", + "modifiers": [ + "caps? anyOption command" + ] + }, + { + "mapIndex": "7", + "modifiers": [ + "anyShift caps? option? command? control", + "shift? caps? anyOption command? control", + "caps? anyOption? command? control" + ] + } + ] + } + }, + "actions": { + "!": { + "none": "!", + "dead: Ω": "₁", + "dead: √": "≠" + }, + "\"": { + "none": "\"", + "dead: Ω": "₊", + "dead: √": "″" + }, + "#": { + "none": "#", + "dead: ˇ": "Ǯ", + "dead: Ω": "₃" + }, + "$": { + "none": "$", + "dead: Ω": "₄" + }, + "%": { + "none": "%", + "dead: Ω": "₅", + "dead: √": "‰" + }, + "&": { + "none": "&", + "dead: Ω": "₇", + "dead: √": "∧" + }, + "'": { + "none": "'", + "dead: Ω": "₌", + "dead: √": "′" + }, + "(": { + "none": "(", + "dead: Ω": "₉" + }, + ")": { + "none": ")", + "dead: Ω": "₀" + }, + "*": { + "none": "*", + "dead: Ω": "₈", + "dead: √": "⊗" + }, + "+": { + "none": "+", + "dead: ¬": "⇔", + "dead: Ω": "⁺", + "dead: √": "⊕" + }, + "-": { + "none": "-", + "dead: Ω": "⁻", + "dead: √": "±" + }, + ".": { + "none": ".", + "dead: √": "⋅" + }, + "0": { + "none": "0", + "dead: Ω": "⁰" + }, + "1": { + "none": "1", + "dead: ¬": "№", + "dead: ¯": "‐", + "dead: Ω": "¹" + }, + "2": { + "none": "2", + "dead: ¬": "½", + "dead: ¯": "–", + "dead: Ω": "²" + }, + "3": { + "none": "3", + "dead: ¬": "⅓", + "dead: ¯": "—", + "dead: ˇ": "ǯ", + "dead: Ω": "³", + "dead: √": "∛" + }, + "4": { + "none": "4", + "dead: ¬": "¼", + "dead: Ω": "⁴", + "dead: √": "∜" + }, + "5": { + "none": "5", + "dead: ¬": "⅔", + "dead: ¯": "¯", + "dead: ´": "´", + "dead: ˇ": "ˇ", + "dead: ˚": "˚", + "dead: Ω": "⁵" + }, + "6": { + "none": "6", + "dead: ¬": "¾", + "dead: Ω": "⁶" + }, + "6 option": { + "next": "dead: ^" + }, + "7": { + "none": "7", + "dead: Ω": "⁷", + "dead: √": "∡" + }, + "8": { + "none": "8", + "dead: Ω": "⁸", + "dead: √": "∠" + }, + "9": { + "none": "9", + "dead: Ω": "⁹", + "dead: √": "∟" + }, + ":": { + "none": ":", + "dead: √": "∴" + }, + ";": { + "none": ";", + "dead: Ω": "₋", + "dead: √": "∵" + }, + "<": { + "none": "<", + "dead: √": "≤" + }, + "=": { + "none": "=", + "dead: ¬": "↔", + "dead: Ω": "⁼", + "dead: √": "≝" + }, + ">": { + "none": ">", + "dead: √": "≥" + }, + "@": { + "none": "@", + "dead: Ω": "₂" + }, + "A": { + "none": "A", + "dead: ^": "Â", + "dead: `": "À", + "dead: ~": "Ã", + "dead: ¨": "Ä", + "dead: ¯": "Ā", + "dead: ´": "Á", + "dead: ˇ": "Ǎ", + "dead: ˚": "Å", + "dead: Ω": "Α", + "dead: √": "∀" + }, + "B": { + "none": "B", + "dead: ¯": "Ƀ", + "dead: ´": "Ɓ", + "dead: Ω": "Β", + "dead: √": "⊇" + }, + "C": { + "none": "C", + "dead: ^": "Ĉ", + "dead: ¬": "©", + "dead: ´": "Ć", + "dead: ˇ": "Č", + "dead: ˚": "Ċ", + "dead: Ω": "Χ", + "dead: √": "ℂ" + }, + "D": { + "none": "D", + "dead: ¯": "Đ", + "dead: ˇ": "Ď", + "dead: Ω": "Δ", + "dead: √": "∇" + }, + "E": { + "none": "E", + "dead: ^": "Ê", + "dead: `": "È", + "dead: ¨": "Ë", + "dead: ¯": "Ē", + "dead: ´": "É", + "dead: ˇ": "Ě", + "dead: ˚": "Ė", + "dead: Ω": "Ε", + "dead: √": "∃" + }, + "F": { + "none": "F", + "dead: Ω": "Φ", + "dead: √": "∎" + }, + "G": { + "none": "G", + "dead: ^": "Ĝ", + "dead: ¯": "Ḡ", + "dead: ´": "Ǵ", + "dead: ˇ": "Ǧ", + "dead: ˚": "Ġ", + "dead: Ω": "Γ", + "dead: √": "⊃" + }, + "H": { + "none": "H", + "dead: ^": "Ĥ", + "dead: ¨": "Ḧ", + "dead: ¬": "⇐", + "dead: ¯": "Ħ", + "dead: ˇ": "Ȟ", + "dead: Ω": "Θ", + "dead: √": "⊅" + }, + "I": { + "none": "I", + "dead: ^": "Î", + "dead: `": "Ì", + "dead: ~": "Ĩ", + "dead: ¨": "Ï", + "dead: ¬": "⇗", + "dead: ¯": "Ī", + "dead: ´": "Í", + "dead: ˇ": "Ǐ", + "dead: ˚": "İ", + "dead: Ω": "Η" + }, + "J": { + "none": "J", + "dead: ^": "Ĵ", + "dead: ¬": "⇓", + "dead: Ω": "Ι" + }, + "K": { + "none": "K", + "dead: ¬": "⇑", + "dead: ´": "Ḱ", + "dead: ˇ": "Ǩ", + "dead: Ω": "Κ", + "dead: √": "∌" + }, + "L": { + "none": "L", + "dead: ¬": "⇒", + "dead: ¯": "Ḻ", + "dead: ´": "Ł", + "dead: ˇ": "Ľ", + "dead: Ω": "Λ", + "dead: √": "∦" + }, + "M": { + "none": "M", + "dead: ¬": "⇘", + "dead: ´": "Ḿ", + "dead: Ω": "Μ", + "dead: √": "∉" + }, + "N": { + "none": "N", + "dead: ~": "Ñ", + "dead: ¬": "⇙", + "dead: ´": "Ń", + "dead: ˇ": "Ň", + "dead: Ω": "Ν", + "dead: √": "ℕ" + }, + "O": { + "none": "O", + "dead: ^": "Ô", + "dead: `": "Ò", + "dead: ~": "Õ", + "dead: ¨": "Ö", + "dead: ¯": "Ō", + "dead: ´": "Ó", + "dead: ˇ": "Ǒ", + "dead: Ω": "Ο", + "dead: √": "∅" + }, + "P": { + "none": "P", + "dead: ¬": "℗", + "dead: ´": "Ṕ", + "dead: Ω": "Π", + "dead: √": "ℙ" + }, + "Q": { + "none": "Q", + "dead: Ω": "Ω", + "dead: √": "ℚ" + }, + "R": { + "none": "R", + "dead: ¬": "®", + "dead: ´": "Ŕ", + "dead: ˇ": "Ř", + "dead: Ω": "Ρ", + "dead: √": "ℝ" + }, + "S": { + "none": "S", + "dead: ^": "Ŝ", + "dead: ¬": "℠", + "dead: ´": "Ś", + "dead: ˇ": "Š", + "dead: Ω": "Σ", + "dead: √": "∫" + }, + "T": { + "none": "T", + "dead: ¬": "℠", + "dead: ¯": "Ŧ", + "dead: ˇ": "Ť", + "dead: Ω": "Τ" + }, + "U": { + "none": "U", + "dead: ^": "Û", + "dead: `": "Ù", + "dead: ~": "Ũ", + "dead: ¨": "Ü", + "dead: ¬": "⇖", + "dead: ¯": "Ū", + "dead: ´": "Ú", + "dead: ˇ": "Ǔ", + "dead: ˚": "Ů", + "dead: Ω": "Ω", + "dead: √": "∖" + }, + "V": { + "none": "V", + "dead: Ω": "Β" + }, + "W": { + "none": "W", + "dead: ^": "Ŵ", + "dead: ¨": "Ẅ", + "dead: ´": "Ẃ", + "dead: Ω": "Ψ" + }, + "X": { + "none": "X", + "dead: ¨": "Ẍ", + "dead: Ω": "Ξ", + "dead: √": "∄" + }, + "Y": { + "none": "Y", + "dead: ^": "Ŷ", + "dead: ~": "Ỹ", + "dead: ¨": "Ÿ", + "dead: ¯": "Ȳ", + "dead: ´": "Ý", + "dead: Ω": "Υ" + }, + "Z": { + "none": "Z", + "dead: ´": "Ź", + "dead: ˇ": "Ž", + "dead: ˚": "Ż", + "dead: Ω": "Ζ", + "dead: √": "ℤ" + }, + "[": { + "none": "[", + "dead: Ω": "⁽" + }, + "]": { + "none": "]", + "dead: Ω": "⁾" + }, + "^": { + "none": "^", + "dead: Ω": "₆", + "dead: √": "℘" + }, + "_": { + "none": "_" + }, + "`": { + "next": "dead: `" + }, + "a": { + "none": "a", + "dead: ^": "â", + "dead: `": "à", + "dead: ~": "ã", + "dead: ¨": "ä", + "dead: ¯": "ā", + "dead: ´": "á", + "dead: ˇ": "ǎ", + "dead: ˚": "å", + "dead: Ω": "α" + }, + "b": { + "none": "b", + "dead: ¯": "ƀ", + "dead: ´": "ɓ", + "dead: Ω": "β", + "dead: √": "⊆" + }, + "c": { + "none": "c", + "dead: ^": "ĉ", + "dead: ¬": "©", + "dead: ´": "ć", + "dead: ˇ": "č", + "dead: ˚": "ċ", + "dead: Ω": "χ", + "dead: √": "∝" + }, + "d": { + "none": "d", + "dead: ¯": "đ", + "dead: ˇ": "ď", + "dead: Ω": "δ", + "dead: √": "Δ" + }, + "dead: ©": { + "next": "dead: ¬" + }, + "e": { + "none": "e", + "dead: ^": "ê", + "dead: `": "è", + "dead: ¨": "ë", + "dead: ¯": "ē", + "dead: ´": "é", + "dead: ˇ": "ě", + "dead: ˚": "ė", + "dead: Ω": "ε" + }, + "f": { + "none": "f", + "dead: Ω": "φ", + "dead: √": "ƒ" + }, + "g": { + "none": "g", + "dead: ^": "ĝ", + "dead: ¯": "ḡ", + "dead: ´": "ǵ", + "dead: ˇ": "ǧ", + "dead: ˚": "ġ", + "dead: Ω": "γ", + "dead: √": "⊂" + }, + "h": { + "none": "h", + "dead: ^": "ĥ", + "dead: ¨": "ḧ", + "dead: ¬": "←", + "dead: ¯": "ħ", + "dead: ˇ": "ȟ", + "dead: Ω": "θ", + "dead: √": "⊄" + }, + "i": { + "none": "i", + "dead: ^": "î", + "dead: `": "ì", + "dead: ~": "ĩ", + "dead: ¨": "ï", + "dead: ¬": "↗", + "dead: ¯": "ī", + "dead: ´": "í", + "dead: ˇ": "ǐ", + "dead: Ω": "η", + "dead: √": "∞" + }, + "j": { + "none": "j", + "dead: ^": "ĵ", + "dead: ¬": "↓", + "dead: ˇ": "ǰ", + "dead: Ω": "ι" + }, + "k": { + "none": "k", + "dead: ¬": "↑", + "dead: ´": "ḱ", + "dead: ˇ": "ǩ", + "dead: Ω": "κ", + "dead: √": "∋" + }, + "l": { + "none": "l", + "dead: ¬": "→", + "dead: ¯": "ḻ", + "dead: ´": "ł", + "dead: ˇ": "ľ", + "dead: Ω": "λ", + "dead: √": "∥" + }, + "m": { + "none": "m", + "dead: ¬": "↘", + "dead: ´": "ḿ", + "dead: Ω": "μ", + "dead: √": "∈" + }, + "n": { + "none": "n", + "dead: ~": "ñ", + "dead: ¬": "↙", + "dead: ´": "ń", + "dead: ˇ": "ň", + "dead: Ω": "ν", + "dead: √": "ⁿ" + }, + "o": { + "none": "o", + "dead: ^": "ô", + "dead: `": "ò", + "dead: ~": "õ", + "dead: ¨": "ö", + "dead: ¯": "ō", + "dead: ´": "ó", + "dead: ˇ": "ǒ", + "dead: Ω": "ο", + "dead: √": "∘" + }, + "p": { + "none": "p", + "dead: ¬": "℗", + "dead: ´": "ṕ", + "dead: Ω": "π", + "dead: √": "∂" + }, + "q": { + "none": "q", + "dead: Ω": "ω" + }, + "r": { + "none": "r", + "dead: ¬": "®", + "dead: ´": "ŕ", + "dead: ˇ": "ř", + "dead: Ω": "ρ", + "dead: √": "√" + }, + "s": { + "none": "s", + "dead: ^": "ŝ", + "dead: ¬": "§", + "dead: ´": "ś", + "dead: ˇ": "š", + "dead: Ω": "σ", + "dead: √": "∩" + }, + "space": { + "none": " ", + "dead: ^": "^", + "dead: `": "`", + "dead: ~": "~", + "dead: ¨": "¨", + "dead: ¬": "©", + "dead: ¯": "¯", + "dead: ´": "´", + "dead: ˇ": "ˇ", + "dead: ˚": "˚", + "dead: √": "√" + }, + "t": { + "none": "t", + "dead: ¨": "ẗ", + "dead: ¬": "™", + "dead: ¯": "ŧ", + "dead: ˇ": "ť", + "dead: Ω": "τ" + }, + "u": { + "none": "u", + "dead: ^": "û", + "dead: `": "ù", + "dead: ~": "ũ", + "dead: ¨": "ü", + "dead: ¬": "↖", + "dead: ¯": "ū", + "dead: ´": "ú", + "dead: ˇ": "ǔ", + "dead: ˚": "ů", + "dead: Ω": "ω", + "dead: √": "∪" + }, + "v": { + "none": "v", + "dead: Ω": "β" + }, + "w": { + "none": "w", + "dead: ^": "ŵ", + "dead: ¨": "ẅ", + "dead: ´": "ẃ", + "dead: ˚": "ẘ", + "dead: Ω": "ψ" + }, + "x": { + "none": "x", + "dead: ¨": "ẍ", + "dead: Ω": "ξ" + }, + "y": { + "none": "y", + "dead: ^": "ŷ", + "dead: ~": "ỹ", + "dead: ¨": "ÿ", + "dead: ¯": "ȳ", + "dead: ´": "ý", + "dead: ˚": "ẙ", + "dead: Ω": "υ" + }, + "z": { + "none": "z", + "dead: ´": "ź", + "dead: ˇ": "ž", + "dead: ˚": "ż", + "dead: Ω": "ζ", + "dead: √": "↯" + }, + "{": { + "none": "{", + "dead: Ω": "₍" + }, + "|": { + "none": "|", + "dead: √": "∨" + }, + "}": { + "none": "}", + "dead: Ω": "₎" + }, + "~": { + "none": "~", + "dead: √": "≈" + }, + "~ option": { + "next": "dead: ~" + }, + "¨": { + "next": "dead: ¨" + }, + "©": { + "next": "dead: ¬" + }, + "© 1": { + "none": "✓" + }, + "¬": { + "next": "dead: ¬" + }, + "¯": { + "next": "dead: ¯" + }, + "´": { + "next": "dead: ´" + }, + "Ä": { + "none": "Ä", + "dead: `": "Ą" + }, + "Æ": { + "none": "Æ", + "dead: ¯": "Ǣ", + "dead: ´": "Ǽ" + }, + "Ë": { + "none": "Ë", + "dead: `": "Ę" + }, + "Ï": { + "none": "Ï", + "dead: `": "Į" + }, + "Ö": { + "none": "Ö", + "dead: `": "Ǫ" + }, + "Ø": { + "none": "Ø", + "dead: ´": "Ǿ" + }, + "Ü": { + "none": "Ü", + "dead: `": "Ų", + "dead: ˇ": "Ǚ" + }, + "ä": { + "none": "ä", + "dead: `": "ą" + }, + "æ": { + "none": "æ", + "dead: ¯": "ǣ", + "dead: ´": "ǽ" + }, + "ë": { + "none": "ë", + "dead: `": "ę" + }, + "ï": { + "none": "ï", + "dead: `": "į" + }, + "ö": { + "none": "ö", + "dead: `": "ǫ" + }, + "ø": { + "none": "ø", + "dead: ´": "ǿ" + }, + "ü": { + "none": "ü", + "dead: `": "ų", + "dead: ˇ": "ǚ" + }, + "ˇ": { + "next": "dead: ˇ" + }, + "˚": { + "next": "dead: ˚" + }, + "Ω": { + "next": "dead: Ω" + }, + "√": { + "next": "dead: √" + } + }, + "terminators": { + "dead: ^": "^", + "dead: `": "`", + "dead: ~": "~", + "dead: ¨": "¨", + "dead: ¬": "¬", + "dead: ¯": "¯", + "dead: ´": "´", + "dead: ˇ": "ˇ", + "dead: ˚": "˚", + "dead: Ω": "Ω", + "dead: √": " " + }, + "keyMaps": { + "0": { + "label": "Base", + "keys": { + "0": { + "code": 0, + "keyName": "A", + "action": "a", + "output": "a" + }, + "1": { + "code": 1, + "keyName": "S", + "action": "s", + "output": "s" + }, + "2": { + "code": 2, + "keyName": "D", + "action": "d", + "output": "d" + }, + "3": { + "code": 3, + "keyName": "F", + "action": "f", + "output": "f" + }, + "4": { + "code": 4, + "keyName": "H", + "action": "h", + "output": "h" + }, + "5": { + "code": 5, + "keyName": "G", + "action": "g", + "output": "g" + }, + "6": { + "code": 6, + "keyName": "Z", + "action": "z", + "output": "z" + }, + "7": { + "code": 7, + "keyName": "X", + "action": "x", + "output": "x" + }, + "8": { + "code": 8, + "keyName": "C", + "action": "c", + "output": "c" + }, + "9": { + "code": 9, + "keyName": "V", + "action": "v", + "output": "v" + }, + "10": { + "code": 10, + "keyName": "§/`", + "output": "§" + }, + "11": { + "code": 11, + "keyName": "B", + "action": "b", + "output": "b" + }, + "12": { + "code": 12, + "keyName": "Q", + "action": "q", + "output": "q" + }, + "13": { + "code": 13, + "keyName": "W", + "action": "w", + "output": "w" + }, + "14": { + "code": 14, + "keyName": "E", + "action": "e", + "output": "e" + }, + "15": { + "code": 15, + "keyName": "R", + "action": "r", + "output": "r" + }, + "16": { + "code": 16, + "keyName": "Y", + "action": "y", + "output": "y" + }, + "17": { + "code": 17, + "keyName": "T", + "action": "t", + "output": "t" + }, + "18": { + "code": 18, + "keyName": "1", + "action": "1", + "output": "1" + }, + "21": { + "code": 21, + "keyName": "4", + "action": "4", + "output": "4" + }, + "22": { + "code": 22, + "keyName": "6", + "action": "6", + "output": "6" + }, + "23": { + "code": 23, + "keyName": "5", + "action": "5", + "output": "5" + }, + "30": { + "code": 30, + "keyName": "]", + "output": "[" + } + } + }, + "1": { + "label": "Shift", + "keys": { + "0": { + "code": 0, + "keyName": "A", + "action": "A", + "output": "A" + }, + "1": { + "code": 1, + "keyName": "S", + "action": "S", + "output": "S" + }, + "2": { + "code": 2, + "keyName": "D", + "action": "D", + "output": "D" + }, + "3": { + "code": 3, + "keyName": "F", + "action": "F", + "output": "F" + }, + "4": { + "code": 4, + "keyName": "H", + "action": "H", + "output": "H" + }, + "5": { + "code": 5, + "keyName": "G", + "action": "G", + "output": "G" + }, + "6": { + "code": 6, + "keyName": "Z", + "action": "Z", + "output": "Z" + }, + "7": { + "code": 7, + "keyName": "X", + "action": "X", + "output": "X" + }, + "8": { + "code": 8, + "keyName": "C", + "action": "C", + "output": "C" + }, + "9": { + "code": 9, + "keyName": "V", + "action": "V", + "output": "V" + }, + "10": { + "code": 10, + "keyName": "§/`", + "output": "±" + }, + "11": { + "code": 11, + "keyName": "B", + "action": "B", + "output": "B" + }, + "12": { + "code": 12, + "keyName": "Q", + "action": "Q", + "output": "Q" + }, + "13": { + "code": 13, + "keyName": "W", + "action": "W", + "output": "W" + }, + "14": { + "code": 14, + "keyName": "E", + "action": "E", + "output": "E" + }, + "15": { + "code": 15, + "keyName": "R", + "action": "R", + "output": "R" + }, + "16": { + "code": 16, + "keyName": "Y", + "action": "Y", + "output": "Y" + }, + "17": { + "code": 17, + "keyName": "T", + "action": "T", + "output": "T" + }, + "18": { + "code": 18, + "keyName": "1", + "action": "!", + "output": "!" + }, + "21": { + "code": 21, + "keyName": "4", + "action": "$", + "output": "$" + }, + "22": { + "code": 22, + "keyName": "6", + "output": "&" + }, + "23": { + "code": 23, + "keyName": "5", + "action": "%", + "output": "%" + }, + "30": { + "code": 30, + "keyName": "]", + "output": "{" + } + } + }, + "2": { + "label": "Caps", + "keys": { + "0": { + "code": 0, + "keyName": "A", + "action": "A", + "output": "A" + }, + "1": { + "code": 1, + "keyName": "S", + "action": "S", + "output": "S" + }, + "2": { + "code": 2, + "keyName": "D", + "action": "D", + "output": "D" + }, + "3": { + "code": 3, + "keyName": "F", + "action": "F", + "output": "F" + }, + "4": { + "code": 4, + "keyName": "H", + "action": "H", + "output": "H" + }, + "5": { + "code": 5, + "keyName": "G", + "action": "G", + "output": "G" + }, + "6": { + "code": 6, + "keyName": "Z", + "action": "Z", + "output": "Z" + }, + "7": { + "code": 7, + "keyName": "X", + "action": "X", + "output": "X" + }, + "8": { + "code": 8, + "keyName": "C", + "action": "C", + "output": "C" + }, + "9": { + "code": 9, + "keyName": "V", + "action": "V", + "output": "V" + }, + "10": { + "code": 10, + "keyName": "§/`", + "output": "§" + }, + "11": { + "code": 11, + "keyName": "B", + "action": "B", + "output": "B" + }, + "12": { + "code": 12, + "keyName": "Q", + "action": "Q", + "output": "Q" + }, + "13": { + "code": 13, + "keyName": "W", + "action": "W", + "output": "W" + }, + "14": { + "code": 14, + "keyName": "E", + "action": "E", + "output": "E" + }, + "15": { + "code": 15, + "keyName": "R", + "action": "R", + "output": "R" + }, + "16": { + "code": 16, + "keyName": "Y", + "action": "Y", + "output": "Y" + }, + "17": { + "code": 17, + "keyName": "T", + "action": "T", + "output": "T" + }, + "18": { + "code": 18, + "keyName": "1", + "action": "1", + "output": "1" + }, + "21": { + "code": 21, + "keyName": "4", + "action": "4", + "output": "4" + }, + "22": { + "code": 22, + "keyName": "6", + "action": "6", + "output": "6" + }, + "23": { + "code": 23, + "keyName": "5", + "action": "5", + "output": "5" + }, + "30": { + "code": 30, + "keyName": "]", + "output": "[" + } + } + }, + "3": { + "label": "Option", + "keys": { + "0": { + "code": 0, + "keyName": "A", + "action": "ä", + "output": "ä" + }, + "1": { + "code": 1, + "keyName": "S", + "output": "ß" + }, + "2": { + "code": 2, + "keyName": "D", + "output": "đ" + }, + "3": { + "code": 3, + "keyName": "F", + "output": "è" + }, + "4": { + "code": 4, + "keyName": "H", + "output": "ù" + }, + "5": { + "code": 5, + "keyName": "G", + "output": "é" + }, + "6": { + "code": 6, + "keyName": "Z", + "output": "à" + }, + "7": { + "code": 7, + "keyName": "X", + "output": "á" + }, + "8": { + "code": 8, + "keyName": "C", + "output": "ç" + }, + "9": { + "code": 9, + "keyName": "V", + "output": "ì" + }, + "10": { + "code": 10, + "keyName": "§/`", + "output": "§" + }, + "11": { + "code": 11, + "keyName": "B", + "output": "í" + }, + "12": { + "code": 12, + "keyName": "Q", + "action": "æ", + "output": "æ" + }, + "13": { + "code": 13, + "keyName": "W", + "output": "å" + }, + "14": { + "code": 14, + "keyName": "E", + "action": "ë", + "output": "ë" + }, + "15": { + "code": 15, + "keyName": "R", + "output": "ý" + }, + "16": { + "code": 16, + "keyName": "Y", + "output": "ÿ" + }, + "17": { + "code": 17, + "keyName": "T", + "output": "þ" + }, + "18": { + "code": 18, + "keyName": "1", + "output": "¡" + }, + "21": { + "code": 21, + "keyName": "4", + "output": "£" + }, + "22": { + "code": 22, + "keyName": "6", + "action": "6 option", + "deadKey": "dead: ^" + }, + "23": { + "code": 23, + "keyName": "5", + "output": "€" + }, + "30": { + "code": 30, + "keyName": "]", + "output": "»" + } + } + }, + "4": { + "label": "Shift+Option", + "keys": { + "0": { + "code": 0, + "keyName": "A", + "action": "Ä", + "output": "Ä" + }, + "1": { + "code": 1, + "keyName": "S", + "output": "ẞ" + }, + "2": { + "code": 2, + "keyName": "D", + "output": "Đ" + }, + "3": { + "code": 3, + "keyName": "F", + "output": "È" + }, + "4": { + "code": 4, + "keyName": "H", + "output": "Ù" + }, + "5": { + "code": 5, + "keyName": "G", + "output": "É" + }, + "6": { + "code": 6, + "keyName": "Z", + "output": "À" + }, + "7": { + "code": 7, + "keyName": "X", + "output": "Á" + }, + "8": { + "code": 8, + "keyName": "C", + "output": "Ç" + }, + "9": { + "code": 9, + "keyName": "V", + "output": "Ì" + }, + "10": { + "code": 10, + "keyName": "§/`", + "output": "±" + }, + "11": { + "code": 11, + "keyName": "B", + "output": "Í" + }, + "12": { + "code": 12, + "keyName": "Q", + "action": "Æ", + "output": "Æ" + }, + "13": { + "code": 13, + "keyName": "W", + "output": "Å" + }, + "14": { + "code": 14, + "keyName": "E", + "action": "Ë", + "output": "Ë" + }, + "15": { + "code": 15, + "keyName": "R", + "output": "Ý" + }, + "16": { + "code": 16, + "keyName": "Y", + "output": "Ÿ" + }, + "17": { + "code": 17, + "keyName": "T", + "output": "Þ" + }, + "18": { + "code": 18, + "keyName": "1", + "output": "¹" + }, + "21": { + "code": 21, + "keyName": "4", + "output": "¥" + }, + "22": { + "code": 22, + "keyName": "6", + "action": "ˇ", + "deadKey": "dead: ˇ" + }, + "23": { + "code": 23, + "keyName": "5", + "output": "¢" + }, + "30": { + "code": 30, + "keyName": "]", + "output": "›" + } + } + }, + "5": { + "label": "Caps+Option", + "keys": { + "0": { + "code": 0, + "keyName": "A", + "output": "Ä" + }, + "1": { + "code": 1, + "keyName": "S", + "output": "ß" + }, + "2": { + "code": 2, + "keyName": "D", + "output": "Ð" + }, + "3": { + "code": 3, + "keyName": "F", + "output": "È" + }, + "4": { + "code": 4, + "keyName": "H", + "output": "Ù" + }, + "5": { + "code": 5, + "keyName": "G", + "output": "É" + }, + "6": { + "code": 6, + "keyName": "Z", + "output": "À" + }, + "7": { + "code": 7, + "keyName": "X", + "output": "Á" + }, + "8": { + "code": 8, + "keyName": "C", + "output": "Ç" + }, + "9": { + "code": 9, + "keyName": "V", + "output": "Ì" + }, + "10": { + "code": 10, + "keyName": "§/`", + "output": "§" + }, + "11": { + "code": 11, + "keyName": "B", + "output": "Í" + }, + "12": { + "code": 12, + "keyName": "Q", + "action": "Æ", + "output": "Æ" + }, + "13": { + "code": 13, + "keyName": "W", + "output": "Å" + }, + "14": { + "code": 14, + "keyName": "E", + "output": "Ë" + }, + "15": { + "code": 15, + "keyName": "R", + "output": "Ý" + }, + "16": { + "code": 16, + "keyName": "Y", + "output": "Ÿ" + }, + "17": { + "code": 17, + "keyName": "T", + "output": "Þ" + }, + "18": { + "code": 18, + "keyName": "1", + "output": "¡" + }, + "21": { + "code": 21, + "keyName": "4", + "output": "£" + }, + "22": { + "code": 22, + "keyName": "6", + "action": "^", + "output": "^" + }, + "23": { + "code": 23, + "keyName": "5", + "output": "€" + }, + "30": { + "code": 30, + "keyName": "]", + "output": "»" + } + } + }, + "6": { + "label": "Command+Option", + "keys": { + "0": { + "code": 0, + "keyName": "A", + "output": "å" + }, + "1": { + "code": 1, + "keyName": "S", + "output": "ß" + }, + "2": { + "code": 2, + "keyName": "D", + "output": "∂" + }, + "3": { + "code": 3, + "keyName": "F", + "output": "ƒ" + }, + "4": { + "code": 4, + "keyName": "H", + "output": "˙" + }, + "5": { + "code": 5, + "keyName": "G", + "output": "©" + }, + "6": { + "code": 6, + "keyName": "Z", + "output": "Ω" + }, + "7": { + "code": 7, + "keyName": "X", + "output": "≈" + }, + "8": { + "code": 8, + "keyName": "C", + "output": "ç" + }, + "9": { + "code": 9, + "keyName": "V", + "output": "√" + }, + "10": { + "code": 10, + "keyName": "§/`", + "output": "§" + }, + "11": { + "code": 11, + "keyName": "B", + "output": "∫" + }, + "12": { + "code": 12, + "keyName": "Q", + "output": "œ" + }, + "13": { + "code": 13, + "keyName": "W", + "output": "∑" + }, + "14": { + "code": 14, + "keyName": "E", + "output": "´" + }, + "15": { + "code": 15, + "keyName": "R", + "output": "®" + }, + "16": { + "code": 16, + "keyName": "Y", + "output": "¥" + }, + "17": { + "code": 17, + "keyName": "T", + "output": "†" + }, + "18": { + "code": 18, + "keyName": "1", + "output": "¡" + }, + "21": { + "code": 21, + "keyName": "4", + "output": "¢" + }, + "22": { + "code": 22, + "keyName": "6", + "output": "§" + }, + "23": { + "code": 23, + "keyName": "5", + "output": "∞" + }, + "30": { + "code": 30, + "keyName": "]", + "output": "‘" + } + } + }, + "7": { + "label": "Control", + "keys": { + "0": { + "code": 0, + "keyName": "A", + "output": "\u0001" + }, + "1": { + "code": 1, + "keyName": "S", + "output": "\u0013" + }, + "2": { + "code": 2, + "keyName": "D", + "output": "\u0004" + }, + "3": { + "code": 3, + "keyName": "F", + "output": "\u0006" + }, + "4": { + "code": 4, + "keyName": "H", + "output": "\b" + }, + "5": { + "code": 5, + "keyName": "G", + "output": "\u0007" + }, + "6": { + "code": 6, + "keyName": "Z", + "output": "\u001a" + }, + "7": { + "code": 7, + "keyName": "X", + "output": "\u0018" + }, + "8": { + "code": 8, + "keyName": "C", + "output": "\u0003" + }, + "9": { + "code": 9, + "keyName": "V", + "output": "\u0016" + }, + "10": { + "code": 10, + "keyName": "§/`", + "output": "0" + }, + "11": { + "code": 11, + "keyName": "B", + "output": "\u0002" + }, + "12": { + "code": 12, + "keyName": "Q", + "output": "\u0011" + }, + "13": { + "code": 13, + "keyName": "W", + "output": "\u0017" + }, + "14": { + "code": 14, + "keyName": "E", + "output": "\u0005" + }, + "15": { + "code": 15, + "keyName": "R", + "output": "\u0012" + }, + "16": { + "code": 16, + "keyName": "Y", + "output": "\u0019" + }, + "17": { + "code": 17, + "keyName": "T", + "output": "\u0014" + }, + "18": { + "code": 18, + "keyName": "1", + "output": "1" + }, + "21": { + "code": 21, + "keyName": "4", + "output": "4" + }, + "22": { + "code": 22, + "keyName": "6", + "output": "6" + }, + "23": { + "code": 23, + "keyName": "5", + "output": "5" + }, + "30": { + "code": 30, + "keyName": "]", + "output": "\u001d" + } + } + } + }, + "deadKeys": { + "dead: ^": { + "terminator": "^", + "compositions": { + "A": "Â", + "C": "Ĉ", + "E": "Ê", + "G": "Ĝ", + "H": "Ĥ", + "I": "Î", + "J": "Ĵ", + "O": "Ô", + "S": "Ŝ", + "U": "Û", + "W": "Ŵ", + "Y": "Ŷ", + "a": "â", + "c": "ĉ", + "e": "ê", + "g": "ĝ", + "h": "ĥ", + "i": "î", + "j": "ĵ", + "o": "ô", + "s": "ŝ", + "space": "^", + "u": "û", + "w": "ŵ", + "y": "ŷ" + } + }, + "dead: `": { + "terminator": "`", + "compositions": { + "A": "À", + "E": "È", + "I": "Ì", + "O": "Ò", + "U": "Ù", + "a": "à", + "e": "è", + "i": "ì", + "o": "ò", + "space": "`", + "u": "ù", + "Ä": "Ą", + "Ë": "Ę", + "Ï": "Į", + "Ö": "Ǫ", + "Ü": "Ų", + "ä": "ą", + "ë": "ę", + "ï": "į", + "ö": "ǫ", + "ü": "ų" + } + }, + "dead: ~": { + "terminator": "~", + "compositions": { + "A": "Ã", + "I": "Ĩ", + "N": "Ñ", + "O": "Õ", + "U": "Ũ", + "Y": "Ỹ", + "a": "ã", + "i": "ĩ", + "n": "ñ", + "o": "õ", + "space": "~", + "u": "ũ", + "y": "ỹ" + } + }, + "dead: ¨": { + "terminator": "¨", + "compositions": { + "A": "Ä", + "E": "Ë", + "H": "Ḧ", + "I": "Ï", + "O": "Ö", + "U": "Ü", + "W": "Ẅ", + "X": "Ẍ", + "Y": "Ÿ", + "a": "ä", + "e": "ë", + "h": "ḧ", + "i": "ï", + "o": "ö", + "space": "¨", + "t": "ẗ", + "u": "ü", + "w": "ẅ", + "x": "ẍ", + "y": "ÿ" + } + }, + "dead: ¬": { + "terminator": "¬", + "compositions": { + "+": "⇔", + "1": "№", + "2": "½", + "3": "⅓", + "4": "¼", + "5": "⅔", + "6": "¾", + "=": "↔", + "C": "©", + "H": "⇐", + "I": "⇗", + "J": "⇓", + "K": "⇑", + "L": "⇒", + "M": "⇘", + "N": "⇙", + "P": "℗", + "R": "®", + "S": "℠", + "T": "℠", + "U": "⇖", + "c": "©", + "h": "←", + "i": "↗", + "j": "↓", + "k": "↑", + "l": "→", + "m": "↘", + "n": "↙", + "p": "℗", + "r": "®", + "s": "§", + "space": "©", + "t": "™", + "u": "↖" + } + }, + "dead: ¯": { + "terminator": "¯", + "compositions": { + "1": "‐", + "2": "–", + "3": "—", + "5": "¯", + "A": "Ā", + "B": "Ƀ", + "D": "Đ", + "E": "Ē", + "G": "Ḡ", + "H": "Ħ", + "I": "Ī", + "L": "Ḻ", + "O": "Ō", + "T": "Ŧ", + "U": "Ū", + "Y": "Ȳ", + "a": "ā", + "b": "ƀ", + "d": "đ", + "e": "ē", + "g": "ḡ", + "h": "ħ", + "i": "ī", + "l": "ḻ", + "o": "ō", + "space": "¯", + "t": "ŧ", + "u": "ū", + "y": "ȳ", + "Æ": "Ǣ", + "æ": "ǣ" + } + }, + "dead: ´": { + "terminator": "´", + "compositions": { + "5": "´", + "A": "Á", + "B": "Ɓ", + "C": "Ć", + "E": "É", + "G": "Ǵ", + "I": "Í", + "K": "Ḱ", + "L": "Ł", + "M": "Ḿ", + "N": "Ń", + "O": "Ó", + "P": "Ṕ", + "R": "Ŕ", + "S": "Ś", + "U": "Ú", + "W": "Ẃ", + "Y": "Ý", + "Z": "Ź", + "a": "á", + "b": "ɓ", + "c": "ć", + "e": "é", + "g": "ǵ", + "i": "í", + "k": "ḱ", + "l": "ł", + "m": "ḿ", + "n": "ń", + "o": "ó", + "p": "ṕ", + "r": "ŕ", + "s": "ś", + "space": "´", + "u": "ú", + "w": "ẃ", + "y": "ý", + "z": "ź", + "Æ": "Ǽ", + "Ø": "Ǿ", + "æ": "ǽ", + "ø": "ǿ" + } + }, + "dead: ˇ": { + "terminator": "ˇ", + "compositions": { + "#": "Ǯ", + "3": "ǯ", + "5": "ˇ", + "A": "Ǎ", + "C": "Č", + "D": "Ď", + "E": "Ě", + "G": "Ǧ", + "H": "Ȟ", + "I": "Ǐ", + "K": "Ǩ", + "L": "Ľ", + "N": "Ň", + "O": "Ǒ", + "R": "Ř", + "S": "Š", + "T": "Ť", + "U": "Ǔ", + "Z": "Ž", + "a": "ǎ", + "c": "č", + "d": "ď", + "e": "ě", + "g": "ǧ", + "h": "ȟ", + "i": "ǐ", + "j": "ǰ", + "k": "ǩ", + "l": "ľ", + "n": "ň", + "o": "ǒ", + "r": "ř", + "s": "š", + "space": "ˇ", + "t": "ť", + "u": "ǔ", + "z": "ž", + "Ü": "Ǚ", + "ü": "ǚ" + } + }, + "dead: ˚": { + "terminator": "˚", + "compositions": { + "5": "˚", + "A": "Å", + "C": "Ċ", + "E": "Ė", + "G": "Ġ", + "I": "İ", + "U": "Ů", + "Z": "Ż", + "a": "å", + "c": "ċ", + "e": "ė", + "g": "ġ", + "space": "˚", + "u": "ů", + "w": "ẘ", + "y": "ẙ", + "z": "ż" + } + }, + "dead: Ω": { + "terminator": "Ω", + "compositions": { + "!": "₁", + "\"": "₊", + "#": "₃", + "$": "₄", + "%": "₅", + "&": "₇", + "'": "₌", + "(": "₉", + ")": "₀", + "*": "₈", + "+": "⁺", + "-": "⁻", + "0": "⁰", + "1": "¹", + "2": "²", + "3": "³", + "4": "⁴", + "5": "⁵", + "6": "⁶", + "7": "⁷", + "8": "⁸", + "9": "⁹", + ";": "₋", + "=": "⁼", + "@": "₂", + "A": "Α", + "B": "Β", + "C": "Χ", + "D": "Δ", + "E": "Ε", + "F": "Φ", + "G": "Γ", + "H": "Θ", + "I": "Η", + "J": "Ι", + "K": "Κ", + "L": "Λ", + "M": "Μ", + "N": "Ν", + "O": "Ο", + "P": "Π", + "Q": "Ω", + "R": "Ρ", + "S": "Σ", + "T": "Τ", + "U": "Ω", + "V": "Β", + "W": "Ψ", + "X": "Ξ", + "Y": "Υ", + "Z": "Ζ", + "[": "⁽", + "]": "⁾", + "^": "₆", + "a": "α", + "b": "β", + "c": "χ", + "d": "δ", + "e": "ε", + "f": "φ", + "g": "γ", + "h": "θ", + "i": "η", + "j": "ι", + "k": "κ", + "l": "λ", + "m": "μ", + "n": "ν", + "o": "ο", + "p": "π", + "q": "ω", + "r": "ρ", + "s": "σ", + "t": "τ", + "u": "ω", + "v": "β", + "w": "ψ", + "x": "ξ", + "y": "υ", + "z": "ζ", + "{": "₍", + "}": "₎" + } + }, + "dead: √": { + "terminator": " ", + "compositions": { + "!": "≠", + "\"": "″", + "%": "‰", + "&": "∧", + "'": "′", + "*": "⊗", + "+": "⊕", + "-": "±", + ".": "⋅", + "3": "∛", + "4": "∜", + "7": "∡", + "8": "∠", + "9": "∟", + ":": "∴", + ";": "∵", + "<": "≤", + "=": "≝", + ">": "≥", + "A": "∀", + "B": "⊇", + "C": "ℂ", + "D": "∇", + "E": "∃", + "F": "∎", + "G": "⊃", + "H": "⊅", + "K": "∌", + "L": "∦", + "M": "∉", + "N": "ℕ", + "O": "∅", + "P": "ℙ", + "Q": "ℚ", + "R": "ℝ", + "S": "∫", + "U": "∖", + "X": "∄", + "Z": "ℤ", + "^": "℘", + "b": "⊆", + "c": "∝", + "d": "Δ", + "f": "ƒ", + "g": "⊂", + "h": "⊄", + "i": "∞", + "k": "∋", + "l": "∥", + "m": "∈", + "n": "ⁿ", + "o": "∘", + "p": "∂", + "r": "√", + "s": "∩", + "space": "√", + "u": "∪", + "z": "↯", + "|": "∨", + "~": "≈" + } + } + } +} \ No newline at end of file diff --git a/spec/eurkey-v1.4-parsed.json b/spec/eurkey-v1.4-parsed.json new file mode 100644 index 0000000..47b4c50 --- /dev/null +++ b/spec/eurkey-v1.4-parsed.json @@ -0,0 +1,2276 @@ +{ + "name": "EurKEY v1.4", + "group": "126", + "id": "-3802", + "modifierMap": { + "f4": { + "defaultIndex": "7", + "selects": [ + { + "mapIndex": "0", + "modifiers": [ + "command?", + "anyShift? caps? command" + ] + }, + { + "mapIndex": "1", + "modifiers": [ + "anyShift caps?" + ] + }, + { + "mapIndex": "2", + "modifiers": [ + "caps" + ] + }, + { + "mapIndex": "3", + "modifiers": [ + "anyOption" + ] + }, + { + "mapIndex": "4", + "modifiers": [ + "anyShift caps? anyOption command?" + ] + }, + { + "mapIndex": "5", + "modifiers": [ + "caps anyOption" + ] + }, + { + "mapIndex": "6", + "modifiers": [ + "caps? anyOption command" + ] + }, + { + "mapIndex": "7", + "modifiers": [ + "anyShift caps? option? command? control", + "shift? caps? anyOption command? control", + "caps? anyOption? command? control" + ] + } + ] + } + }, + "actions": { + "a0": { + "none": "!", + "1": "≠", + "6": "¹" + }, + "a1": { + "none": "\"", + "1": "″", + "6": "₊" + }, + "a10": { + "none": "+", + "1": "⊕", + "4": "⇔", + "6": "⁺" + }, + "a100": { + "none": "Ï", + "3": "Į" + }, + "a101": { + "none": "Ö", + "3": "Ǫ" + }, + "a102": { + "none": "Ø", + "9": "Ǿ" + }, + "a103": { + "none": "Ü", + "10": "Ǚ", + "3": "Ų" + }, + "a104": { + "none": "ä", + "3": "ą" + }, + "a105": { + "none": "æ", + "2": "ǣ", + "9": "ǽ" + }, + "a106": { + "none": "ë", + "3": "ę" + }, + "a107": { + "none": "ï", + "3": "į" + }, + "a108": { + "none": "ö", + "3": "ǫ" + }, + "a109": { + "none": "ø", + "9": "ǿ" + }, + "a11": { + "none": "-", + "1": "±", + "6": "⁻" + }, + "a110": { + "none": "ü", + "10": "ǚ", + "3": "ų" + }, + "a111": { + "next": "10" + }, + "a112": { + "next": "5" + }, + "a113": { + "next": "6" + }, + "a114": { + "next": "1" + }, + "a12": { + "none": ".", + "1": "⋅" + }, + "a13": { + "none": "0", + "6": "₀" + }, + "a14": { + "none": "1", + "2": "‐", + "4": "№", + "6": "₁" + }, + "a15": { + "none": "2", + "2": "–", + "4": "½", + "6": "₂" + }, + "a16": { + "none": "3", + "1": "∛", + "10": "ǯ", + "2": "—", + "4": "⅓", + "6": "₃" + }, + "a17": { + "none": "4", + "1": "∜", + "4": "¼", + "6": "₄" + }, + "a18": { + "none": "5", + "10": "ˇ", + "2": "¯", + "4": "⅔", + "5": "˚", + "6": "₅", + "9": "´" + }, + "a19": { + "none": "6", + "4": "¾", + "6": "₆" + }, + "a2": { + "none": "#", + "10": "Ǯ", + "6": "³" + }, + "a20": { + "next": "7" + }, + "a21": { + "none": "7", + "1": "∡", + "6": "₇" + }, + "a22": { + "none": "8", + "1": "∠", + "6": "₈" + }, + "a23": { + "none": "9", + "1": "∟", + "6": "₉" + }, + "a24": { + "none": ":", + "1": "∴" + }, + "a25": { + "none": ";", + "1": "∵", + "6": "₋" + }, + "a26": { + "none": "<", + "1": "≤" + }, + "a27": { + "none": "=", + "1": "≝", + "4": "↔", + "6": "⁼" + }, + "a28": { + "none": ">", + "1": "≥" + }, + "a29": { + "none": "@", + "6": "²" + }, + "a3": { + "none": "$", + "6": "⁴" + }, + "a30": { + "none": "A", + "1": "∀", + "10": "Ǎ", + "11": "Ã", + "2": "Ā", + "3": "À", + "5": "Å", + "6": "Α", + "7": "Â", + "8": "Ä", + "9": "Á" + }, + "a31": { + "none": "B", + "1": "⊇", + "2": "Ƀ", + "6": "Β", + "9": "Ɓ" + }, + "a32": { + "none": "C", + "1": "ℂ", + "10": "Č", + "5": "Ċ", + "6": "Χ", + "7": "Ĉ", + "9": "Ć" + }, + "a33": { + "none": "D", + "1": "∇", + "10": "Ď", + "2": "Đ", + "6": "Δ" + }, + "a34": { + "none": "E", + "1": "∃", + "10": "Ě", + "2": "Ē", + "3": "È", + "5": "Ė", + "6": "Ε", + "7": "Ê", + "8": "Ë", + "9": "É" + }, + "a35": { + "none": "F", + "1": "∎", + "6": "Φ" + }, + "a36": { + "none": "G", + "1": "⊃", + "10": "Ǧ", + "2": "Ḡ", + "5": "Ġ", + "6": "Γ", + "7": "Ĝ", + "9": "Ǵ" + }, + "a37": { + "none": "H", + "1": "⊅", + "10": "Ȟ", + "2": "Ħ", + "4": "⇐", + "6": "Θ", + "7": "Ĥ", + "8": "Ḧ" + }, + "a38": { + "none": "I", + "10": "Ǐ", + "11": "Ĩ", + "2": "Ī", + "3": "Ì", + "4": "⇗", + "5": "İ", + "6": "Η", + "7": "Î", + "8": "Ï", + "9": "Í" + }, + "a39": { + "none": "J", + "4": "⇓", + "6": "Ι", + "7": "Ĵ" + }, + "a4": { + "none": "%", + "1": "‰", + "6": "⁵" + }, + "a40": { + "none": "K", + "1": "∌", + "10": "Ǩ", + "4": "⇑", + "6": "Κ", + "9": "Ḱ" + }, + "a41": { + "none": "L", + "1": "∦", + "10": "Ľ", + "2": "Ḻ", + "4": "⇒", + "6": "Λ", + "9": "Ł" + }, + "a42": { + "none": "M", + "1": "∉", + "4": "⇘", + "6": "Μ", + "9": "Ḿ" + }, + "a43": { + "none": "N", + "1": "ℕ", + "10": "Ň", + "11": "Ñ", + "4": "⇙", + "6": "Ν", + "9": "Ń" + }, + "a44": { + "none": "O", + "1": "∅", + "10": "Ǒ", + "11": "Õ", + "2": "Ō", + "3": "Ò", + "6": "Ο", + "7": "Ô", + "8": "Ö", + "9": "Ó" + }, + "a45": { + "none": "P", + "1": "ℙ", + "6": "Π", + "9": "Ṕ" + }, + "a46": { + "none": "Q", + "1": "ℚ", + "6": "Ω" + }, + "a47": { + "none": "R", + "1": "ℝ", + "10": "Ř", + "6": "Ρ", + "9": "Ŕ" + }, + "a48": { + "none": "S", + "1": "∫", + "10": "Š", + "6": "Σ", + "7": "Ŝ", + "9": "Ś" + }, + "a49": { + "none": "T", + "10": "Ť", + "2": "Ŧ", + "4": "℠", + "6": "Τ" + }, + "a5": { + "none": "&", + "1": "∧", + "6": "⁷" + }, + "a50": { + "none": "U", + "1": "∖", + "10": "Ǔ", + "11": "Ũ", + "2": "Ū", + "3": "Ù", + "4": "⇖", + "5": "Ů", + "6": "Ω", + "7": "Û", + "8": "Ü", + "9": "Ú" + }, + "a51": { + "none": "V", + "6": "Β" + }, + "a52": { + "none": "W", + "6": "Ψ", + "7": "Ŵ", + "8": "Ẅ", + "9": "Ẃ" + }, + "a53": { + "none": "X", + "1": "∄", + "6": "Ξ", + "8": "Ẍ" + }, + "a54": { + "none": "Y", + "11": "Ỹ", + "2": "Ȳ", + "6": "Υ", + "7": "Ŷ", + "8": "Ÿ", + "9": "Ý" + }, + "a55": { + "none": "Z", + "1": "ℤ", + "10": "Ž", + "5": "Ż", + "6": "Ζ", + "9": "Ź" + }, + "a56": { + "none": "[", + "6": "⁽" + }, + "a57": { + "none": "]", + "6": "⁾" + }, + "a58": { + "none": "^", + "1": "℘", + "6": "⁶" + }, + "a59": { + "none": "_" + }, + "a6": { + "none": "'", + "1": "′", + "6": "₌" + }, + "a60": { + "next": "3" + }, + "a61": { + "none": "a", + "10": "ǎ", + "11": "ã", + "2": "ā", + "3": "à", + "5": "å", + "6": "α", + "7": "â", + "8": "ä", + "9": "á" + }, + "a62": { + "none": "b", + "1": "⊆", + "2": "ƀ", + "6": "β", + "9": "ɓ" + }, + "a63": { + "none": "c", + "1": "∝", + "10": "č", + "4": "©", + "5": "ċ", + "6": "χ", + "7": "ĉ", + "9": "ć" + }, + "a64": { + "none": "d", + "1": "Δ", + "10": "ď", + "2": "đ", + "6": "δ" + }, + "a65": { + "none": "e", + "10": "ě", + "2": "ē", + "3": "è", + "5": "ė", + "6": "ε", + "7": "ê", + "8": "ë", + "9": "é" + }, + "a66": { + "none": "f", + "1": "ƒ", + "6": "φ" + }, + "a67": { + "none": "g", + "1": "⊂", + "10": "ǧ", + "2": "ḡ", + "5": "ġ", + "6": "γ", + "7": "ĝ", + "9": "ǵ" + }, + "a68": { + "none": "h", + "1": "⊄", + "10": "ȟ", + "2": "ħ", + "4": "←", + "6": "θ", + "7": "ĥ", + "8": "ḧ" + }, + "a69": { + "none": "i", + "1": "∞", + "10": "ǐ", + "11": "ĩ", + "2": "ī", + "3": "ì", + "4": "↗", + "6": "η", + "7": "î", + "8": "ï", + "9": "í" + }, + "a7": { + "none": "(", + "6": "⁹" + }, + "a70": { + "none": "j", + "10": "ǰ", + "4": "↓", + "6": "ι", + "7": "ĵ" + }, + "a71": { + "none": "k", + "1": "∋", + "10": "ǩ", + "4": "↑", + "6": "κ", + "9": "ḱ" + }, + "a72": { + "none": "l", + "1": "∥", + "10": "ľ", + "2": "ḻ", + "4": "→", + "6": "λ", + "9": "ł" + }, + "a73": { + "none": "m", + "1": "∈", + "4": "↘", + "6": "μ", + "9": "ḿ" + }, + "a74": { + "none": "n", + "1": "ⁿ", + "10": "ň", + "11": "ñ", + "4": "↙", + "6": "ν", + "9": "ń" + }, + "a75": { + "none": "o", + "1": "∘", + "10": "ǒ", + "11": "õ", + "2": "ō", + "3": "ò", + "6": "ο", + "7": "ô", + "8": "ö", + "9": "ó" + }, + "a76": { + "none": "p", + "1": "∂", + "4": "℗", + "6": "π", + "9": "ṕ" + }, + "a77": { + "none": "q", + "6": "ω" + }, + "a78": { + "none": "r", + "1": "√", + "10": "ř", + "4": "®", + "6": "ρ", + "9": "ŕ" + }, + "a79": { + "none": "s", + "1": "∩", + "10": "š", + "4": "§", + "6": "σ", + "7": "ŝ", + "9": "ś" + }, + "a8": { + "none": ")", + "6": "⁰" + }, + "a80": { + "none": " ", + "1": "√", + "10": "ˇ", + "11": "~", + "2": "¯", + "3": "`", + "4": "¬", + "5": "˚", + "7": "^", + "8": "¨", + "9": "´" + }, + "a81": { + "none": "t", + "10": "ť", + "2": "ŧ", + "4": "™", + "6": "τ", + "8": "ẗ" + }, + "a82": { + "none": "u", + "1": "∪", + "10": "ǔ", + "11": "ũ", + "2": "ū", + "3": "ù", + "4": "↖", + "5": "ů", + "6": "ω", + "7": "û", + "8": "ü", + "9": "ú" + }, + "a83": { + "none": "v", + "6": "β" + }, + "a84": { + "none": "w", + "5": "ẘ", + "6": "ψ", + "7": "ŵ", + "8": "ẅ", + "9": "ẃ" + }, + "a85": { + "none": "x", + "6": "ξ", + "8": "ẍ" + }, + "a86": { + "none": "y", + "11": "ỹ", + "2": "ȳ", + "5": "ẙ", + "6": "υ", + "7": "ŷ", + "8": "ÿ", + "9": "ý" + }, + "a87": { + "none": "z", + "1": "↯", + "10": "ž", + "5": "ż", + "6": "ζ", + "9": "ź" + }, + "a88": { + "none": "{", + "6": "₍" + }, + "a89": { + "none": "|", + "1": "∨" + }, + "a9": { + "none": "*", + "1": "⊗", + "6": "⁸" + }, + "a90": { + "none": "}", + "6": "₎" + }, + "a91": { + "none": "~", + "1": "≈" + }, + "a92": { + "next": "11" + }, + "a93": { + "next": "8" + }, + "a94": { + "next": "4" + }, + "a95": { + "next": "2" + }, + "a96": { + "next": "9" + }, + "a97": { + "none": "Ä", + "3": "Ą" + }, + "a98": { + "none": "Æ", + "2": "Ǣ", + "9": "Ǽ" + }, + "a99": { + "none": "Ë", + "3": "Ę" + } + }, + "terminators": { + "1": " ", + "10": "ˇ", + "11": "~", + "2": "¯", + "3": "`", + "4": "¬", + "5": "˚", + "6": "Ω", + "7": "^", + "8": "¨", + "9": "´" + }, + "keyMaps": { + "0": { + "label": "Base", + "keys": { + "0": { + "code": 0, + "keyName": "A", + "action": "a61", + "output": "a" + }, + "1": { + "code": 1, + "keyName": "S", + "action": "a79", + "output": "s" + }, + "2": { + "code": 2, + "keyName": "D", + "action": "a64", + "output": "d" + }, + "3": { + "code": 3, + "keyName": "F", + "action": "a66", + "output": "f" + }, + "4": { + "code": 4, + "keyName": "H", + "action": "a68", + "output": "h" + }, + "5": { + "code": 5, + "keyName": "G", + "action": "a67", + "output": "g" + }, + "6": { + "code": 6, + "keyName": "Z", + "action": "a87", + "output": "z" + }, + "7": { + "code": 7, + "keyName": "X", + "action": "a85", + "output": "x" + }, + "8": { + "code": 8, + "keyName": "C", + "action": "a63", + "output": "c" + }, + "9": { + "code": 9, + "keyName": "V", + "action": "a83", + "output": "v" + }, + "10": { + "code": 10, + "keyName": "§/`", + "output": "§" + }, + "11": { + "code": 11, + "keyName": "B", + "action": "a62", + "output": "b" + }, + "12": { + "code": 12, + "keyName": "Q", + "action": "a77", + "output": "q" + }, + "13": { + "code": 13, + "keyName": "W", + "action": "a84", + "output": "w" + }, + "14": { + "code": 14, + "keyName": "E", + "action": "a65", + "output": "e" + }, + "15": { + "code": 15, + "keyName": "R", + "action": "a78", + "output": "r" + }, + "16": { + "code": 16, + "keyName": "Y", + "action": "a86", + "output": "y" + }, + "17": { + "code": 17, + "keyName": "T", + "action": "a81", + "output": "t" + }, + "18": { + "code": 18, + "keyName": "1", + "action": "a14", + "output": "1" + }, + "21": { + "code": 21, + "keyName": "4", + "action": "a17", + "output": "4" + }, + "22": { + "code": 22, + "keyName": "6", + "action": "a19", + "output": "6" + }, + "23": { + "code": 23, + "keyName": "5", + "action": "a18", + "output": "5" + }, + "30": { + "code": 30, + "keyName": "]", + "output": "[" + } + } + }, + "1": { + "label": "Shift", + "keys": { + "0": { + "code": 0, + "keyName": "A", + "action": "a30", + "output": "A" + }, + "1": { + "code": 1, + "keyName": "S", + "action": "a48", + "output": "S" + }, + "2": { + "code": 2, + "keyName": "D", + "action": "a33", + "output": "D" + }, + "3": { + "code": 3, + "keyName": "F", + "action": "a35", + "output": "F" + }, + "4": { + "code": 4, + "keyName": "H", + "action": "a37", + "output": "H" + }, + "5": { + "code": 5, + "keyName": "G", + "action": "a36", + "output": "G" + }, + "6": { + "code": 6, + "keyName": "Z", + "action": "a55", + "output": "Z" + }, + "7": { + "code": 7, + "keyName": "X", + "action": "a53", + "output": "X" + }, + "8": { + "code": 8, + "keyName": "C", + "action": "a32", + "output": "C" + }, + "9": { + "code": 9, + "keyName": "V", + "action": "a51", + "output": "V" + }, + "10": { + "code": 10, + "keyName": "§/`", + "output": "±" + }, + "11": { + "code": 11, + "keyName": "B", + "action": "a31", + "output": "B" + }, + "12": { + "code": 12, + "keyName": "Q", + "action": "a46", + "output": "Q" + }, + "13": { + "code": 13, + "keyName": "W", + "action": "a52", + "output": "W" + }, + "14": { + "code": 14, + "keyName": "E", + "action": "a34", + "output": "E" + }, + "15": { + "code": 15, + "keyName": "R", + "action": "a47", + "output": "R" + }, + "16": { + "code": 16, + "keyName": "Y", + "action": "a54", + "output": "Y" + }, + "17": { + "code": 17, + "keyName": "T", + "action": "a49", + "output": "T" + }, + "18": { + "code": 18, + "keyName": "1", + "action": "a0", + "output": "!" + }, + "21": { + "code": 21, + "keyName": "4", + "action": "a3", + "output": "$" + }, + "22": { + "code": 22, + "keyName": "6", + "output": "&" + }, + "23": { + "code": 23, + "keyName": "5", + "action": "a4", + "output": "%" + }, + "30": { + "code": 30, + "keyName": "]", + "output": "{" + } + } + }, + "2": { + "label": "Caps", + "keys": { + "0": { + "code": 0, + "keyName": "A", + "action": "a30", + "output": "A" + }, + "1": { + "code": 1, + "keyName": "S", + "action": "a48", + "output": "S" + }, + "2": { + "code": 2, + "keyName": "D", + "action": "a33", + "output": "D" + }, + "3": { + "code": 3, + "keyName": "F", + "action": "a35", + "output": "F" + }, + "4": { + "code": 4, + "keyName": "H", + "action": "a37", + "output": "H" + }, + "5": { + "code": 5, + "keyName": "G", + "action": "a36", + "output": "G" + }, + "6": { + "code": 6, + "keyName": "Z", + "action": "a55", + "output": "Z" + }, + "7": { + "code": 7, + "keyName": "X", + "action": "a53", + "output": "X" + }, + "8": { + "code": 8, + "keyName": "C", + "action": "a32", + "output": "C" + }, + "9": { + "code": 9, + "keyName": "V", + "action": "a51", + "output": "V" + }, + "10": { + "code": 10, + "keyName": "§/`", + "output": "ẞ" + }, + "11": { + "code": 11, + "keyName": "B", + "action": "a31", + "output": "B" + }, + "12": { + "code": 12, + "keyName": "Q", + "action": "a46", + "output": "Q" + }, + "13": { + "code": 13, + "keyName": "W", + "action": "a52", + "output": "W" + }, + "14": { + "code": 14, + "keyName": "E", + "action": "a34", + "output": "E" + }, + "15": { + "code": 15, + "keyName": "R", + "action": "a47", + "output": "R" + }, + "16": { + "code": 16, + "keyName": "Y", + "action": "a54", + "output": "Y" + }, + "17": { + "code": 17, + "keyName": "T", + "action": "a49", + "output": "T" + }, + "18": { + "code": 18, + "keyName": "1", + "action": "a14", + "output": "1" + }, + "21": { + "code": 21, + "keyName": "4", + "action": "a17", + "output": "4" + }, + "22": { + "code": 22, + "keyName": "6", + "action": "a19", + "output": "6" + }, + "23": { + "code": 23, + "keyName": "5", + "action": "a18", + "output": "5" + }, + "30": { + "code": 30, + "keyName": "]", + "output": "[" + } + } + }, + "3": { + "label": "Option", + "keys": { + "0": { + "code": 0, + "keyName": "A", + "action": "a104", + "output": "ä" + }, + "1": { + "code": 1, + "keyName": "S", + "output": "ß" + }, + "2": { + "code": 2, + "keyName": "D", + "output": "đ" + }, + "3": { + "code": 3, + "keyName": "F", + "output": "è" + }, + "4": { + "code": 4, + "keyName": "H", + "output": "ù" + }, + "5": { + "code": 5, + "keyName": "G", + "output": "é" + }, + "6": { + "code": 6, + "keyName": "Z", + "output": "à" + }, + "7": { + "code": 7, + "keyName": "X", + "output": "á" + }, + "8": { + "code": 8, + "keyName": "C", + "output": "ç" + }, + "9": { + "code": 9, + "keyName": "V", + "output": "ì" + }, + "10": { + "code": 10, + "keyName": "§/`", + "output": "§" + }, + "11": { + "code": 11, + "keyName": "B", + "output": "í" + }, + "12": { + "code": 12, + "keyName": "Q", + "action": "a105", + "output": "æ" + }, + "13": { + "code": 13, + "keyName": "W", + "output": "å" + }, + "14": { + "code": 14, + "keyName": "E", + "action": "a106", + "output": "ë" + }, + "15": { + "code": 15, + "keyName": "R", + "output": "ý" + }, + "16": { + "code": 16, + "keyName": "Y", + "output": "ÿ" + }, + "17": { + "code": 17, + "keyName": "T", + "output": "þ" + }, + "18": { + "code": 18, + "keyName": "1", + "output": "¡" + }, + "21": { + "code": 21, + "keyName": "4", + "output": "£" + }, + "22": { + "code": 22, + "keyName": "6", + "action": "a20", + "deadKey": "7" + }, + "23": { + "code": 23, + "keyName": "5", + "output": "€" + }, + "30": { + "code": 30, + "keyName": "]", + "output": "»" + } + } + }, + "4": { + "label": "Shift+Option", + "keys": { + "0": { + "code": 0, + "keyName": "A", + "action": "a97", + "output": "Ä" + }, + "1": { + "code": 1, + "keyName": "S", + "output": "ẞ" + }, + "2": { + "code": 2, + "keyName": "D", + "output": "Đ" + }, + "3": { + "code": 3, + "keyName": "F", + "output": "È" + }, + "4": { + "code": 4, + "keyName": "H", + "output": "Ù" + }, + "5": { + "code": 5, + "keyName": "G", + "output": "É" + }, + "6": { + "code": 6, + "keyName": "Z", + "output": "À" + }, + "7": { + "code": 7, + "keyName": "X", + "output": "Á" + }, + "8": { + "code": 8, + "keyName": "C", + "output": "Ç" + }, + "9": { + "code": 9, + "keyName": "V", + "output": "Ì" + }, + "10": { + "code": 10, + "keyName": "§/`", + "output": "±" + }, + "11": { + "code": 11, + "keyName": "B", + "output": "Í" + }, + "12": { + "code": 12, + "keyName": "Q", + "action": "a98", + "output": "Æ" + }, + "13": { + "code": 13, + "keyName": "W", + "output": "Å" + }, + "14": { + "code": 14, + "keyName": "E", + "action": "a99", + "output": "Ë" + }, + "15": { + "code": 15, + "keyName": "R", + "output": "Ý" + }, + "16": { + "code": 16, + "keyName": "Y", + "output": "Ÿ" + }, + "17": { + "code": 17, + "keyName": "T", + "output": "Þ" + }, + "18": { + "code": 18, + "keyName": "1", + "output": "¹" + }, + "21": { + "code": 21, + "keyName": "4", + "output": "¥" + }, + "22": { + "code": 22, + "keyName": "6", + "action": "a111", + "deadKey": "10" + }, + "23": { + "code": 23, + "keyName": "5", + "output": "¢" + }, + "30": { + "code": 30, + "keyName": "]", + "output": "›" + } + } + }, + "5": { + "label": "Caps+Option", + "keys": { + "0": { + "code": 0, + "keyName": "A", + "output": "Ä" + }, + "1": { + "code": 1, + "keyName": "S", + "output": "ß" + }, + "2": { + "code": 2, + "keyName": "D", + "output": "Ð" + }, + "3": { + "code": 3, + "keyName": "F", + "output": "È" + }, + "4": { + "code": 4, + "keyName": "H", + "output": "Ù" + }, + "5": { + "code": 5, + "keyName": "G", + "output": "É" + }, + "6": { + "code": 6, + "keyName": "Z", + "output": "À" + }, + "7": { + "code": 7, + "keyName": "X", + "output": "Á" + }, + "8": { + "code": 8, + "keyName": "C", + "output": "Ç" + }, + "9": { + "code": 9, + "keyName": "V", + "output": "Ì" + }, + "10": { + "code": 10, + "keyName": "§/`", + "output": "ẞ" + }, + "11": { + "code": 11, + "keyName": "B", + "output": "Í" + }, + "12": { + "code": 12, + "keyName": "Q", + "action": "a98", + "output": "Æ" + }, + "13": { + "code": 13, + "keyName": "W", + "output": "Å" + }, + "14": { + "code": 14, + "keyName": "E", + "output": "Ë" + }, + "15": { + "code": 15, + "keyName": "R", + "output": "Ý" + }, + "16": { + "code": 16, + "keyName": "Y", + "output": "Ÿ" + }, + "17": { + "code": 17, + "keyName": "T", + "output": "Þ" + }, + "18": { + "code": 18, + "keyName": "1", + "output": "¡" + }, + "21": { + "code": 21, + "keyName": "4", + "output": "£" + }, + "22": { + "code": 22, + "keyName": "6", + "action": "a58", + "output": "^" + }, + "23": { + "code": 23, + "keyName": "5", + "output": "€" + }, + "30": { + "code": 30, + "keyName": "]", + "output": "»" + } + } + }, + "6": { + "label": "Command+Option", + "keys": { + "0": { + "code": 0, + "keyName": "A", + "output": "å" + }, + "1": { + "code": 1, + "keyName": "S", + "output": "ß" + }, + "2": { + "code": 2, + "keyName": "D", + "output": "∂" + }, + "3": { + "code": 3, + "keyName": "F", + "output": "ƒ" + }, + "4": { + "code": 4, + "keyName": "H", + "output": "˙" + }, + "5": { + "code": 5, + "keyName": "G", + "output": "©" + }, + "6": { + "code": 6, + "keyName": "Z", + "output": "Ω" + }, + "7": { + "code": 7, + "keyName": "X", + "output": "≈" + }, + "8": { + "code": 8, + "keyName": "C", + "output": "ç" + }, + "9": { + "code": 9, + "keyName": "V", + "output": "√" + }, + "10": { + "code": 10, + "keyName": "§/`", + "output": "§" + }, + "11": { + "code": 11, + "keyName": "B", + "output": "∫" + }, + "12": { + "code": 12, + "keyName": "Q", + "output": "œ" + }, + "13": { + "code": 13, + "keyName": "W", + "output": "∑" + }, + "14": { + "code": 14, + "keyName": "E", + "output": "´" + }, + "15": { + "code": 15, + "keyName": "R", + "output": "®" + }, + "16": { + "code": 16, + "keyName": "Y", + "output": "¥" + }, + "17": { + "code": 17, + "keyName": "T", + "output": "†" + }, + "18": { + "code": 18, + "keyName": "1", + "output": "¡" + }, + "21": { + "code": 21, + "keyName": "4", + "output": "¢" + }, + "22": { + "code": 22, + "keyName": "6", + "output": "ẞ" + }, + "23": { + "code": 23, + "keyName": "5", + "output": "∞" + }, + "30": { + "code": 30, + "keyName": "]", + "output": "‘" + } + } + }, + "7": { + "label": "Control", + "keys": { + "0": { + "code": 0, + "keyName": "A", + "output": "\u0001" + }, + "1": { + "code": 1, + "keyName": "S", + "output": "\u0013" + }, + "2": { + "code": 2, + "keyName": "D", + "output": "\u0004" + }, + "3": { + "code": 3, + "keyName": "F", + "output": "\u0006" + }, + "4": { + "code": 4, + "keyName": "H", + "output": "\b" + }, + "5": { + "code": 5, + "keyName": "G", + "output": "\u0007" + }, + "6": { + "code": 6, + "keyName": "Z", + "output": "\u001a" + }, + "7": { + "code": 7, + "keyName": "X", + "output": "\u0018" + }, + "8": { + "code": 8, + "keyName": "C", + "output": "\u0003" + }, + "9": { + "code": 9, + "keyName": "V", + "output": "\u0016" + }, + "10": { + "code": 10, + "keyName": "§/`", + "output": "0" + }, + "11": { + "code": 11, + "keyName": "B", + "output": "\u0002" + }, + "12": { + "code": 12, + "keyName": "Q", + "output": "\u0011" + }, + "13": { + "code": 13, + "keyName": "W", + "output": "\u0017" + }, + "14": { + "code": 14, + "keyName": "E", + "output": "\u0005" + }, + "15": { + "code": 15, + "keyName": "R", + "output": "\u0012" + }, + "16": { + "code": 16, + "keyName": "Y", + "output": "\u0019" + }, + "17": { + "code": 17, + "keyName": "T", + "output": "\u0014" + }, + "18": { + "code": 18, + "keyName": "1", + "output": "1" + }, + "21": { + "code": 21, + "keyName": "4", + "output": "4" + }, + "22": { + "code": 22, + "keyName": "6", + "output": "6" + }, + "23": { + "code": 23, + "keyName": "5", + "output": "5" + }, + "30": { + "code": 30, + "keyName": "]", + "output": "\u001d" + } + } + } + }, + "deadKeys": { + "1": { + "terminator": " ", + "compositions": { + "a0": "≠", + "a1": "″", + "a10": "⊕", + "a11": "±", + "a12": "⋅", + "a16": "∛", + "a17": "∜", + "a21": "∡", + "a22": "∠", + "a23": "∟", + "a24": "∴", + "a25": "∵", + "a26": "≤", + "a27": "≝", + "a28": "≥", + "a30": "∀", + "a31": "⊇", + "a32": "ℂ", + "a33": "∇", + "a34": "∃", + "a35": "∎", + "a36": "⊃", + "a37": "⊅", + "a4": "‰", + "a40": "∌", + "a41": "∦", + "a42": "∉", + "a43": "ℕ", + "a44": "∅", + "a45": "ℙ", + "a46": "ℚ", + "a47": "ℝ", + "a48": "∫", + "a5": "∧", + "a50": "∖", + "a53": "∄", + "a55": "ℤ", + "a58": "℘", + "a6": "′", + "a62": "⊆", + "a63": "∝", + "a64": "Δ", + "a66": "ƒ", + "a67": "⊂", + "a68": "⊄", + "a69": "∞", + "a71": "∋", + "a72": "∥", + "a73": "∈", + "a74": "ⁿ", + "a75": "∘", + "a76": "∂", + "a78": "√", + "a79": "∩", + "a80": "√", + "a82": "∪", + "a87": "↯", + "a89": "∨", + "a9": "⊗", + "a91": "≈" + } + }, + "10": { + "terminator": "ˇ", + "compositions": { + "a103": "Ǚ", + "a110": "ǚ", + "a16": "ǯ", + "a18": "ˇ", + "a2": "Ǯ", + "a30": "Ǎ", + "a32": "Č", + "a33": "Ď", + "a34": "Ě", + "a36": "Ǧ", + "a37": "Ȟ", + "a38": "Ǐ", + "a40": "Ǩ", + "a41": "Ľ", + "a43": "Ň", + "a44": "Ǒ", + "a47": "Ř", + "a48": "Š", + "a49": "Ť", + "a50": "Ǔ", + "a55": "Ž", + "a61": "ǎ", + "a63": "č", + "a64": "ď", + "a65": "ě", + "a67": "ǧ", + "a68": "ȟ", + "a69": "ǐ", + "a70": "ǰ", + "a71": "ǩ", + "a72": "ľ", + "a74": "ň", + "a75": "ǒ", + "a78": "ř", + "a79": "š", + "a80": "ˇ", + "a81": "ť", + "a82": "ǔ", + "a87": "ž" + } + }, + "11": { + "terminator": "~", + "compositions": { + "a30": "Ã", + "a38": "Ĩ", + "a43": "Ñ", + "a44": "Õ", + "a50": "Ũ", + "a54": "Ỹ", + "a61": "ã", + "a69": "ĩ", + "a74": "ñ", + "a75": "õ", + "a80": "~", + "a82": "ũ", + "a86": "ỹ" + } + }, + "2": { + "terminator": "¯", + "compositions": { + "a105": "ǣ", + "a14": "‐", + "a15": "–", + "a16": "—", + "a18": "¯", + "a30": "Ā", + "a31": "Ƀ", + "a33": "Đ", + "a34": "Ē", + "a36": "Ḡ", + "a37": "Ħ", + "a38": "Ī", + "a41": "Ḻ", + "a44": "Ō", + "a49": "Ŧ", + "a50": "Ū", + "a54": "Ȳ", + "a61": "ā", + "a62": "ƀ", + "a64": "đ", + "a65": "ē", + "a67": "ḡ", + "a68": "ħ", + "a69": "ī", + "a72": "ḻ", + "a75": "ō", + "a80": "¯", + "a81": "ŧ", + "a82": "ū", + "a86": "ȳ", + "a98": "Ǣ" + } + }, + "3": { + "terminator": "`", + "compositions": { + "a100": "Į", + "a101": "Ǫ", + "a103": "Ų", + "a104": "ą", + "a106": "ę", + "a107": "į", + "a108": "ǫ", + "a110": "ų", + "a30": "À", + "a34": "È", + "a38": "Ì", + "a44": "Ò", + "a50": "Ù", + "a61": "à", + "a65": "è", + "a69": "ì", + "a75": "ò", + "a80": "`", + "a82": "ù", + "a97": "Ą", + "a99": "Ę" + } + }, + "4": { + "terminator": "¬", + "compositions": { + "a10": "⇔", + "a14": "№", + "a15": "½", + "a16": "⅓", + "a17": "¼", + "a18": "⅔", + "a19": "¾", + "a27": "↔", + "a37": "⇐", + "a38": "⇗", + "a39": "⇓", + "a40": "⇑", + "a41": "⇒", + "a42": "⇘", + "a43": "⇙", + "a49": "℠", + "a50": "⇖", + "a63": "©", + "a68": "←", + "a69": "↗", + "a70": "↓", + "a71": "↑", + "a72": "→", + "a73": "↘", + "a74": "↙", + "a76": "℗", + "a78": "®", + "a79": "§", + "a80": "¬", + "a81": "™", + "a82": "↖" + } + }, + "5": { + "terminator": "˚", + "compositions": { + "a18": "˚", + "a30": "Å", + "a32": "Ċ", + "a34": "Ė", + "a36": "Ġ", + "a38": "İ", + "a50": "Ů", + "a55": "Ż", + "a61": "å", + "a63": "ċ", + "a65": "ė", + "a67": "ġ", + "a80": "˚", + "a82": "ů", + "a84": "ẘ", + "a86": "ẙ", + "a87": "ż" + } + }, + "6": { + "terminator": "Ω", + "compositions": { + "a0": "¹", + "a1": "₊", + "a10": "⁺", + "a11": "⁻", + "a13": "₀", + "a14": "₁", + "a15": "₂", + "a16": "₃", + "a17": "₄", + "a18": "₅", + "a19": "₆", + "a2": "³", + "a21": "₇", + "a22": "₈", + "a23": "₉", + "a25": "₋", + "a27": "⁼", + "a29": "²", + "a3": "⁴", + "a30": "Α", + "a31": "Β", + "a32": "Χ", + "a33": "Δ", + "a34": "Ε", + "a35": "Φ", + "a36": "Γ", + "a37": "Θ", + "a38": "Η", + "a39": "Ι", + "a4": "⁵", + "a40": "Κ", + "a41": "Λ", + "a42": "Μ", + "a43": "Ν", + "a44": "Ο", + "a45": "Π", + "a46": "Ω", + "a47": "Ρ", + "a48": "Σ", + "a49": "Τ", + "a5": "⁷", + "a50": "Ω", + "a51": "Β", + "a52": "Ψ", + "a53": "Ξ", + "a54": "Υ", + "a55": "Ζ", + "a56": "⁽", + "a57": "⁾", + "a58": "⁶", + "a6": "₌", + "a61": "α", + "a62": "β", + "a63": "χ", + "a64": "δ", + "a65": "ε", + "a66": "φ", + "a67": "γ", + "a68": "θ", + "a69": "η", + "a7": "⁹", + "a70": "ι", + "a71": "κ", + "a72": "λ", + "a73": "μ", + "a74": "ν", + "a75": "ο", + "a76": "π", + "a77": "ω", + "a78": "ρ", + "a79": "σ", + "a8": "⁰", + "a81": "τ", + "a82": "ω", + "a83": "β", + "a84": "ψ", + "a85": "ξ", + "a86": "υ", + "a87": "ζ", + "a88": "₍", + "a9": "⁸", + "a90": "₎" + } + }, + "7": { + "terminator": "^", + "compositions": { + "a30": "Â", + "a32": "Ĉ", + "a34": "Ê", + "a36": "Ĝ", + "a37": "Ĥ", + "a38": "Î", + "a39": "Ĵ", + "a44": "Ô", + "a48": "Ŝ", + "a50": "Û", + "a52": "Ŵ", + "a54": "Ŷ", + "a61": "â", + "a63": "ĉ", + "a65": "ê", + "a67": "ĝ", + "a68": "ĥ", + "a69": "î", + "a70": "ĵ", + "a75": "ô", + "a79": "ŝ", + "a80": "^", + "a82": "û", + "a84": "ŵ", + "a86": "ŷ" + } + }, + "8": { + "terminator": "¨", + "compositions": { + "a30": "Ä", + "a34": "Ë", + "a37": "Ḧ", + "a38": "Ï", + "a44": "Ö", + "a50": "Ü", + "a52": "Ẅ", + "a53": "Ẍ", + "a54": "Ÿ", + "a61": "ä", + "a65": "ë", + "a68": "ḧ", + "a69": "ï", + "a75": "ö", + "a80": "¨", + "a81": "ẗ", + "a82": "ü", + "a84": "ẅ", + "a85": "ẍ", + "a86": "ÿ" + } + }, + "9": { + "terminator": "´", + "compositions": { + "a102": "Ǿ", + "a105": "ǽ", + "a109": "ǿ", + "a18": "´", + "a30": "Á", + "a31": "Ɓ", + "a32": "Ć", + "a34": "É", + "a36": "Ǵ", + "a38": "Í", + "a40": "Ḱ", + "a41": "Ł", + "a42": "Ḿ", + "a43": "Ń", + "a44": "Ó", + "a45": "Ṕ", + "a47": "Ŕ", + "a48": "Ś", + "a50": "Ú", + "a52": "Ẃ", + "a54": "Ý", + "a55": "Ź", + "a61": "á", + "a62": "ɓ", + "a63": "ć", + "a65": "é", + "a67": "ǵ", + "a69": "í", + "a71": "ḱ", + "a72": "ł", + "a73": "ḿ", + "a74": "ń", + "a75": "ó", + "a76": "ṕ", + "a78": "ŕ", + "a79": "ś", + "a80": "´", + "a82": "ú", + "a84": "ẃ", + "a86": "ý", + "a87": "ź", + "a98": "Ǽ" + } + } + } +} \ No newline at end of file diff --git a/spec/eurkey-v2.0-parsed.json b/spec/eurkey-v2.0-parsed.json new file mode 100644 index 0000000..e9e226d --- /dev/null +++ b/spec/eurkey-v2.0-parsed.json @@ -0,0 +1,2281 @@ +{ + "name": "EurKEY v2.0", + "group": "126", + "id": "-31468", + "modifierMap": { + "f4": { + "defaultIndex": "7", + "selects": [ + { + "mapIndex": "0", + "modifiers": [ + "command?", + "anyShift? caps? command" + ] + }, + { + "mapIndex": "1", + "modifiers": [ + "anyShift caps?" + ] + }, + { + "mapIndex": "2", + "modifiers": [ + "caps" + ] + }, + { + "mapIndex": "3", + "modifiers": [ + "anyOption" + ] + }, + { + "mapIndex": "4", + "modifiers": [ + "anyShift caps? anyOption command?" + ] + }, + { + "mapIndex": "5", + "modifiers": [ + "caps anyOption" + ] + }, + { + "mapIndex": "6", + "modifiers": [ + "caps? anyOption command" + ] + }, + { + "mapIndex": "7", + "modifiers": [ + "anyShift caps? anyOption? command? anyControl", + "anyShift? caps? anyOption command? anyControl", + "caps? anyOption? command? anyControl" + ] + } + ] + } + }, + "actions": { + "__CTRL_U001E__": { + "none": "\u001e", + "⌥\\": "↑" + }, + "!": { + "none": "!", + "⌥m": "¹", + "⌥⇧m": "≠" + }, + "\"": { + "none": "\"", + "⌥m": "₊", + "⌥⇧m": "″" + }, + "#": { + "none": "#", + "⌥⇧6": "Ǯ", + "⌥m": "³" + }, + "$": { + "none": "$", + "⌥m": "⁴" + }, + "%": { + "none": "%", + "⌥m": "⁵", + "⌥⇧m": "‰" + }, + "&": { + "none": "&", + "⌥m": "⁷", + "⌥⇧m": "∧" + }, + "'": { + "none": "'", + "⌥m": "₌", + "⌥⇧m": "′" + }, + "(": { + "none": "(", + "⌥m": "⁹" + }, + ")": { + "none": ")", + "⌥m": "⁰" + }, + "*": { + "none": "*", + "⌥m": "⁸", + "⌥⇧m": "⊗" + }, + "+": { + "none": "+", + "⌥\\": "⇔", + "⌥m": "⁺", + "⌥⇧m": "⊕" + }, + "-": { + "none": "-", + "⌥m": "⁻", + "⌥⇧m": "±" + }, + ".": { + "none": ".", + "⌥⇧m": "⋅" + }, + "0": { + "none": "0", + "⌥m": "₀" + }, + "1": { + "none": "1", + "⌥\\": "№", + "⌥⇧7": "‐", + "⌥m": "₁" + }, + "2": { + "none": "2", + "⌥\\": "½", + "⌥⇧7": "–", + "⌥m": "₂" + }, + "3": { + "none": "3", + "⌥\\": "⅓", + "⌥⇧7": "—", + "⌥⇧6": "ǯ", + "⌥m": "₃", + "⌥⇧m": "∛" + }, + "4": { + "none": "4", + "⌥\\": "¼", + "⌥m": "₄", + "⌥⇧m": "∜" + }, + "5": { + "none": "5", + "⌥\\": "⅔", + "⌥⇧7": "¯", + "⌥'": "´", + "⌥⇧6": "ˇ", + "⌥7": "˚", + "⌥m": "₅" + }, + "6": { + "none": "6", + "⌥\\": "¾", + "⌥m": "₆" + }, + "6 option": { + "next": "⌥6" + }, + "7": { + "none": "7", + "⌥m": "₇", + "⌥⇧m": "∡" + }, + "8": { + "none": "8", + "⌥m": "₈", + "⌥⇧m": "∠" + }, + "9": { + "none": "9", + "⌥m": "₉", + "⌥⇧m": "∟" + }, + ":": { + "none": ":", + "⌥⇧m": "∴" + }, + ";": { + "none": ";", + "⌥m": "₋", + "⌥⇧m": "∵" + }, + "<": { + "none": "<", + "⌥⇧m": "≤" + }, + "=": { + "none": "=", + "⌥\\": "↔", + "⌥m": "⁼", + "⌥⇧m": "≝" + }, + ">": { + "none": ">", + "⌥⇧m": "≥" + }, + "@": { + "none": "@", + "⌥m": "²" + }, + "A": { + "none": "A", + "⌥6": "Â", + "⌥`": "À", + "⌥⇧`": "Ã", + "⌥⇧'": "Ä", + "⌥⇧7": "Ā", + "⌥'": "Á", + "⌥⇧6": "Ǎ", + "⌥7": "Å", + "⌥m": "Α", + "⌥⇧m": "∀" + }, + "B": { + "none": "B", + "⌥⇧7": "Ƀ", + "⌥'": "Ɓ", + "⌥m": "Β", + "⌥⇧m": "⊇" + }, + "C": { + "none": "C", + "⌥6": "Ĉ", + "⌥'": "Ć", + "⌥⇧6": "Č", + "⌥7": "Ċ", + "⌥m": "Χ", + "⌥⇧m": "ℂ" + }, + "D": { + "none": "D", + "⌥⇧7": "Đ", + "⌥⇧6": "Ď", + "⌥m": "Δ", + "⌥⇧m": "∇" + }, + "E": { + "none": "E", + "⌥6": "Ê", + "⌥`": "È", + "⌥⇧'": "Ë", + "⌥⇧7": "Ē", + "⌥'": "É", + "⌥⇧6": "Ě", + "⌥7": "Ė", + "⌥m": "Ε", + "⌥⇧m": "∃" + }, + "F": { + "none": "F", + "⌥m": "Φ", + "⌥⇧m": "∎" + }, + "G": { + "none": "G", + "⌥6": "Ĝ", + "⌥⇧7": "Ḡ", + "⌥'": "Ǵ", + "⌥⇧6": "Ǧ", + "⌥7": "Ġ", + "⌥m": "Γ", + "⌥⇧m": "⊃" + }, + "H": { + "none": "H", + "⌥6": "Ĥ", + "⌥⇧'": "Ḧ", + "⌥\\": "⇐", + "⌥⇧7": "Ħ", + "⌥⇧6": "Ȟ", + "⌥m": "Θ", + "⌥⇧m": "⊅" + }, + "I": { + "none": "I", + "⌥6": "Î", + "⌥`": "Ì", + "⌥⇧`": "Ĩ", + "⌥⇧'": "Ï", + "⌥\\": "⇗", + "⌥⇧7": "Ī", + "⌥'": "Í", + "⌥⇧6": "Ǐ", + "⌥7": "İ", + "⌥m": "Η" + }, + "J": { + "none": "J", + "⌥6": "Ĵ", + "⌥\\": "⇓", + "⌥m": "Ι" + }, + "K": { + "none": "K", + "⌥\\": "⇑", + "⌥'": "Ḱ", + "⌥⇧6": "Ǩ", + "⌥m": "Κ", + "⌥⇧m": "∌" + }, + "L": { + "none": "L", + "⌥\\": "⇒", + "⌥⇧7": "Ḻ", + "⌥'": "Ł", + "⌥⇧6": "Ľ", + "⌥m": "Λ", + "⌥⇧m": "∦" + }, + "M": { + "none": "M", + "⌥\\": "⇘", + "⌥'": "Ḿ", + "⌥m": "Μ", + "⌥⇧m": "∉" + }, + "N": { + "none": "N", + "⌥⇧`": "Ñ", + "⌥\\": "⇙", + "⌥'": "Ń", + "⌥⇧6": "Ň", + "⌥m": "Ν", + "⌥⇧m": "ℕ" + }, + "O": { + "none": "O", + "⌥6": "Ô", + "⌥`": "Ò", + "⌥⇧`": "Õ", + "⌥⇧'": "Ö", + "⌥⇧7": "Ō", + "⌥'": "Ó", + "⌥⇧6": "Ǒ", + "⌥m": "Ο", + "⌥⇧m": "∅" + }, + "P": { + "none": "P", + "⌥'": "Ṕ", + "⌥m": "Π", + "⌥⇧m": "ℙ" + }, + "Q": { + "none": "Q", + "⌥m": "Ω", + "⌥⇧m": "ℚ" + }, + "R": { + "none": "R", + "⌥'": "Ŕ", + "⌥⇧6": "Ř", + "⌥m": "Ρ", + "⌥⇧m": "ℝ" + }, + "S": { + "none": "S", + "⌥6": "Ŝ", + "⌥'": "Ś", + "⌥⇧6": "Š", + "⌥m": "Σ", + "⌥⇧m": "∫" + }, + "T": { + "none": "T", + "⌥\\": "℠", + "⌥⇧7": "Ŧ", + "⌥⇧6": "Ť", + "⌥m": "Τ" + }, + "U": { + "none": "U", + "⌥6": "Û", + "⌥`": "Ù", + "⌥⇧`": "Ũ", + "⌥⇧'": "Ü", + "⌥\\": "⇖", + "⌥⇧7": "Ū", + "⌥'": "Ú", + "⌥⇧6": "Ǔ", + "⌥7": "Ů", + "⌥m": "Ω", + "⌥⇧m": "∖" + }, + "V": { + "none": "V", + "⌥m": "Β" + }, + "W": { + "none": "W", + "⌥6": "Ŵ", + "⌥⇧'": "Ẅ", + "⌥'": "Ẃ", + "⌥m": "Ψ" + }, + "X": { + "none": "X", + "⌥⇧'": "Ẍ", + "⌥m": "Ξ", + "⌥⇧m": "∄" + }, + "Y": { + "none": "Y", + "⌥6": "Ŷ", + "⌥⇧`": "Ỹ", + "⌥⇧'": "Ÿ", + "⌥⇧7": "Ȳ", + "⌥'": "Ý", + "⌥m": "Υ" + }, + "Z": { + "none": "Z", + "⌥'": "Ź", + "⌥⇧6": "Ž", + "⌥7": "Ż", + "⌥m": "Ζ", + "⌥⇧m": "ℤ" + }, + "[": { + "none": "[", + "⌥m": "⁽" + }, + "]": { + "none": "]", + "⌥m": "⁾" + }, + "^": { + "none": "^", + "⌥m": "⁶", + "⌥⇧m": "℘" + }, + "_": { + "none": "_" + }, + "`": { + "next": "⌥`" + }, + "a": { + "none": "a", + "⌥6": "â", + "⌥`": "à", + "⌥⇧`": "ã", + "⌥⇧'": "ä", + "⌥⇧7": "ā", + "⌥'": "á", + "⌥⇧6": "ǎ", + "⌥7": "å", + "⌥m": "α" + }, + "b": { + "none": "b", + "⌥⇧7": "ƀ", + "⌥'": "ɓ", + "⌥m": "β", + "⌥⇧m": "⊆" + }, + "c": { + "none": "c", + "⌥6": "ĉ", + "⌥\\": "©", + "⌥'": "ć", + "⌥⇧6": "č", + "⌥7": "ċ", + "⌥m": "χ", + "⌥⇧m": "∝" + }, + "d": { + "none": "d", + "⌥⇧7": "đ", + "⌥⇧6": "ď", + "⌥m": "δ", + "⌥⇧m": "Δ" + }, + "e": { + "none": "e", + "⌥6": "ê", + "⌥`": "è", + "⌥⇧'": "ë", + "⌥⇧7": "ē", + "⌥'": "é", + "⌥⇧6": "ě", + "⌥7": "ė", + "⌥m": "ε" + }, + "f": { + "none": "f", + "⌥m": "φ", + "⌥⇧m": "ƒ" + }, + "g": { + "none": "g", + "⌥6": "ĝ", + "⌥⇧7": "ḡ", + "⌥'": "ǵ", + "⌥⇧6": "ǧ", + "⌥7": "ġ", + "⌥m": "γ", + "⌥⇧m": "⊂" + }, + "h": { + "none": "h", + "⌥6": "ĥ", + "⌥⇧'": "ḧ", + "⌥\\": "←", + "⌥⇧7": "ħ", + "⌥⇧6": "ȟ", + "⌥m": "θ", + "⌥⇧m": "⊄" + }, + "i": { + "none": "i", + "⌥6": "î", + "⌥`": "ì", + "⌥⇧`": "ĩ", + "⌥⇧'": "ï", + "⌥\\": "↗", + "⌥⇧7": "ī", + "⌥'": "í", + "⌥⇧6": "ǐ", + "⌥m": "η", + "⌥⇧m": "∞" + }, + "j": { + "none": "j", + "⌥6": "ĵ", + "⌥\\": "↓", + "⌥⇧6": "ǰ", + "⌥m": "ι" + }, + "k 1": { + "none": "k", + "⌥\\": "↑", + "⌥'": "ḱ", + "⌥⇧6": "ǩ", + "⌥m": "κ", + "⌥⇧m": "∋" + }, + "l 1": { + "none": "l", + "⌥\\": "→", + "⌥⇧7": "ḻ", + "⌥'": "ł", + "⌥⇧6": "ľ", + "⌥m": "λ", + "⌥⇧m": "∥" + }, + "m": { + "none": "m", + "⌥\\": "↘", + "⌥'": "ḿ", + "⌥m": "μ", + "⌥⇧m": "∈" + }, + "n": { + "none": "n", + "⌥⇧`": "ñ", + "⌥\\": "↙", + "⌥'": "ń", + "⌥⇧6": "ň", + "⌥m": "ν", + "⌥⇧m": "ⁿ" + }, + "o": { + "none": "o", + "⌥6": "ô", + "⌥`": "ò", + "⌥⇧`": "õ", + "⌥⇧'": "ö", + "⌥⇧7": "ō", + "⌥'": "ó", + "⌥⇧6": "ǒ", + "⌥m": "ο", + "⌥⇧m": "∘" + }, + "p": { + "none": "p", + "⌥\\": "℗", + "⌥'": "ṕ", + "⌥m": "π", + "⌥⇧m": "∂" + }, + "q": { + "none": "q", + "⌥m": "ω" + }, + "r": { + "none": "r", + "⌥\\": "®", + "⌥'": "ŕ", + "⌥⇧6": "ř", + "⌥m": "ρ", + "⌥⇧m": "√" + }, + "s": { + "none": "s", + "⌥6": "ŝ", + "⌥\\": "§", + "⌥'": "ś", + "⌥⇧6": "š", + "⌥m": "σ", + "⌥⇧m": "∩" + }, + "space": { + "none": " ", + "⌥6": "^", + "⌥`": "`", + "⌥⇧`": "~", + "⌥⇧'": "¨", + "⌥\\": "¬", + "⌥⇧7": "¯", + "⌥'": "´", + "⌥⇧6": "ˇ", + "⌥7": "˚", + "⌥⇧m": "√" + }, + "t": { + "none": "t", + "⌥⇧'": "ẗ", + "⌥\\": "™", + "⌥⇧7": "ŧ", + "⌥⇧6": "ť", + "⌥m": "τ" + }, + "u": { + "none": "u", + "⌥6": "û", + "⌥`": "ù", + "⌥⇧`": "ũ", + "⌥⇧'": "ü", + "⌥\\": "↖", + "⌥⇧7": "ū", + "⌥'": "ú", + "⌥⇧6": "ǔ", + "⌥7": "ů", + "⌥m": "ω", + "⌥⇧m": "∪" + }, + "v": { + "none": "v", + "⌥m": "β" + }, + "w": { + "none": "w", + "⌥6": "ŵ", + "⌥⇧'": "ẅ", + "⌥'": "ẃ", + "⌥7": "ẘ", + "⌥m": "ψ" + }, + "x": { + "none": "x", + "⌥⇧'": "ẍ", + "⌥m": "ξ" + }, + "y": { + "none": "y", + "⌥6": "ŷ", + "⌥⇧`": "ỹ", + "⌥⇧'": "ÿ", + "⌥⇧7": "ȳ", + "⌥'": "ý", + "⌥7": "ẙ", + "⌥m": "υ" + }, + "z": { + "none": "z", + "⌥'": "ź", + "⌥⇧6": "ž", + "⌥7": "ż", + "⌥m": "ζ", + "⌥⇧m": "↯" + }, + "{": { + "none": "{", + "⌥m": "₍" + }, + "|": { + "none": "|", + "⌥⇧m": "∨" + }, + "}": { + "none": "}", + "⌥m": "₎" + }, + "~": { + "none": "~", + "⌥⇧m": "≈" + }, + "~ option": { + "next": "⌥⇧`" + }, + "¨": { + "next": "⌥⇧'" + }, + "¬": { + "next": "⌥\\" + }, + "¯": { + "next": "⌥⇧7" + }, + "´": { + "next": "⌥'" + }, + "Ä": { + "none": "Ä", + "⌥`": "Ą" + }, + "Æ": { + "none": "Æ", + "⌥⇧7": "Ǣ", + "⌥'": "Ǽ" + }, + "Ë": { + "none": "Ë", + "⌥`": "Ę" + }, + "Ï": { + "none": "Ï", + "⌥`": "Į" + }, + "Ö": { + "none": "Ö", + "⌥`": "Ǫ" + }, + "Ø": { + "none": "Ø", + "⌥'": "Ǿ" + }, + "Ü": { + "none": "Ü", + "⌥`": "Ų", + "⌥⇧6": "Ǚ" + }, + "ä": { + "none": "ä", + "⌥`": "ą" + }, + "æ": { + "none": "æ", + "⌥⇧7": "ǣ", + "⌥'": "ǽ" + }, + "ë": { + "none": "ë", + "⌥`": "ę" + }, + "ï": { + "none": "ï", + "⌥`": "į" + }, + "ö": { + "none": "ö", + "⌥`": "ǫ" + }, + "ø": { + "none": "ø", + "⌥'": "ǿ" + }, + "ü": { + "none": "ü", + "⌥`": "ų", + "⌥⇧6": "ǚ" + }, + "ˇ": { + "next": "⌥⇧6" + }, + "˚": { + "next": "⌥7" + }, + "Ω": { + "next": "⌥m" + }, + "√": { + "next": "⌥⇧m" + } + }, + "terminators": { + "⌥6": "^", + "⌥`": "`", + "⌥⇧`": "~", + "⌥⇧'": "¨", + "⌥\\": "¬", + "⌥⇧7": "¯", + "⌥'": "´", + "⌥⇧6": "ˇ", + "⌥7": "˚", + "⌥m": "Ω", + "⌥⇧m": " " + }, + "keyMaps": { + "0": { + "label": "Base", + "keys": { + "0": { + "code": 0, + "keyName": "A", + "action": "a", + "output": "a" + }, + "1": { + "code": 1, + "keyName": "S", + "action": "s", + "output": "s" + }, + "2": { + "code": 2, + "keyName": "D", + "action": "d", + "output": "d" + }, + "3": { + "code": 3, + "keyName": "F", + "action": "f", + "output": "f" + }, + "4": { + "code": 4, + "keyName": "H", + "action": "h", + "output": "h" + }, + "5": { + "code": 5, + "keyName": "G", + "action": "g", + "output": "g" + }, + "6": { + "code": 6, + "keyName": "Z", + "action": "z", + "output": "z" + }, + "7": { + "code": 7, + "keyName": "X", + "action": "x", + "output": "x" + }, + "8": { + "code": 8, + "keyName": "C", + "action": "c", + "output": "c" + }, + "9": { + "code": 9, + "keyName": "V", + "action": "v", + "output": "v" + }, + "10": { + "code": 10, + "keyName": "§/`", + "output": "§" + }, + "11": { + "code": 11, + "keyName": "B", + "action": "b", + "output": "b" + }, + "12": { + "code": 12, + "keyName": "Q", + "action": "q", + "output": "q" + }, + "13": { + "code": 13, + "keyName": "W", + "action": "w", + "output": "w" + }, + "14": { + "code": 14, + "keyName": "E", + "action": "e", + "output": "e" + }, + "15": { + "code": 15, + "keyName": "R", + "action": "r", + "output": "r" + }, + "16": { + "code": 16, + "keyName": "Y", + "action": "y", + "output": "y" + }, + "17": { + "code": 17, + "keyName": "T", + "action": "t", + "output": "t" + }, + "18": { + "code": 18, + "keyName": "1", + "action": "1", + "output": "1" + }, + "21": { + "code": 21, + "keyName": "4", + "action": "4", + "output": "4" + }, + "22": { + "code": 22, + "keyName": "6", + "action": "6", + "output": "6" + }, + "23": { + "code": 23, + "keyName": "5", + "action": "5", + "output": "5" + }, + "30": { + "code": 30, + "keyName": "]", + "output": "[" + } + } + }, + "1": { + "label": "Shift", + "keys": { + "0": { + "code": 0, + "keyName": "A", + "action": "A", + "output": "A" + }, + "1": { + "code": 1, + "keyName": "S", + "action": "S", + "output": "S" + }, + "2": { + "code": 2, + "keyName": "D", + "action": "D", + "output": "D" + }, + "3": { + "code": 3, + "keyName": "F", + "action": "F", + "output": "F" + }, + "4": { + "code": 4, + "keyName": "H", + "action": "H", + "output": "H" + }, + "5": { + "code": 5, + "keyName": "G", + "action": "G", + "output": "G" + }, + "6": { + "code": 6, + "keyName": "Z", + "action": "Z", + "output": "Z" + }, + "7": { + "code": 7, + "keyName": "X", + "action": "X", + "output": "X" + }, + "8": { + "code": 8, + "keyName": "C", + "action": "C", + "output": "C" + }, + "9": { + "code": 9, + "keyName": "V", + "action": "V", + "output": "V" + }, + "10": { + "code": 10, + "keyName": "§/`", + "output": "±" + }, + "11": { + "code": 11, + "keyName": "B", + "action": "B", + "output": "B" + }, + "12": { + "code": 12, + "keyName": "Q", + "action": "Q", + "output": "Q" + }, + "13": { + "code": 13, + "keyName": "W", + "action": "W", + "output": "W" + }, + "14": { + "code": 14, + "keyName": "E", + "action": "E", + "output": "E" + }, + "15": { + "code": 15, + "keyName": "R", + "action": "R", + "output": "R" + }, + "16": { + "code": 16, + "keyName": "Y", + "action": "Y", + "output": "Y" + }, + "17": { + "code": 17, + "keyName": "T", + "action": "T", + "output": "T" + }, + "18": { + "code": 18, + "keyName": "1", + "action": "!", + "output": "!" + }, + "21": { + "code": 21, + "keyName": "4", + "action": "$", + "output": "$" + }, + "22": { + "code": 22, + "keyName": "6", + "output": "&" + }, + "23": { + "code": 23, + "keyName": "5", + "action": "%", + "output": "%" + }, + "30": { + "code": 30, + "keyName": "]", + "output": "{" + } + } + }, + "2": { + "label": "Caps", + "keys": { + "0": { + "code": 0, + "keyName": "A", + "action": "A", + "output": "A" + }, + "1": { + "code": 1, + "keyName": "S", + "action": "S", + "output": "S" + }, + "2": { + "code": 2, + "keyName": "D", + "action": "D", + "output": "D" + }, + "3": { + "code": 3, + "keyName": "F", + "action": "F", + "output": "F" + }, + "4": { + "code": 4, + "keyName": "H", + "action": "H", + "output": "H" + }, + "5": { + "code": 5, + "keyName": "G", + "action": "G", + "output": "G" + }, + "6": { + "code": 6, + "keyName": "Z", + "action": "Z", + "output": "Z" + }, + "7": { + "code": 7, + "keyName": "X", + "action": "X", + "output": "X" + }, + "8": { + "code": 8, + "keyName": "C", + "action": "C", + "output": "C" + }, + "9": { + "code": 9, + "keyName": "V", + "action": "V", + "output": "V" + }, + "10": { + "code": 10, + "keyName": "§/`", + "output": "ẞ" + }, + "11": { + "code": 11, + "keyName": "B", + "action": "B", + "output": "B" + }, + "12": { + "code": 12, + "keyName": "Q", + "action": "Q", + "output": "Q" + }, + "13": { + "code": 13, + "keyName": "W", + "action": "W", + "output": "W" + }, + "14": { + "code": 14, + "keyName": "E", + "action": "E", + "output": "E" + }, + "15": { + "code": 15, + "keyName": "R", + "action": "R", + "output": "R" + }, + "16": { + "code": 16, + "keyName": "Y", + "action": "Y", + "output": "Y" + }, + "17": { + "code": 17, + "keyName": "T", + "action": "T", + "output": "T" + }, + "18": { + "code": 18, + "keyName": "1", + "action": "1", + "output": "1" + }, + "21": { + "code": 21, + "keyName": "4", + "action": "4", + "output": "4" + }, + "22": { + "code": 22, + "keyName": "6", + "action": "6", + "output": "6" + }, + "23": { + "code": 23, + "keyName": "5", + "action": "5", + "output": "5" + }, + "30": { + "code": 30, + "keyName": "]", + "output": "[" + } + } + }, + "3": { + "label": "Option", + "keys": { + "0": { + "code": 0, + "keyName": "A", + "action": "ä", + "output": "ä" + }, + "1": { + "code": 1, + "keyName": "S", + "output": "ß" + }, + "2": { + "code": 2, + "keyName": "D", + "output": "đ" + }, + "3": { + "code": 3, + "keyName": "F", + "output": "è" + }, + "4": { + "code": 4, + "keyName": "H", + "output": "ù" + }, + "5": { + "code": 5, + "keyName": "G", + "output": "é" + }, + "6": { + "code": 6, + "keyName": "Z", + "output": "à" + }, + "7": { + "code": 7, + "keyName": "X", + "output": "á" + }, + "8": { + "code": 8, + "keyName": "C", + "output": "ç" + }, + "9": { + "code": 9, + "keyName": "V", + "output": "ì" + }, + "10": { + "code": 10, + "keyName": "§/`", + "output": "" + }, + "11": { + "code": 11, + "keyName": "B", + "output": "í" + }, + "12": { + "code": 12, + "keyName": "Q", + "action": "æ", + "output": "æ" + }, + "13": { + "code": 13, + "keyName": "W", + "output": "å" + }, + "14": { + "code": 14, + "keyName": "E", + "action": "ë", + "output": "ë" + }, + "15": { + "code": 15, + "keyName": "R", + "output": "ý" + }, + "16": { + "code": 16, + "keyName": "Y", + "output": "ÿ" + }, + "17": { + "code": 17, + "keyName": "T", + "output": "þ" + }, + "18": { + "code": 18, + "keyName": "1", + "output": "¡" + }, + "21": { + "code": 21, + "keyName": "4", + "output": "£" + }, + "22": { + "code": 22, + "keyName": "6", + "action": "6 option", + "deadKey": "⌥6" + }, + "23": { + "code": 23, + "keyName": "5", + "output": "€" + }, + "30": { + "code": 30, + "keyName": "]", + "output": "»" + } + } + }, + "4": { + "label": "Shift+Option", + "keys": { + "0": { + "code": 0, + "keyName": "A", + "action": "Ä", + "output": "Ä" + }, + "1": { + "code": 1, + "keyName": "S", + "output": "ẞ" + }, + "2": { + "code": 2, + "keyName": "D", + "output": "Đ" + }, + "3": { + "code": 3, + "keyName": "F", + "output": "È" + }, + "4": { + "code": 4, + "keyName": "H", + "output": "Ù" + }, + "5": { + "code": 5, + "keyName": "G", + "output": "É" + }, + "6": { + "code": 6, + "keyName": "Z", + "output": "À" + }, + "7": { + "code": 7, + "keyName": "X", + "output": "Á" + }, + "8": { + "code": 8, + "keyName": "C", + "output": "Ç" + }, + "9": { + "code": 9, + "keyName": "V", + "output": "Ì" + }, + "10": { + "code": 10, + "keyName": "§/`", + "output": "±" + }, + "11": { + "code": 11, + "keyName": "B", + "output": "Í" + }, + "12": { + "code": 12, + "keyName": "Q", + "action": "Æ", + "output": "Æ" + }, + "13": { + "code": 13, + "keyName": "W", + "output": "Å" + }, + "14": { + "code": 14, + "keyName": "E", + "action": "Ë", + "output": "Ë" + }, + "15": { + "code": 15, + "keyName": "R", + "output": "Ý" + }, + "16": { + "code": 16, + "keyName": "Y", + "output": "Ÿ" + }, + "17": { + "code": 17, + "keyName": "T", + "output": "Þ" + }, + "18": { + "code": 18, + "keyName": "1", + "output": "¹" + }, + "21": { + "code": 21, + "keyName": "4", + "output": "¥" + }, + "22": { + "code": 22, + "keyName": "6", + "action": "ˇ", + "deadKey": "⌥⇧6" + }, + "23": { + "code": 23, + "keyName": "5", + "output": "¢" + }, + "30": { + "code": 30, + "keyName": "]", + "output": "›" + } + } + }, + "5": { + "label": "Caps+Option", + "keys": { + "0": { + "code": 0, + "keyName": "A", + "output": "Ä" + }, + "1": { + "code": 1, + "keyName": "S", + "output": "ß" + }, + "2": { + "code": 2, + "keyName": "D", + "output": "Ð" + }, + "3": { + "code": 3, + "keyName": "F", + "output": "È" + }, + "4": { + "code": 4, + "keyName": "H", + "output": "Ù" + }, + "5": { + "code": 5, + "keyName": "G", + "output": "É" + }, + "6": { + "code": 6, + "keyName": "Z", + "output": "À" + }, + "7": { + "code": 7, + "keyName": "X", + "output": "Á" + }, + "8": { + "code": 8, + "keyName": "C", + "output": "Ç" + }, + "9": { + "code": 9, + "keyName": "V", + "output": "Ì" + }, + "10": { + "code": 10, + "keyName": "§/`", + "output": "ẞ" + }, + "11": { + "code": 11, + "keyName": "B", + "output": "Í" + }, + "12": { + "code": 12, + "keyName": "Q", + "action": "Æ", + "output": "Æ" + }, + "13": { + "code": 13, + "keyName": "W", + "output": "Å" + }, + "14": { + "code": 14, + "keyName": "E", + "output": "Ë" + }, + "15": { + "code": 15, + "keyName": "R", + "output": "Ý" + }, + "16": { + "code": 16, + "keyName": "Y", + "output": "Ÿ" + }, + "17": { + "code": 17, + "keyName": "T", + "output": "Þ" + }, + "18": { + "code": 18, + "keyName": "1", + "output": "¡" + }, + "21": { + "code": 21, + "keyName": "4", + "output": "£" + }, + "22": { + "code": 22, + "keyName": "6", + "action": "^", + "output": "^" + }, + "23": { + "code": 23, + "keyName": "5", + "output": "€" + }, + "30": { + "code": 30, + "keyName": "]", + "output": "»" + } + } + }, + "6": { + "label": "Command+Option", + "keys": { + "0": { + "code": 0, + "keyName": "A", + "output": "å" + }, + "1": { + "code": 1, + "keyName": "S", + "output": "ß" + }, + "2": { + "code": 2, + "keyName": "D", + "output": "∂" + }, + "3": { + "code": 3, + "keyName": "F", + "output": "ƒ" + }, + "4": { + "code": 4, + "keyName": "H", + "output": "˙" + }, + "5": { + "code": 5, + "keyName": "G", + "output": "©" + }, + "6": { + "code": 6, + "keyName": "Z", + "output": "Ω" + }, + "7": { + "code": 7, + "keyName": "X", + "output": "≈" + }, + "8": { + "code": 8, + "keyName": "C", + "output": "ç" + }, + "9": { + "code": 9, + "keyName": "V", + "output": "√" + }, + "10": { + "code": 10, + "keyName": "§/`", + "output": "ẞ" + }, + "11": { + "code": 11, + "keyName": "B", + "output": "∫" + }, + "12": { + "code": 12, + "keyName": "Q", + "output": "œ" + }, + "13": { + "code": 13, + "keyName": "W", + "output": "∑" + }, + "14": { + "code": 14, + "keyName": "E", + "output": "´" + }, + "15": { + "code": 15, + "keyName": "R", + "output": "®" + }, + "16": { + "code": 16, + "keyName": "Y", + "output": "¥" + }, + "17": { + "code": 17, + "keyName": "T", + "output": "†" + }, + "18": { + "code": 18, + "keyName": "1", + "output": "¡" + }, + "21": { + "code": 21, + "keyName": "4", + "output": "¢" + }, + "22": { + "code": 22, + "keyName": "6", + "output": "ẞ" + }, + "23": { + "code": 23, + "keyName": "5", + "output": "∞" + }, + "30": { + "code": 30, + "keyName": "]", + "output": "‘" + } + } + }, + "7": { + "label": "Control", + "keys": { + "0": { + "code": 0, + "keyName": "A", + "output": "\u0001" + }, + "1": { + "code": 1, + "keyName": "S", + "output": "\u0013" + }, + "2": { + "code": 2, + "keyName": "D", + "output": "\u0004" + }, + "3": { + "code": 3, + "keyName": "F", + "output": "\u0006" + }, + "4": { + "code": 4, + "keyName": "H", + "output": "\b" + }, + "5": { + "code": 5, + "keyName": "G", + "output": "\u0007" + }, + "6": { + "code": 6, + "keyName": "Z", + "output": "\u001a" + }, + "7": { + "code": 7, + "keyName": "X", + "output": "\u0018" + }, + "8": { + "code": 8, + "keyName": "C", + "output": "\u0003" + }, + "9": { + "code": 9, + "keyName": "V", + "output": "\u0016" + }, + "10": { + "code": 10, + "keyName": "§/`", + "output": "0" + }, + "11": { + "code": 11, + "keyName": "B", + "output": "\u0002" + }, + "12": { + "code": 12, + "keyName": "Q", + "output": "\u0011" + }, + "13": { + "code": 13, + "keyName": "W", + "output": "\u0017" + }, + "14": { + "code": 14, + "keyName": "E", + "output": "\u0005" + }, + "15": { + "code": 15, + "keyName": "R", + "output": "\u0012" + }, + "16": { + "code": 16, + "keyName": "Y", + "output": "\u0019" + }, + "17": { + "code": 17, + "keyName": "T", + "output": "\u0014" + }, + "18": { + "code": 18, + "keyName": "1", + "output": "1" + }, + "21": { + "code": 21, + "keyName": "4", + "output": "4" + }, + "22": { + "code": 22, + "keyName": "6", + "output": "6" + }, + "23": { + "code": 23, + "keyName": "5", + "output": "5" + }, + "30": { + "code": 30, + "keyName": "]", + "output": "\u001d" + } + } + } + }, + "deadKeys": { + "⌥6": { + "terminator": "^", + "compositions": { + "A": "Â", + "C": "Ĉ", + "E": "Ê", + "G": "Ĝ", + "H": "Ĥ", + "I": "Î", + "J": "Ĵ", + "O": "Ô", + "S": "Ŝ", + "U": "Û", + "W": "Ŵ", + "Y": "Ŷ", + "a": "â", + "c": "ĉ", + "e": "ê", + "g": "ĝ", + "h": "ĥ", + "i": "î", + "j": "ĵ", + "o": "ô", + "s": "ŝ", + "space": "^", + "u": "û", + "w": "ŵ", + "y": "ŷ" + } + }, + "⌥`": { + "terminator": "`", + "compositions": { + "A": "À", + "E": "È", + "I": "Ì", + "O": "Ò", + "U": "Ù", + "a": "à", + "e": "è", + "i": "ì", + "o": "ò", + "space": "`", + "u": "ù", + "Ä": "Ą", + "Ë": "Ę", + "Ï": "Į", + "Ö": "Ǫ", + "Ü": "Ų", + "ä": "ą", + "ë": "ę", + "ï": "į", + "ö": "ǫ", + "ü": "ų" + } + }, + "⌥⇧`": { + "terminator": "~", + "compositions": { + "A": "Ã", + "I": "Ĩ", + "N": "Ñ", + "O": "Õ", + "U": "Ũ", + "Y": "Ỹ", + "a": "ã", + "i": "ĩ", + "n": "ñ", + "o": "õ", + "space": "~", + "u": "ũ", + "y": "ỹ" + } + }, + "⌥⇧'": { + "terminator": "¨", + "compositions": { + "A": "Ä", + "E": "Ë", + "H": "Ḧ", + "I": "Ï", + "O": "Ö", + "U": "Ü", + "W": "Ẅ", + "X": "Ẍ", + "Y": "Ÿ", + "a": "ä", + "e": "ë", + "h": "ḧ", + "i": "ï", + "o": "ö", + "space": "¨", + "t": "ẗ", + "u": "ü", + "w": "ẅ", + "x": "ẍ", + "y": "ÿ" + } + }, + "⌥\\": { + "terminator": "¬", + "compositions": { + "__CTRL_U001E__": "↑", + "+": "⇔", + "1": "№", + "2": "½", + "3": "⅓", + "4": "¼", + "5": "⅔", + "6": "¾", + "=": "↔", + "H": "⇐", + "I": "⇗", + "J": "⇓", + "K": "⇑", + "L": "⇒", + "M": "⇘", + "N": "⇙", + "T": "℠", + "U": "⇖", + "c": "©", + "h": "←", + "i": "↗", + "j": "↓", + "k 1": "↑", + "l 1": "→", + "m": "↘", + "n": "↙", + "p": "℗", + "r": "®", + "s": "§", + "space": "¬", + "t": "™", + "u": "↖" + } + }, + "⌥⇧7": { + "terminator": "¯", + "compositions": { + "1": "‐", + "2": "–", + "3": "—", + "5": "¯", + "A": "Ā", + "B": "Ƀ", + "D": "Đ", + "E": "Ē", + "G": "Ḡ", + "H": "Ħ", + "I": "Ī", + "L": "Ḻ", + "O": "Ō", + "T": "Ŧ", + "U": "Ū", + "Y": "Ȳ", + "a": "ā", + "b": "ƀ", + "d": "đ", + "e": "ē", + "g": "ḡ", + "h": "ħ", + "i": "ī", + "l 1": "ḻ", + "o": "ō", + "space": "¯", + "t": "ŧ", + "u": "ū", + "y": "ȳ", + "Æ": "Ǣ", + "æ": "ǣ" + } + }, + "⌥'": { + "terminator": "´", + "compositions": { + "5": "´", + "A": "Á", + "B": "Ɓ", + "C": "Ć", + "E": "É", + "G": "Ǵ", + "I": "Í", + "K": "Ḱ", + "L": "Ł", + "M": "Ḿ", + "N": "Ń", + "O": "Ó", + "P": "Ṕ", + "R": "Ŕ", + "S": "Ś", + "U": "Ú", + "W": "Ẃ", + "Y": "Ý", + "Z": "Ź", + "a": "á", + "b": "ɓ", + "c": "ć", + "e": "é", + "g": "ǵ", + "i": "í", + "k 1": "ḱ", + "l 1": "ł", + "m": "ḿ", + "n": "ń", + "o": "ó", + "p": "ṕ", + "r": "ŕ", + "s": "ś", + "space": "´", + "u": "ú", + "w": "ẃ", + "y": "ý", + "z": "ź", + "Æ": "Ǽ", + "Ø": "Ǿ", + "æ": "ǽ", + "ø": "ǿ" + } + }, + "⌥⇧6": { + "terminator": "ˇ", + "compositions": { + "#": "Ǯ", + "3": "ǯ", + "5": "ˇ", + "A": "Ǎ", + "C": "Č", + "D": "Ď", + "E": "Ě", + "G": "Ǧ", + "H": "Ȟ", + "I": "Ǐ", + "K": "Ǩ", + "L": "Ľ", + "N": "Ň", + "O": "Ǒ", + "R": "Ř", + "S": "Š", + "T": "Ť", + "U": "Ǔ", + "Z": "Ž", + "a": "ǎ", + "c": "č", + "d": "ď", + "e": "ě", + "g": "ǧ", + "h": "ȟ", + "i": "ǐ", + "j": "ǰ", + "k 1": "ǩ", + "l 1": "ľ", + "n": "ň", + "o": "ǒ", + "r": "ř", + "s": "š", + "space": "ˇ", + "t": "ť", + "u": "ǔ", + "z": "ž", + "Ü": "Ǚ", + "ü": "ǚ" + } + }, + "⌥7": { + "terminator": "˚", + "compositions": { + "5": "˚", + "A": "Å", + "C": "Ċ", + "E": "Ė", + "G": "Ġ", + "I": "İ", + "U": "Ů", + "Z": "Ż", + "a": "å", + "c": "ċ", + "e": "ė", + "g": "ġ", + "space": "˚", + "u": "ů", + "w": "ẘ", + "y": "ẙ", + "z": "ż" + } + }, + "⌥m": { + "terminator": "Ω", + "compositions": { + "!": "¹", + "\"": "₊", + "#": "³", + "$": "⁴", + "%": "⁵", + "&": "⁷", + "'": "₌", + "(": "⁹", + ")": "⁰", + "*": "⁸", + "+": "⁺", + "-": "⁻", + "0": "₀", + "1": "₁", + "2": "₂", + "3": "₃", + "4": "₄", + "5": "₅", + "6": "₆", + "7": "₇", + "8": "₈", + "9": "₉", + ";": "₋", + "=": "⁼", + "@": "²", + "A": "Α", + "B": "Β", + "C": "Χ", + "D": "Δ", + "E": "Ε", + "F": "Φ", + "G": "Γ", + "H": "Θ", + "I": "Η", + "J": "Ι", + "K": "Κ", + "L": "Λ", + "M": "Μ", + "N": "Ν", + "O": "Ο", + "P": "Π", + "Q": "Ω", + "R": "Ρ", + "S": "Σ", + "T": "Τ", + "U": "Ω", + "V": "Β", + "W": "Ψ", + "X": "Ξ", + "Y": "Υ", + "Z": "Ζ", + "[": "⁽", + "]": "⁾", + "^": "⁶", + "a": "α", + "b": "β", + "c": "χ", + "d": "δ", + "e": "ε", + "f": "φ", + "g": "γ", + "h": "θ", + "i": "η", + "j": "ι", + "k 1": "κ", + "l 1": "λ", + "m": "μ", + "n": "ν", + "o": "ο", + "p": "π", + "q": "ω", + "r": "ρ", + "s": "σ", + "t": "τ", + "u": "ω", + "v": "β", + "w": "ψ", + "x": "ξ", + "y": "υ", + "z": "ζ", + "{": "₍", + "}": "₎" + } + }, + "⌥⇧m": { + "terminator": " ", + "compositions": { + "!": "≠", + "\"": "″", + "%": "‰", + "&": "∧", + "'": "′", + "*": "⊗", + "+": "⊕", + "-": "±", + ".": "⋅", + "3": "∛", + "4": "∜", + "7": "∡", + "8": "∠", + "9": "∟", + ":": "∴", + ";": "∵", + "<": "≤", + "=": "≝", + ">": "≥", + "A": "∀", + "B": "⊇", + "C": "ℂ", + "D": "∇", + "E": "∃", + "F": "∎", + "G": "⊃", + "H": "⊅", + "K": "∌", + "L": "∦", + "M": "∉", + "N": "ℕ", + "O": "∅", + "P": "ℙ", + "Q": "ℚ", + "R": "ℝ", + "S": "∫", + "U": "∖", + "X": "∄", + "Z": "ℤ", + "^": "℘", + "b": "⊆", + "c": "∝", + "d": "Δ", + "f": "ƒ", + "g": "⊂", + "h": "⊄", + "i": "∞", + "k 1": "∋", + "l 1": "∥", + "m": "∈", + "n": "ⁿ", + "o": "∘", + "p": "∂", + "r": "√", + "s": "∩", + "space": "√", + "u": "∪", + "z": "↯", + "|": "∨", + "~": "≈" + } + } + } +} \ No newline at end of file