From 691f82940cee511a1aaa063e8418f4699b8949aa Mon Sep 17 00:00:00 2001 From: subframe7536 <1667077010@qq.com> Date: Sun, 13 Oct 2024 19:14:59 +0800 Subject: [PATCH] refactor ligatures and build script --- README.md | 21 +- build.py | 841 +- config.json | 22 +- source/MapleMono-Italic[wght]-VF.ttf | Bin 305648 -> 307516 bytes source/MapleMono-Italic[wght].glyphs | 18668 +++++++++++++------------ source/MapleMono-Italic[wght].vfc | Bin 1158363 -> 1172610 bytes source/MapleMono[wght]-VF.ttf | Bin 274024 -> 272936 bytes source/MapleMono[wght].glyphs | 12002 ++++++++-------- source/MapleMono[wght].vfc | Bin 1041900 -> 1040065 bytes source/features/README.md | 183 + source/features/italic.fea | 391 +- source/features/regular.fea | 166 +- source/preset-normal.json | 24 +- source/schema.json | 160 +- 14 files changed, 16202 insertions(+), 16276 deletions(-) create mode 100644 source/features/README.md diff --git a/README.md b/README.md index 6254c3a..9d70e88 100644 --- a/README.md +++ b/README.md @@ -22,26 +22,7 @@ Base on `Jetbrains Mono` and **much "Opinioned"** - Round corner - New shape of `@ $ % & Q a` and cursive italic `f i j k l x y` -- Large amount of ligatures - - equal variants: `==` / `===` / `!=` / `!==` / `>=` / `<=`... - - arrow variants: `->` / `=>` / `-->` / `==>` / `<->` / `<=>`... - - xml variants: `` / `<>` / `` / ` +-> +>= +<= +<<= +<== +!= +!! +!== +=!= +=> +== +=:= +:=: +:= +:> +:< +:: +;; +;;; +:? +:?> +::= +||- +||= +|- +|= +|| +-- +--- +<-- +?? +??? +?: +?. +&& +__ +=/= +<-< +<=< +<==> +==> +=>> +>=> +>>= +>>- +-< +-<< +<-| +<=| +|=> +>- +<~ +~~ +<~> +<~~ +-~ +~~> +~> +~- +~@ +<+> +<+ ++> +<*> +<* +*> + + +<< +<<< +>> +>>> +#{ +#[ +#( +#? +#_ +#__ +#: +#= +#_( +]# +0x12 +[TRACE] +[DEBUG] +[INFO] +[WARN] +[ERROR] +[FATAL] +[TODO] +todo)) +[FIXME] +fixme)) +######## + +\\ +``` + +#### Notice + +- `<<` / `<<<` should have tailing space, `>>` / `>>>` should have heading space + +### Character Varients (cvXX) + +- zero: `0` with dot style +- cv01: `@ $ & % Q => ->` without gap +- cv02: `a` with top arm +- cv03: `i` without left bottom bar +- cv04: `l` with left bottom bar, like consolas, will be overrided by cv35 in italic style + +#### Italic Only +- cv31: italic `a` with top arm +- cv32: italic `f` without bottom tail +- cv33: italic `i j` with left bottom bar and horizen top bar +- cv34: italic `k` without circle +- cv35: italic `l` without tail +- cv36: italic `x` without tail + +#### CN Only + +- cv98: Full width `…`(ellipsis) and `—`(emdash) +- cv99: Traditional punctuations + +### Style Sets (ssXX) + +- ss01: Broken equals ligatures (`==`, `===`, `!=`, `!==`, `=/=`) +- ss02: Broken compare and equal ligatures (`<=`, `>=`) +- ss03: Enable arbitrary tag (allow to use any case letters in all tags) +- ss04: Break multiple underscores (`__`, `#__`) +- ss05: Thin backslash in escape letters (`\w`, `\n`, `\r` ...) +- ss06: Remove connected strokes between italic letters (`al`, `ul`, `il` ...) +- ss07: Make space optional in multiple less or greater (`<<`, `>>`, `<<<`, `>>>`) \ No newline at end of file diff --git a/source/features/italic.fea b/source/features/italic.fea index 33c8bcf..196fed3 100644 --- a/source/features/italic.fea +++ b/source/features/italic.fea @@ -4,7 +4,7 @@ @Digit = [zero zero.zero one two three four five six seven eight nine]; @DigitHex = [a b c d e f A B C D E F]; @SpaceExlusion = [space bullet periodcentered period]; -@a = [A a a.cv02]; +@a = [A a a.cv31]; @b = [B b]; @c = [C c]; @d = [D d]; @@ -12,10 +12,10 @@ @f = [F f]; @g = [G g]; @h = [H h]; -@i = [I i i.ss01]; -@j = [J j j.ss01]; -@k = [K k k.ss01]; -@l = [L l l.cv04 l.ss01]; +@i = [I i i.cv33]; +@j = [J j j.cv33]; +@k = [K k k.cv34]; +@l = [L l l.cv35]; @m = [M m]; @n = [N n]; @o = [O o]; @@ -27,12 +27,13 @@ @u = [U u]; @v = [V v]; @w = [W w]; -@x = [X x x.ss01]; +@x = [X x x.cv36]; @y = [Y y]; @z = [Z z]; @zero = [zero zero.zero]; -@escape = [backslash slash @Digit b B c d D f k n p P r s S t u w W v x dollar period asterisk asciitilde question bar quotesingle quotedbl bracketleft bracketright parenleft parenright braceleft braceright grave comma]; -@a_l = [a_l.liga a_l.liga.cv02 a_l.liga.cv04 a_l.liga.cv02.cv04 a_l.liga.ss01 a_l.liga.cv02.ss01]; +@escape_letter = [@Digit b B c d D f k n p P r s S t u w W v x]; +@escape_punctuation = [backslash slash dollar period asterisk asciitilde question bar quotesingle quotedbl bracketleft bracketright parenleft parenright braceleft braceright grave comma]; +@a_l = [a_l.liga a_l.liga.cv31 a_l.liga.cv35 a_l.liga.cv31.cv35 a_l.liga.cv04 a_l.liga.cv04.cv31 a_l.liga.ss06]; #/< otclasses #< classes @@ -219,7 +220,7 @@ feature calt { sub plus' plus plus by SPC; } plus_plus_plus.liga; - # .? + # .? Zig lookup period_question.liga { ignore sub period period' question; ignore sub period' question question; @@ -245,7 +246,7 @@ feature calt { sub period' period period by SPC; } period_period_period.liga; - # ..< + # ..< Swift lookup period_period_less.liga { ignore sub period period' period less; ignore sub period' period less [less slash greater]; @@ -333,25 +334,18 @@ feature calt { sub greater' colon greater by SPC; } greater_colon_greater.liga; - # << + # << with tailing space lookup less_less.liga { - ignore sub less less' less; - ignore sub hyphen less' less; - ignore sub equal less' less; - ignore sub less' less less; - ignore sub less' less equal; - ignore sub less' less asciitilde; - sub SPC less' by less_less.liga; - sub less' less by SPC; + ignore sub less less' less space; + sub SPC less' space by less_less.liga; + sub less' less space by SPC; } less_less.liga; - # <<< + # <<< with tailing space lookup less_less_less.liga { - ignore sub less less' less less; - ignore sub less' less less less; - sub SPC SPC less' by less_less_less.liga; - sub SPC less' less by SPC; - sub less' less less by SPC; + sub SPC SPC less' space by less_less_less.liga; + sub SPC less' less space by SPC; + sub less' less less space by SPC; } less_less_less.liga; # <=> @@ -414,7 +408,7 @@ feature calt { # ->> lookup hyphen_greater_greater.liga { ignore sub hyphen hyphen' greater greater; - ignore sub hyphen' greater greater greater; + ignore sub hyphen' greater greater [greater hyphen]; sub SPC SPC greater' by hyphen_greater_greater.liga; sub SPC greater' greater by SPC; sub hyphen' greater greater by SPC; @@ -442,26 +436,21 @@ feature calt { sub hyphen' greater by SPC; } hyphen_greater.liga; - # >> + # >> with heading space lookup greater_greater.liga { ignore sub greater greater' greater; - ignore sub greater' greater greater; - ignore sub greater' greater equal; - ignore sub greater' greater hyphen; - ignore sub equal greater' greater; - ignore sub slash greater' greater; - ignore sub less greater' greater; - sub SPC greater' by greater_greater.liga; - sub greater' greater by SPC; + ignore sub greater' greater [greater equal hyphen]; + ignore sub [equal slash less] greater' greater; + sub space SPC greater' by greater_greater.liga; + sub space greater' greater by SPC; } greater_greater.liga; - # >>> + # >>> with heading space lookup greater_greater_greater.liga { - ignore sub greater greater' greater greater; ignore sub greater' greater greater greater; - sub SPC SPC greater' by greater_greater_greater.liga; - sub SPC greater' greater by SPC; - sub greater' greater greater by SPC; + sub space SPC SPC greater' by greater_greater_greater.liga; + sub space SPC greater' greater by SPC; + sub space greater' greater greater by SPC; } greater_greater_greater.liga; # >= @@ -810,7 +799,7 @@ feature calt { # <-- lookup less_hyphen_hyphen.liga { ignore sub less less' hyphen hyphen; - ignore sub less' hyphen hyphen hyphen; + ignore sub less' hyphen hyphen [hyphen greater less]; sub SPC SPC hyphen' by less_hyphen_hyphen.liga; sub SPC hyphen' hyphen by SPC; sub less' hyphen hyphen by SPC; @@ -852,7 +841,7 @@ feature calt { sub question' colon by SPC; } question_colon.liga; - # ?. + # ?. TypeScript / Rust lookup question_period.liga { ignore sub question question' period; ignore sub question' period period; @@ -915,7 +904,7 @@ feature calt { # <=< lookup less_equal_less.liga { - ignore sub less less' equal less; + ignore sub [less equal] less' equal less; ignore sub parenleft question less' equal less; ignore sub less' equal less [less equal]; sub SPC SPC less' by less_equal_less.liga; @@ -958,7 +947,7 @@ feature calt { # >=> lookup greater_equal_greater.liga { - ignore sub greater greater' equal greater; + ignore sub [greater equal] greater' equal greater; ignore sub greater' equal greater [greater equal]; sub SPC SPC greater' by greater_equal_greater.liga; sub SPC equal' greater by SPC; @@ -1455,9 +1444,11 @@ feature calt { sub less' exclam hyphen hyphen hyphen hyphen greater by SPC; } xml_empty_comment.liga; + # \\ \. \? \$ ... lookup escape { - ignore sub backslash.liga backslash' @escape; - sub backslash' @escape by backslash.liga; + ignore sub backslash.liga backslash' @escape_punctuation; + ignore sub backslash' percent percent; + sub backslash' @escape_punctuation by backslash.liga; } escape; # ================[III]================ @@ -1745,8 +1736,6 @@ feature cv01 { sub equal_equal_greater.liga by equal_equal_greater.liga.cv01; sub less_equal_equal_greater.liga by less_equal_equal_greater.liga.cv01; sub less_equal_greater.liga by less_equal_greater.liga.cv01; - sub less_less_equal.liga by less_less_equal.liga.cv01; - sub equal_greater_greater.liga by equal_greater_greater.liga.cv01; sub less_equal_less.liga by less_equal_less.liga.cv01; sub greater_equal_greater.liga by greater_equal_greater.liga.cv01; sub less_equal_bar.liga by less_equal_bar.liga.cv01; @@ -1760,46 +1749,11 @@ feature cv01 { sub less_hyphen_less.liga by less_hyphen_less.liga.cv01; sub greater_hyphen_greater.liga by greater_hyphen_greater.liga.cv01; sub less_hyphen_greater.liga by less_hyphen_greater.liga.cv01; - sub less_less_hyphen.liga by less_less_hyphen.liga.cv01; - sub hyphen_greater_greater.liga by hyphen_greater_greater.liga.cv01; sub less_exclam_hyphen_hyphen.liga by less_exclam_hyphen_hyphen.liga.cv01; sub less_numbersign_hyphen_hyphen.liga by less_numbersign_hyphen_hyphen.liga.cv01; sub xml_empty_comment.liga by xml_empty_comment.liga.cv01; } cv01; -feature cv02 { - sub a by a.cv02; - sub aacute by aacute.cv02; - sub abreve by abreve.cv02; - sub abreveacute by abreveacute.cv02; - sub abrevedotbelow by abrevedotbelow.cv02; - sub abrevegrave by abrevegrave.cv02; - sub abrevehookabove by abrevehookabove.cv02; - sub abrevetilde by abrevetilde.cv02; - sub acaron by acaron.cv02; - sub acircumflex by acircumflex.cv02; - sub acircumflexacute by acircumflexacute.cv02; - sub acircumflexdotbelow by acircumflexdotbelow.cv02; - sub acircumflexgrave by acircumflexgrave.cv02; - sub acircumflexhookabove by acircumflexhookabove.cv02; - sub acircumflextilde by acircumflextilde.cv02; - sub adieresis by adieresis.cv02; - sub adotbelow by adotbelow.cv02; - sub agrave by agrave.cv02; - sub ahookabove by ahookabove.cv02; - sub amacron by amacron.cv02; - sub aogonek by aogonek.cv02; - sub aring by aring.cv02; - sub atilde by atilde.cv02; - sub ordfeminine by ordfeminine.cv02; - -# ================[III]================ - - sub a_l.liga by a_l.liga.cv02; - sub a_l_l.liga by a_l_l.liga.cv02; - -# ===================================== -} cv02; feature cv04 { sub l by l.cv04; @@ -1809,11 +1763,9 @@ feature cv04 { sub ldot by ldot.cv04; sub lslash by lslash.cv04; sub one by one.cv04; -# ================[III]================ sub C_l.liga by C_l.liga.cv04; sub a_l.liga by a_l.liga.cv04; - sub a_l.liga.cv02 by a_l.liga.cv02.cv04; sub c_l.liga by c_l.liga.cv04; sub e_l.liga by e_l.liga.cv04; sub i_l.liga by i_l.liga.cv04; @@ -1821,76 +1773,148 @@ feature cv04 { sub t_l.liga by t_l.liga.cv04; sub u_l.liga by u_l.liga.cv04; sub a_l_l.liga by a_l_l.liga.cv04; - sub a_l_l.liga.cv02 by a_l_l.liga.cv02.cv04; sub e_l_l.liga by e_l_l.liga.cv04; sub i_l_l.liga by i_l_l.liga.cv04; sub u_l_l.liga by u_l_l.liga.cv04; - -# ===================================== } cv04; -# ================[III]================ +feature cv31 { + sub a by a.cv31; + sub aacute by aacute.cv31; + sub abreve by abreve.cv31; + sub abreveacute by abreveacute.cv31; + sub abrevedotbelow by abrevedotbelow.cv31; + sub abrevegrave by abrevegrave.cv31; + sub abrevehookabove by abrevehookabove.cv31; + sub abrevetilde by abrevetilde.cv31; + sub acaron by acaron.cv31; + sub acircumflex by acircumflex.cv31; + sub acircumflexacute by acircumflexacute.cv31; + sub acircumflexdotbelow by acircumflexdotbelow.cv31; + sub acircumflexgrave by acircumflexgrave.cv31; + sub acircumflexhookabove by acircumflexhookabove.cv31; + sub acircumflextilde by acircumflextilde.cv31; + sub adieresis by adieresis.cv31; + sub adotbelow by adotbelow.cv31; + sub agrave by agrave.cv31; + sub ahookabove by ahookabove.cv31; + sub amacron by amacron.cv31; + sub aogonek by aogonek.cv31; + sub aring by aring.cv31; + sub atilde by atilde.cv31; + sub ordfeminine by ordfeminine.cv31; + + sub a_l.liga by a_l.liga.cv31; + sub a_l_l.liga by a_l_l.liga.cv31; + sub a_l.liga.cv04 by a_l.liga.cv04.cv31; + sub a_l_l.liga.cv04 by a_l_l.liga.cv04.cv31; +} cv31; + +feature cv32 { + sub f by f.cv32; + sub f_f.liga by f_f.liga.cv32; +} cv32; + +feature cv33 { + sub i by i.cv33; + sub iacute by iacute.cv33; + sub ibreve by ibreve.cv33; + sub icaron by icaron.cv33; + sub icircumflex by icircumflex.cv33; + sub idieresis by idieresis.cv33; + sub idotbelow by idotbelow.cv33; + sub idotless by idotless.cv33; + sub igrave by igrave.cv33; + sub ihookabove by ihookabove.cv33; + sub imacron by imacron.cv33; + sub iogonek by iogonek.cv33; + sub itilde by itilde.cv33; + + sub j by j.cv33; + sub jcircumflex by jcircumflex.cv33; + sub jdotless by jdotless.cv33; + + sub i_l.liga by i_l.liga.cv33; + sub i_l_l.liga by i_l_l.liga.cv33; + sub i_l_l.liga.cv04 by i_l_l.liga.cv04.cv33; +} cv33; + +feature cv34 { + sub k by k.cv34; + sub kcommaaccent by kcommaaccent.cv34; +} cv34; + +feature cv35 { + sub l by l.cv35; + sub l.cv04 by l.cv35; + sub lacute by lacute.cv35; + sub lacute.cv04 by lacute.cv35; + sub lcaron by lcaron.cv35; + sub lcaron.cv04 by lcaron.cv35; + sub lcommaaccent by lcommaaccent.cv35; + sub lcommaaccent.cv04 by lcommaaccent.cv35; + sub ldot by ldot.cv35; + sub ldot.cv04 by ldot.cv35; + sub lslash by lslash.cv35; + sub lslash.cv04 by lslash.cv35; + + sub C_l.liga by C_l.liga.cv35; + sub C_l.liga.cv04 by C_l.liga.cv35; + sub a_l.liga by a_l.liga.cv35; + sub a_l.liga.cv04 by a_l.liga.cv35; + sub c_l.liga by c_l.liga.cv35; + sub c_l.liga.cv04 by c_l.liga.cv35; + sub e_l.liga by e_l.liga.cv35; + sub e_l.liga.cv04 by e_l.liga.cv35; + sub i_l.liga by i_l.liga.cv35; + sub i_l.liga.cv04 by i_l.liga.cv35; + sub l_l.liga by l_l.liga.cv35; + sub l_l.liga.cv04 by l_l.liga.cv35; + sub t_l.liga by t_l.liga.cv35; + sub t_l.liga.cv04 by t_l.liga.cv35; + sub u_l.liga by u_l.liga.cv35; + sub u_l.liga.cv04 by u_l.liga.cv35; + sub a_l_l.liga by a_l_l.liga.cv35; + sub a_l_l.liga.cv04 by a_l_l.liga.cv35; + sub e_l_l.liga by e_l_l.liga.cv35; + sub e_l_l.liga.cv04 by e_l_l.liga.cv35; + sub i_l_l.liga by i_l_l.liga.cv35; + sub i_l_l.liga.cv04 by i_l_l.liga.cv35; + sub i_l_l.liga.cv04.cv33 by i_l_l.liga.cv33.cv35; + sub u_l_l.liga by u_l_l.liga.cv35; + sub u_l_l.liga.cv04 by u_l_l.liga.cv35; + + sub one.cv04 by one; +} cv35; + + +feature cv36 { + sub x by x.cv36; +} cv36; -# non-cursive style feature ss01 { - sub i by i.ss01; - sub iacute by iacute.ss01; - sub ibreve by ibreve.ss01; - sub icaron by icaron.ss01; - sub icircumflex by icircumflex.ss01; - sub idieresis by idieresis.ss01; - sub idotbelow by idotbelow.ss01; - sub idotless by idotless.ss01; - sub igrave by igrave.ss01; - sub ihookabove by ihookabove.ss01; - sub imacron by imacron.ss01; - sub iogonek by iogonek.ss01; - sub itilde by itilde.ss01; - sub j by j.ss01; - sub jcircumflex by jcircumflex.ss01; - sub jdotless by jdotless.ss01; - sub k by k.ss01; - sub kcommaaccent by kcommaaccent.ss01; - sub l by l.ss01; - sub lacute by lacute.ss01; - sub lcaron by lcaron.ss01; - sub lcommaaccent by lcommaaccent.ss01; - sub ldot by ldot.ss01; - sub lslash by lslash.ss01; - sub x by x.ss01; - - sub C_l.liga by C_l.liga.ss01; - sub a_l.liga by a_l.liga.ss01; - sub a_l.liga.cv02 by a_l.liga.cv02.ss01; - sub c_l.liga by c_l.liga.ss01; - sub e_l.liga by e_l.liga.ss01; - sub i_l.liga by i_l.liga.ss01; - sub i_l.liga.cv04 by i_l.liga.cv04.ss01; - sub l_l.liga by l_l.liga.ss01; - sub t_l.liga by t_l.liga.ss01; - sub u_l.liga by u_l.liga.ss01; - sub t_t.liga by t_t.liga.ss01; - sub a_l_l.liga by a_l_l.liga.ss01; - sub a_l_l.liga.cv02 by a_l_l.liga.cv02.ss01; - sub e_l_l.liga by e_l_l.liga.ss01; - sub i_l_l.liga by i_l_l.liga.ss01; - sub i_l_l.liga.cv04 by i_l_l.liga.cv04.ss01; - sub u_l_l.liga by u_l_l.liga.ss01; - + featureNames { + name "Broken equals ligatures"; + }; + sub equal_equal.liga by equal_equal.liga.ss01; + sub equal_equal_equal.liga by equal_equal_equal.liga.ss01; + sub exclam_equal.liga by exclam_equal.liga.ss01; + sub exclam_equal_equal.liga by exclam_equal_equal.liga.ss01; + sub equal_slash_equal.liga by equal_slash_equal.liga.ss01; } ss01; -# ===================================== -# split `==` feature ss02 { + featureNames { + name "Broken compare and equal ligatures"; + }; sub less_equal.liga by less_equal.liga.ss02; sub greater_equal.liga by greater_equal.liga.ss02; - sub equal_equal.liga by equal_equal.liga.ss02; - sub equal_equal_equal.liga by equal_equal_equal.liga.ss02; - sub exclam_equal.liga by exclam_equal.liga.ss02; - sub exclam_equal_equal.liga by exclam_equal_equal.liga.ss02; - sub equal_slash_equal.liga by equal_slash_equal.liga.ss02; } ss02; + feature ss03 { + featureNames { + name "Enable arbitrary tag"; + }; # [TRACE] lookup badge_trace.liga.ss03 { sub SPC SPC SPC SPC SPC SPC bracketright' by badge_trace.liga; @@ -1984,7 +2008,88 @@ feature ss03 { } ss03; feature ss04 { + featureNames { + name "Break multiple underscores"; + }; sub underscore_underscore.liga by underscore_underscore.liga.ss04; sub numbersign_underscore_underscore.liga by numbersign_underscore_underscore.liga.ss04; - sub backslash.liga by backslash; -} ss04; \ No newline at end of file +} ss04; + +feature ss05 { + featureNames { + name "Thin backslash in escape letters"; + }; + ignore sub backslash.liga backslash' @escape_letter; + sub backslash' @escape_letter by backslash.liga; +} ss05; + +feature ss06 { + featureNames { + name "Remove connected strokes between italic letters"; + }; + sub C_l.liga by C_l.liga.ss06; + sub a_l.liga by a_l.liga.ss06; + sub c_l.liga by c_l.liga.ss06; + sub e_l.liga by e_l.liga.ss06; + sub i_l.liga by i_l.liga.ss06; + sub l_l.liga by l_l.liga.ss06; + sub t_l.liga by t_l.liga.ss06; + sub u_l.liga by u_l.liga.ss06; + sub a_l_l.liga by a_l_l.liga.ss06; + sub a_l_l.liga.cv31 by a_l_l.liga.cv31.ss06; + sub e_l_l.liga by e_l_l.liga.ss06; + sub i_l_l.liga by i_l_l.liga.ss06; + sub i_l_l.liga.cv33 by i_l_l.liga.cv33.ss06; + sub u_l_l.liga by u_l_l.liga.ss06; + sub f_f.liga by f_f.liga.ss06; + sub f_f.liga.cv32 by f_f.liga.cv32.ss06; + sub t_t.liga by t_t.liga.ss06; +} ss06; + +feature ss07 { + featureNames { + name "Make space optional in multiple less or greater"; + }; + # << + lookup loose_less_less.liga { + ignore sub less less' less; + ignore sub hyphen less' less; + ignore sub equal less' less; + ignore sub less' less less; + ignore sub less' less equal; + ignore sub less' less asciitilde; + sub SPC less' by less_less.liga; + sub less' less by SPC; + } loose_less_less.liga; + + # <<< + lookup loose_less_less_less.liga { + ignore sub less less' less less; + ignore sub less' less less less; + sub SPC SPC less' by less_less_less.liga; + sub SPC less' less by SPC; + sub less' less less by SPC; + } loose_less_less_less.liga; + + # >> + lookup loose_greater_greater.liga { + ignore sub greater greater' greater; + ignore sub greater' greater greater; + ignore sub greater' greater equal; + ignore sub greater' greater hyphen; + ignore sub equal greater' greater; + ignore sub slash greater' greater; + ignore sub less greater' greater; + sub SPC greater' by greater_greater.liga; + sub greater' greater by SPC; + } loose_greater_greater.liga; + + # >>> + lookup loose_greater_greater_greater.liga { + ignore sub greater greater' greater greater; + ignore sub greater' greater greater greater; + sub SPC SPC greater' by greater_greater_greater.liga; + sub SPC greater' greater by SPC; + sub greater' greater greater by SPC; + } loose_greater_greater_greater.liga; +} ss07; \ No newline at end of file diff --git a/source/features/regular.fea b/source/features/regular.fea index 752a374..03b7e0c 100644 --- a/source/features/regular.fea +++ b/source/features/regular.fea @@ -32,7 +32,8 @@ @x = [X x]; @y = [Y y]; @z = [Z z]; -@escape = [backslash slash @Digit b B c d D f k n p P r s S t u w W v x dollar period asterisk asciitilde question bar quotesingle quotedbl bracketleft bracketright parenleft parenright braceleft braceright grave comma]; +@escape_letter = [@Digit b B c d D f k n p P r s S t u w W v x]; +@escape_punctuation = [backslash slash dollar period asterisk asciitilde question bar quotesingle quotedbl bracketleft bracketright parenleft parenright braceleft braceright grave comma]; #/< otclasses #< classes @@ -219,7 +220,7 @@ feature calt { sub plus' plus plus by SPC; } plus_plus_plus.liga; - # .? + # .? Zig lookup period_question.liga { ignore sub period period' question; ignore sub period' question question; @@ -245,7 +246,7 @@ feature calt { sub period' period period by SPC; } period_period_period.liga; - # ..< + # ..< Swift lookup period_period_less.liga { ignore sub period period' period less; ignore sub period' period less [less slash greater]; @@ -333,25 +334,18 @@ feature calt { sub greater' colon greater by SPC; } greater_colon_greater.liga; - # << + # << with tailing space lookup less_less.liga { - ignore sub less less' less; - ignore sub hyphen less' less; - ignore sub equal less' less; - ignore sub less' less less; - ignore sub less' less equal; - ignore sub less' less asciitilde; - sub SPC less' by less_less.liga; - sub less' less by SPC; + ignore sub less less' less space; + sub SPC less' space by less_less.liga; + sub less' less space by SPC; } less_less.liga; - # <<< + # <<< with tailing space lookup less_less_less.liga { - ignore sub less less' less less; - ignore sub less' less less less; - sub SPC SPC less' by less_less_less.liga; - sub SPC less' less by SPC; - sub less' less less by SPC; + sub SPC SPC less' space by less_less_less.liga; + sub SPC less' less space by SPC; + sub less' less less space by SPC; } less_less_less.liga; # <=> @@ -414,7 +408,7 @@ feature calt { # ->> lookup hyphen_greater_greater.liga { ignore sub hyphen hyphen' greater greater; - ignore sub hyphen' greater greater greater; + ignore sub hyphen' greater greater [greater hyphen]; sub SPC SPC greater' by hyphen_greater_greater.liga; sub SPC greater' greater by SPC; sub hyphen' greater greater by SPC; @@ -442,26 +436,21 @@ feature calt { sub hyphen' greater by SPC; } hyphen_greater.liga; - # >> + # >> with heading space lookup greater_greater.liga { ignore sub greater greater' greater; - ignore sub greater' greater greater; - ignore sub greater' greater equal; - ignore sub greater' greater hyphen; - ignore sub equal greater' greater; - ignore sub slash greater' greater; - ignore sub less greater' greater; - sub SPC greater' by greater_greater.liga; - sub greater' greater by SPC; + ignore sub greater' greater [greater equal hyphen]; + ignore sub [equal slash less] greater' greater; + sub space SPC greater' by greater_greater.liga; + sub space greater' greater by SPC; } greater_greater.liga; - # >>> + # >>> with heading space lookup greater_greater_greater.liga { - ignore sub greater greater' greater greater; ignore sub greater' greater greater greater; - sub SPC SPC greater' by greater_greater_greater.liga; - sub SPC greater' greater by SPC; - sub greater' greater greater by SPC; + sub space SPC SPC greater' by greater_greater_greater.liga; + sub space SPC greater' greater by SPC; + sub space greater' greater greater by SPC; } greater_greater_greater.liga; # >= @@ -810,7 +799,7 @@ feature calt { # <-- lookup less_hyphen_hyphen.liga { ignore sub less less' hyphen hyphen; - ignore sub less' hyphen hyphen hyphen; + ignore sub less' hyphen hyphen [hyphen greater less]; sub SPC SPC hyphen' by less_hyphen_hyphen.liga; sub SPC hyphen' hyphen by SPC; sub less' hyphen hyphen by SPC; @@ -852,7 +841,7 @@ feature calt { sub question' colon by SPC; } question_colon.liga; - # ?. + # ?. TypeScript / Rust lookup question_period.liga { ignore sub question question' period; ignore sub question' period period; @@ -915,7 +904,7 @@ feature calt { # <=< lookup less_equal_less.liga { - ignore sub less less' equal less; + ignore sub [less equal] less' equal less; ignore sub parenleft question less' equal less; ignore sub less' equal less [less equal]; sub SPC SPC less' by less_equal_less.liga; @@ -958,7 +947,7 @@ feature calt { # >=> lookup greater_equal_greater.liga { - ignore sub greater greater' equal greater; + ignore sub [greater equal] greater' equal greater; ignore sub greater' equal greater [greater equal]; sub SPC SPC greater' by greater_equal_greater.liga; sub SPC equal' greater by SPC; @@ -1456,8 +1445,9 @@ feature calt { } xml_empty_comment.liga; lookup escape { - ignore sub backslash.liga backslash' @escape; - sub backslash' @escape by backslash.liga; + ignore sub backslash.liga backslash' @escape_punctuation; + ignore sub backslash' percent percent; + sub backslash' @escape_punctuation by backslash.liga; } escape; } calt; @@ -1643,9 +1633,11 @@ feature case { sub circumflexcomb_hookabovecomb by circumflexcomb_hookabovecomb.case; sub circumflexcomb_tildecomb by circumflexcomb_tildecomb.case; } case; + feature zero { sub zero by zero.zero; } zero; + feature cv01 { sub Q by Q.cv01; sub ampersand by ampersand.cv01; @@ -1661,8 +1653,6 @@ feature cv01 { sub equal_equal_greater.liga by equal_equal_greater.liga.cv01; sub less_equal_equal_greater.liga by less_equal_equal_greater.liga.cv01; sub less_equal_greater.liga by less_equal_greater.liga.cv01; - sub less_less_equal.liga by less_less_equal.liga.cv01; - sub equal_greater_greater.liga by equal_greater_greater.liga.cv01; sub less_equal_less.liga by less_equal_less.liga.cv01; sub greater_equal_greater.liga by greater_equal_greater.liga.cv01; sub less_equal_bar.liga by less_equal_bar.liga.cv01; @@ -1676,13 +1666,12 @@ feature cv01 { sub less_hyphen_less.liga by less_hyphen_less.liga.cv01; sub greater_hyphen_greater.liga by greater_hyphen_greater.liga.cv01; sub less_hyphen_greater.liga by less_hyphen_greater.liga.cv01; - sub less_less_hyphen.liga by less_less_hyphen.liga.cv01; - sub hyphen_greater_greater.liga by hyphen_greater_greater.liga.cv01; sub less_exclam_hyphen_hyphen.liga by less_exclam_hyphen_hyphen.liga.cv01; sub less_numbersign_hyphen_hyphen.liga by less_numbersign_hyphen_hyphen.liga.cv01; sub xml_empty_comment.liga by xml_empty_comment.liga.cv01; } cv01; + feature cv02 { sub a by a.cv02; sub aacute by aacute.cv02; @@ -1709,6 +1698,7 @@ feature cv02 { sub atilde by atilde.cv02; sub ordfeminine by ordfeminine.cv02; } cv02; + feature cv03 { sub i by i.cv03; sub iacute by iacute.cv03; @@ -1725,6 +1715,7 @@ feature cv03 { sub iogonek by iogonek.cv03; sub itilde by itilde.cv03; } cv03; + feature cv04 { sub l by l.cv04; sub lacute by lacute.cv04; @@ -1734,17 +1725,30 @@ feature cv04 { sub lslash by lslash.cv04; sub one by one.cv04; } cv04; -# split `==` + +feature ss01 { + featureNames { + name "Broken equals ligatures"; + }; + sub equal_equal.liga by equal_equal.liga.ss01; + sub equal_equal_equal.liga by equal_equal_equal.liga.ss01; + sub exclam_equal.liga by exclam_equal.liga.ss01; + sub exclam_equal_equal.liga by exclam_equal_equal.liga.ss01; + sub equal_slash_equal.liga by equal_slash_equal.liga.ss01; +} ss01; + feature ss02 { + featureNames { + name "Broken compare and equal ligatures"; + }; sub less_equal.liga by less_equal.liga.ss02; sub greater_equal.liga by greater_equal.liga.ss02; - sub equal_equal.liga by equal_equal.liga.ss02; - sub equal_equal_equal.liga by equal_equal_equal.liga.ss02; - sub exclam_equal.liga by exclam_equal.liga.ss02; - sub exclam_equal_equal.liga by exclam_equal_equal.liga.ss02; - sub equal_slash_equal.liga by equal_slash_equal.liga.ss02; } ss02; + feature ss03 { + featureNames { + name "Enable rbitrary tag"; + }; # [TRACE] lookup badge_trace.liga.ss03 { sub SPC SPC SPC SPC SPC SPC bracketright' by badge_trace.liga; @@ -1809,7 +1813,7 @@ feature ss03 { sub bracketleft' @f @a @t @a @l bracketright by SPC; } badge_fatal.liga.ss03; - # [TODO] + # [TODO] lookup badge_todo.liga.ss03 { sub SPC SPC SPC SPC SPC bracketright' by badge_todo.liga; sub SPC SPC SPC SPC @o' bracketright by SPC; @@ -1832,7 +1836,65 @@ feature ss03 { } ss03; feature ss04 { + featureNames { + name "Break multiple underscores"; + }; sub underscore_underscore.liga by underscore_underscore.liga.ss04; sub numbersign_underscore_underscore.liga by numbersign_underscore_underscore.liga.ss04; - sub backslash.liga by backslash; -} ss04; \ No newline at end of file +} ss04; + +feature ss05 { + featureNames { + name "Thin backslash in escape letters"; + }; + ignore sub backslash.liga backslash' @escape_letter; + sub backslash' @escape_letter by backslash.liga; +} ss05; + +feature ss07 { + featureNames { + name "Make space optional in multiple less or greater"; + }; + # << + lookup loose_less_less.liga { + ignore sub less less' less; + ignore sub hyphen less' less; + ignore sub equal less' less; + ignore sub less' less less; + ignore sub less' less equal; + ignore sub less' less asciitilde; + sub SPC less' by less_less.liga; + sub less' less by SPC; + } loose_less_less.liga; + + # <<< + lookup loose_less_less_less.liga { + ignore sub less less' less less; + ignore sub less' less less less; + sub SPC SPC less' by less_less_less.liga; + sub SPC less' less by SPC; + sub less' less less by SPC; + } loose_less_less_less.liga; + + # >> + lookup loose_greater_greater.liga { + ignore sub greater greater' greater; + ignore sub greater' greater greater; + ignore sub greater' greater equal; + ignore sub greater' greater hyphen; + ignore sub equal greater' greater; + ignore sub slash greater' greater; + ignore sub less greater' greater; + sub SPC greater' by greater_greater.liga; + sub greater' greater by SPC; + } loose_greater_greater.liga; + + # >>> + lookup loose_greater_greater_greater.liga { + ignore sub greater greater' greater greater; + ignore sub greater' greater greater greater; + sub SPC SPC greater' by greater_greater_greater.liga; + sub SPC greater' greater by SPC; + sub greater' greater greater by SPC; + } loose_greater_greater_greater.liga; +} ss07; \ No newline at end of file diff --git a/source/preset-normal.json b/source/preset-normal.json index 5122cea..19358b3 100644 --- a/source/preset-normal.json +++ b/source/preset-normal.json @@ -1,6 +1,6 @@ { "$schema": "./schema.json", - "family_name": "Maple Mono", + "family_name": "Maple Mono Normal", "use_hinted": true, "pool_size": 4, "feature_freeze": { @@ -8,25 +8,21 @@ "cv02": "enable", "cv03": "ignore", "cv04": "ignore", + "cv31": "ignore", + "cv32": "ignore", + "cv33": "enable", + "cv34": "enable", + "cv35": "enable", + "cv36": "enable", "cv98": "ignore", "cv99": "ignore", "ss01": "ignore", "ss02": "ignore", "ss03": "ignore", "ss04": "ignore", - "zero": "ignore" - }, - "feature_freeze_italic": { - "cv01": "ignore", - "cv02": "ignore", - "cv03": "ignore", - "cv04": "ignore", - "cv98": "ignore", - "cv99": "ignore", - "ss01": "enable", - "ss02": "ignore", - "ss03": "ignore", - "ss04": "ignore", + "ss05": "ignore", + "ss06": "enable", + "ss07": "enable", "zero": "ignore" }, "nerd_font": { diff --git a/source/schema.json b/source/schema.json index 442cc29..d8a8547 100644 --- a/source/schema.json +++ b/source/schema.json @@ -24,7 +24,7 @@ "properties": { "cv01": { "type": "string", - "description": "Classic '@', '$', '&', 'Q', '=>', '->'", + "description": "Classic '@', '$', '%', '&', 'Q', '=>', '->'", "enum": [ "ignore", "disable", @@ -51,7 +51,61 @@ }, "cv04": { "type": "string", - "description": "Alternative 'l' (with bottom left bar) and '1' (without bottom bar)", + "description": "Alternative 'l' (with bottom left bar) and '1' (without bottom bar), will be overrided by cv35 in italic style", + "enum": [ + "ignore", + "disable", + "enable" + ] + }, + "cv31": { + "type": "string", + "description": "[Italic Only] Alternative 'a' (with top alarm)", + "enum": [ + "ignore", + "disable", + "enable" + ] + }, + "cv32": { + "type": "string", + "description": "[Italic Only] Alternative 'f' (without bottom tail)", + "enum": [ + "ignore", + "disable", + "enable" + ] + }, + "cv33": { + "type": "string", + "description": "[Italic Only] Alternative 'i' (with bottom left bar) and 'j'", + "enum": [ + "ignore", + "disable", + "enable" + ] + }, + "cv34": { + "type": "string", + "description": "[Italic Only] Alternative 'k' (without center circle)", + "enum": [ + "ignore", + "disable", + "enable" + ] + }, + "cv35": { + "type": "string", + "description": "[Italic Only] Alternative 'l' (without center tail)", + "enum": [ + "ignore", + "disable", + "enable" + ] + }, + "cv36": { + "type": "string", + "description": "[Italic Only] Alternative 'x' (without top and bottom tails)", "enum": [ "ignore", "disable", @@ -60,7 +114,7 @@ }, "cv98": { "type": "string", - "description": "Full width '…'(ellipsis) and '—'(emdash) support for Maple Mono NF CN", + "description": "[CN Only] Full width '…'(ellipsis) and '—'(emdash)", "enum": [ "ignore", "disable", @@ -69,7 +123,7 @@ }, "cv99": { "type": "string", - "description": "Traditional punctuations support for Maple Mono NF CN", + "description": "[CN Only] Traditional punctuations", "enum": [ "ignore", "disable", @@ -78,7 +132,7 @@ }, "ss01": { "type": "string", - "description": "Non-cursive italic style of 'l i j k x'", + "description": "Broken equals ligatures (==, ===, !=, !==, =/=)", "enum": [ "ignore", "disable", @@ -87,7 +141,7 @@ }, "ss02": { "type": "string", - "description": "Disable ligautures on equals like '==', '!=', '<='", + "description": "Broken compare and equal ligatures (<=, >=)", "enum": [ "ignore", "disable", @@ -96,7 +150,7 @@ }, "ss03": { "type": "string", - "description": "Ignore cases on all tags", + "description": "Enable arbitrary tag (allow to use any case letters in all tags)", "enum": [ "ignore", "disable", @@ -105,112 +159,34 @@ }, "ss04": { "type": "string", - "description": "Disable ligatures on '__', '#__', '***' and escape strings", + "description": "Break multiple underscores (__, #__)", "enum": [ "ignore", "disable", "enable" ] }, - "zero": { + "ss05": { "type": "string", - "description": "Dot style '0'", - "enum": [ - "ignore", - "disable", - "enable" - ] - } - } - }, - "feature_freeze_italic": { - "type": "object", - "description": "Freeze some font features (No effect on Variable font) for italic font \n enable: enable font features by default \n disable: remove some font features \n ignore: skip handle target font features", - "properties": { - "cv01": { - "type": "string", - "description": "Classic '@', '$', '&', 'Q', '=>', '->'", + "description": "Thin backslash in escape letters (\\w, \\n, \\r ...)", "enum": [ "ignore", "disable", "enable" ] }, - "cv02": { + "ss06": { "type": "string", - "description": "Alternative 'a' (with top alarm)", + "description": "[Italic Only] Remove connected strokes between italic letters (al, ul, il ...)", "enum": [ "ignore", "disable", "enable" ] }, - "cv03": { + "ss07": { "type": "string", - "description": "Alternative regular 'i' (without bottom left bar)", - "enum": [ - "ignore", - "disable", - "enable" - ] - }, - "cv04": { - "type": "string", - "description": "Alternative 'l' (with bottom left bar) and '1' (without bottom bar)", - "enum": [ - "ignore", - "disable", - "enable" - ] - }, - "cv98": { - "type": "string", - "description": "Full width '…'(ellipsis) and '—'(emdash) support for Maple Mono NF CN", - "enum": [ - "ignore", - "disable", - "enable" - ] - }, - "cv99": { - "type": "string", - "description": "Traditional punctuations support for Maple Mono NF CN", - "enum": [ - "ignore", - "disable", - "enable" - ] - }, - "ss01": { - "type": "string", - "description": "Non-cursive italic style of 'l i j k x'", - "enum": [ - "ignore", - "disable", - "enable" - ] - }, - "ss02": { - "type": "string", - "description": "Disable ligautures on equals like '==', '!=', '<='", - "enum": [ - "ignore", - "disable", - "enable" - ] - }, - "ss03": { - "type": "string", - "description": "Ignore cases on all tags", - "enum": [ - "ignore", - "disable", - "enable" - ] - }, - "ss04": { - "type": "string", - "description": "Disable ligatures on '__', '#__', '***' and escape strings", + "description": "Make space optional in multiple less or greater (<<, >>, <<<, >>>)", "enum": [ "ignore", "disable",