From 824cd6a9f820e08b5eefd1127e46a25ac0825fb4 Mon Sep 17 00:00:00 2001 From: John Mager Date: Sat, 20 Jun 2020 19:36:55 -0400 Subject: [PATCH] Added support for longer ligatures - Breaking out the ligature substitution rules like this also allows for easy logical extensions, to handle edge cases as FiraCode does. --- Scripts/features.py | 65 ++++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 30 deletions(-) diff --git a/Scripts/features.py b/Scripts/features.py index c0180ed..307004b 100644 --- a/Scripts/features.py +++ b/Scripts/features.py @@ -44,36 +44,41 @@ def rule(liga): [LIG f i] LIG [ f f i] LIG } """ - if len(liga) == 2: - return dedent('''\ - lookup {0}_{1} {{ - ignore sub {0} {0}' {1}; - ignore sub {0}' {1} {1}; - sub {0}' {1} by LIG; - sub LIG {1}' by {0}_{1}.liga; - }} {0}_{1}; - ''').format(*liga) - elif len(liga) == 3: - return dedent('''\ - lookup {0}_{1}_{2} {{ - ignore sub {0} {0}' {1} {2}; - ignore sub {0}' {1} {2} {2}; - sub {0}' {1} {2} by LIG; - sub LIG {1}' {2} by LIG; - sub LIG LIG {2}' by {0}_{1}_{2}.liga; - }} {0}_{1}_{2}; - ''').format(*liga) - elif len(liga) == 4: - return dedent('''\ - lookup {0}_{1}_{2}_{3} {{ - ignore sub {0} {0}' {1} {2} {3}; - ignore sub {0}' {1} {2} {3} {3}; - sub {0}' {1} {2} {3} by LIG; - sub LIG {1}' {2} {3} by LIG; - sub LIG LIG {2}' {3} by LIG; - sub LIG LIG LIG {3}' by {0}_{1}_{2}_{3}.liga; - }} {0}_{1}_{2}_{3}; - ''').format(*liga) + # ignores: + # ignore sub {0} {0}' {1}; + # ignore sub {0}' {1} {1}; + rules = [ + ignore(prefix=liga[:1], head=liga[0], suffix=liga[1:]), + ignore(head=liga[0], suffix=(liga[1:] + [liga[-1]])), + ] + + name = "_".join(liga) + # substitution logic + # sub {0}' {1} by LIG; + # sub LIG {1}' by {0}_{1}.liga; + for i in range(len(liga)): + init = _join(["LIG" for lig in liga[:i]]) + tail = _join(liga[i + 1 :]) + replace = "LIG" if (i + 1 < len(liga)) else (name + ".liga") + rules.append("sub{0} {1}'{2} by {3};".format(init, liga[i], tail, replace)) + + # put it all together + lines = ( + ["lookup " + name + " {"] + [" " + r for r in rules] + ["}} {0};".format(name)] + ) + return "\n".join(lines) + + +def _join(items): + return (" " + " ".join(items)) if items else "" + + +def ignore(prefix=None, head=None, suffix=None): + """ don't substitute `head` if it's surrounded by `prefix` and `suffix` """ + assert head + pref = _join(prefix) + rest = _join(suffix) + return "ignore sub{0} {1}'{2};".format(pref, head, rest) def indent(text, prefix):