pinchord-v25.0.3.py

Pinchord · pinchord.git · Tickets · Changelog

Branches > serial-mods > 0f00bc9 > files / plover_pinchord / dictionaries / pinchord-v25.0.3.py

## Pinchord Plover python dictionary
import re

## Longest valid outline, Pinchord only needs one stroke outlines :)
LONGEST_KEY = 1

BANKS = ["prefixes", "initials", "vowels", "finals", "suffixes"]

## Specified by 'chords.edn' (https://grahp.dev/pinchord.git/chords.edn)
## Unlike Shrimple, Pinchord enumerates all bank chords!
DICT = {
    "prefixes": {
        "+": "{^}",
        "#": "{-|}",
        "#+": "{^}{-|}",
        "#+": "{^}{-|}",
        "_": "{^}_",
        "_+": "{^}-",
        "#_": "{^}_{-|}",
        "#_+": "{^}-{-|}",
        "": "{}",
    },

    "initials": {
        "T": "t",
        "TSP&": "sk",
        "TP": "f",
        "TP&": "ph",
        "TSWR": "kr",
        "THR": "thr",
        "TPR": "fr",
        "PWR": "br",
        "SH&": "sch",
        "TSPR": "scr",
        "TSPR&": "skr",
        "TSWH": "kn",
        "TWH": "thw",
        "PWHR": "bl",
        "SPWHR": "cl",
        "TS": "st",
        "SPR": "spr",
        "SHR&": "shr",
        "HR": "l",
        "WH": "wh",
        "TW": "tw",
        "S": "s",
        "SR": "v",
        "SR&": "vr",
        "TPWR": "dr",
        "TPWH": "x",
        "H": "h",
        "PR": "pr",
        "TSPWR": "gr",
        "SHR": "sl",
        "SW": "sw",
        "SW&": "sv",
        "SWR": "y",
        "TSPWH": "gh",
        "R": "r",
        "SWHR": "squ",
        "TSR": "str",
        "TWHR": "j",
        "SH": "sh",
        "PH": "m",
        "TSP": "sc",
        "TR": "tr",
        "P": "p",
        "WHR": "qu",
        "WHR&": "q",
        "TPHR": "fl",
        "TPHR&": "phl",
        "TPR&": "phr",
        "TH": "th",
        "WR": "wr",
        "SPWR": "cr",
        "SPH": "sm",
        "TSW": "k",
        "SPHR": "spl",
        "TSPWHR": "gl",
        "TSWHR": "kl",
        "SPW": "c",
        "SWH": "z",
        "PHR": "pl",
        "SPWH": "ch",
        "TSPW": "g",
        "W": "w",
        "SP": "sp",
        "TSPH": "sn",
        "TPH": "n",
        "TPW": "d",
        "PW": "b",
    },

   "vowels": {
       "OU": "ou",
       "AU": "au",
       "AOI": "ei",
       "AO": "oa",
       "AO^": "ao",
       "AU^": "ua",
       "AI^": "ia",
       "IU^": "ee",
       "IU": "e",
       "AIU": "ea",
       "OI^": "io",
       "AIU^": "ae",
       "AOU": "ui",
       "AOI^": "ie",
       "U": "u",
       "O": "o",
       "O^": "oo",
       "A": "a",
       "A^": "aa",
       "I": "i",
       "I^": "eu",
       "^": "y",
       "OIU": "oe",
       "AOU^": "iu",
       "OI": "oi",
       "OIU^": "eo",
       "U^": "ue",
       "AI": "ai",
       "-": "{^}",
    },

    "finals": {
        "FS": "v",
        "FS*": "vv",
        "LFS": "lv",
        "LRFS": "nv",
        "RFS": "rv",
        "KFS": "sh",
        "LKFS": "lsh",
        "LRKFS": "nsh",
        "RKFS": "rsh",
        "PST": "w",
        "L": "l",
        "LR": "rl",
        "LR*": "rly",
        "R": "r",
        "P": "p",
        "LP": "lp",
        "LP*": "pl",
        "LRP": "mp",
        "RP": "rp",
        "PK": "b",
        "LPK": "lb",
        "LRPK": "mb",
        "RPK": "rb",
        "PF": "n",
        "LPF": "ln",
        "LRPF": "nn",
        "RPF": "rn",
        "PKFS": "g",
        "LPKFS": "lg",
        "LPKFS*": "gl",
        "LRPKFS": "ng",
        "LRPKFS*": "gn",
        "RPKFS": "rg",
        "RPKFS*": "dg",
        "KFS*": "gh",
        "KFST*": "ght",
        "F": "f",
        "F*": "ff",
        "LF": "lf",
        "LRF": "nf",
        "LRF*": "fn",
        "RF": "rf",
        "PFT": "y",
        "PFT*": "yy",
        "LPFT": "ly",
        "RPFT*": "nly",
        "LRPFT*": "nny",
        "LPFT*": "lly",
        "RPFT": "ry",
        "LRPFT": "ny",

        "PKST": "ct",
        "LPKST": "lct",
        "LRPKST": "nct",
        "RPKST": "rct",

        "PKF": "d",
        "LPKF": "ld",
        "LRPKF": "nd",
        "RPKF": "rd",

        "PKF*": "dd",
        "LPKF*": "ndl",
        "LRPKF*": "ddl",
        "RPKF*": "rld",

        "KS": "x",
        "RKS": "rx",
        "LKS": "lx",
        "LRKS": "nx",
        "KST": "xt",
        "RKST": "rxt",
        "LKST": "lxt",
        "LRKST": "nxt",
        "KF": "ch",
        "LKF": "lch",
        "LRKF": "nch",
        "RKF": "rch",
        "K": "k",
        "K*": "ck",
        "LK*": "lck",
        "LRK*": "nck",
        "RK*": "rck",
        "LK": "lk",
        "LRK": "nk",
        "RK": "rk",
        "S": "s",
        "LS": "ls",
        "LRS": "ns",
        "RS": "rs",
        "PS": "m",
        "LPS": "lm",
        "LRPS": "mn",
        "RPS": "rm",
        "PFS": "z",
        "LPFS": "lz",
        "LRPFS": "nz",
        "RPFS": "rz",
        "T": "t",
        "LT": "lt",
        "LRT": "nt",
        "RT": "rt",
        "RT*": "rty",
        "ST": "st",
        "ST*": "ts",
        "LST": "lst",
        "LRST": "nst",
        "RST": "rst",
        "PT": "pt",
        "LPT": "lpt",
        "LRPT": "npt",
        "RPT": "rpt",

        "KT": "kt",
        "KT*": "h",
        "PKT*": "ph",
        "PKT": "hp",
        "LKT": "lkt",
        "LRKT": "nkt",
        "RKT": "rkt",
        "FT": "ft",
        "LFT": "lft",
        "LRFT": "nft",
        "RFT": "rft",
        "KFT": "tch",
        "LKFT": "ltch",
        "LRKFT": "ntch",
        "RKFT": "rtch",
        "PKFT": "ky",
        "LPKFT": "lky",
        "LRPKFT": "nky",
        "RPKFT": "rky",
        "PKFT*": "cky",
        "LPKFT*": "lcky",
        "LRPKFT*": "ncky",
        "RPKFT*": "rcky",
        "L*": "ll",
        "R*": "rr",
        "P*": "pp",
        "PF*": "w",
        "LPF*": "wl",
        "LRPF*": "wn",
        "RPF*": "rw",
        "LPK*": "bl",
        "LRPK*": "bbl",
        "PKFS*": "gg",
        "KS*": "sk",
        "RKS*": "rsk",
        "LKS*": "lsk",
        "LRKS*": "nsk",

        "PKS*": "sc",
        "LPKS*": "lsc",
        "LRPKS*": "nsc",
        "RPKS*": "rsc",

        "KST*": "j",
        "RKST*": "rj",
        "LKST*": "lj",
        "LRKST*": "nj",

        "PKS": "c",
        "LPKS": "lc",
        "LRPKS": "nc",
        "RPKS": "rc",
        "S*": "ss",
        "PS*": "sp",
        "PFS*": "zz",
        "T*": "tt",
        "LT*": "ttl",

        "FST": "th",
        "LFST": "lth",
        "LFST*": "lfth",
        "LRFST": "nth",
        "RFST": "rth",
        "RFST*": "rmth",

        "PKFST": "cy",
        "PKFST*": "sy",
        "LPKFST": "lcy",
        "LRPKFST": "ncy",
        "RPKFST": "rcy",
    },

    "suffixes": {
        "E": "e",
    },
}

BANK_SPLITTING_REGEX = r"(_?#?\+?)(T?S?P?W?H?R?&?)(A?O?I?U?\^?\-?)(L?R?P?K?F?S?T?\*?)(E?)"

EMTPY_TRANSLATION = ""

def banks(stroke):
    match = re.match(BANK_SPLITTING_REGEX, stroke)
    if match:
        prefix, initials, vowels, finals, suffixes = match.groups()
        return {"prefixes": prefix, "initials": initials, "vowels": vowels, "finals": finals, "suffixes": suffixes}
    else:
        return None

def build_translation(stroke_banks):
    translation = ""
    for bank in BANKS:
        keys = stroke_banks.get(bank) or ""
        translation += DICT[bank].get(keys, "")
    return translation

def lookup_stroke(stroke):
    stroke_banks = banks(stroke)
    if stroke_banks:
        return build_translation(stroke_banks)
    else:
        return EMTPY_TRANSLATION

def lookup(outline):
    if len(outline) > LONGEST_KEY:
        return EMTPY_TRANSLATION
    else:
        stroke = outline[0]
        return lookup_stroke(stroke)