Skip to content

Instantly share code, notes, and snippets.

@kiliman
Last active May 20, 2020 16:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kiliman/5c9844ef91602ea165b86f17b04e6270 to your computer and use it in GitHub Desktop.
Save kiliman/5c9844ef91602ea165b86f17b04e6270 to your computer and use it in GitHub Desktop.
`calt` table generated by my Python script (output identical to FiraCodes Clojure script)
lookup bar_bar_bar_greater {
ignore sub bar bar' bar bar greater;
ignore sub bar' bar bar greater greater;
sub bar.spacer bar.spacer bar.spacer greater' by bar_bar_bar_greater.liga;
sub bar.spacer bar.spacer bar' greater by bar.spacer;
sub bar.spacer bar' bar greater by bar.spacer;
sub bar' bar bar greater by bar.spacer;
} bar_bar_bar_greater;
lookup less_bar_bar_bar {
ignore sub less less' bar bar bar;
ignore sub less' bar bar bar bar;
sub less.spacer bar.spacer bar.spacer bar' by less_bar_bar_bar.liga;
sub less.spacer bar.spacer bar' bar by bar.spacer;
sub less.spacer bar' bar bar by bar.spacer;
sub less' bar bar bar by less.spacer;
} less_bar_bar_bar;
lookup less_exclam_hyphen_hyphen {
ignore sub less less' exclam hyphen hyphen;
ignore sub less' exclam hyphen hyphen hyphen;
ignore sub parenleft question less' exclam hyphen hyphen;
sub less.spacer exclam.spacer hyphen.spacer hyphen' by less_exclam_hyphen_hyphen.liga;
sub less.spacer exclam.spacer hyphen' hyphen by hyphen.spacer;
sub less.spacer exclam' hyphen hyphen by exclam.spacer;
sub less' exclam hyphen hyphen by less.spacer;
} less_exclam_hyphen_hyphen;
lookup numbersign_numbersign_numbersign_numbersign {
ignore sub numbersign numbersign' numbersign numbersign numbersign;
ignore sub numbersign' numbersign numbersign numbersign numbersign;
sub numbersign.spacer numbersign.spacer numbersign.spacer numbersign' by numbersign_numbersign_numbersign_numbersign.liga;
sub numbersign.spacer numbersign.spacer numbersign' numbersign by numbersign.spacer;
sub numbersign.spacer numbersign' numbersign numbersign by numbersign.spacer;
sub numbersign' numbersign numbersign numbersign by numbersign.spacer;
} numbersign_numbersign_numbersign_numbersign;
lookup asciitilde_asciitilde_greater {
ignore sub asciitilde asciitilde' asciitilde greater;
ignore sub asciitilde' asciitilde greater greater;
sub asciitilde.spacer asciitilde.spacer greater' by asciitilde_asciitilde_greater.liga;
sub asciitilde.spacer asciitilde' greater by asciitilde.spacer;
sub asciitilde' asciitilde greater by asciitilde.spacer;
} asciitilde_asciitilde_greater;
lookup asterisk_asterisk_asterisk {
ignore sub asterisk asterisk' asterisk asterisk;
ignore sub asterisk' asterisk asterisk asterisk;
ignore sub slash asterisk' asterisk asterisk;
ignore sub asterisk' asterisk asterisk slash;
sub asterisk.spacer asterisk.spacer asterisk' by asterisk_asterisk_asterisk.liga;
sub asterisk.spacer asterisk' asterisk by asterisk.spacer;
sub asterisk' asterisk asterisk by asterisk.spacer;
} asterisk_asterisk_asterisk;
lookup bar_bar_greater {
ignore sub bar bar' bar greater;
ignore sub bar' bar greater greater;
ignore sub less bar' bar greater;
sub bar.spacer bar.spacer greater' by bar_bar_greater.liga;
sub bar.spacer bar' greater by bar.spacer;
sub bar' bar greater by bar.spacer;
} bar_bar_greater;
lookup colon_colon_colon {
ignore sub colon colon' colon colon;
ignore sub colon' colon colon colon;
ignore sub parenleft question colon' colon colon;
sub colon.spacer colon.spacer colon' by colon_colon_colon.liga;
sub colon.spacer colon' colon by colon.spacer;
sub colon' colon colon by colon.spacer;
} colon_colon_colon;
lookup colon_colon_equal {
ignore sub colon colon' colon equal;
ignore sub colon' colon equal equal;
ignore sub parenleft question colon' colon equal;
sub colon.spacer colon.spacer equal' by colon_colon_equal.liga;
sub colon.spacer colon' equal by colon.spacer;
sub colon' colon equal by colon.spacer;
} colon_colon_equal;
lookup equal_equal_equal {
ignore sub equal equal' equal equal;
ignore sub equal' equal equal equal;
ignore sub parenleft question equal' equal equal;
ignore sub parenleft question less equal' equal equal;
ignore sub less question equal' equal equal;
ignore sub [bracketleft less greater bar slash] equal' equal equal;
ignore sub equal' equal equal [bracketright less greater bar slash];
sub equal.spacer equal.spacer equal' by equal_equal_equal.liga;
sub equal.spacer equal' equal by equal.spacer;
sub equal' equal equal by equal.spacer;
} equal_equal_equal;
lookup exclam_equal_equal {
ignore sub exclam exclam' equal equal;
ignore sub exclam' equal equal equal;
ignore sub parenleft question exclam' equal equal;
ignore sub parenleft question less exclam' equal equal;
sub exclam.spacer equal.spacer equal' by exclam_equal_equal.liga;
sub exclam.spacer equal' equal by equal.spacer;
sub exclam' equal equal by exclam.spacer;
} exclam_equal_equal;
lookup exclam_exclam_period {
ignore sub exclam exclam' exclam period;
ignore sub exclam' exclam period period;
ignore sub parenleft question exclam' exclam period;
ignore sub parenleft question less exclam' exclam period;
sub exclam.spacer exclam.spacer period' by exclam_exclam_period.liga;
sub exclam.spacer exclam' period by exclam.spacer;
sub exclam' exclam period by exclam.spacer;
} exclam_exclam_period;
lookup greater_greater_greater {
ignore sub greater greater' greater greater;
ignore sub greater' greater greater greater;
ignore sub [asterisk plus dollar] greater' greater greater;
sub greater.spacer greater.spacer greater' by greater_greater_greater.liga;
sub greater.spacer greater' greater by greater.spacer;
sub greater' greater greater by greater.spacer;
} greater_greater_greater;
lookup hyphen_hyphen_hyphen {
ignore sub hyphen hyphen' hyphen hyphen;
ignore sub hyphen' hyphen hyphen hyphen;
ignore sub [bracketleft less greater bar] hyphen' hyphen hyphen;
ignore sub hyphen' hyphen hyphen [bracketright less greater bar];
sub hyphen.spacer hyphen.spacer hyphen' by hyphen_hyphen_hyphen.liga;
sub hyphen.spacer hyphen' hyphen by hyphen.spacer;
sub hyphen' hyphen hyphen by hyphen.spacer;
} hyphen_hyphen_hyphen;
lookup less_asciitilde_asciitilde {
ignore sub less less' asciitilde asciitilde;
ignore sub less' asciitilde asciitilde asciitilde;
sub less.spacer asciitilde.spacer asciitilde' by less_asciitilde_asciitilde.liga;
sub less.spacer asciitilde' asciitilde by asciitilde.spacer;
sub less' asciitilde asciitilde by less.spacer;
} less_asciitilde_asciitilde;
lookup less_asciitilde_greater {
ignore sub less less' asciitilde greater;
ignore sub less' asciitilde greater greater;
sub less.spacer asciitilde.spacer greater' by less_asciitilde_greater.liga;
sub less.spacer asciitilde' greater by asciitilde.spacer;
sub less' asciitilde greater by less.spacer;
} less_asciitilde_greater;
lookup less_asterisk_greater {
sub less.spacer asterisk.spacer greater' by less_asterisk_greater.liga;
sub less.spacer asterisk' greater by asterisk.spacer;
sub less' asterisk greater by less.spacer;
} less_asterisk_greater;
lookup less_bar_bar {
ignore sub less less' bar bar;
ignore sub less' bar bar bar;
ignore sub less' bar bar greater;
sub less.spacer bar.spacer bar' by less_bar_bar.liga;
sub less.spacer bar' bar by bar.spacer;
sub less' bar bar by less.spacer;
} less_bar_bar;
lookup less_bar_greater {
ignore sub less less' bar greater;
ignore sub less' bar greater greater;
sub less.spacer bar.spacer greater' by less_bar_greater.liga;
sub less.spacer bar' greater by bar.spacer;
sub less' bar greater by less.spacer;
} less_bar_greater;
lookup less_dollar_greater {
sub less.spacer dollar.spacer greater' by less_dollar_greater.liga;
sub less.spacer dollar' greater by dollar.spacer;
sub less' dollar greater by less.spacer;
} less_dollar_greater;
lookup less_less_less {
ignore sub less less' less less;
ignore sub less' less less less;
ignore sub less' less less [asterisk plus dollar];
sub less.spacer less.spacer less' by less_less_less.liga;
sub less.spacer less' less by less.spacer;
sub less' less less by less.spacer;
} less_less_less;
lookup less_plus_greater {
sub less.spacer plus.spacer greater' by less_plus_greater.liga;
sub less.spacer plus' greater by plus.spacer;
sub less' plus greater by less.spacer;
} less_plus_greater;
lookup less_slash_greater {
ignore sub less less' slash greater;
ignore sub less' slash greater greater;
sub less.spacer slash.spacer greater' by less_slash_greater.liga;
sub less.spacer slash' greater by slash.spacer;
sub less' slash greater by less.spacer;
} less_slash_greater;
lookup numbersign_numbersign_numbersign {
ignore sub numbersign numbersign' numbersign numbersign;
ignore sub numbersign' numbersign numbersign numbersign;
sub numbersign.spacer numbersign.spacer numbersign' by numbersign_numbersign_numbersign.liga;
sub numbersign.spacer numbersign' numbersign by numbersign.spacer;
sub numbersign' numbersign numbersign by numbersign.spacer;
} numbersign_numbersign_numbersign;
lookup numbersign_underscore_parenleft {
ignore sub numbersign numbersign' underscore parenleft;
ignore sub numbersign' underscore parenleft parenleft;
sub numbersign.spacer underscore.spacer parenleft' by numbersign_underscore_parenleft.liga;
sub numbersign.spacer underscore' parenleft by underscore.spacer;
sub numbersign' underscore parenleft by numbersign.spacer;
} numbersign_underscore_parenleft;
lookup period_period_equal {
ignore sub period period' period equal;
ignore sub period' period equal equal;
sub period.spacer period.spacer equal' by period_period_equal.liga;
sub period.spacer period' equal by period.spacer;
sub period' period equal by period.spacer;
} period_period_equal;
lookup period_period_less {
ignore sub period period' period less;
ignore sub period' period less less;
sub period.spacer period.spacer less' by period_period_less.liga;
sub period.spacer period' less by period.spacer;
sub period' period less by period.spacer;
} period_period_less;
lookup period_period_period {
ignore sub period period' period period;
ignore sub period' period period period;
sub period.spacer period.spacer period' by period_period_period.liga;
sub period.spacer period' period by period.spacer;
sub period' period period by period.spacer;
} period_period_period;
lookup plus_plus_plus {
ignore sub plus plus' plus plus;
ignore sub plus' plus plus plus;
sub plus.spacer plus.spacer plus' by plus_plus_plus.liga;
sub plus.spacer plus' plus by plus.spacer;
sub plus' plus plus by plus.spacer;
} plus_plus_plus;
lookup slash_slash_slash {
ignore sub slash slash' slash slash;
ignore sub slash' slash slash slash;
sub slash.spacer slash.spacer slash' by slash_slash_slash.liga;
sub slash.spacer slash' slash by slash.spacer;
sub slash' slash slash by slash.spacer;
} slash_slash_slash;
lookup w_w_w {
ignore sub w w' w w;
ignore sub w' w w w;
sub w.spacer w.spacer w' by w_w_w.liga;
sub w.spacer w' w by w.spacer;
sub w' w w by w.spacer;
} w_w_w;
lookup ampersand_ampersand {
ignore sub ampersand ampersand' ampersand;
ignore sub ampersand' ampersand ampersand;
sub ampersand.spacer ampersand' by ampersand_ampersand.liga;
sub ampersand' ampersand by ampersand.spacer;
} ampersand_ampersand;
lookup asciicircum_equal {
ignore sub asciicircum asciicircum' equal;
ignore sub asciicircum' equal equal;
sub asciicircum.spacer equal' by asciicircum_equal.liga;
sub asciicircum' equal by asciicircum.spacer;
} asciicircum_equal;
lookup asciitilde_asciitilde {
ignore sub asciitilde asciitilde' asciitilde;
ignore sub asciitilde' asciitilde asciitilde;
sub asciitilde.spacer asciitilde' by asciitilde_asciitilde.liga;
sub asciitilde' asciitilde by asciitilde.spacer;
} asciitilde_asciitilde;
lookup asciitilde_at {
ignore sub asciitilde asciitilde' at;
ignore sub asciitilde' at at;
sub asciitilde.spacer at' by asciitilde_at.liga;
sub asciitilde' at by asciitilde.spacer;
} asciitilde_at;
lookup asciitilde_greater {
ignore sub asciitilde asciitilde' greater;
ignore sub asciitilde' greater greater;
sub asciitilde.spacer greater' by asciitilde_greater.liga;
sub asciitilde' greater by asciitilde.spacer;
} asciitilde_greater;
lookup asciitilde_hyphen {
ignore sub asciitilde asciitilde' hyphen;
ignore sub asciitilde' hyphen hyphen;
sub asciitilde.spacer hyphen' by asciitilde_hyphen.liga;
sub asciitilde' hyphen by asciitilde.spacer;
} asciitilde_hyphen;
lookup asterisk_asterisk {
ignore sub asterisk asterisk' asterisk;
ignore sub asterisk' asterisk asterisk;
ignore sub slash asterisk' asterisk;
ignore sub asterisk' asterisk slash;
sub asterisk.spacer asterisk' by asterisk_asterisk.liga;
sub asterisk' asterisk by asterisk.spacer;
} asterisk_asterisk;
lookup asterisk_greater {
ignore sub asterisk asterisk' greater;
ignore sub asterisk' greater greater;
sub asterisk.spacer greater' by asterisk_greater.liga;
sub asterisk' greater by asterisk.spacer;
} asterisk_greater;
lookup asterisk_slash {
ignore sub asterisk asterisk' slash;
ignore sub asterisk' slash slash;
ignore sub slash asterisk' slash;
ignore sub asterisk' slash asterisk;
sub asterisk.spacer slash' by asterisk_slash.liga;
sub asterisk' slash by asterisk.spacer;
} asterisk_slash;
lookup bar_bar {
ignore sub bar bar' bar;
ignore sub bar' bar bar;
ignore sub [hyphen equal] bar' bar;
ignore sub bar' bar [hyphen equal];
sub bar.spacer bar' by bar_bar.liga;
sub bar' bar by bar.spacer;
} bar_bar;
lookup bar_braceright {
ignore sub bar bar' braceright;
ignore sub bar' braceright braceright;
ignore sub braceleft bar' braceright;
sub bar.spacer braceright' by bar_braceright.liga;
sub bar' braceright by bar.spacer;
} bar_braceright;
lookup bar_bracketright {
ignore sub bar bar' bracketright;
ignore sub bar' bracketright bracketright;
ignore sub bracketleft bar' bracketright;
sub bar.spacer bracketright' by bar_bracketright.liga;
sub bar' bracketright by bar.spacer;
} bar_bracketright;
lookup bar_greater {
ignore sub bar bar' greater;
ignore sub bar' greater greater;
sub bar.spacer greater' by bar_greater.liga;
sub bar' greater by bar.spacer;
} bar_greater;
lookup braceleft_bar {
ignore sub braceleft braceleft' bar;
ignore sub braceleft' bar bar;
ignore sub braceleft' bar braceright;
sub braceleft.spacer bar' by braceleft_bar.liga;
sub braceleft' bar by braceleft.spacer;
} braceleft_bar;
lookup bracketleft_bar {
ignore sub bracketleft bracketleft' bar;
ignore sub bracketleft' bar bar;
ignore sub bracketleft' bar bracketright;
sub bracketleft.spacer bar' by bracketleft_bar.liga;
sub bracketleft' bar by bracketleft.spacer;
} bracketleft_bar;
lookup bracketright_numbersign {
ignore sub bracketright bracketright' numbersign;
ignore sub bracketright' numbersign numbersign;
sub bracketright.spacer numbersign' by bracketright_numbersign.liga;
sub bracketright' numbersign by bracketright.spacer;
} bracketright_numbersign;
lookup colon_colon {
ignore sub colon colon' colon;
ignore sub colon' colon colon;
ignore sub parenleft question colon' colon;
sub colon.spacer colon' by colon_colon.liga;
sub colon' colon by colon.spacer;
} colon_colon;
lookup colon_equal {
ignore sub colon colon' equal;
ignore sub colon' equal equal;
ignore sub parenleft question colon' equal;
ignore sub equal colon' equal;
sub colon.spacer equal' by colon_equal.liga;
sub colon' equal by colon.spacer;
} colon_equal;
lookup colon_greater {
ignore sub colon colon' greater;
ignore sub colon' greater greater;
ignore sub parenleft question colon' greater;
ignore sub colon' greater equal;
sub colon.spacer greater' by colon_greater.liga;
sub colon' greater by colon.spacer;
} colon_greater;
lookup colon_less {
ignore sub colon colon' less;
ignore sub colon' less less;
ignore sub parenleft question colon' less;
sub colon.spacer less' by colon_less.liga;
sub colon' less by colon.spacer;
} colon_less;
lookup dollar_greater {
ignore sub dollar dollar' greater;
ignore sub dollar' greater greater;
sub dollar.spacer greater' by dollar_greater.liga;
sub dollar' greater by dollar.spacer;
} dollar_greater;
lookup equal_equal {
ignore sub equal equal' equal;
ignore sub equal' equal equal;
ignore sub parenleft question equal' equal;
ignore sub parenleft question less equal' equal;
ignore sub less question equal' equal;
ignore sub [bracketleft less greater bar slash] equal' equal;
ignore sub equal' equal [bracketright less greater bar slash] ;
sub equal.spacer equal' by equal_equal.liga;
sub equal' equal by equal.spacer;
} equal_equal;
lookup exclam_equal {
ignore sub exclam exclam' equal;
ignore sub exclam' equal equal;
ignore sub parenleft question exclam' equal;
ignore sub parenleft question less exclam' equal;
ignore sub equal exclam' equal;
sub exclam.spacer equal' by exclam_equal.liga;
sub exclam' equal by exclam.spacer;
} exclam_equal;
lookup exclam_exclam {
ignore sub exclam exclam' exclam;
ignore sub exclam' exclam exclam;
ignore sub parenleft question exclam' exclam;
ignore sub parenleft question less exclam' exclam;
sub exclam.spacer exclam' by exclam_exclam.liga;
sub exclam' exclam by exclam.spacer;
} exclam_exclam;
lookup greater_colon {
ignore sub greater greater' colon;
ignore sub greater' colon colon;
sub greater.spacer colon' by greater_colon.liga;
sub greater' colon by greater.spacer;
} greater_colon;
lookup greater_equal {
ignore sub greater greater' equal;
ignore sub greater' equal equal;
ignore sub greater' equal [less greater bar colon exclam slash];
sub greater.spacer equal' by greater_equal.liga;
sub greater' equal by greater.spacer;
} greater_equal;
lookup greater_greater {
ignore sub greater greater' greater;
ignore sub greater' greater greater;
ignore sub [asterisk plus dollar hyphen equal] greater' greater;
ignore sub greater' greater [hyphen equal];
sub greater.spacer greater' by greater_greater.liga;
sub greater' greater by greater.spacer;
} greater_greater;
lookup hyphen_asciitilde {
ignore sub hyphen hyphen' asciitilde;
ignore sub hyphen' asciitilde asciitilde;
sub hyphen.spacer asciitilde' by hyphen_asciitilde.liga;
sub hyphen' asciitilde by hyphen.spacer;
} hyphen_asciitilde;
lookup hyphen_hyphen {
ignore sub hyphen hyphen' hyphen;
ignore sub hyphen' hyphen hyphen;
ignore sub [bracketleft less greater bar] hyphen' hyphen;
ignore sub hyphen' hyphen [bracketright less greater bar];
sub hyphen.spacer hyphen' by hyphen_hyphen.liga;
sub hyphen' hyphen by hyphen.spacer;
} hyphen_hyphen;
lookup less_asciitilde {
ignore sub less less' asciitilde;
ignore sub less' asciitilde asciitilde;
sub less.spacer asciitilde' by less_asciitilde.liga;
sub less' asciitilde by less.spacer;
} less_asciitilde;
lookup less_asterisk {
ignore sub less less' asterisk;
ignore sub less' asterisk asterisk;
sub less.spacer asterisk' by less_asterisk.liga;
sub less' asterisk by less.spacer;
} less_asterisk;
lookup less_bar {
ignore sub less less' bar;
ignore sub less' bar bar;
sub less.spacer bar' by less_bar.liga;
sub less' bar by less.spacer;
} less_bar;
lookup less_colon {
ignore sub less less' colon;
ignore sub less' colon colon;
sub less.spacer colon' by less_colon.liga;
sub less' colon by less.spacer;
} less_colon;
lookup less_dollar {
ignore sub less less' dollar;
ignore sub less' dollar dollar;
sub less.spacer dollar' by less_dollar.liga;
sub less' dollar by less.spacer;
} less_dollar;
lookup less_equal {
ignore sub less less' equal;
ignore sub less' equal equal;
ignore sub parenleft question less' equal;
ignore sub less' equal [less greater bar colon exclam slash];
sub less.spacer equal' by less_equal.liga;
sub less' equal by less.spacer;
} less_equal;
lookup less_greater {
ignore sub less less' greater;
ignore sub less' greater greater;
sub less.spacer greater' by less_greater.liga;
sub less' greater by less.spacer;
} less_greater;
lookup less_less {
ignore sub less less' less;
ignore sub less' less less;
ignore sub [hyphen equal] less' less;
ignore sub less' less [asterisk plus dollar hyphen equal];
sub less.spacer less' by less_less.liga;
sub less' less by less.spacer;
} less_less;
lookup less_plus {
ignore sub less less' plus;
ignore sub less' plus plus;
sub less.spacer plus' by less_plus.liga;
sub less' plus by less.spacer;
} less_plus;
lookup less_slash {
ignore sub less less' slash;
ignore sub less' slash slash;
sub less.spacer slash' by less_slash.liga;
sub less' slash by less.spacer;
} less_slash;
lookup numbersign_braceleft {
ignore sub numbersign numbersign' braceleft;
ignore sub numbersign' braceleft braceleft;
sub numbersign.spacer braceleft' by numbersign_braceleft.liga;
sub numbersign' braceleft by numbersign.spacer;
} numbersign_braceleft;
lookup numbersign_bracketleft {
ignore sub numbersign numbersign' bracketleft;
ignore sub numbersign' bracketleft bracketleft;
sub numbersign.spacer bracketleft' by numbersign_bracketleft.liga;
sub numbersign' bracketleft by numbersign.spacer;
} numbersign_bracketleft;
lookup numbersign_colon {
ignore sub numbersign numbersign' colon;
ignore sub numbersign' colon colon;
sub numbersign.spacer colon' by numbersign_colon.liga;
sub numbersign' colon by numbersign.spacer;
} numbersign_colon;
lookup numbersign_equal {
ignore sub numbersign numbersign' equal;
ignore sub numbersign' equal equal;
sub numbersign.spacer equal' by numbersign_equal.liga;
sub numbersign' equal by numbersign.spacer;
} numbersign_equal;
lookup numbersign_exclam {
ignore sub numbersign numbersign' exclam;
ignore sub numbersign' exclam exclam;
sub numbersign.spacer exclam' by numbersign_exclam.liga;
sub numbersign' exclam by numbersign.spacer;
} numbersign_exclam;
lookup numbersign_numbersign {
ignore sub numbersign numbersign' numbersign;
ignore sub numbersign' numbersign numbersign;
sub numbersign.spacer numbersign' by numbersign_numbersign.liga;
sub numbersign' numbersign by numbersign.spacer;
} numbersign_numbersign;
lookup numbersign_parenleft {
ignore sub numbersign numbersign' parenleft;
ignore sub numbersign' parenleft parenleft;
sub numbersign.spacer parenleft' by numbersign_parenleft.liga;
sub numbersign' parenleft by numbersign.spacer;
} numbersign_parenleft;
lookup numbersign_question {
ignore sub numbersign numbersign' question;
ignore sub numbersign' question question;
sub numbersign.spacer question' by numbersign_question.liga;
sub numbersign' question by numbersign.spacer;
} numbersign_question;
lookup numbersign_underscore {
ignore sub numbersign numbersign' underscore;
ignore sub numbersign' underscore underscore;
sub numbersign.spacer underscore' by numbersign_underscore.liga;
sub numbersign' underscore by numbersign.spacer;
} numbersign_underscore;
lookup percent_percent {
ignore sub percent percent' percent;
ignore sub percent' percent percent;
sub percent.spacer percent' by percent_percent.liga;
sub percent' percent by percent.spacer;
} percent_percent;
lookup period_equal {
ignore sub period period' equal;
ignore sub period' equal equal;
sub period.spacer equal' by period_equal.liga;
sub period' equal by period.spacer;
} period_equal;
lookup period_hyphen {
ignore sub period period' hyphen;
ignore sub period' hyphen hyphen;
sub period.spacer hyphen' by period_hyphen.liga;
sub period' hyphen by period.spacer;
} period_hyphen;
lookup period_period {
ignore sub period period' period;
ignore sub period' period period;
sub period.spacer period' by period_period.liga;
sub period' period by period.spacer;
} period_period;
lookup period_question {
ignore sub period period' question;
ignore sub period' question question;
sub period.spacer question' by period_question.liga;
sub period' question by period.spacer;
} period_question;
lookup plus_greater {
ignore sub plus plus' greater;
ignore sub plus' greater greater;
sub plus.spacer greater' by plus_greater.liga;
sub plus' greater by plus.spacer;
} plus_greater;
lookup plus_plus {
ignore sub plus plus' plus;
ignore sub plus' plus plus;
sub plus.spacer plus' by plus_plus.liga;
sub plus' plus by plus.spacer;
} plus_plus;
lookup question_equal {
ignore sub question question' equal;
ignore sub question' equal equal;
ignore sub parenleft question' equal;
ignore sub less question' equal;
sub question.spacer equal' by question_equal.liga;
sub question' equal by question.spacer;
} question_equal;
lookup question_period {
ignore sub question question' period;
ignore sub question' period period;
sub question.spacer period' by question_period.liga;
sub question' period by question.spacer;
} question_period;
lookup question_question {
ignore sub question question' question;
ignore sub question' question question;
sub question.spacer question' by question_question.liga;
sub question' question by question.spacer;
} question_question;
lookup semicolon_semicolon {
ignore sub semicolon semicolon' semicolon;
ignore sub semicolon' semicolon semicolon;
sub semicolon.spacer semicolon' by semicolon_semicolon.liga;
sub semicolon' semicolon by semicolon.spacer;
} semicolon_semicolon;
lookup slash_asterisk {
ignore sub slash slash' asterisk;
ignore sub slash' asterisk asterisk;
ignore sub slash' asterisk slash;
ignore sub asterisk slash' asterisk;
sub slash.spacer asterisk' by slash_asterisk.liga;
sub slash' asterisk by slash.spacer;
} slash_asterisk;
lookup slash_greater {
ignore sub slash slash' greater;
ignore sub slash' greater greater;
sub slash.spacer greater' by slash_greater.liga;
sub slash' greater by slash.spacer;
} slash_greater;
lookup slash_slash {
ignore sub slash slash' slash;
ignore sub slash' slash slash;
sub slash.spacer slash' by slash_slash.liga;
sub slash' slash by slash.spacer;
} slash_slash;
# No ligature should follow those sequences
ignore_prefixes = [
["parenleft", "question", "colon"],
# #578 #624 Regexp lookahead/lookbehind
["parenleft", "question", "equal"],
["parenleft", "question", "less", "equal"],
["parenleft", "question", "exclam"],
["parenleft", "question", "less", "exclam"],
# #850 PHP <?=
["less", "question", "equal"],
]
# ignore sub parenleft question less' exclam hyphen hyphen;
def gen_ignore_prefixes(liga):
prefixes = []
for prefix in ignore_prefixes:
print(prefix)
# try to match last N glyphs in `prefix` with N first in `liga`
for N in range(len(prefix), 0, -1):
print("N={N} prefix={prefix} liga={liga}".format(N = N, prefix = prefix[-N:], liga=liga[:N]))
if prefix[-N:] == liga[:N]:
print("!MATCH at {N}".format(N = N))
prefixes.append(
" ignore sub "
+ " ".join(prefix[0:-N])
+ " "
+ liga[0]
+ "' "
+ " ".join(liga[1:])
+ ";\n"
)
break
return "".join(prefixes)
ignores = {
"slash_asterisk": [
" ignore sub slash' asterisk slash;\n",
" ignore sub asterisk slash' asterisk;\n",
],
"asterisk_slash": [
" ignore sub slash asterisk' slash;\n",
" ignore sub asterisk' slash asterisk;\n",
],
"asterisk_asterisk": [
" ignore sub slash asterisk' asterisk;\n",
" ignore sub asterisk' asterisk slash;\n",
],
"asterisk_asterisk_asterisk": [
" ignore sub slash asterisk' asterisk asterisk;\n",
" ignore sub asterisk' asterisk asterisk slash;\n",
],
# #621 <||>
"less_bar_bar": [" ignore sub less' bar bar greater;\n"],
"bar_bar_greater": [" ignore sub less bar' bar greater;\n"],
# #574 :>=
"colon_greater": [" ignore sub colon' greater equal;\n"],
# #346 =:=
"colon_equal": [" ignore sub equal colon' equal;\n"],
# #346 =!=
"exclam_equal": [" ignore sub equal exclam' equal;\n"],
# #346 <=< <=> <=| <=: <=! <=/
"less_equal": [" ignore sub less' equal [less greater bar colon exclam slash];\n"],
# #548 >=<
# #346 >=> >=< >=| >=: >=! >=/
"greater_equal": [
" ignore sub greater' equal [less greater bar colon exclam slash];\n"
],
# #593 {|}
"braceleft_bar": [" ignore sub braceleft' bar braceright;\n"],
"bar_braceright": [" ignore sub braceleft bar' braceright;\n"],
# #593 |:
"bracketleft_bar": [" ignore sub bracketleft' bar bracketright;\n"],
"bar_bracketright": [" ignore sub bracketleft bar' bracketright;\n"],
# #410 <*>> <+>> <$>>
# #346 >>->> >>=>>
"greater_greater": [
" ignore sub [asterisk plus dollar hyphen equal] greater' greater;\n"
" ignore sub greater' greater [hyphen equal];\n"
],
# #410 <*>>> <+>>> <$>>>
# #346 >>>->>> >>>=>>>
"greater_greater_greater": [
" ignore sub [asterisk plus dollar] greater' greater greater;\n"
],
# #410 <<*> <<+> <<$>
# #346 <<-<< <<=<<
"less_less": [
" ignore sub [hyphen equal] less' less;\n"
" ignore sub less' less [asterisk plus dollar hyphen equal];\n"
],
# #410 <<<*> <<<+> <<<$>
"less_less_less": [" ignore sub less' less less [asterisk plus dollar];\n"],
# #968 ==
# #346 <==> >==< |==| /==/
"equal_equal": [
" ignore sub [bracketleft less greater bar slash] equal' equal;\n"
" ignore sub equal' equal [bracketright less greater bar slash] ;\n"
],
# #968 ===
# #346 <===> >===< |===| /===/
"equal_equal_equal": [
" ignore sub [bracketleft less greater bar slash] equal' equal equal;\n"
" ignore sub equal' equal equal [bracketright less greater bar slash];\n"
],
# #968 --
# #346 <--> >--< |--|
"hyphen_hyphen": [
" ignore sub [bracketleft less greater bar] hyphen' hyphen;\n"
" ignore sub hyphen' hyphen [bracketright less greater bar];\n"
],
# #968 ---
# #346 <---> >---< |---|
"hyphen_hyphen_hyphen": [
" ignore sub [bracketleft less greater bar] hyphen' hyphen hyphen;\n"
" ignore sub hyphen' hyphen hyphen [bracketright less greater bar];\n"
],
# #346 ||-|| ||=||
"bar_bar": [
" ignore sub [hyphen equal] bar' bar;\n"
" ignore sub bar' bar [hyphen equal];\n"
],
}
def gettemplate(ligas):
count = len(ligas)
if count == 2:
template = """
lookup 1_2 {
__ignore__
sub 1.spacer 2' by 1_2.liga;
sub 1' 2 by 1.spacer;
} 1_2;
"""
elif count == 3:
template = """
lookup 1_2_3 {
__ignore__
sub 1.spacer 2.spacer 3' by 1_2_3.liga;
sub 1.spacer 2' 3 by 2.spacer;
sub 1' 2 3 by 1.spacer;
} 1_2_3;
"""
elif count == 4:
template = """
lookup 1_2_3_4 {
__ignore__
sub 1.spacer 2.spacer 3.spacer 4' by 1_2_3_4.liga;
sub 1.spacer 2.spacer 3' 4 by 3.spacer;
sub 1.spacer 2' 3 4 by 2.spacer;
sub 1' 2 3 4 by 1.spacer;
} 1_2_3_4;
"""
elif count == 5:
template = """
lookup 1_2_3_4_5 {
__ignore__
sub 1.spacer 2.spacer 3.spacer 4.spacer 5' by 1_2_3_4_5.liga;
sub 1.spacer 2.spacer 3.spacer 4' 5 by 4.spacer;
sub 1.spacer 2.spacer 3' 4 5 by 3.spacer;
sub 1.spacer 2' 3 4 5 by 2.spacer;
sub 1' 2 3 4 5 by 1.spacer;
} 1_2_3_4_5;
"""
return template
# DO NOT generate ignores at all
def skipignores(ligas):
_skipignores = [
["less", "asterisk", "greater"],
["less", "plus", "greater"],
["less", "dollar", "greater"],
]
return len(list(filter(lambda lig: lig == ligas, _skipignores))) > 0
def getignore(liga):
if skipignores(liga):
return ""
template1 = " ignore sub 1 1'"
template2 = " ignore sub 1'"
for i in range(2, len(liga) + 1):
template1 = template1 + " " + str(i)
template2 = template2 + " " + str(i)
template1 = template1 + ";\n"
template2 = template2 + " " + str(len(liga)) + ";\n"
# get ignore from dict
glyph = "_".join(liga)
ignore = ignores.get(glyph)
if ignore != None:
ignore = "".join(ignore)
else:
ignore = ""
return template1 + template2 + gen_ignore_prefixes(liga) + ignore
def replacerule(ligas, template, ignore):
rule = template.replace("__ignore__\n", ignore)
for i in range(0, len(ligas)):
rule = rule.replace(str(i + 1), ligas[i])
return rule
_manual = [
["slash", "backslash"],
["backslash", "slash"],
]
def manual(liga):
return len(list(filter(lambda lig: lig == liga, _manual))) > 0
def liga_rule(liga):
template = gettemplate(liga)
ignore = getignore(liga)
rule = replacerule(liga, template, ignore)
return rule
# sort by len of ligs (longest to shortest)
# followed alphabettically (ascending order)
def compare_ligas(l1, l2):
len1 = len(l1)
len2 = len(l2)
if len1 > len2:
return -1
elif len1 < len2:
return 1
# same length
elif l1 < l2:
return -1
elif l1 > l2:
return 1
else:
return 0
def replace_calt(ligas):
l = list(filter(lambda lig: manual(lig) == False, ligas))
l.sort(key=lambda item: [-len(item), "_".join(item)])
rules = []
for liga in l:
rules.append(liga_rule(liga))
return "".join(rules)
ligas = [
["slash", "backslash"],
["hyphen", "hyphen"],
["greater", "equal"],
["backslash", "slash"],
["greater", "equal", "less"],
["less", "exclam", "hyphen", "hyphen"],
]
def run():
with open("glyphs.txt", "r") as f:
glyphs = f.readlines()
ligas = list(map(lambda glyph: glyph.replace(".liga\n", "").split("_"), glyphs))
print(ligas)
calt = replace_calt(ligas)
with open("calt2.fea", "w") as f:
print(calt)
f.write(calt)
debug = False
#debug = True
if debug:
print(replace_calt([["colon", "colon", "colon"]]))
else:
run()
# print(ligarule(["hyphen", "hyphen"]))
# print(ligarule(["greater", "equal"]))
# print(ligarule(["greater", "equal", "less"]))
# print(ligarule(["less", "asterisk", "greater"]))
# print(ligarule(["less", "exclam", "hyphen", "hyphen"]))
# print(ligarule(["numbersign", "numbersign", "numbersign", "numbersign", "numbersign"]))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment