ccmp: Add composition for overlays and hooks (#2262)

This commit is contained in:
Belleve 2024-03-27 15:47:20 -10:00 committed by GitHub
parent d461934be1
commit 4a6862aa45
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 152 additions and 32 deletions

View file

@ -130,20 +130,19 @@ glyph-block AutoBuild-Accents : begin
local second : new Set local second : new Set
local mapping : new Map local mapping : new Map
foreach { k1 m } [Object.entries uk] : begin foreach { { k1 k2 } v } [items-of uk] : begin
foreach { k2 v } [Object.entries m] : begin local g1 : query-glyph k1
local g1 : query-glyph k1 local g2 : query-glyph k2
local g2 : query-glyph k2 local g3 : query-glyph v
local g3 : query-glyph v if (g1 && g2 && g3) : begin
if (g1 && g2 && g3) : begin first.add g1
first.add g1 second.add g2
second.add g2
local mm : mapping.get g1 local mm : mapping.get g1
if [not mm] : begin if [not mm] : begin
set mm : new Map set mm : new Map
mapping.set g1 mm mapping.set g1 mm
mm.set g2 g3 mm.set g2 g3
define [matchFirst g] : first.has g define [matchFirst g] : first.has g
define [matchSecond g] : second.has g define [matchSecond g] : second.has g

View file

@ -24,18 +24,15 @@ export : define upperGrekMarkToTonosTf : object
'psiliPerispomeni' 'psiliPerispomeniGrekUpperTonos' 'psiliPerispomeni' 'psiliPerispomeniGrekUpperTonos'
'dasiaPerispomeni' 'dasiaPerispomeniGrekUpperTonos' 'dasiaPerispomeni' 'dasiaPerispomeniGrekUpperTonos'
export : define markCompositionTf : object export : define markCompositionTf : list
'commaAbove' : object list { 'commaAbove' 'graveAbove' } 'psiliVaria'
'graveAbove' 'psiliVaria' list { 'commaAbove' 'acuteAbove' } 'psiliOxia'
'acuteAbove' 'psiliOxia' list { 'commaAbove' 'perispomeniAbove' } 'psiliPerispomeni'
'perispomeniAbove' 'psiliPerispomeni' list { 'commaAbove' 'cyrlPokrytieAbove' } 'commaCyrlPorkytieAbove'
'cyrlPokrytieAbove' 'commaCyrlPorkytieAbove' list { 'revCommaAbove' 'graveAbove' } 'dasiaVaria'
'revCommaAbove' : object list { 'revCommaAbove' 'acuteAbove' } 'dasiaOxia'
'graveAbove' 'dasiaVaria' list { 'revCommaAbove' 'perispomeniAbove' } 'dasiaPerispomeni'
'acuteAbove' 'dasiaOxia' list { 'cyrlPsiliAbove' 'cyrlPokrytieAbove' } 'cyrlPsiliPokrytieAbove'
'perispomeniAbove' 'dasiaPerispomeni'
'cyrlPsiliAbove' : object
'cyrlPokrytieAbove' 'cyrlPsiliPokrytieAbove'
export : define decompOverrides : object export : define decompOverrides : object
# Latvians use comma instead of cedillas in several letters. # Latvians use comma instead of cedillas in several letters.
@ -215,3 +212,102 @@ export : define decompOverrides : object
0x1DF0B { 'esh' 'dblBarOver' } 0x1DF0B { 'esh' 'dblBarOver' }
0x1DF0C { 'eshCurlyTail' 'dblBarOver' } 0x1DF0C { 'eshCurlyTail' 'dblBarOver' }
# List of non-canonical combinations but applicable for ccmp feature
export : define ccmpCombinations : list
########## Data from L2/24-021
# Tilde overlays
list {0x004C 0x0334} 0x2C62
list {0x0062 0x0334} 0x1D6C
list {0x0064 0x0334} 0x1D6D
list {0x0066 0x0334} 0x1D6E
list {0x006C 0x0334} 0x026B
list {0x006D 0x0334} 0x1D6F
list {0x006E 0x0334} 0x1D70
list {0x0070 0x0334} 0x1D71
list {0x0072 0x0334} 0x1D72
list {0x0073 0x0334} 0x1D74
list {0x0074 0x0334} 0x1D75
list {0x007A 0x0334} 0x1D76
list {0x0279 0x0334} 0xAB68
list {0x027E 0x0334} 0x1D73
list {0x02E1 0x0334} 0xAB5E
# Palatal hooks
list {0x0043 0x0321} 0xA7C4
list {0x005A 0x0321} 0xA7C6
list {0x0062 0x0321} 0x1D80
list {0x0063 0x0321} 0xA794
list {0x0064 0x0321} 0x1D81
list {0x0066 0x0321} 0x1D82
list {0x0068 0x0321} 0xA795
list {0x006B 0x0321} 0x1D84
list {0x006C 0x0321} 0x1D85
list {0x006D 0x0321} 0x1D86
list {0x006E 0x0321} 0x1D87
list {0x0070 0x0321} 0x1D88
list {0x0072 0x0321} 0x1D89
list {0x0073 0x0321} 0x1D8A
list {0x0074 0x0321} 0x01AB
list {0x0076 0x0321} 0x1D8C
list {0x0078 0x0321} 0x1D8D
list {0x007A 0x0321} 0x1D8E
list {0x014B 0x0321} 0x1DF14
list {0x0261 0x0321} 0x1D83
list {0x026C 0x0321} 0x1DF13
list {0x0279 0x0321} 0x1DF15
list {0x027E 0x0321} 0x1DF16
list {0x0283 0x0321} 0x1D8B
list {0x0292 0x0321} 0x1DF18
list {0x02A4 0x0321} 0x1DF12
list {0x02A7 0x0321} 0x1DF17
list {0x02E1 0x0321} 0x1DAA
list {0x1D57 0x0321} 0x1DB5
# Retroflex hooks
list {0x0052 0x0322} 0x2C64
list {0x0054 0x0322} 0x01AE
list {0x0061 0x0322} 0x1D8F
list {0x0063 0x0322} 0x1DF1D
list {0x0064 0x0322} 0x0256
list {0x0065 0x0322} 0x1D92
list {0x0069 0x0322} 0x1D96
list {0x006C 0x0322} 0x026D
list {0x006E 0x0322} 0x0273
list {0x006F 0x0322} 0x1DF1B
list {0x0072 0x0322} 0x027D
list {0x0074 0x0322} 0x0288
list {0x0075 0x0322} 0x1D99
list {0x007A 0x0322} 0x0290
list {0x01AD 0x0322} 0x1DF09
list {0x01C3 0x0322} 0x1DF0A
list {0x0251 0x0322} 0x1D90
list {0x0254 0x0322} 0x1D97
list {0x0257 0x0322} 0x1D91
list {0x0259 0x0322} 0x1D95
list {0x025B 0x0322} 0x1D93
list {0x025C 0x0322} 0x1D94
list {0x0268 0x0322} 0x1DF1A
list {0x026C 0x0322} 0xA78E
list {0x026E 0x0322} 0x1DF05
list {0x027A 0x0322} 0x1DF08
list {0x0283 0x0322} 0x1D98
list {0x0292 0x0322} 0x1D9A
list {0x02A3 0x0322} 0xAB66
list {0x02A4 0x0322} 0x1DF19
list {0x02A6 0x0322} 0xAB67
list {0x02A7 0x0322} 0x1DF1C
list {0x02B3 0x0322} 0x107A8
list {0x02E1 0x0322} 0x1DA9
list {0x1D48 0x0322} 0x1078B
list {0x1D57 0x0322} 0x107AF
list {0x1DBB 0x0322} 0x1DBC
list {0x207F 0x0322} 0x1DAF
list {0x10787 0x0322} 0x10788
list {0x1078C 0x0322} 0x1078D
list {0x1079B 0x0322} 0x1079D
list {0x1079E 0x0322} 0x1079F
list {0x107A6 0x0322} 0x107A7
list {0x107AC 0x0322} 0x107AD

View file

@ -1,6 +1,6 @@
$$include './meta/macros.ptl' $$include './meta/macros.ptl'
import [UkMapToLookup UkMap2ToLookup] from "./table-util.mjs" import [UkMapToLookup UkLigatureToLookup] from "./table-util.mjs"
import [Dotless TieMark TieGlyph OgonekTrY IsSuperscript IsSubscript LeaningMark LeaningMarkSpacer] from "@iosevka/glyph/relation" import [Dotless TieMark TieGlyph OgonekTrY IsSuperscript IsSubscript LeaningMark LeaningMarkSpacer] from "@iosevka/glyph/relation"
import as UnicodeKnowledge from "@iosevka/font-glyphs/unicode-knowledge" import as UnicodeKnowledge from "@iosevka/font-glyphs/unicode-knowledge"
@ -33,6 +33,14 @@ export : define [buildCCMP gsub glyphStore markGlyphs] : begin
gsub.endBlock rec gsub.endBlock rec
Ccmp-Group "Combining of overlay/hoked letters" : begin
define combineLookup : gsub.createLookup : object
.type 'gsub_ligature'
.substitutions : UkLigatureToLookup UnicodeKnowledge.ccmpCombinations
function u : glyphStore.queryNameByUnicode u
export-lookup combineLookup
Ccmp-Group "Mark transforms" : begin Ccmp-Group "Mark transforms" : begin
define groupGrekUpperTonos {} define groupGrekUpperTonos {}
@ -67,7 +75,7 @@ export : define [buildCCMP gsub glyphStore markGlyphs] : begin
export-lookup : gsub.createLookup : object export-lookup : gsub.createLookup : object
.type 'gsub_ligature' .type 'gsub_ligature'
.substitutions : UkMap2ToLookup UnicodeKnowledge.markCompositionTf .substitutions : UkLigatureToLookup UnicodeKnowledge.markCompositionTf [function n n]
export-lookup : gsub.createLookup : object export-lookup : gsub.createLookup : object
.type 'gsub_multiple' .type 'gsub_multiple'

View file

@ -221,8 +221,25 @@ export : define [UkMapToLookup m] : begin
r.push v r.push v
return { .left l .right r } return { .left l .right r }
export : define [UkMap2ToLookup mm] : begin export : define [UkLigatureToLookup data mapper] : begin
local res {} local substitutions {}
foreach { g1 second } [Object.entries mm] : foreach { g2 gTo } [Object.entries second] : begin foreach { from to } [items-of data] : begin
res.push {.from {g1 g2} .to gTo} local allFound true
return res local fromGlyphNames {}
local toGlyph null
foreach u [items-of from] : begin
local gn : mapper u
if gn
: then : fromGlyphNames.push gn
: else : set allFound false
begin
local gn : mapper to
if gn
: then : set toGlyph gn
: else : set allFound false
if allFound : substitutions.push {.from fromGlyphNames .to toGlyph}
return substitutions