From a038c05a260d6859810746646ff9eb0cb7953001 Mon Sep 17 00:00:00 2001 From: John McWilliams <37010132+jmcwilliams403@users.noreply.github.com> Date: Sun, 28 Jul 2024 17:39:43 -0400 Subject: [PATCH] Add variant selectors for Cyrillic Capital En/Er. (#2439) --- changes/31.0.1.md | 1 + .../src/letter/latin-ext/upper-aa-ao.ptl | 2 +- .../font-glyphs/src/letter/latin/upper-h.ptl | 10 +- .../font-glyphs/src/letter/latin/upper-n.ptl | 8 +- .../font-glyphs/src/letter/latin/upper-p.ptl | 8 +- params/variants.toml | 119 ++++++++++++++++-- .../src/templates/package-sample.mjs | 2 +- .../src/templates/stylistic-set.mjs | 2 +- 8 files changed, 123 insertions(+), 29 deletions(-) diff --git a/changes/31.0.1.md b/changes/31.0.1.md index 968daa742..f62e4828b 100644 --- a/changes/31.0.1.md +++ b/changes/31.0.1.md @@ -1,3 +1,4 @@ +* Add separate variant selectors for Cyrillic Capital En/Er (`VXAA`, `VXAB`). * Add characters: - BLACK-LETTER CAPITAL H (`U+210C`). - BLACK-LETTER CAPITAL I (`U+2111`). diff --git a/packages/font-glyphs/src/letter/latin-ext/upper-aa-ao.ptl b/packages/font-glyphs/src/letter/latin-ext/upper-aa-ao.ptl index 7bcf8ef82..2b7334cc9 100644 --- a/packages/font-glyphs/src/letter/latin-ext/upper-aa-ao.ptl +++ b/packages/font-glyphs/src/letter/latin-ext/upper-aa-ao.ptl @@ -169,7 +169,7 @@ glyph-block Letter-Latin-Upper-AA-AO : begin set-mark-anchor 'cvDecompose' 0 0 include : letterShape df CAP 0 0.1 0.28 - select-variant "cyrl/Rha/left" (follow -- 'P') + select-variant "cyrl/Rha/left" (follow -- 'cyrl/Er') select-variant "cyrl/Rha/right" derive-multi-part-glyphs "cyrl/Rha" 0x516 {'cyrl/Rha/left' 'cyrl/Rha/right'} BuildRha diff --git a/packages/font-glyphs/src/letter/latin/upper-h.ptl b/packages/font-glyphs/src/letter/latin/upper-h.ptl index 97e7d9a82..3126efead 100644 --- a/packages/font-glyphs/src/letter/latin/upper-h.ptl +++ b/packages/font-glyphs/src/letter/latin/upper-h.ptl @@ -243,8 +243,8 @@ glyph-block Letter-Latin-Upper-H : begin select-variant 'grek/Eta' 0x397 (follow -- 'H') select-variant 'HTurned' 0xA78D (follow -- 'H') link-reduced-variant 'grek/Eta/sansSerif' 'grek/Eta' MathSansSerif (follow -- 'H/sansSerif') - alias 'cyrl/En' 0x41D 'H' - alias 'cyrl/En/descBase' null 'H/descBase' + select-variant 'cyrl/En' 0x41D (shapeFrom -- 'H') + select-variant 'cyrl/En/descBase' (shapeFrom -- 'H') select-variant 'leftHalfH' 0x2C75 select-variant 'rightHalfH' 0xA7F5 select-variant 'grek/Heta' 0x370 (shapeFrom -- 'leftHalfH') @@ -265,7 +265,7 @@ glyph-block Letter-Latin-Upper-H : begin derive-composites 'cyrl/EnTail' 0x4C9 'cyrl/En/descBase' [CyrTailDescender.rSideJut RightSB 0] derive-composites 'cyrl/enTail' 0x4CA 'cyrl/en/descBase' [CyrTailDescender.rSideJut RightSB 0] - CreateSelectorVariants 'cyrl/EnGhe' 0x4A4 [Object.keys HConfig] (follow -- 'H') + CreateSelectorVariants 'cyrl/EnGhe' 0x4A4 [Object.keys HConfig] (follow -- 'cyrl/En') CreateSelectorVariants 'cyrl/enghe' 0x4A5 [Object.keys HConfig] (follow -- 'cyrl/en') select-variant 'Hwair' 0x1F6 @@ -274,10 +274,10 @@ glyph-block Letter-Latin-Upper-H : begin select-variant 'HStroke' 0x126 (follow -- 'H') select-variant 'smcpHStroke' null (follow -- 'H') - select-variant 'cyrl/EnMidHook' 0x0522 (follow -- 'H') + select-variant 'cyrl/EnMidHook' 0x0522 (follow -- 'cyrl/En') select-variant 'cyrl/enMidHook' 0x0523 (follow -- 'cyrl/en') - select-variant 'cyrl/NjeKomi' 0x050A (follow -- 'Hwair') + select-variant 'cyrl/NjeKomi' 0x050A select-variant 'cyrl/njeKomi' 0x050B create-glyph 'mathbb/H' 0x210D : glyph-proc diff --git a/packages/font-glyphs/src/letter/latin/upper-n.ptl b/packages/font-glyphs/src/letter/latin/upper-n.ptl index fe431f8d8..b3954383f 100644 --- a/packages/font-glyphs/src/letter/latin/upper-n.ptl +++ b/packages/font-glyphs/src/letter/latin/upper-n.ptl @@ -115,7 +115,7 @@ glyph-block Letter-Latin-Upper-N : begin local [object swEnd] : include : NShape bodyType slabType CAP SB RightSB (crDiag -- crD) include : EngHook RightSB 0 Descender (sw -- [Math.min Stroke (swEnd * 1.5)]) - create-glyph "NLTail.\(suffix)" : glyph-proc + create-glyph "NHookLeft.\(suffix)" : glyph-proc include [refer-glyph "N.\(suffix)"] AS_BASE ALSO_METRICS eject-contour 'serifLB' include : PalatalHook.lExt SB 0 @@ -141,9 +141,9 @@ glyph-block Letter-Latin-Upper-N : begin derive-composites 'NDescender' 0xA790 'N' [CyrDescender.rSideJut RightSB 0] - select-variant 'Eng' 0x14A (follow -- 'N') - select-variant 'smcpN' 0x274 (follow -- 'N') - select-variant 'NLTail' 0x19D (follow -- 'N') + select-variant 'Eng' 0x14A (follow -- 'N') + select-variant 'smcpN' 0x274 (follow -- 'N') + select-variant 'NHookLeft' 0x19D (follow -- 'N') select-variant 'currency/nairaSignBase' (follow -- 'N') create-glyph 'cyrl/I' 0x418 : glyph-proc diff --git a/packages/font-glyphs/src/letter/latin/upper-p.ptl b/packages/font-glyphs/src/letter/latin/upper-p.ptl index f393294ee..93553240e 100644 --- a/packages/font-glyphs/src/letter/latin/upper-p.ptl +++ b/packages/font-glyphs/src/letter/latin/upper-p.ptl @@ -217,13 +217,13 @@ glyph-block Letter-Latin-Upper-P : begin select-variant 'P' 'P' link-reduced-variant 'P/sansSerif' 'P' MathSansSerif - select-variant 'grek/Rho' 0x3A1 (follow -- 'P') - link-reduced-variant 'grek/Rho/sansSerif' 'grek/Rho' MathSansSerif (follow -- 'P/sansSerif') + select-variant 'grek/Rho' 0x3A1 + link-reduced-variant 'grek/Rho/sansSerif' 'grek/Rho' MathSansSerif select-variant 'smcpP' 0x1D18 (follow -- 'P') - alias 'grek/smcpRho' 0x1D29 'smcpP' + select-variant 'grek/smcpRho' 0x1D29 (shapeFrom -- 'smcpP') (follow -- 'grek/Rho') - alias 'cyrl/Er' 0x420 'P' + select-variant 'cyrl/Er' 0x420 (shapeFrom -- 'P') select-variant 'PHookLeft' 0x1A4 diff --git a/params/variants.toml b/params/variants.toml index 3ac95ab6e..14e4eea4b 100644 --- a/params/variants.toml +++ b/params/variants.toml @@ -962,8 +962,6 @@ selector."grek/Heta" = "serifless" selector."grek/heta" = "serifless" selector.Hwair = "serifless" selector.HHookTop = "serifless" -selector."cyrl/Nje/leftHalf" = "serifless" -selector."cyrl/Nje/leftHalf/reduced" = "serifless" [prime.capital-h.variants.top-left-serifed] rank = 2 @@ -977,8 +975,6 @@ selector."grek/Heta" = "topLeftSerifed" selector."grek/heta" = "topLeftSerifed" selector.Hwair = "topLeftSerifed" selector.HHookTop = "serifless" -selector."cyrl/Nje/leftHalf" = "topLeftSerifed" -selector."cyrl/Nje/leftHalf/reduced" = "topLeftSerifed" [prime.capital-h.variants.top-left-bottom-right-serifed] rank = 3 @@ -992,8 +988,6 @@ selector."grek/Heta" = "topLeftSerifed" selector."grek/heta" = "topLeftSerifed" selector.Hwair = "topLeftSerifed" selector.HHookTop = "topLeftBottomRightSerifed" -selector."cyrl/Nje/leftHalf" = "topLeftSerifed" -selector."cyrl/Nje/leftHalf/reduced" = "topLeftSerifed" [prime.capital-h.variants.serifed] rank = 4 @@ -1007,8 +1001,6 @@ selector."grek/Heta" = "serifed" selector."grek/heta" = "topLeftSerifed" selector.Hwair = "serifedExceptBottomRight" selector.HHookTop = "serifed" -selector."cyrl/Nje/leftHalf" = "serifed" -selector."cyrl/Nje/leftHalf/reduced" = "serifedExceptBottomRight" @@ -1343,7 +1335,6 @@ descriptionAffix = "closed shape" selectorAffix.P = "closed" selectorAffix."P/sansSerif" = "closed" selectorAffix.PHookLeft = "closed" -selectorAffix."currency/rubleSign" = "closed" [prime.capital-p.variants-buildup.stages.body.open] rank = 2 @@ -1351,7 +1342,6 @@ descriptionAffix = "open shape" selectorAffix.P = "open" selectorAffix."P/sansSerif" = "open" selectorAffix.PHookLeft = "open" -selectorAffix."currency/rubleSign" = "closed" [prime.capital-p.variants-buildup.stages.serifs.serifless] rank = 1 @@ -1360,7 +1350,6 @@ descriptionJoiner = "without" selectorAffix.P = "serifless" selectorAffix."P/sansSerif" = "serifless" selectorAffix.PHookLeft = "serifless" -selectorAffix."currency/rubleSign" = "serifless" [prime.capital-p.variants-buildup.stages.serifs.motion-serifed] rank = 2 @@ -1368,7 +1357,6 @@ descriptionAffix = "motion serifs" selectorAffix.P = "motionSerifed" selectorAffix."P/sansSerif" = "serifless" selectorAffix.PHookLeft = "serifless" -selectorAffix."currency/rubleSign" = "motionSerifed" [prime.capital-p.variants-buildup.stages.serifs.serifed] rank = 3 @@ -1376,7 +1364,6 @@ descriptionAffix = "serifs" selectorAffix.P = "serifed" selectorAffix."P/sansSerif" = "serifless" selectorAffix.PHookLeft = "serifed" -selectorAffix."currency/rubleSign" = "serifed" @@ -6602,6 +6589,50 @@ selectorAffix."cyrl/em" = "smallCyrl" +[prime.cyrl-capital-en] +sampler = "Н" +samplerExplain = "Cyrillic Capital En" +nonBreakingTagForNewVariantSelector = "VXAA" # REMOVE IN NEXT MAJOR VERSION CHANGE +tagKind = "letter" + +[prime.cyrl-capital-en.variants.serifless] +rank = 1 +description = "Cyrillic Capital En (`Н`) without serifs" +selector."cyrl/En" = "serifless" +selector."cyrl/En/descBase" = "serifless" +selector."cyrl/NjeKomi" = "serifless" +selector."cyrl/Nje/leftHalf" = "serifless" +selector."cyrl/Nje/leftHalf/reduced" = "serifless" + +[prime.cyrl-capital-en.variants.top-left-serifed] +rank = 2 +description = "Cyrillic Capital En (`Н`) with serif only at top left" +selector."cyrl/En" = "topLeftSerifed" +selector."cyrl/En/descBase" = "topLeftSerifed" +selector."cyrl/NjeKomi" = "topLeftSerifed" +selector."cyrl/Nje/leftHalf" = "topLeftSerifed" +selector."cyrl/Nje/leftHalf/reduced" = "topLeftSerifed" + +[prime.cyrl-capital-en.variants.top-left-bottom-right-serifed] +rank = 3 +description = "Cyrillic Capital En (`Н`) with serif only at top left and bottom right" +selector."cyrl/En" = "topLeftBottomRightSerifed" +selector."cyrl/En/descBase" = "topLeftSerifed" +selector."cyrl/NjeKomi" = "topLeftSerifed" +selector."cyrl/Nje/leftHalf" = "topLeftSerifed" +selector."cyrl/Nje/leftHalf/reduced" = "topLeftSerifed" + +[prime.cyrl-capital-en.variants.serifed] +rank = 4 +description = "Cyrillic Capital En (`Н`) with serifs" +selector."cyrl/En" = "serifed" +selector."cyrl/En/descBase" = "serifed" +selector."cyrl/NjeKomi" = "serifedExceptBottomRight" +selector."cyrl/Nje/leftHalf" = "serifed" +selector."cyrl/Nje/leftHalf/reduced" = "serifedExceptBottomRight" + + + [prime.cyrl-en] sampler = "н" samplerExplain = "Cyrillic Lower En" @@ -6678,6 +6709,62 @@ selectorAffix."cyrl/njeKomi" = "serifedExceptBottomRight" +[prime.cyrl-capital-er] +sampler = "Р" +samplerExplain = "Cyrillic Capital Er" +nonBreakingTagForNewVariantSelector = "VXAB" # REMOVE IN NEXT MAJOR VERSION CHANGE +tagKind = "letter" + +[prime.cyrl-capital-er.variants-buildup] +entry = "body" +descriptionLeader = "Cyrillic Capital Er (`Р`)" + +[prime.cyrl-capital-er.variants-buildup.stages.body."*"] +next = "serifs" + +[prime.cyrl-capital-er.variants-buildup.stages.body.closed] +rank = 1 +descriptionAffix = "closed shape" +selectorAffix."grek/Rho" = "closed" +selectorAffix."grek/Rho/sansSerif" = "closed" +selectorAffix."cyrl/Er" = "closed" +selectorAffix."currency/rubleSign" = "closed" + +[prime.cyrl-capital-er.variants-buildup.stages.body.open] +rank = 2 +descriptionAffix = "open shape" +selectorAffix."grek/Rho" = "open" +selectorAffix."grek/Rho/sansSerif" = "open" +selectorAffix."cyrl/Er" = "open" +selectorAffix."currency/rubleSign" = "closed" + +[prime.cyrl-capital-er.variants-buildup.stages.serifs.serifless] +rank = 1 +descriptionAffix = "serifs" +descriptionJoiner = "without" +selectorAffix."grek/Rho" = "serifless" +selectorAffix."grek/Rho/sansSerif" = "serifless" +selectorAffix."cyrl/Er" = "serifless" +selectorAffix."currency/rubleSign" = "serifless" + +[prime.cyrl-capital-er.variants-buildup.stages.serifs.motion-serifed] +rank = 2 +descriptionAffix = "motion serifs" +selectorAffix."grek/Rho" = "motionSerifed" +selectorAffix."grek/Rho/sansSerif" = "serifless" +selectorAffix."cyrl/Er" = "motionSerifed" +selectorAffix."currency/rubleSign" = "motionSerifed" + +[prime.cyrl-capital-er.variants-buildup.stages.serifs.serifed] +rank = 3 +descriptionAffix = "serifs" +selectorAffix."grek/Rho" = "serifed" +selectorAffix."grek/Rho/sansSerif" = "serifless" +selectorAffix."cyrl/Er" = "serifed" +selectorAffix."currency/rubleSign" = "serifed" + + + [prime.cyrl-er] sampler = "р" samplerExplain = "Cyrillic Lower Er" @@ -8331,7 +8418,9 @@ cyrl-capital-ka = "symmetric-connected-serifless" cyrl-ka = "symmetric-connected-serifless" cyrl-el = "straight" cyrl-em = "flat-bottom-serifless" +cyrl-capital-en = "serifless" cyrl-en = "serifless" +cyrl-capital-er = "closed-serifless" cyrl-er = "eared-serifless" cyrl-capital-u = "straight-serifless" cyrl-u = "straight-serifless" @@ -8481,7 +8570,9 @@ cyrl-ze = "unilateral-serifed" cyrl-capital-ka = "symmetric-connected-serifed" cyrl-ka = "symmetric-connected-serifed" cyrl-em = "flat-bottom-serifed" +cyrl-capital-en = "serifed" cyrl-en = "serifed" +cyrl-capital-er = "closed-serifed" cyrl-er = "eared-serifed" cyrl-capital-u = "straight-turn-serifed" cyrl-u = "straight-turn-serifed" @@ -10250,6 +10341,7 @@ cyrl-capital-ze = "unilateral-inward-serifed" cyrl-ze = "serifless" cyrl-capital-ka = "symmetric-connected-bottom-right-serifed" cyrl-ka = "symmetric-connected-serifless" +cyrl-capital-er = "closed-motion-serifed" cyrl-capital-u = "straight-turn-serifless" cyrl-u = "straight-turn-serifless" cyrl-capital-e = "unilateral-inward-serifed" @@ -10338,6 +10430,7 @@ capital-thorn = "serifed" cyrl-ze = "unilateral-inward-serifed" cyrl-capital-ka = "symmetric-connected-serifed" cyrl-ka = "symmetric-connected-serifed" +cyrl-capital-er = "closed-serifed" cyrl-capital-u = "straight-turn-serifed" cyrl-u = "straight-turn-serifed" cyrl-e = "unilateral-inward-serifed" diff --git a/tools/generate-samples/src/templates/package-sample.mjs b/tools/generate-samples/src/templates/package-sample.mjs index e8346946f..64451059e 100644 --- a/tools/generate-samples/src/templates/package-sample.mjs +++ b/tools/generate-samples/src/templates/package-sample.mjs @@ -5,7 +5,7 @@ export const ssStrings = [ ["ABC.DEF.GHI.JKL.MNO.PQRS.TUV.WXYZ", "abc.def.ghi.jkl.mno.pqrs.tuv.wxyz"], ["!iIlL17|¦ ¢coO08BbDQ $5SZ2zs 96µm", "float il1[]={1-2/3.4,5+6=7/8%90};"], ["1234567890 ,._-+= >< «¯-¬_» ~–÷+×", "{*}[]()<>`+-=$/#_%^@\\&|~?'\" !,.;:"], - ["CG6Qg9q¶ äöü Þẞðþſß ΓΔΛαδιλμξπτχ∂", [..."ЖЗКУЭЯавжзклмнруфчъыьэя ", "<=", " ", "!=", " ", "=="]] + ["CG6Qg9q¶ äöü Þẞðþſß ΓΔΛαδιλμξπτχ∂", [..."ЖЗКНРУЭЯавжзклмнруфчьыэя ", "<=", " ", "!=", " ", "=="]] ]; function* makeSample(lbm, hotChars) { diff --git a/tools/generate-samples/src/templates/stylistic-set.mjs b/tools/generate-samples/src/templates/stylistic-set.mjs index 281af4e9d..3d1dbed4a 100644 --- a/tools/generate-samples/src/templates/stylistic-set.mjs +++ b/tools/generate-samples/src/templates/stylistic-set.mjs @@ -5,7 +5,7 @@ const ssStrings = [ ["ABC.DEF.GHI.JKL.MNO.PQRS.TUV.WXYZ", "abc.def.ghi.jkl.mno.pqrs.tuv.wxyz"], ["!iIlL17|¦ ¢coO08BbDQ $5SZ2zs 96µm", "float il1[]={1-2/3.4,5+6=7/8%90};"], ["1234567890 ,._-+= >< «¯-¬_» ~–÷+×", "{*}[]()<>`+-=$/#_%^@\\&|~?'\" !,.;:"], - ["CG6Qg9q¶ äöü Þẞðþſß ΓΔΛαδιλμξπτχ∂", [..."ЖЗКУЭЯавжзклмнруфчъыьэя ", "<=", " ", "!=", " ", "=="]] + ["CG6Qg9q¶ äöü Þẞðþſß ΓΔΛαδιλμξπτχ∂", [..."ЖЗКНРУЭЯавжзклмнруфчьыэя ", "<=", " ", "!=", " ", "=="]] ]; function* makeSample(theme, lbm, features, hotChars) {