Add Characters:

- MODIFIER LETTER RAISED UP ARROW (`U+A71B`) (#1460).
  - MODIFIER LETTER RAISED DOWN ARROW (`U+A71C`) (#1460).
  - MODIFIER LETTER RAISED EXCLAMATION MARK (`U+A71D`).
  - MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK (`U+A71E`).
  - MODIFIER LETTER LOW INVERTED EXCLAMATION MARK (`U+A71F`).
  - MODIFIER LETTER SUPERSCRIPT TRIANGULAR COLON (`U+10781`) ...  MODIFIER LETTER RETROFLEX CLICK WITH RETROFLEX HOOK (`U+107B9`).
  - LATIN LETTER SMALL CAPITAL L WITH BELT (`U+1DF04`).
  - LATIN SMALL LETTER LEZH WITH RETROFLEX HOOK (`U+1DF05`).
  - LATIN SMALL LETTER TURNED Y WITH BELT (`U+1DF06`).
  - LATIN SMALL LETTER TURNED R WITH LONG LEG AND RETROFLEX HOOK (`U+1DF08`).
  - LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK (`U+1DF0A`).
This commit is contained in:
be5invis 2022-12-11 18:29:18 -08:00
parent 09623460b5
commit dd54bbcece
17 changed files with 316 additions and 177 deletions

View file

@ -7,6 +7,17 @@
- LATIN SMALL LETTER F WITH STROKE (`U+A799`) (#1453).
- LATIN CAPITAL LETTER U WITH STROKE (`U+A7B8`) (#1453).
- LATIN SMALL LETTER U WITH STROKE (`U+A7B9`) (#1453).
- MODIFIER LETTER RAISED UP ARROW (`U+A71B`) (#1460).
- MODIFIER LETTER RAISED DOWN ARROW (`U+A71C`) (#1460).
- MODIFIER LETTER RAISED EXCLAMATION MARK (`U+A71D`).
- MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK (`U+A71E`).
- MODIFIER LETTER LOW INVERTED EXCLAMATION MARK (`U+A71F`).
- MODIFIER LETTER SUPERSCRIPT TRIANGULAR COLON (`U+10781`) ... MODIFIER LETTER RETROFLEX CLICK WITH RETROFLEX HOOK (`U+107B9`).
- LATIN LETTER SMALL CAPITAL L WITH BELT (`U+1DF04`).
- LATIN SMALL LETTER LEZH WITH RETROFLEX HOOK (`U+1DF05`).
- LATIN SMALL LETTER TURNED Y WITH BELT (`U+1DF06`).
- LATIN SMALL LETTER TURNED R WITH LONG LEG AND RETROFLEX HOOK (`U+1DF08`).
- LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK (`U+1DF0A`).
* Fix metrics of ASCII single quotes under Aile (#1454).
* Fix overshoot of oval-shaped `0`, and open `6`/`9` (#1455).
* Fix serifs of certain letters (#1458):

View file

@ -71,21 +71,34 @@ glyph-block AutoBuild-Accents : begin
# When recursively building, `recursiveCodes` contain an array of "needed" Unicode list
local goalCodes : recursiveCodes || [range 0x0000 0xFFFF]
foreach code goalCodes : if [not : glyphStore.queryByUnicode code] : do
local parts { }
local allFound true
local customDecomp UnicodeKnowledge.decompOverrides.(code)
local str : String.fromCodePoint code
local nfd : fallback UnicodeKnowledge.decompositionOverrides.(str) : str.normalize 'NFD'
if (str !== nfd) : begin
local nfdChars : Array.from nfd
local parts { }
local allFound true
foreach part [items-of nfdChars] : begin
local part : glyphStore.queryByUnicode [part.codePointAt 0]
local nfd : str.normalize 'NFD'
if customDecomp
: then : begin
foreach partName customDecomp : begin
local part : glyphStore.queryByName partName
if [not part]
: then : set allFound false
: else : parts.push part
if allFound : begin
local glyphName : 'u' + [code.toString 16 :.padStart 4 '0']
set parts : subParts parts
set foundDecompositions.(glyphName) { glyphName code parts }
: else : if (str !== nfd) : begin
local nfdChars : Array.from nfd
foreach partChar [items-of nfdChars] : begin
local part : glyphStore.queryByUnicode [partChar.codePointAt 0]
if [not part]
: then : set allFound false
: else : parts.push part
if (allFound && parts.length) : begin
local glyphName : 'u' + [code.toString 16 :.padStart 4 '0']
set parts : subParts parts
set foundDecompositions.(glyphName) { glyphName code parts }
local s_goalName nothing
local s_code nothing

View file

@ -1240,7 +1240,7 @@ glyph-block Autobuild-Pnonetic-Ligatures : begin
glyph-block-import Recursive-Build : Thinner
glyph-block-import Autobuild-Enclosure-Shared : CollectJobs CreateDerivedFontFromJobs EnsureComponentGlyphT applyRelations
define [createPhoneticLigatures prefix div _shrink1 _shrink2 wadj1 wadj2 demands] : begin
define [createPhoneticLigatures prefix div _shrink1 _shrink2 wadj1 wadj2 tfm demands] : begin
define CWidth : Width * div
define jobs : CollectJobs NON-DECOMPOSABLE NOT-CENTERED ALLOW-PROPORTIONAL prefix "" demands
local shrink1 : clamp 0 1 _shrink1
@ -1288,10 +1288,21 @@ glyph-block Autobuild-Pnonetic-Ligatures : begin
include : Translate (CWidth / 2) 0
include : Regizmo
include : tfm div
applyRelations jobs.relApplications
define [ToLetter] : glyph-proc
define [ToSuperscript div] : glyph-proc
local df : DivFrame df
include [Ungizmo] true
include [Translate (-df.middle) (-CAP)] true
include [Scale 0.7] true
include [Translate df.middle (CAP + AccentStackOffset / 2)] true
include [Regizmo] true
define stdShrink : clamp 0.75 0.9 : StrokeWidthBlend 0.75 0.9
createPhoneticLigatures 'phonetic' para.diversityM stdShrink stdShrink 1 1 : list
createPhoneticLigatures 'phonetic' para.diversityM stdShrink stdShrink 1 1 ToLetter : list
list 0x02A3 { 'd/phoneticLeft' 'z' } 'b'
list 0x02A4 { 'd/phoneticLeft' 'ezh' } 'if'
list 0x02A5 { 'd/phoneticLeft' 'zCurlyTail' } 'if'
@ -1302,10 +1313,23 @@ glyph-block Autobuild-Pnonetic-Ligatures : begin
list 0x02AA { 'l/phoneticLeft' 's/phoneticRight' } 'b'
list 0x02AB { 'l/phoneticLeft' 'z' } 'b'
list 0xAB66 { 'd/phoneticLeft' 'zRTailBR' } 'if'
list 0xAB67 { 't/phoneticLeft1' 'sRTail' } null
list 0xAB67 { 't/phoneticLeft1' 'sRTail' } 'p'
list 0xFB01 { 'f/compLigLeft1' 'dotlessi/compLigRight' } null
list 0xFB02 { 'f/compLigLeft2' 'l/compLigRight' } null
createPhoneticLigatures 'phoneticSuperscript' 1 stdShrink stdShrink 1 1 ToSuperscript : list
list 0x10787 { 'd/phoneticLeft' 'z' } 'b'
list 0x1078A { 'd/phoneticLeft' 'ezh' } 'if'
list 0x10789 { 'd/phoneticLeft' 'zCurlyTail' } 'if'
list 0x107AC { 't/phoneticLeft2' 's/phoneticRight' } 'b'
list 0x107AE { 't/teshLeft' 'esh' } 'if'
list 0x107AB { 't/phoneticLeft1' 'cCurlyTail' } 'b'
list 0x10790 { 'f/phoneticLeft' 'eng/phoneticRight' } 'if'
list 0x10799 { 'l/phoneticLeft' 's/phoneticRight' } 'b'
list 0x1079A { 'l/phoneticLeft' 'z' } 'b'
list 0x10788 { 'd/phoneticLeft' 'zRTailBR' } 'if'
list 0x107AD { 't/phoneticLeft1' 'sRTail' } 'p'
glyph-block Autobuild-Double-Emotions : begin
glyph-block-import CommonShapes
glyph-block-import Common-Derivatives

View file

@ -218,13 +218,13 @@ glyph-block Autobuild-Transformed : begin
list 0x02B6 'invSmcpR'
list 0x02B7 'w'
list 0x02B8 'y'
list 0x02C0 'fineglottalstop'
list 0x02C1 'finerevglottalstop'
list 0x02C0 'fineGlottalStop'
list 0x02C1 'fineRevGlottalStop'
list 0x02E0 'latn/gamma'
list 0x02E1 'l'
list 0x02E2 's'
list 0x02E3 'x'
list 0x02E4 'revglottalstop'
list 0x02E4 'revGlottalStop'
list 0x2071 'i'
list 0x207F 'n'
list 0x1D43 'a'
@ -323,17 +323,66 @@ glyph-block Autobuild-Transformed : begin
list 0x207C 'equal'
list 0x207D 'parenLeft'
list 0x207E 'parenRight'
list 0xA7F8 'smcpHStroke'
list 0xA7F9 'oe'
list 0xA702 'subst'
list 0xA703 'substBarNoRise'
list 0xA704 'supst'
list 0xA705 'supstBarNoRise'
list 0xAB5C 'heng'
list 0xAB69 'turnw'
list 0xA71B 'arrowUp.NWID'
list 0xA71C 'arrowDown.NWID'
list 0xA71D 'alveolarclick'
list 0xA71E 'exclamDownAlt'
list 0xA7F2 'C'
list 0xA7F3 'F'
list 0xA7F4 'Q'
list 0xA7F8 'smcpHStroke'
list 0xA7F9 'oe'
list 0xAB5C 'heng'
list 0xAB5E 'lTildeOver'
list 0xAB69 'turnw'
list 0x107AF 'tRTail'
list 0x1078B 'dHookBottom'
list 0x107A5 'q'
list 0x10792 'smcpG'
list 0x107B3 'glottalStopBar'
list 0x10795 'hBar'
list 0x10797 'hHookTopLTail'
list 0x107B0 'vHookTop'
list 0x107A9 'rFlap'
list 0x107A8 'rRTail'
list 0x10784 'smcpB'
list 0x107AA 'smcpR'
list 0x10796 'smcpH'
list 0x107B4 'revGlottalStopBar'
list 0x1079B 'lBelt'
list 0x1079E 'lyogh'
list 0x1079D 'lBeltRTail'
list 0x1079F 'lyoghRTail'
list 0x107A1 'turnyBelt'
list 0x1079C 'smcpLBelt'
list 0x107A0 'turny'
list 0x107A6 'turnrlongleg'
list 0x107A7 'rTurnLongLetRTail'
list 0x10785 'bHookTop'
list 0x1078C 'dHookTop'
list 0x1078D 'dHookTopBottom'
list 0x10798 'dotlessjBarHookTop'
list 0x10793 'gScriptHookTop'
list 0x10794 'smcpGHookTop'
list 0x107B5 'bullEye'
list 0x107B6 'dentalclick'
list 0x107B8 'palatoalveolarclick'
list 0x107B9 'retroflexClickHook'
list 0x107B7 'alveolarlateralclick'
list 0x107B2 'smcpY'
list 0x107A4 'closeomega'
list 0x107A2 'oSlash'
list 0x1078E 'eRev'
list 0x10791 'ramshorn'
list 0x1078F 'closeturnepsilon'
list 0x10783 'ae'
list 0x107A3 'smcpOE'
list 0x10781 'triangleColon'
list 0x10782 'halfTriangleColon'
list null 'S' # there is no superscript S in unicode, but is is used for the SM symbol
createSuperscripts 'numerator' NumeratorForm : list
@ -409,6 +458,7 @@ glyph-block Autobuild-Transformed : begin
list 0xA701 'substBarNoRise'
list 0xA706 'supst'
list 0xA707 'supstBarNoRise'
list 0xA71F 'exclamDownAlt'
createSubscripts 'denominator' DenominatorForm : list
list null 'zero.onum'

View file

@ -108,6 +108,19 @@ glyph-block Letter-Latin-Ezh : begin
select-variant 'lyogh' 0x26E
create-glyph 'lyoghRTail.serifless' : glyph-proc
include : MarkSet.if
include : EzhShape XH 0 0.4
include : VBarLeft SB 0 Ascender
include : WithTransform [ApparentTranslate (SB + HVContrast * Stroke - RightSB) (-Descender)]
refer-glyph 'rtailBR'
create-glyph 'lyoghRTail.hooky' : glyph-proc
include [refer-glyph 'lyoghRTail.serifless'] AS_BASE ALSO_METRICS
include : LeftwardTopSerif SB Ascender SideJut
select-variant 'lyoghRTail' 0x1DF05 (follow -- 'lyogh')
create-glyph 'ezhtail' 0x1BA : glyph-proc
local b : mix Descender XH 0.25
include : EzhShape XH b nothing nothing 0.5

View file

@ -11,7 +11,7 @@ glyph-block Letter-Latin-Glottal-Stop : begin
glyph-block-import Mark-Shared-Metrics : markHalfStroke
glyph-block-import Letter-Shared-Shapes : LetterBarOverlay
create-glyph 'glottalstop' 0x294 : glyph-proc
create-glyph 'glottalStop' 0x294 : glyph-proc
include : MarkSet.b
include : dispiro
widths.rhs
@ -24,9 +24,9 @@ glyph-block Letter-Latin-Glottal-Stop : begin
if SLAB : begin
include : CenterBottomSerif Middle 0 Jut
alias 'capglottalstop' 0x241 'glottalstop'
alias 'capGlottalStop' 0x241 'glottalStop'
create-glyph 'revglottalstop' 0x295 : glyph-proc
create-glyph 'revGlottalStop' 0x295 : glyph-proc
include : MarkSet.b
include : dispiro
widths.lhs
@ -39,7 +39,7 @@ glyph-block Letter-Latin-Glottal-Stop : begin
if SLAB : begin
include : CenterBottomSerif Middle 0 Jut
create-glyph 'smallglottalstop' 0x242 : glyph-proc
create-glyph 'smallGlottalStop' 0x242 : glyph-proc
include : MarkSet.b
include : dispiro
widths.rhs
@ -52,7 +52,7 @@ glyph-block Letter-Latin-Glottal-Stop : begin
if SLAB : begin
include : CenterBottomSerif Middle 0 Jut
create-glyph 'fineglottalstop' : glyph-proc
create-glyph 'fineGlottalStop' : glyph-proc
include : MarkSet.b
local fine : markHalfStroke * 2
include : dispiro
@ -66,7 +66,7 @@ glyph-block Letter-Latin-Glottal-Stop : begin
if SLAB : begin
include : CenterBottomSerif Middle 0 Jut fine
create-glyph 'finerevglottalstop' : glyph-proc
create-glyph 'fineRevGlottalStop' : glyph-proc
include : MarkSet.b
local fine : markHalfStroke * 2
include : dispiro
@ -80,12 +80,12 @@ glyph-block Letter-Latin-Glottal-Stop : begin
if SLAB : begin
include : CenterBottomSerif Middle 0 Jut fine
turned 'invglottalstop' 0x296 'revglottalstop' Middle (Ascender / 2)
turned 'invGlottalStop' 0x296 'revGlottalStop' Middle (Ascender / 2)
create-glyph 'glottalstopbar' 0x2A1 : glyph-proc
include [refer-glyph 'glottalstop'] AS_BASE
create-glyph 'glottalStopBar' 0x2A1 : glyph-proc
include [refer-glyph 'glottalStop'] AS_BASE
include : LetterBarOverlay.m.in Middle [if SLAB Stroke 0] (Ascender * 0.5) 0.5
create-glyph 'revglottalstopbar' 0x2A2 : glyph-proc
include [refer-glyph 'revglottalstop'] AS_BASE
create-glyph 'revGlottalStopBar' 0x2A2 : glyph-proc
include [refer-glyph 'revGlottalStop'] AS_BASE
include : LetterBarOverlay.m.in Middle [if SLAB Stroke 0] (Ascender * 0.5) 0.5

View file

@ -60,7 +60,7 @@ glyph-block Letter-Latin-Lower-H : begin
if fTailed : include : RightwardTailedBar RightSB 0 (XH - SmallArchDepthB)
include : Serifs fTailed false
create-glyph "hbar.\(suffix)" : glyph-proc
create-glyph "hBar.\(suffix)" : glyph-proc
include [refer-glyph "h.\(suffix)"] AS_BASE ALSO_METRICS
include : HBarOverlay fHasTopSerif
@ -94,7 +94,7 @@ glyph-block Letter-Latin-Lower-H : begin
select-variant 'h' 'h'
link-reduced-variant 'h/sansSerif' 'h' MathSansSerif
turned 'turnh' 0x265 'h' Middle (XH / 2) [MarkSet.p]
select-variant 'hbar' 0x127 (follow -- 'h')
select-variant 'hBar' 0x127 (follow -- 'h')
select-variant 'cyrl/shha' 0x4BB (shapeFrom -- 'h')
derive-composites 'cyrl/shhaDescender' 0x527 'cyrl/shha' [CyrDescender RightSB]
@ -142,7 +142,7 @@ glyph-block Letter-Latin-Lower-H : begin
include [refer-glyph src]
include : MarkSet.if
alias 'cyrl/tshe' 0x45B 'hbar'
alias 'cyrl/tshe' 0x45B 'hBar'
glyph-block-import Letter-Blackboard : BBS BBD BBBarLeft
create-glyph 'mathbb/h' 0x1D559 : glyph-proc

View file

@ -200,6 +200,16 @@ glyph-block Letter-Latin-Lower-R : begin
include : refer-glyph "rtailBR"
include : ApparentTranslate (df.rightSB - xBar + df.leftSB + Stroke * HVContrast) 0
create-glyph "rTurnLongLetRTail.\(suffix)" : glyph-proc
include [refer-glyph "rlongleg.\(suffix)"] AS_BASE ALSO_METRICS
eject-contour 'serifLT'
include : FlipAround df.middle (XH / 2)
include : df.markSet.if
define [object xBar] : RDim df mode
include : new-glyph : glyph-proc
include : refer-glyph "rtailBR"
include : ApparentTranslate (df.rightSB - xBar + df.leftSB + Stroke * HVContrast) 0
select-variant 'r' 'r'
link-reduced-variant 'r/sansSerif' 'r' MathSansSerif
@ -218,6 +228,7 @@ glyph-block Letter-Latin-Lower-R : begin
include : df.markSet.b
select-variant 'rTurnRTail' 0x27B
select-variant 'rTurnLongLetRTail' 0x1DF08 (follow -- 'rTurnRTail')
define [BBRShape df md doTopSerif doBottomSerif] : glyph-proc

View file

@ -12,7 +12,7 @@ glyph-block Letter-Latin-Lower-Y : begin
glyph-block-import Mark-Shared-Metrics : markExtend markStroke markStress markFine
glyph-block-import Mark-Above : aboveMarkTop aboveMarkBot aboveMarkMid aboveMarkStack
glyph-block-import Mark-Below : belowMarkStack
glyph-block-import Letter-Shared-Shapes : nShoulder FlatHookDepth SerifFrame
glyph-block-import Letter-Shared-Shapes : nShoulder FlatHookDepth SerifFrame BeltOverlay
define SLAB-NONE { false false false }
define SLAB-AUTO { SLAB SLAB false }
@ -299,9 +299,17 @@ glyph-block Letter-Latin-Lower-Y : begin
set-base-anchor 'overlay' Middle (XH / 2)
select-variant 'y' 'y'
select-variant 'y/nonCursive' (shapeFrom -- 'y')
link-reduced-variant 'y/sansSerif' 'y' MathSansSerif
alias 'cyrl/u' 0x443 'y'
turned 'turny' 0x28E 'y/nonCursive' Middle (XH / 2) [MarkSet.b]
derive-glyphs 'turnyBelt' 0x1DF06 'y/nonCursive' : function [src sel] : glyph-proc
include : MarkSet.b
include [refer-glyph src]
include : FlipAround Middle (XH / 2)
include : BeltOverlay.at Middle XH
foreach { suffix { DrawAt kdr } } [Object.entries DotVariants] : do
create-glyph "yDotBelowDot1.\(suffix)" : glyph-proc
set-mark-anchor 'yBelowDot' 0 0 0 belowMarkStack
@ -362,8 +370,6 @@ glyph-block Letter-Latin-Lower-Y : begin
select-variant 'yHookTop' 0x1B4
select-variant 'cyrl/U' 0x423
turned 'turny' 0x28E 'y' Middle (XH / 2) [MarkSet.b]
define [LambdaBarOverlayShape] : FlatSlashShape [mix SB RightSB 0.45] [mix 0 CAP 0.8] (OverlayStroke / 2)
define LambdaConfig : object
straight { true false SLAB-NONE }

View file

@ -175,7 +175,7 @@ glyph-block Letter-Latin-O : begin
alias 'grek/capSymbolTheta' 0x3F4 'Obar'
alias 'cyrl/oe' 0x4E9 'obar'
create-glyph 'bulleye' 0x298 : glyph-proc
create-glyph 'bullEye' 0x298 : glyph-proc
include [refer-glyph 'O'] AS_BASE
local halfDotWidth : Math.min DotRadius ((RightSB - SB - HVContrast * Stroke * 2) / 4)
local halfDotHeight : Math.min DotRadius (halfDotWidth * 1.5)

View file

@ -80,5 +80,7 @@ glyph-block Letter-Latin-Upper-L : begin
create-glyph 'LBarOverlay' : LetterBarOverlay.l.in LBarLeftX 0 CAP
create-glyph 'LBeltOverlay' : BeltOverlay CAP (LBarLeftX + 0.5 * HVContrast * Stroke)
create-glyph 'smcpLBeltOverlay' : BeltOverlay XH (LBarLeftX + 0.5 * HVContrast * Stroke)
derive-composites 'LBar' 0x23D 'L' 'LBarOverlay'
derive-composites 'LBelt' 0xA7AD 'L' 'LBeltOverlay'
derive-composites 'smcpLBelt' 0x1DF04 'smcpL' 'smcpLBeltOverlay'

View file

@ -538,19 +538,22 @@ glyph-block Letter-Shared-Shapes : begin
archv
straight.down.end SB bottom [heading Downward]
glyph-block-export BeltOverlay
define [BeltOverlay top xMiddle] : begin
define [BeltOverlayAt x y] : begin
local fine : AdviceStroke 4.5
local r : XH * 0.05
return : dispiro
widths.rhs fine
flat xMiddle (0.5 * top + r) [heading Leftward]
curl (xMiddle - HalfStroke - r * 1.5) (0.5 * top + r)
flat x (y + r) [heading Leftward]
curl (x - HalfStroke - r * 1.5) (y + r)
archv
g4.down.mid (xMiddle - HalfStroke - r * 2.5) (0.5 * top) [heading Downward]
g4.down.mid (x - HalfStroke - r * 2.5) y [heading Downward]
arcvh
flat (xMiddle - HalfStroke - r * 1.5) (0.5 * top - r)
curl (xMiddle + HalfStroke + r * 1.5 + fine) (0.5 * top - r)
flat (x - HalfStroke - r * 1.5) (y - r)
curl (x + HalfStroke + r * 1.5 + fine) (y - r)
glyph-block-export BeltOverlay
define [BeltOverlay top xMiddle] : BeltOverlayAt xMiddle (0.5 * top)
set BeltOverlay.at BeltOverlayAt
glyph-block-export LetterBarOverlay
define [LetterBarOverlay] : params [x y space refSw pXInSw sw] : begin

View file

@ -17,7 +17,7 @@ glyph-block Symbol-Punctuation-Emotion : begin
create-glyph "exclam.\(suffix)" : glyph-proc
local df : DivFrame para.diversityF
set-width df.width
include : MarkSet.capital
include : df.markSet.capital
include : VBar df.middle [clamp 0 (CAP * 0.4) (emotionBottom * 1.18)] CAP
include : DrawAt df.middle dr (dr - overshoot)
@ -35,8 +35,16 @@ glyph-block Symbol-Punctuation-Emotion : begin
select-variant 'question/dotPart' (follow -- 'punctuationDot')
select-variant 'questionDown/dotPart' (follow -- 'punctuationDot')
alias 'alveolarclick' 0x1C3 'exclam'
turned 'exclamDown' 0xA1 'exclam' [DivFrame para.diversityF].middle (XH / 2)
derive-glyphs 'retroflexClickHook' 0x1DF0A 'exclam' : function [src sel] : glyph-proc
include [refer-glyph src] AS_BASE ALSO_METRICS
local df : DivFrame para.diversityF
include : df.markSet.capDesc
include : WithTransform [ApparentTranslate (df.middle + HVContrast * HalfStroke - df.rightSB) (-Descender)]
refer-glyph "rtailBR"
alias 'alveolarclick' 0x1C3 'exclam'
turned 'exclamDown' 0xA1 'exclam' [DivFrame para.diversityF].middle (XH / 2)
turned 'exclamDownAlt' null 'exclam' [DivFrame para.diversityF].middle (XH / 2)
do "Question"
local [YConnectT top emotionBottom] : mix emotionBottom (top - HalfStroke) 0.375

View file

@ -10,11 +10,11 @@ glyph-block Symbol-Other-Phonetic : begin
glyph-block-import CommonShapes
glyph-block-import Common-Derivatives
local triangleSize : Math.min (PeriodRadius) (XH / 5)
local triangleSize : Math.min (PeriodRadius) (XH / 6)
local toneMarkLeft : mix SB RightSB 0.1
local toneMarkRight : Width - toneMarkLeft
create-glyph 'trianglecolon' 0x2D0 : glyph-proc
create-glyph 'triangleColon' 0x2D0 : glyph-proc
include : union
spiro-outline
corner (Middle - triangleSize * 1.35) XH
@ -25,7 +25,7 @@ glyph-block Symbol-Other-Phonetic : begin
corner Middle (0 + triangleSize * 2.75)
corner (Middle + triangleSize * 1.35) 0
create-glyph 'halftrianglecolon' 0x2D1 : glyph-proc
create-glyph 'halfTriangleColon' 0x2D1 : glyph-proc
include : spiro-outline
corner (Middle - triangleSize * 1.35) XH
corner Middle (XH - triangleSize * 2.75)

View file

@ -34,136 +34,120 @@ export : define markCompositionTf : object
'cyrlPsiliAbove' : object
'cyrlPokrytieAbove' 'cyrlPsiliPokrytieAbove'
export : define decompositionOverrides : object
export : define decompOverrides : object
# Latvians use comma instead of cedillas in several letters.
# Record them as custom decomposition.
."\u0156" "R\u0326"
."\u0157" "r\u0326"
."\u0136" "K\u0326"
."\u0137" "k\u0326"
."\u0145" "N\u0326"
."\u0146" "n\u0326"
."\u013B" "L\u0326"
."\u013C" "l\u0326"
."\u0122" "G\u0326"
."\u0123" "g\u0312"
0x122 { 'G' 'commaBelow' }
0x123 { 'g' 'turnCommaAbove' }
0x136 { 'K' 'commaBelow' }
0x137 { 'k' 'commaBelow' }
0x13b { 'L' 'commaBelow' }
0x13c { 'l' 'commaBelow' }
0x145 { 'N' 'commaBelow' }
0x146 { 'n' 'commaBelow' }
0x156 { 'R' 'commaBelow' }
0x157 { 'r' 'commaBelow' }
# autobuild Latin glyphs
."\u0167" "t\u0335"
."\u0197" "I\u0335"
."\u019A" "l\u0335"
."\u0248" "J\u0335"
."\u0249" "j\u0335"
."\u0268" "i\u0335"
."\u024D" "r\u0335"
."\u1D7B" "\u026A\u0335"
."\u1D7C" "\u0269\u0335"
# Spacing marks
0xa8 { 'markBaseSpace' 'dieresisAbove' }
0xaf { 'markBaseSpace' 'macronAbove' }
0xb8 { 'markBaseSpace' 'cedillaBelow' }
0x2c2 { 'markBaseSpace' 'lessAbove' }
0x2c3 { 'markBaseSpace' 'greaterAbove' }
0x2c4 { 'markBaseSpace' 'upArrowHeadAbove' }
0x2c5 { 'markBaseSpace' 'downArrowHeadAbove' }
0x2c6 { 'markBaseSpace' 'circumflexAbove' }
0x2c7 { 'markBaseSpace' 'caronAbove' }
0x2c9 { 'markBaseSpace' 'macronAbove' }
0x2ca { 'markBaseSpace' 'acuteAbove' }
0x2cb { 'markBaseSpace' 'graveAbove' }
0x2cd { 'markBaseSpace' 'macronBelow' }
0x2ce { 'markBaseSpace' 'graveBelow' }
0x2cf { 'markBaseSpace' 'acuteBelow' }
0x2d2 { 'markBaseSpace' 'rightHalfCircleBelow' }
0x2d3 { 'markBaseSpace' 'leftHalfCircleBelow' }
0x2d4 { 'markBaseSpace' 'uptackBelow' }
0x2d5 { 'markBaseSpace' 'downtackBelow' }
0x2d6 { 'markBaseSpace' 'plusBelow' }
0x2d7 { 'markBaseSpace' 'minusBelow' }
0x2d8 { 'markBaseSpace' 'breveAbove' }
0x2d9 { 'markBaseSpace' 'dotAbove' }
0x2da { 'markBaseSpace' 'ringAbove' }
0x2db { 'markBaseSpace' 'ogonekBelow' }
0x2dc { 'markBaseSpace' 'tildeAbove' }
0x2dd { 'markBaseSpace' 'doubleAcuteAbove' }
0x2df { 'markBaseSpace' 'crossAbove' }
0x2ec { 'markBaseSpace' 'caronBelow' }
0x2ed { 'markBaseSpace' 'dblOverlineAbove' }
0x2ef { 'markBaseSpace' 'downArrowHeadBelow' }
0x2f0 { 'markBaseSpace' 'upArrowHeadBelow' }
0x2f1 { 'markBaseSpace' 'lessBelow' }
0x2f2 { 'markBaseSpace' 'greaterBelow' }
0x2f3 { 'markBaseSpace' 'ringBelow' }
0x2f7 { 'markBaseSpace' 'tildeBelow' }
0x2ff { 'markBaseSpace' 'leftArrowBelow' }
0x37a { 'markBaseSpace' 'iotaBelow' }
0x384 { 'markBaseSpace' 'acuteAbove' }
0x385 { 'markBaseSpace' 'dieresisAbove' 'acuteAbove' }
0x1fbd { 'markBaseSpace' 'commaAbove' }
0x1fbe { 'markBaseSpace' 'iotaBelow' }
0x1fbf { 'markBaseSpace' 'commaAbove' }
0x1fc0 { 'markBaseSpace' 'perispomeniAbove' }
0x1fc1 { 'markBaseSpace' 'dieresisAbove' 'perispomeniAbove' }
0x1fed { 'markBaseSpace' 'dieresisAbove' 'graveAbove' }
0x1fee { 'markBaseSpace' 'dieresisAbove' 'acuteAbove' }
0x1fef { 'markBaseSpace' 'graveAbove' }
0x1ffd { 'markBaseSpace' 'acuteAbove' }
0x1ffe { 'markBaseSpace' 'revCommaAbove' }
."\u1D7F" "\u028A\uE001"
."\u0289" "u\uE001"
."\u0244" "U\uE001"
."\u01E5" "g\uE001"
."\u01BB" "2\uE001"
."\u04B0" "\u04AE\u0335"
."\u04B1" "\u04AF\u0335"
."\u024F" "y\uE001"
."\uAB30" "\uAB64\uE001"
."\u1D7D" "p\uE001"
0x167 { 't' 'barOver' }
0x197 { 'I' 'barOver' }
0x19a { 'l' 'barOver' }
0x1bb { 'two.lnum' 'longBarOver' }
0x23a { 'A' 'longSlashOver' }
0x23b { 'C' 'longSlashOver' }
0x23c { 'c' 'slashOver' }
0x23e { 'T' 'longSlashOver' }
0x244 { 'U' 'longBarOver' }
0x246 { 'E' 'longSlashOver' }
0x247 { 'e' 'slashOver' }
0x248 { 'J' 'barOver' }
0x249 { 'j' 'barOver' }
0x24d { 'r' 'barOver' }
0x24f { 'y' 'longBarOver' }
."\u023A" "A\u0338"
."\u023B" "C\u0338"
."\u023C" "c\u0337"
."\u023E" "T\u0338"
."\u0246" "E\u0338"
."\u0247" "e\u0337"
0x47c { 'cyrl/BroadOmega' 'cyrlPsiliAbove' 'cyrlPokrytieAbove' }
0x47d { 'cyrl/broadOmega' 'cyrlPsiliAbove' 'cyrlPokrytieAbove' }
0x498 { 'cyrl/Ze' 'cedillaBelow' }
0x499 { 'cyrl/ze' 'cedillaBelow' }
0x4aa { 'cyrl/Es' 'cedillaBelow' }
0x4ab { 'cyrl/es' 'cedillaBelow' }
0x4b0 { 'cyrl/Ue' 'barOver' }
0x4b1 { 'cyrl/ue' 'barOver' }
."\u0290" "z\u0322"
."\u1D90" "\u0251\u0322"
0x1d7c { 'latn/iota' 'barOver' }
0x1d7d { 'p' 'longBarOver' }
0x1d7f { 'latinupsilon1' 'longBarOver' }
0x1e10 { 'D' 'commaBelow' }
0x1e11 { 'd' 'commaBelow' }
0x1e9c { 'longs' 'shortSlashOver' }
0x1eda { 'OHorn' 'acuteAbove' }
0x1edb { 'oHorn' 'acuteAbove' }
0x1edc { 'OHorn' 'graveAbove' }
0x1edd { 'oHorn' 'graveAbove' }
0x1ede { 'OHorn' 'hookAbove' }
0x1edf { 'oHorn' 'hookAbove' }
0x1ee0 { 'OHorn' 'tildeAbove' }
0x1ee1 { 'oHorn' 'tildeAbove' }
0x1ee2 { 'OHorn' 'dotBelow' }
0x1ee3 { 'oHorn' 'dotBelow' }
."\u1E10" "D\u0326"
."\u1E11" "d\u0326"
0x2c65 { 'a' 'slashOver' }
0x2c66 { 't' 'longSlashOver' }
."\u1E9C" "\u017F\uE000"
."\u1EDC" "\u01A0\u0300"
."\u1EDD" "\u01A1\u0300"
."\u1EDA" "\u01A0\u0301"
."\u1EDB" "\u01A1\u0301"
."\u1EDE" "\u01A0\u0309"
."\u1EDF" "\u01A1\u0309"
."\u1EE0" "\u01A0\u0303"
."\u1EE1" "\u01A1\u0303"
."\u1EE2" "\u01A0\u0323"
."\u1EE3" "\u01A1\u0323"
."\u2C65" "a\u0337"
."\u2C66" "t\u0338"
# Cyrillic composite characters
."\u0498" "\u0417\u0327"
."\u0499" "\u0437\u0327"
."\u04AA" "\u0421\u0327"
."\u04AB" "\u0441\u0327"
."\u047C" "\uA64C\u0486\u0487"
."\u047D" "\uA64D\u0486\u0487"
# Spacing modifers
."\u02CB" "\uE00D\u0300"
."\u02CA" "\uE00D\u0301"
."\u02C6" "\uE00D\u0302"
."\u02DC" "\uE00D\u0303"
."\u00AF" "\uE00D\u0304"
."\u02C9" "\uE00D\u0304"
."\u02D8" "\uE00D\u0306"
."\u02D9" "\uE00D\u0307"
."\u00A8" "\uE00D\u0308"
."\u02DA" "\uE00D\u030A"
."\u02C7" "\uE00D\u030C"
."\u00B8" "\uE00D\u0327"
."\u02CD" "\uE00D\u0331"
."\u02CE" "\uE00D\u0316"
."\u02CF" "\uE00D\u0317"
."\u02D2" "\uE00D\u0339"
."\u02D3" "\uE00D\u031C"
."\u02D4" "\uE00D\u031D"
."\u02D5" "\uE00D\u031E"
."\u02D6" "\uE00D\u031F"
."\u02D7" "\uE00D\u0320"
."\u02DB" "\uE00D\u0328"
."\u02DD" "\uE00D\u030B"
."\u02DF" "\uE00D\u033D"
."\u02EC" "\uE00D\u032C"
."\u02ED" "\uE00D\u033F"
."\u02F3" "\uE00D\u0325"
."\u02F7" "\uE00D\u0330"
."\u02BE" "\uE00D\u0357"
."\u02BF" "\uE00D\u0351"
."\u02C2" "\uE00D\u1DFE"
."\u02C3" "\uE00D\u0350"
."\u02C4" "\uE00D\uE002"
."\u02C5" "\uE00D\uE003"
."\u02EF" "\uE00D\uE005"
."\u02F0" "\uE00D\uE004"
."\u02F1" "\uE00D\u0354"
."\u02F2" "\uE00D\u0355"
."\u02FF" "\uE00D\u20EE"
."\u1FED" "\uE00D\u0308\u0300"
."\u1FEE" "\uE00D\u0308\u0301"
."\u1FEF" "\uE00D\u0300"
."\u1FFD" "\uE00D\u0301"
."\u1FFE" "\uE00D\u0314"
."\u1FBD" "\uE00D\u0313"
."\u1FBE" "\uE00D\u0345"
."\u1FBF" "\uE00D\u0313"
."\u1FC0" "\uE00D\u0342"
."\u1FC1" "\uE00D\u0308\u0342"
."\u0384" "\uE00D\u0301"
."\u0385" "\uE00D\u0308\u0301"
."\u037A" "\uE00D\u0345"
."\uAB30" "\u0251\uE001"
."\uA7B8" "U\u0338"
."\uA7B9" "u\u0337"
."\uA7BB" "a\uE010"
."\uA7BD" "i\uE010"
."\uA7BF" "u\uE010"
0xa7b8 { 'U' 'longSlashOver' }
0xa7b9 { 'u' 'slashOver' }
0xa7bb { 'a' 'EgyptologicalYodAbove' }
0xa7bd { 'i' 'EgyptologicalYodAbove' }
0xa7bf { 'u' 'EgyptologicalYodAbove' }
0xab30 { 'scripta' 'longBarOver' }

View file

@ -4301,6 +4301,7 @@ tag = "cv49"
rank = 1
description = "Letter `y` that is fully straight"
selector.y = "straight"
selector."y/nonCursive" = "straight"
selector."y/sansSerif" = "straight"
selector.yHookTop = "straight"
@ -4308,6 +4309,7 @@ selector.yHookTop = "straight"
rank = 2
description = "Letter `y` with straight upper and a tail turns leftward"
selector.y = "straightTurn"
selector."y/nonCursive" = "straightTurn"
selector."y/sansSerif" = "straightTurn"
selector.yHookTop = "straightTurn"
@ -4315,6 +4317,7 @@ selector.yHookTop = "straightTurn"
rank = 3
description = "More curly letter `y`, like Iosevka 2.x"
selector.y = "curly"
selector."y/nonCursive" = "curly"
selector."y/sansSerif" = "curly"
selector.yHookTop = "curly"
@ -4322,6 +4325,7 @@ selector.yHookTop = "curly"
rank = 4
description = "More curly letter `y`, like Iosevka 2.x, with a tail turns leftward"
selector.y = "curlyTurn"
selector."y/nonCursive" = "curlyTurn"
selector."y/sansSerif" = "curlyTurn"
selector.yHookTop = "curlyTurn"
@ -4329,6 +4333,7 @@ selector.yHookTop = "curlyTurn"
rank = 5
description = "Cursive-like `y`"
selector.y = "cursive"
selector."y/nonCursive" = "straightTurn"
selector."y/sansSerif" = "cursive"
selector.yHookTop = "cursive"
@ -4336,6 +4341,7 @@ selector.yHookTop = "cursive"
rank = 6
description = "Cursive-like `y` with flat terminal hook"
selector.y = "cursiveFlatHook"
selector."y/nonCursive" = "straightTurn"
selector."y/sansSerif" = "cursiveFlatHook"
selector.yHookTop = "cursiveFlatHook"
@ -4343,6 +4349,7 @@ selector.yHookTop = "cursiveFlatHook"
rank = 7
description = "Letter `y` that is fully straight, with motion serifs"
selector.y = "straightMotionSerifed"
selector."y/nonCursive" = "straightMotionSerifed"
selector."y/sansSerif" = "straight"
selector.yHookTop = "straight"
@ -4350,6 +4357,7 @@ selector.yHookTop = "straight"
rank = 8
description = "Letter `y` with straight upper and a tail turns leftward, and motion serifs"
selector.y = "straightTurnMotionSerifed"
selector."y/nonCursive" = "straightTurnMotionSerifed"
selector."y/sansSerif" = "straightTurn"
selector.yHookTop = "straightTurn"
@ -4357,6 +4365,7 @@ selector.yHookTop = "straightTurn"
rank = 9
description = "More curly letter `y`, like Iosevka 2.x, with motion serifs"
selector.y = "curlyMotionSerifed"
selector."y/nonCursive" = "curlyMotionSerifed"
selector."y/sansSerif" = "curly"
selector.yHookTop = "curly"
@ -4364,6 +4373,7 @@ selector.yHookTop = "curly"
rank = 10
description = "More curly letter `y`, like Iosevka 2.x, with a tail turns leftward and motion serifs"
selector.y = "curlyTurnMotionSerifed"
selector."y/nonCursive" = "curlyTurnMotionSerifed"
selector."y/sansSerif" = "curlyTurn"
selector.yHookTop = "curlyTurn"
@ -4371,6 +4381,7 @@ selector.yHookTop = "curlyTurn"
rank = 11
description = "Cursive-like `y`, with motion serifs"
selector.y = "cursiveMotionSerifed"
selector."y/nonCursive" = "straightTurnMotionSerifed"
selector."y/sansSerif" = "cursive"
selector.yHookTop = "cursive"
@ -4378,6 +4389,7 @@ selector.yHookTop = "cursive"
rank = 12
description = "Cursive-like `y` with flat terminal hook, and motion serifs"
selector.y = "cursiveFlatHookMotionSerifed"
selector."y/nonCursive" = "straightTurnMotionSerifed"
selector."y/sansSerif" = "cursiveFlatHook"
selector.yHookTop = "cursiveFlatHook"

View file

@ -5,6 +5,8 @@ export async function collectBlockData() {
[[0xe0a0, 0xe0df], "Private Use Area — Powerline"],
[[0xee00, 0xee3f], "Private Use Area — Progress Bar"],
// Missing ranges in UnicodeDataIndex
[[0x10780, 0x107bf], "Latin Extended-F"],
[[0x1df00, 0x1dfff], "Latin Extended-G"],
[[0x1fa70, 0x1faff], "Symbols and Pictographs Extended-A "],
[[0x1fb00, 0x1fbff], "Symbols for Legacy Computing"]
];