Iosevka/font-src/otl/gsub-cv-ss.ptl

99 lines
3.9 KiB
Text

import [AddLookup AddCommonFeature PickCommonFeature AddFeatureLookup PickLookup BeginLookupBlock EndLookupBlock ChainRuleBuilder] from"./table-util.mjs"
import [Cv AnyCv CvDecompose RightDependentLink RightDependentTrigger] from"../support/gr.mjs"
extern Map
extern Set
define look-around null
define-operator "~>" 880 'right' : syntax-rules
`(@l ~> @r) `{.left @l .right @r}
define [FeatureName tag] : tag + '_cvss'
define [SsLookupName tag] : 'lookup_ss_' + tag
define [CvLookupName tag] : 'lookup_cv_' + tag
define [CvDecomposeLookupName tag] : 'lookup_cv_decompose_' + tag
export : define [buildCVSS sink para glyphStore] : begin
define {chain-rule} : ChainRuleBuilder sink
local rec : BeginLookupBlock sink
local cvLookupNameSet : new Set
local cvDecompositionLookupNameSet : new Set
local ssLookupNameSet : new Set
define [addCvMapping tag src dst rank] : begin
define feature : PickCommonFeature sink [FeatureName tag]
define lookupName : CvLookupName tag
define lookup : PickLookup sink lookupName {.type 'gsub_alternate' .substitutions {.}}
if [not : cvLookupNameSet.has lookupName] : begin
AddFeatureLookup feature lookupName
cvLookupNameSet.add lookupName
if [not lookup.substitutions.(src)] : set lookup.substitutions.(src) { }
set lookup.substitutions.(src).(rank - 1) dst
define [addCvDecomposition tag gn parts] : begin
define feature : PickCommonFeature sink [FeatureName tag]
define lookupName : CvDecomposeLookupName tag
define lookup : PickLookup sink lookupName {.type 'gsub_multiple' .substitutions {.}}
if [not : cvDecompositionLookupNameSet.has lookupName] : begin
AddFeatureLookup feature lookupName
cvDecompositionLookupNameSet.add lookupName
define lookupNameCv : CvLookupName tag
sink.lookupDep.push { lookupName lookupNameCv }
set lookup.substitutions.(gn) parts
define [addSsSubstitution tag decomp src dst] : begin
define feature : PickCommonFeature sink [FeatureName tag]
define lookupName : SsLookupName composition.tag
define lookup : PickLookup sink lookupName {.type 'gsub_single' .substitutions {.}}
if [not : ssLookupNameSet.has lookupName] : begin
AddFeatureLookup feature lookupName
ssLookupNameSet.add lookupName
foreach { prime pv } [items-of decomp] : if (pv.tag && pv.rank) : begin
local pvDecomp : CvDecomposeLookupName pv.tag
if [cvDecompositionLookupNameSet.has pvDecomp] : begin
AddFeatureLookup feature pvDecomp
sink.lookupDep.push { pvDecomp lookupName }
set lookup.substitutions.(src) dst
# cvxx
foreach {gn glyph} [glyphStore.namedEntries] : if [not : CvDecompose.get glyph] : do
foreach [gr : items-of : AnyCv.query glyph] : if gr.tag : begin
addCvMapping gr.tag gn [glyphStore.ensureExists : gr.get glyph] gr.rank
foreach {gn glyph} [glyphStore.namedEntries] : if [CvDecompose.get glyph] : do
local parts : CvDecompose.get glyph
foreach part [items-of parts] : begin
local gPart : glyphStore.queryByName part
if gPart : foreach [gr : items-of : AnyCv.query gPart] : if gr.tag : begin
addCvDecomposition gr.tag gn parts
# ssxx
foreach {name composition} para.variants.composites : if composition.tag : do
define decomp : composition.decompose para para.variants.selectorTree
foreach { prime pv } [items-of decomp] : if (pv.tag && pv.rank) : begin
local gr : Cv pv.tag pv.rank
foreach {gn glyph} [glyphStore.namedEntries] : if [not : CvDecompose.get glyph] : begin
local substituted : gr.get glyph
if substituted : addSsSubstitution composition.tag decomp gn substituted
# If there are holes in the alternates list, fill them
foreach lutn cvLookupNameSet : begin
local st [PickLookup sink lutn].substitutions
foreach { k v } [pairs-of st] : foreach idx [range 0 v.length] : if [not v.(idx)]
set v.(idx) k
# Lookup dependency
foreach lutnCv cvLookupNameSet : foreach lutnSS ssLookupNameSet : begin
sink.lookupDep.push { lutnCv lutnSS }
EndLookupBlock rec sink
define [objectIsNotEmpty obj] : obj && [Object.keys obj].length