Fix operator centering chain propagation under Apple platform (#768).

This commit is contained in:
be5invis 2020-12-06 15:51:51 -08:00
parent f610b82f4d
commit 1f7720c17e
2 changed files with 45 additions and 58 deletions

1
changes/4.0.3.md Normal file
View file

@ -0,0 +1 @@
* Fix operator centering chain propagation under Apple platform (#768).

View file

@ -104,16 +104,25 @@ define [buildLigationsImpl sink para featureName mappedFeature rankedLookups] :
set lookupRank : lookupRank + 1
do "Operator centering"
define [centerAsterisk] : {'asterisk'} ~> {'asterisk/lowered'}
define [centerColon] : {'colon' 'colon.mid'} ~> {'colon.mid' 'colon.mid'}
define [centerCaret] : {'asciiCaret'} ~> {'asciiCaret.low'}
define [centerTilde] : {'asciiTilde'} ~> {'asciiTilde.low'}
define [centerPeriod] : {'period'} ~> {'period.mid'}
define [deCenterPeriod] : {'period.mid'} ~> {'period'}
define [centerAsterisk] : {'asterisk'} ~> {'asterisk/lowered'}
define [centerColon] : {'colon'} ~> {'colon.mid'}
define [centerCaret] : {'asciiCaret'} ~> {'asciiCaret.low'}
define [centerTilde] : {'asciiTilde'} ~> {'asciiTilde.low'}
define [centerPeriod] : {'period'} ~> {'period.mid'}
define [deCenterPeriod] : {'period.mid'} ~> {'period'}
define centerizeGroups : list centerAsterisk centerColon centerCaret centerTilde
if [hasLG 'dot-oper'] : centerizeGroups.push centerPeriod
define centerizeL : centerizeGroups.map : x => [x].left.0
define centerizeR : centerizeGroups.map : lambda [x] : begin
local left [x].left
local right [x].right
while (right <@ Function) : set right [right left]
return : if right (right.0 || left.0) (left.0)
define [Cg] : centerizeL ~> centerizeR
do "Bracket-star"
CreateLigationLookup : keep-if 'brst' : list
chain-rule # (*
@ -133,63 +142,35 @@ define [buildLigationsImpl sink para featureName mappedFeature rankedLookups] :
{'parenRight' 'bracketRight' 'braceRight'} ~> look-around
do "Operator Centering"
local startRules {}
foreach [g : items-of centerizeGroups] : begin
startRules.push : chain-rule [g] [g] [acskip] [acskip] [acops] # ::+
startRules.push : chain-rule [g] [g] [acskip] [acops] # ::+
startRules.push : chain-rule [g] [g] [acops] # ::+
startRules.push : chain-rule [g] [acskip] [acskip] [acops] # :+
startRules.push : chain-rule [g] [acskip] [acops] # :+
startRules.push : chain-rule [g] [acops] # :+
startRules.push : chain-rule [acops] [acskip] [acskip] [g] # +:
startRules.push : chain-rule [acops] [acskip] [g] # +:
startRules.push : chain-rule [acops] [g] # +:
CreateLigationLookup : keep-if 'center-ops' startRules
CreateLigationLookup : keep-if 'center-ops' : list
chain-rule [Cg] [Cg] [acskip] [acskip] [acops] # ::+
chain-rule [Cg] [Cg] [acskip] [acops] # ::+
chain-rule [Cg] [Cg] [acops] # ::+
chain-rule [Cg] [acskip] [acskip] [acops] # :+
chain-rule [Cg] [acskip] [acops] # :+
chain-rule [Cg] [acops] # :+
chain-rule [acops] [acskip] [acskip] [Cg] # +:
chain-rule [acops] [acskip] [Cg] # +:
chain-rule [acops] [Cg] # +:
do "Operator centering : Trailing"
local centerizeL : centerizeGroups.map : x => [x].left.0
local centerizeR : centerizeGroups.map : lambda [x] : begin
local left [x].left
local right [x].right
while (right <@ Function) : set right [right left]
return : if right (right.0 || left.0) (left.0)
CreateLigationLookup : keep-if 'center-ops' : list
chain-rule centerizeR [acskip] [acskip] (centerizeL ~> centerizeR)
chain-rule centerizeR [acskip] (centerizeL ~> centerizeR)
chain-rule centerizeR (centerizeL ~> centerizeR)
chain-rule centerizeR [acskip] [acskip] [Cg]
chain-rule centerizeR [acskip] [Cg]
chain-rule centerizeR [Cg]
CreateReverseLigationLookup : keep-if 'center-ops' : list
reverse-rule
centerizeL ~> centerizeR
[acskip] ~> look-around
[acskip] ~> look-around
centerizeR ~> look-around
reverse-rule
centerizeL ~> centerizeR
[acskip] ~> look-around
centerizeR ~> look-around
reverse-rule
centerizeL ~> centerizeR
centerizeR ~> look-around
# Commented out this since it looks not very "necessary" if all dots are considered
# operators...
# define alphabet {
# 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm'
# 'n' 'o' 'p' 'q' 'r' 's' 't' 'u' 'v' 'w' 'x' 'y' 'z'
# 'A' 'B' 'C' 'D' 'E' 'F' 'G' 'H' 'I' 'J' 'K' 'L' 'M'
# 'N' 'O' 'P' 'Q' 'R' 'S' 'T' 'U' 'V' 'W' 'X' 'Y' 'Z'
# 'zero.lnum' 'zero.onum' 'one.lnum' 'one.onum'
# 'two.lnum' 'two.onum' 'three.lnum' 'three.onum'
# 'four.lnum' 'four.onum' 'five.lnum' 'five.onum'
# 'six.lnum' 'six.onum' 'seven.lnum' 'seven.onum'
# 'eight.lnum' 'eight.onum' 'nine.lnum' 'nine.onum'
# }
# do "Operator centering : Avoid 'letter-point' being centered"
# CreateLigationLookup : keep-if 'center-ops' : keep-if 'dot-oper' : list
# chain-rule alphabet [deCenterPeriod]
# chain-rule [deCenterPeriod] alphabet
reverse-rule [Cg] [acskip] [acskip] centerizeR
reverse-rule [Cg] [acskip] centerizeR
reverse-rule [Cg] centerizeR
do "Operator centering : Apple fix"
# Apple (still) have problem when dealing with reverse chaining lookup
# They give up at run beginning. Fix them.
CreateLigationLookup : keep-if 'center-ops' : list
chain-rule [Cg] [acskip] [acskip] centerizeR
chain-rule [Cg] [acskip] centerizeR
chain-rule [Cg] centerizeR
do "Kern Dotty"
define dottyPunctuationSets : list
@ -309,6 +290,11 @@ define [buildLigationsImpl sink para featureName mappedFeature rankedLookups] :
reverse-rule
{'bar'} ~> [[lsx 'trig'] {'bar'}]
[[lsx 'trig'] {'bar'}] ~> look-around
# Apple fix
CreateLigationLookup : keep-if 'trig' : list
chain-rule
{'bar'} ~> [[lsx 'trig'] {'bar'}]
[[lsx 'trig'] {'bar'}] ~> look-around
do "shift-eq operators (<<= and >>=)"
CreateLigationLookup : keep-if "llggeq" : list