394 lines
13 KiB
Text
394 lines
13 KiB
Text
# -------------------------------------------------------------------------------------
|
||
# BEGIN glyph class definitions
|
||
|
||
@DASH = [
|
||
hyphen
|
||
endash
|
||
emdash
|
||
];
|
||
@DASH_CASE = [
|
||
hyphen.case
|
||
endash.case
|
||
emdash.case
|
||
];
|
||
@DASH_ANY = [ @DASH @DASH_CASE ];
|
||
|
||
# cap-height tall glyphs
|
||
@UC = [
|
||
@Uppercase
|
||
@Numeral
|
||
|
||
# punctuation
|
||
ampersand exclam exclamdbl exclamdown uni2049 question uni2047 uni2048
|
||
questiondown interrobang invertedinterrobang bar paragraph
|
||
|
||
# currency
|
||
dollar cent yen sterling florin uni20BA uni20BD euro uni20B9 tenge peseta
|
||
peso kip won lira austral hryvnia naira guarani coloncurrency cedi cruzeiro
|
||
tugrik uni20AF mill afii57636 manat rupee lari franc
|
||
|
||
# cap-tall symbols
|
||
numero triagrt triagdn triagup warningSign blackleftpointingtriangle
|
||
circleblack circlewhite
|
||
diamondblack diamondblack_x diamondwhite diamondwhite_x
|
||
sunWithRays blackSunWithRays
|
||
heartWhiteSuit heartBlackSuit heavyBlackHeart
|
||
upBlackArrow upWhiteArrow
|
||
capslock placeofinterestsign control projective option alternativekeysymbol
|
||
brokenCircleNorthWestArrow anticlockwiseOpenCircleArrow
|
||
clockwiseOpenCircleArrow
|
||
deleteleft deleteright clear ejectsymbol
|
||
|
||
# percent and fractions
|
||
onehalf onethird onequarter threequarters fivesixths onefraction seveneighths
|
||
oneeighth fiveeighths threeeighths percent perthousand pertenthousand uni214D
|
||
cadauna careof accountof addresssubject
|
||
];
|
||
|
||
# x-height tall glyphs
|
||
@LC = [
|
||
@Lowercase
|
||
];
|
||
|
||
@CASE_DELIM_L = [
|
||
braceleft braceright
|
||
bracketleft bracketright
|
||
parenleft parenright
|
||
];
|
||
@CASE_NONDELIM_L = [
|
||
at
|
||
multiply
|
||
minus
|
||
plus
|
||
plusminus
|
||
divide
|
||
equal
|
||
notequal
|
||
endash
|
||
figuredash
|
||
emdash
|
||
hyphen
|
||
bullet
|
||
openbullet
|
||
hyphenbullet
|
||
trianglebullet
|
||
blackleftbullet
|
||
blackrightbullet
|
||
blackSmallSquare
|
||
leftArrow
|
||
leftLongArrow
|
||
leftLongArrow2
|
||
leftDoubleArrow
|
||
leftLongDoubleArrow
|
||
rightArrow
|
||
rightLongArrow
|
||
rightLongArrow2
|
||
rightDoubleArrow
|
||
rightLongDoubleArrow
|
||
leftRightArrow
|
||
leftRightLongArrow
|
||
leftRightDoubleArrow
|
||
leftRightLongDoubleArrow
|
||
northEastArrow
|
||
southEastArrow
|
||
southWestArrow
|
||
northWestArrow
|
||
colon
|
||
approxequal
|
||
asciitilde
|
||
less
|
||
greater
|
||
lessequal
|
||
greaterequal
|
||
];
|
||
@CASE_L = [
|
||
@CASE_DELIM_L
|
||
@CASE_NONDELIM_L
|
||
];
|
||
|
||
@CASE_DELIM_R = [
|
||
braceleft.case braceright.case
|
||
bracketleft.case bracketright.case
|
||
parenleft.case parenright.case
|
||
];
|
||
@CASE_NONDELIM_R = [
|
||
at.case
|
||
multiply.case
|
||
minus.case
|
||
plus.case
|
||
plusminus.case
|
||
divide.case
|
||
equal.case
|
||
notequal.case
|
||
endash.case
|
||
figuredash.case
|
||
emdash.case
|
||
hyphen.case
|
||
bullet.case
|
||
openbullet.case
|
||
hyphenbullet.case
|
||
trianglebullet.case
|
||
blackleftbullet.case
|
||
blackrightbullet.case
|
||
blackSmallSquare.case
|
||
leftArrow.case
|
||
leftLongArrow.case
|
||
leftLongArrow2.case
|
||
leftDoubleArrow.case
|
||
leftLongDoubleArrow.case
|
||
rightArrow.case
|
||
rightLongArrow.case
|
||
rightLongArrow2.case
|
||
rightDoubleArrow.case
|
||
rightLongDoubleArrow.case
|
||
leftRightArrow.case
|
||
leftRightLongArrow.case
|
||
leftRightDoubleArrow.case
|
||
leftRightLongDoubleArrow.case
|
||
northEastArrow.case
|
||
southEastArrow.case
|
||
southWestArrow.case
|
||
northWestArrow.case
|
||
colon.case
|
||
approxequal.case
|
||
asciitilde.case
|
||
less.case
|
||
greater.case
|
||
lessequal.case
|
||
greaterequal.case
|
||
];
|
||
@CASE_R = [
|
||
@CASE_DELIM_R
|
||
@CASE_NONDELIM_R
|
||
];
|
||
|
||
@Punctuation = [
|
||
slash bar quoteleft quoteright quotesingle quotedbl
|
||
quotedblleft quotedblright quotedblbase quotesinglbase prime doubleprime
|
||
tripleprime quadrupleprime primerev doubleprimerev tripleprimerev primemod
|
||
doubleprimemod comma period ellipsis twodotleader semicolon underscore
|
||
asciicircum circumflex
|
||
asterisk
|
||
];
|
||
|
||
# END glyph class definitions
|
||
# -------------------------------------------------------------------------------------
|
||
# BEGIN arrow replacements
|
||
|
||
# --->
|
||
sub @DASH @DASH @DASH greater by rightLongArrow2;
|
||
sub @DASH_ANY @DASH_ANY @DASH_ANY greater.case by rightLongArrow2.case;
|
||
# -->
|
||
sub @DASH @DASH greater by rightLongArrow;
|
||
sub @DASH_ANY @DASH_ANY greater.case by rightLongArrow.case;
|
||
# [endash emdash]-> (legacy)
|
||
sub [endash emdash] greater by rightLongArrow;
|
||
sub [endash emdash endash.case emdash.case] greater.case by rightLongArrow.case;
|
||
# ->
|
||
sub hyphen greater by rightArrow;
|
||
sub [hyphen hyphen.case] greater.case by rightArrow.case;
|
||
# <---
|
||
sub less @DASH @DASH @DASH by leftLongArrow2;
|
||
sub less.case @DASH_ANY @DASH_ANY @DASH_ANY by leftLongArrow2.case;
|
||
# <--
|
||
sub less @DASH @DASH by leftLongArrow;
|
||
sub less.case @DASH_ANY @DASH_ANY by leftLongArrow.case;
|
||
# <-[endash emdash] (legacy)
|
||
sub less [endash emdash] by leftLongArrow;
|
||
sub less.case [endash emdash endash.case emdash.case] by leftLongArrow.case;
|
||
# ignore e.g. "<-3" ("less than negative")
|
||
ignore sub less' hyphen' @Numeral;
|
||
ignore sub less.case' [hyphen hyphen.case]' @Numeral;
|
||
# <-
|
||
sub less' hyphen' by leftArrow;
|
||
sub less.case' [hyphen hyphen.case]' by leftArrow.case;
|
||
# <->
|
||
sub less rightArrow by leftRightArrow; # <,->
|
||
sub [less less.case] rightArrow.case by leftRightArrow.case;
|
||
sub leftArrow greater by leftRightArrow; # <-,-
|
||
sub leftArrow.case [greater greater.case] by leftRightArrow.case;
|
||
# <-->
|
||
sub less rightLongArrow by leftRightLongArrow; # <,-->
|
||
sub [less less.case] rightLongArrow.case by leftRightLongArrow.case;
|
||
sub leftLongArrow greater by leftRightLongArrow; # <--,>
|
||
sub leftLongArrow.case [greater greater.case] by leftRightLongArrow.case;
|
||
# <=>
|
||
sub less equal greater by leftRightDoubleArrow;
|
||
sub less.case [equal equal.case] [greater greater.case] by leftRightDoubleArrow.case;
|
||
sub less equal equal greater by leftRightLongDoubleArrow;
|
||
sub less.case [equal equal.case] [equal equal.case] [greater greater.case] by leftRightLongDoubleArrow.case;
|
||
# =>
|
||
sub equal equal greater by rightLongDoubleArrow;
|
||
sub [equal equal.case] [equal equal.case] greater.case by rightLongDoubleArrow.case;
|
||
sub equal greater by rightDoubleArrow;
|
||
sub [equal equal.case] greater.case by rightDoubleArrow.case;
|
||
# <==
|
||
sub less equal equal by leftLongDoubleArrow;
|
||
sub less.case [equal equal.case] [equal equal.case] by leftLongDoubleArrow.case;
|
||
# Note: We do NOT (sub less equal by leftDoubleArrow) as that would
|
||
# interfere with "<=" (less than or equal to)
|
||
|
||
# END arrow replacements
|
||
# -------------------------------------------------------------------------------------
|
||
# BEGIN smiley
|
||
# :-)
|
||
sub colon' [ @DASH_ANY minus minus.case ] [parenright parenright.case] by colon.case;
|
||
sub [colon colon.case] hyphen' [parenright parenright.case] by hyphen.case;
|
||
sub [colon colon.case] endash' [parenright parenright.case] by endash.case;
|
||
sub [colon colon.case] emdash' [parenright parenright.case] by emdash.case;
|
||
sub [colon colon.case] [ @DASH_ANY minus minus.case ] parenright' by parenright.case;
|
||
|
||
# END smiley
|
||
# -------------------------------------------------------------------------------------
|
||
# BEGIN case
|
||
|
||
# A foo' -> A foo.case
|
||
#
|
||
# ignore subs adjacent to lower case
|
||
#
|
||
# h[1,3]
|
||
ignore sub @LC @CASE_DELIM_L @All @CASE_DELIM_L'; # h[X]
|
||
ignore sub @LC @CASE_DELIM_L @All @All @CASE_DELIM_L'; # h[XX]
|
||
ignore sub @LC @CASE_DELIM_L @All @All @All @CASE_DELIM_L'; # h[XXX]
|
||
ignore sub @LC @CASE_DELIM_L @All @All @All @All @CASE_DELIM_L'; # h[XXXX]
|
||
# x[]X
|
||
ignore sub @LC @CASE_DELIM_L @CASE_DELIM_L' @UC; # x[]X
|
||
ignore sub @LC @CASE_DELIM_L' @Whitespace @UC; # x[ X
|
||
ignore sub @LC @CASE_DELIM_L' @Whitespace @Whitespace @UC; # x[ X
|
||
ignore sub @LC @CASE_DELIM_L @CASE_DELIM_L' @Whitespace @UC; # x[] X
|
||
ignore sub @LC @CASE_DELIM_L @CASE_DELIM_L' @Whitespace @Whitespace @UC; # x[] X
|
||
ignore sub @LC @CASE_DELIM_L' @UC; # x[X
|
||
|
||
# short runs of uc-lc, e.g "(Xx)", "[xxX]"
|
||
ignore sub @CASE_DELIM_L' @UC @LC @CASE_DELIM_L; # (Xx)
|
||
ignore sub @CASE_DELIM_L' @UC @All @LC @CASE_DELIM_L; # (X.x)
|
||
ignore sub @CASE_DELIM_L @LC @UC @CASE_DELIM_L'; # (xX)
|
||
ignore sub @CASE_DELIM_L @LC @All @UC @CASE_DELIM_L'; # (x.X)
|
||
|
||
#
|
||
# e.g. "x-M"
|
||
ignore sub @LC @CASE_L'; # x-
|
||
ignore sub @LC @CASE_L @CASE_L'; # x--
|
||
ignore sub @LC @CASE_L @CASE_L @CASE_L'; # x---
|
||
# ignore sub @LC [@CASE_L @Whitespace] @CASE_L'; # x--, x -
|
||
# ignore sub @LC [@CASE_L @Whitespace] [@CASE_L @Whitespace] @CASE_L'; # x---, x --, x -, x- -
|
||
# ignore sub @LC
|
||
# [@CASE_L @Whitespace]
|
||
# [@CASE_L @Whitespace]
|
||
# [@CASE_L @Whitespace]
|
||
# @CASE_L'; # x----, x ---, x --, x -, x- --, x- -, x-- -
|
||
# ignore sub @LC
|
||
# [@CASE_L @Whitespace]
|
||
# [@CASE_L @Whitespace]
|
||
# [@CASE_L @Whitespace]
|
||
# [@CASE_L @Whitespace]
|
||
# @CASE_L'; # x----- ...
|
||
#
|
||
# e.g. "x- "
|
||
# ignore sub @LC @CASE_L' @Whitespace; # "x- "
|
||
# ignore sub @LC @CASE_L' @Whitespace @Whitespace; # "x- "
|
||
#
|
||
# e.g. "-x"
|
||
ignore sub @CASE_L' @LC; # -x
|
||
ignore sub @CASE_L' @CASE_L @LC; # --x
|
||
ignore sub @CASE_L' @CASE_L @CASE_L @LC; # ---x
|
||
# ignore sub @CASE_L @CASE_L @CASE_L @CASE_L @LC; # ----x
|
||
# ignore sub @CASE_L @CASE_L @CASE_L @CASE_L @CASE_L @LC; # -----x
|
||
|
||
#
|
||
# pairs with space, e.g. "( ) M" since we don't support subbing
|
||
# all on the left side.
|
||
ignore sub @CASE_DELIM_L @Whitespace @CASE_DELIM_L' @Whitespace [ @UC @CASE_R ];
|
||
#
|
||
# e.g. "A-", "A -", "A -"
|
||
sub [ @UC @CASE_R ] @CASE_L' by @CASE_R;
|
||
sub [ @UC @CASE_R ] @Whitespace @CASE_L' by @CASE_R;
|
||
sub [ @UC @CASE_R ] @Whitespace @Whitespace @CASE_L' by @CASE_R;
|
||
|
||
# foo' foo foo foo foo A -> foo.case foo foo foo foo A
|
||
# foo' foo foo foo A -> foo.case foo foo foo A
|
||
# foo' foo foo A -> foo.case foo foo A
|
||
# foo' foo A -> foo.case foo A
|
||
# foo' A -> foo.case A
|
||
# Note: since we look quite far back, sequences like x{}[]M will case both
|
||
# the square brackets next to M _and_ the curly braces to become .case
|
||
#
|
||
# e.g. "-A", "--A", "---A", "----A", "-----A"
|
||
sub @CASE_L' [ @UC @CASE_R ] by @CASE_R;
|
||
sub @CASE_L' @CASE_L [ @CASE_R @UC ] by @CASE_R;
|
||
sub @CASE_L' @CASE_L @CASE_L [ @CASE_R @UC ] by @CASE_R;
|
||
sub @CASE_L' @CASE_L @CASE_L @CASE_L [ @CASE_R @UC ] by @CASE_R;
|
||
sub @CASE_L' @CASE_L @CASE_L @CASE_L @CASE_L [ @CASE_R @UC ] by @CASE_R;
|
||
#
|
||
# e.g. "- A", "-- A", "--- A", "---- A", "----- A"
|
||
sub @CASE_L' @Whitespace [ @UC @CASE_R ] by @CASE_R;
|
||
sub @CASE_L' @CASE_L @Whitespace [ @CASE_R @UC ] by @CASE_R;
|
||
sub @CASE_L' @CASE_L @CASE_L @Whitespace [ @CASE_R @UC ] by @CASE_R;
|
||
sub @CASE_L' @CASE_L @CASE_L @CASE_L @Whitespace [ @CASE_R @UC ] by @CASE_R;
|
||
sub @CASE_L' @CASE_L @CASE_L @CASE_L @CASE_L @Whitespace [ @CASE_R @UC ] by @CASE_R;
|
||
#
|
||
# e.g. "- A", "-- A", "--- A", "---- A", "----- A"
|
||
sub @CASE_L' @Whitespace @Whitespace [ @UC @CASE_R ] by @CASE_R;
|
||
sub @CASE_L' @CASE_L @Whitespace @Whitespace [ @CASE_R @UC ] by @CASE_R;
|
||
sub @CASE_L' @CASE_L @CASE_L @Whitespace @Whitespace [ @CASE_R @UC ] by @CASE_R;
|
||
sub @CASE_L' @CASE_L @CASE_L @CASE_L @Whitespace @Whitespace [ @CASE_R @UC ] by @CASE_R;
|
||
sub @CASE_L' @CASE_L @CASE_L @CASE_L @CASE_L @Whitespace @Whitespace [ @CASE_R @UC ] by @CASE_R;
|
||
|
||
# X(_)
|
||
sub @CASE_DELIM_R @Punctuation @CASE_DELIM_L' by @CASE_DELIM_R;
|
||
|
||
# in between number position adjustment, e.g. 3 /multiply 4 -> 3 multiply.case 4
|
||
@between_num_L = [
|
||
multiply
|
||
asterisk
|
||
];
|
||
@between_num_R = [
|
||
multiply.case
|
||
asterisk.case
|
||
];
|
||
sub @Numeral @between_num_L' @Numeral by @between_num_R; # 3*9
|
||
sub @Numeral @Whitespace @between_num_L' @Numeral by @between_num_R; # 3 *9
|
||
sub @Numeral @Whitespace @Whitespace @between_num_L' @Numeral by @between_num_R; # 3 *9
|
||
sub @Numeral @between_num_L' @Whitespace @Numeral by @between_num_R; # 3* 9
|
||
sub @Numeral @Whitespace @between_num_L' @Whitespace @Numeral by @between_num_R; # 3 * 9
|
||
sub @Numeral @Whitespace @Whitespace @between_num_L' @Whitespace @Numeral by @between_num_R; # 3 * 9
|
||
sub @Numeral @between_num_L' @Whitespace @Whitespace @Numeral by @between_num_R; # 3* 9
|
||
sub @Numeral @Whitespace @between_num_L' @Whitespace @Whitespace @Numeral by @between_num_R; # 3 * 9
|
||
sub @Numeral @Whitespace @Whitespace @between_num_L' @Whitespace @Whitespace @Numeral by @between_num_R; # 3 * 9
|
||
|
||
# END case
|
||
# -------------------------------------------------------------------------------------
|
||
# BEGIN NxN
|
||
# x surrounded by numbers, e.g:
|
||
# 3x4 -> 3×4
|
||
# 10x20 -> 10×20
|
||
# 0x10 -> 0x10 No substitution
|
||
#
|
||
@NumNoZero = [
|
||
#
|
||
# NOTE! Keep this up to date with @Whitespace
|
||
#
|
||
# 1. in glyphs, copy list from font into > features > Whitespace class
|
||
# 2. paste & replace this list here
|
||
# 3. remove all "zero" glyphs
|
||
#
|
||
one two twostroke three four five Tonefive six seven eight nine
|
||
one.ss01 three.1 four.ss01 six.ss01 nine.ss01
|
||
one.tf two.tf three.tf four.tf five.tf six.tf seven.tf eight.tf
|
||
nine.tf one.tf.ss01 three.1.tf four.tf.ss01 six.tf.ss01
|
||
nine.tf.ss01
|
||
];
|
||
|
||
sub @NumNoZero x' @Numeral by multiply.case; # "3x9" "1x0"
|
||
sub @Numeral @Numeral x' @Numeral by multiply.case; # "10x0"
|
||
|
||
sub @NumNoZero @Whitespace x' @Numeral by multiply.case; # "3 x9" "1 x0"
|
||
sub @NumNoZero @Whitespace x' @Whitespace @Numeral by multiply.case; # "3 x 9" "1 x 0"
|
||
sub @NumNoZero x' @Whitespace @Numeral by multiply.case; # "3x 9" "1x 0"
|
||
|
||
sub @Numeral @Numeral @Whitespace x' @Numeral by multiply.case; # "10 x0"
|
||
sub @Numeral @Numeral @Whitespace x' @Whitespace @Numeral by multiply.case; # "10 x 0"
|
||
sub @Numeral @Numeral x' @Whitespace @Numeral by multiply.case; # "10x 0"
|
||
|
||
# END NxN
|
||
# -------------------------------------------------------------------------------------
|