Allows hardcoding sequences to ignore ligatures

- Certain operator combinations - especially those involving equals
 signs - look wrong when some of them form ligatures.

 - All current rules from FiraCode were ported over, but many are
 currently irrelevant for this font. Those are commented out of the
 file.

 - Fixes issue #118
pull/134/head
John Mager 2020-06-20 20:02:41 -04:00
parent 824cd6a9f8
commit bb0e4dc3af
1 changed files with 112 additions and 1 deletions

View File

@ -3,6 +3,7 @@
# Adapted from https://github.com/tonsky/FiraCode/blob/master/gen_calt.clj
from textwrap import dedent
from collections import defaultdict
import tempfile
@ -44,7 +45,7 @@ def rule(liga):
[LIG f i] LIG
[ f f i] LIG }
"""
# ignores:
# standard ignores:
# ignore sub {0} {0}' {1};
# ignore sub {0}' {1} {1};
rules = [
@ -52,6 +53,9 @@ def rule(liga):
ignore(head=liga[0], suffix=(liga[1:] + [liga[-1]])),
]
# hardcoded ignores, i.e. `<||>`
rules.extend(ignores[tuple(liga)])
name = "_".join(liga)
# substitution logic
# sub {0}' {1} by LIG;
@ -81,5 +85,112 @@ def ignore(prefix=None, head=None, suffix=None):
return "ignore sub{0} {1}'{2};".format(pref, head, rest)
ignores = defaultdict(
list,
{
("slash", "asterisk"): [
"ignore sub slash' asterisk slash;",
"ignore sub asterisk slash' asterisk;",
],
("asterisk", "slash"): [
"ignore sub slash asterisk' slash;",
"ignore sub asterisk' slash asterisk;",
],
# ("asterisk", "asterisk"): [
# "ignore sub slash asterisk' asterisk;",
# "ignore sub asterisk' asterisk slash;",
# ],
# ("asterisk", "asterisk", "asterisk"): [
# "ignore sub slash asterisk' asterisk asterisk;",
# "ignore sub asterisk' asterisk asterisk slash;",
# ],
# <||>
("less", "bar", "bar"): ["ignore sub less' bar bar greater;"],
("bar", "bar", "greater"): ["ignore sub less bar' bar greater;"],
# # :>=
# ("colon", "greater"): ["ignore sub colon' greater equal;"],
# # {|}
# ("braceleft", "bar"): ["ignore sub braceleft' bar braceright;"],
# ("bar", "braceright"): ["ignore sub braceleft bar' braceright;"],
# # [|]
# ("bracketleft", "bar"): ["ignore sub bracketleft' bar bracketright;"],
# ("bar", "bracketright"): ["ignore sub bracketleft bar' bracketright;"],
# # <*>>> <+>>> <$>>>
# ("greater", "greater", "greater"): [
# "ignore sub [asterisk plus dollar] greater' greater greater;"
# ],
# # <<<*> <<<+> <<<$>
# ("less", "less", "less"): ["ignore sub less' less less [asterisk plus dollar];"],
# # =:=
# ("colon", "equal"): ["ignore sub equal colon' equal;"],
# =!=
("exclam", "equal"): ["ignore sub equal exclam' equal;"],
# =!==
("exclam", "equal", "equal"): ["ignore sub equal exclam' equal equal;"],
# =<= <=< <=> <=| <=: <=! <=/
("less", "equal"): [
"ignore sub equal less' equal;",
"ignore sub less' equal [less greater bar colon exclam slash];",
],
# >=<
# =>= >=> >=< >=| >=: >=! >=/
("greater", "equal"): [
"ignore sub equal greater' equal;",
"ignore sub greater' equal [less greater bar colon exclam slash];",
],
# <*>> <+>> <$>>
# >>->> >>=>>
("greater", "greater"): [
# "ignore sub [asterisk plus dollar] greater' greater;",
# "ignore sub [hyphen equal] greater' greater;",
# "ignore sub greater' greater [hyphen equal];",
],
# <<*> <<+> <<$>
# <<-<< <<=<<
("less", "less"): [
# "ignore sub less' less [asterisk plus dollar];",
# "ignore sub [hyphen equal] less' less;",
# "ignore sub less' less [hyphen equal];",
],
# ||-|| ||=||
("bar", "bar"): [
"ignore sub [hyphen equal] bar' bar;",
"ignore sub bar' bar [hyphen equal];",
],
# # <--> >--< |--|
# ("hyphen", "hyphen"): [
# "ignore sub [less greater bar] hyphen' hyphen;",
# "ignore sub hyphen' hyphen [less greater bar];",
# ],
# # <---> >---< |---|
# ("hyphen", "hyphen", "hyphen"):
# "ignore sub [less greater bar] hyphen' hyphen hyphen;",
# "ignore sub hyphen' hyphen hyphen [less greater bar];",
# ],
("equal", "equal"): [ # ==
# "ignore sub bracketleft equal' equal;", # [==
# "ignore sub equal' equal bracketright;",# ==]
"ignore sub equal [colon exclam] equal' equal;", # =:== =!==
# "ignore sub [less greater bar slash] equal' equal;", # <== >== |== /==
# "ignore sub equal' equal [less greater bar slash];", # ==< ==> ==| ==/
"ignore sub equal' equal [colon exclam] equal;", # ==:= ==!=
],
# [===[ ]===]
# [=== ===]
# <===> >===< |===| /===/ =:=== =!=== ===:= ===!=
("equal", "equal", "equal"): [
# "ignore sub bracketleft equal' equal equal;",
# "ignore sub equal' equal equal bracketright;",
"ignore sub equal [colon exclam] equal' equal equal;",
"ignore sub [less greater bar slash] equal' equal equal;",
# "ignore sub equal' equal equal [less greater bar slash];",
"ignore sub equal' equal equal [colon exclam] equal;",
],
# #118 https://
("slash", "slash"): ["ignore sub colon slash' slash;"],
},
)
def indent(text, prefix):
return '\n'.join(prefix + line for line in text.split('\n'))