diff --git a/changes/15.1.0.md b/changes/15.1.0.md new file mode 100644 index 000000000..cee27ad3b --- /dev/null +++ b/changes/15.1.0.md @@ -0,0 +1,17 @@ +* Add Characters + - MODIFIER LETTER YIN DEPARTING TONE MARK (`U+02EA`); + - MODIFIER LETTER YANG DEPARTING TONE MARK (`U+02EB`); + - MODIFIER LETTER DOUBLE APOSTROPHE (`U+02EE`); + - MODIFIER LETTER MIDDLE GRAVE ACCENT (`U+02F4`); + - MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT (`U+02F5`); + - MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT (`U+02F6`); + - MODIFIER LETTER RAISED COLON (`U+02F8`); + - MODIFIER LETTER BEGIN HIGH TONE (`U+02F9`); + - MODIFIER LETTER END HIGH TONE (`U+02FA`); + - MODIFIER LETTER BEGIN LOW TONE (`U+02FB`); + - MODIFIER LETTER END LOW TONE (`U+02FC`); + - MODIFIER LETTER SHELF (`U+02FD`); + - MODIFIER LETTER OPEN SHELF (`U+02FE`); + - MODIFIER LETTER LOW LEFT ARROW (`U+02FF`); + - COMBINING LEFT ARROW BELOW (`U+20EE`); + - COMBINING RIGHT ARROW BELOW (`U+20EF`); diff --git a/font-src/glyphs/marks/below.ptl b/font-src/glyphs/marks/below.ptl index 2e6da4809..19827ac67 100644 --- a/font-src/glyphs/marks/below.ptl +++ b/font-src/glyphs/marks/below.ptl @@ -182,6 +182,23 @@ glyph-block Mark-Below : begin set-mark-anchor 'below' markMiddle 0 markMiddle belowMarkStack set-base-anchor 'belowBrace' markMiddle belowMarkMid + create-glyph 'shelfBelow' : glyph-proc + set-width 0 + set-mark-anchor 'below' markMiddle 0 markMiddle belowMarkStack + set-base-anchor 'belowBrace' markMiddle belowMarkMid + + include : VBar (SB - Width) belowMarkBot belowMarkTop (markFine * 2) + include : VBar (RightSB - Width) belowMarkBot belowMarkTop (markFine * 2) + include : HBarBottom (SB - Width) (RightSB - Width) belowMarkBot (markFine * 2) + + create-glyph 'openShelfBelow' : glyph-proc + set-width 0 + set-mark-anchor 'below' markMiddle 0 markMiddle belowMarkStack + set-base-anchor 'belowBrace' markMiddle belowMarkMid + + include : VBar (SB - Width) belowMarkBot belowMarkTop (markFine * 2) + include : HBarBottom (SB - Width) (RightSB - Width) belowMarkBot (markFine * 2) + # Turned below marks define [TurnAboveMarkToBelow gnBelowMark unicodeBelowMark gnAboveMark] : begin derive-glyphs gnBelowMark unicodeBelowMark gnAboveMark : function [src gr] : glyph-proc @@ -230,6 +247,8 @@ glyph-block Mark-Below : begin TurnAboveMarkToBelow 'sbRsbUnderlineBelow' null 'sbRsbOverlineAbove' TurnAboveMarkToBelow 'leftHalfCircleBelow' 0x31C 'rightHalfCircleAbove' TurnAboveMarkToBelow 'rightHalfCircleBelow' 0x339 'leftHalfCircleAbove' + TurnAboveMarkToBelow 'leftArrowBelow' 0x20EE 'rightArrowAbove' + TurnAboveMarkToBelow 'rightArrowBelow' 0x20EF 'leftArrowAbove' create-glyph 'greaterAndUpArrowheadBelow' 0x0356 : glyph-proc set-width 0 diff --git a/font-src/glyphs/symbol/punctuation/ascii-marks.ptl b/font-src/glyphs/symbol/punctuation/ascii-marks.ptl index a36e7ebee..5d6161274 100644 --- a/font-src/glyphs/symbol/punctuation/ascii-marks.ptl +++ b/font-src/glyphs/symbol/punctuation/ascii-marks.ptl @@ -9,7 +9,7 @@ glyph-block Symbol-Punctuation-Ascii-Marks : begin glyph-block-import CommonShapes glyph-block-import Common-Derivatives glyph-block-import Mark-Shared-Metrics : markExtend - glyph-block-import Mark-Above : aboveMarkTop + glyph-block-import Mark-Above : aboveMarkTop aboveMarkMid glyph-block-import Symbol-Punctuation-Quotes-And-Primes define [MarkZoom w] : glyph-proc @@ -48,3 +48,12 @@ glyph-block Symbol-Punctuation-Ascii-Marks : begin include [refer-glyph 'markBaseSpace'] AS_BASE ALSO_METRICS include [refer-glyph 'ringAbove'] include : MarkZoom currentGlyph.advanceWidth + + do "spacing centered marks" + define shift : ApparentTranslate 0 (SymbolMid - aboveMarkMid) + derive-composites 'mdfMidGrave' 0x2F4 'markBaseSpace' 'graveAbove' shift + derive-composites 'mdfMidDoubleGrave' 0x2F5 'markBaseSpace' 'doubleGraveAbove' shift + derive-composites 'mdfMidDoubleAcute' 0x2F6 'markBaseSpace' 'doubleAcuteAbove' shift + + derive-composites 'mdfShelf' 0x2FD 'markBaseSpace' 'shelfBelow' + derive-composites 'mdfOpenShelf' 0x2FE 'markBaseSpace' 'openShelfBelow' diff --git a/font-src/glyphs/symbol/punctuation/other-phonetic.ptl b/font-src/glyphs/symbol/punctuation/other-phonetic.ptl index f707e0766..6d98a82be 100644 --- a/font-src/glyphs/symbol/punctuation/other-phonetic.ptl +++ b/font-src/glyphs/symbol/punctuation/other-phonetic.ptl @@ -11,6 +11,8 @@ glyph-block Symbol-Other-Phonetic : begin glyph-block-import Common-Derivatives local triangleSize : Math.min (PeriodRadius) (XH / 5) + local toneMarkLeft : mix SB RightSB 0.1 + local toneMarkRight : Width - toneMarkLeft create-glyph 'trianglecolon' 0x2D0 : glyph-proc include : union @@ -29,23 +31,25 @@ glyph-block Symbol-Other-Phonetic : begin corner Middle (XH - triangleSize * 2.75) corner (Middle + triangleSize * 1.35) XH - define [yOfTone tone] : mix (OperatorStroke / 2) (CAP - OperatorStroke / 2) (tone / 4) + define [yOfTone tone] : mix (OperatorStroke / 2) (CAP - OperatorStroke / 2) (tone / 4) define [yOfToneNeutral tone] : mix DotRadius (CAP - DotRadius) (tone / 4) + define [yOfToneDepart a b p] : mix (CAP * a + OperatorStroke / 2) (CAP * b - OperatorStroke / 2) p foreach tone [range 4 downtill 0] : begin create-glyph ('tone' + tone) (0x2E5 + 4 - tone) : glyph-proc - include : VBarRight [mix SB RightSB 0.9] 0 CAP OperatorStroke - include : HBar [mix SB RightSB 0.1] ([mix SB RightSB 0.9] - 1) [yOfTone tone] OperatorStroke + include : VBarRight toneMarkRight 0 CAP OperatorStroke + include : HBar toneMarkLeft (toneMarkRight - 0.1) [yOfTone tone] OperatorStroke create-glyph ('toneSandhi' + tone) (0xA712 + 4 - tone) : glyph-proc - include : VBarLeft [mix SB RightSB 0.1] 0 CAP OperatorStroke - include : HBar [mix SB RightSB 0.1] ([mix SB RightSB 0.9] - 1) [yOfTone tone] OperatorStroke + include : VBarLeft toneMarkLeft 0 CAP OperatorStroke + include : HBar (toneMarkLeft + 0.1) toneMarkRight [yOfTone tone] OperatorStroke create-glyph ('toneNeutral' + tone) (0xA708 + 4 - tone) : glyph-proc - include : VBarRight [mix SB RightSB 0.9] 0 CAP OperatorStroke - include : DotAt ([mix SB RightSB 0.1] + DotRadius) [yOfToneNeutral tone] DotRadius + include : VBarRight toneMarkRight 0 CAP OperatorStroke + include : DotAt (toneMarkLeft + DotRadius) [yOfToneNeutral tone] DotRadius create-glyph ('toneSandhiNeutral' + tone) (0xA70D + 4 - tone) : glyph-proc - include : VBarLeft [mix SB RightSB 0.1] 0 CAP OperatorStroke - include : DotAt ([mix SB RightSB 0.9] - DotRadius) [yOfToneNeutral tone] DotRadius + include : VBarLeft toneMarkLeft 0 CAP OperatorStroke + include : DotAt (toneMarkRight - DotRadius) [yOfToneNeutral tone] DotRadius + # Connected tones foreach toneStart [range 4 downtill 0] : foreach toneEnd [range 4 downtill 0] : begin create-glyph ('toneStart' + toneStart + toneEnd) : glyph-proc Joining.set currentGlyph Joining.Classes.Right @@ -110,3 +114,22 @@ glyph-block Symbol-Other-Phonetic : begin create-glyph ('toneSandhiMid' + toneStart + toneMid + toneEnd) : glyph-proc include [refer-glyph ('toneMid' + toneStart + toneMid + toneEnd)] AS_BASE ALSO_METRICS Joining.set currentGlyph Joining.Classes.Mid + + # Departing tones + local DepartingToneConfig : list + list 'departingToneYin' 0x2EA 0 0.5 0 + list 'departingToneYang' 0x2EB 0 0.5 0.5 + list 'beginHighTone' 0x2F9 0.6 1 1.0 + list 'beginLowTone' 0x2FB 0 0.4 0 + foreach { name code a b pos } [items-of DepartingToneConfig] : begin + create-glyph name code : glyph-proc + include : VBarLeft toneMarkLeft (CAP * a) (CAP * b) OperatorStroke + include : HBar (toneMarkLeft + 0.1) toneMarkRight [yOfToneDepart a b pos] OperatorStroke + + local EnteringToneConfig : list + list 'endHighTone' 0x2FA 0.6 1 1.0 + list 'endLowTone' 0x2FC 0 0.4 0 + foreach { name code a b pos } [items-of EnteringToneConfig] : begin + create-glyph name code : glyph-proc + include : VBarRight toneMarkRight (CAP * a) (CAP * b) OperatorStroke + include : HBar toneMarkLeft (toneMarkRight - 0.1) [yOfToneDepart a b pos] OperatorStroke diff --git a/font-src/glyphs/symbol/punctuation/quotes-and-primes.ptl b/font-src/glyphs/symbol/punctuation/quotes-and-primes.ptl index e3f200402..e99f06469 100644 --- a/font-src/glyphs/symbol/punctuation/quotes-and-primes.ptl +++ b/font-src/glyphs/symbol/punctuation/quotes-and-primes.ptl @@ -63,9 +63,10 @@ glyph-block Symbol-Punctuation-Quotes-And-Primes : begin derive-glyphs 'revDoubleQuote' 0x201F 'revSingleQuote' DoubleQuoteProc derive-glyphs 'revLowDoubleQuote' 0x2E42 'revLowSingleQuote' DoubleQuoteProc - alias 'mdfTurncomma' 0x2BB 'openSingleQuote' - alias 'mdfApostrophe' 0x2BC 'closeSingleQuote' - alias 'mdfRevComma' 0x2BD 'revSingleQuote' + alias 'mdfTurncomma' 0x2BB 'openSingleQuote' + alias 'mdfApostrophe' 0x2BC 'closeSingleQuote' + alias 'mdfRevComma' 0x2BD 'revSingleQuote' + alias 'mdfDoubleApostrophe' 0x2EE 'closeDoubleQuote' # Primes create-glyph 'prime' 0x2032 : glyph-proc diff --git a/font-src/glyphs/symbol/punctuation/small.ptl b/font-src/glyphs/symbol/punctuation/small.ptl index 96b3ba747..5f8e8e802 100644 --- a/font-src/glyphs/symbol/punctuation/small.ptl +++ b/font-src/glyphs/symbol/punctuation/small.ptl @@ -150,6 +150,14 @@ glyph-block Symbol-Punctuation-Small : begin include : DrawAt df.middle [mix dr (XH - dr) k] (dr - overshoot) include : DrawAt df.middle [mix dr (XH - dr) (1 - k)] (dr - overshoot) + create-glyph "modifierLetterRaisedColon.\(suffix)" : glyph-proc + local df : DivFrame para.diversityII + set-width df.width + local k 0.9 + local dr : DotRadius * kDotRadius + include : DrawAt df.middle (CAP - [mix dr (XH - dr) k]) (dr - overshoot) + include : DrawAt df.middle (CAP - [mix dr (XH - dr) (1 - k)]) (dr - overshoot) + create-glyph "semicolon.\(suffix)" : glyph-proc include [refer-glyph "comma.\(suffix)"] AS_BASE ALSO_METRICS include [refer-glyph "xhPeriod.\(suffix)"] @@ -161,6 +169,7 @@ glyph-block Symbol-Punctuation-Small : begin select-variant 'colon' ':' (follow -- 'punctuationDot') select-variant 'colon/mid' (follow -- 'punctuationDot') select-variant 'modifierLetterColon' 0xA789 (follow -- 'punctuationDot') + select-variant 'modifierLetterRaisedColon' 0x2F8 (follow -- 'punctuationDot') select-variant 'semicolon' ';' (follow -- 'punctuationDot') select-variant 'invertSemicolon' 0x204F (follow -- 'punctuationDot') alias 'greekquestion' 0x37E 'semicolon' diff --git a/font-src/meta/unicode-knowledge.ptl b/font-src/meta/unicode-knowledge.ptl index 6a6327c8c..75e190aae 100644 --- a/font-src/meta/unicode-knowledge.ptl +++ b/font-src/meta/unicode-knowledge.ptl @@ -140,6 +140,7 @@ export : define decompositionOverrides : object ."\u02F0" "\uE00D\uE004" ."\u02F1" "\uE00D\u0354" ."\u02F2" "\uE00D\u0355" + ."\u02FF" "\uE00D\u20EE" ."\u1FED" "\uE00D\u0308\u0300" ."\u1FEE" "\uE00D\u0308\u0301" diff --git a/utility/copy-char-name-to-markdown.js b/utility/copy-char-name-to-markdown.js new file mode 100644 index 000000000..852bf06e9 --- /dev/null +++ b/utility/copy-char-name-to-markdown.js @@ -0,0 +1,7 @@ +const ucdNames = require("@unicode/unicode-14.0.0/Names"); + +for (let i = 2; i < process.argv.length; i++) { + const lch = parseInt(process.argv[i], 16); + const name = ucdNames.get(lch); + console.log(" -", name, `(\`U+${lch.toString(16).toUpperCase().padStart(4, "0")}\`);`); +} diff --git a/verdafile.js b/verdafile.js index 429cae9f7..d68de79df 100644 --- a/verdafile.js +++ b/verdafile.js @@ -649,6 +649,7 @@ const PagesFontExport = task.group(`pages:font-export`, async (target, gr) => { const outDir = Path.resolve(pagesDir, "shared/fonts", gr); await target.need(GroupWebFonts(gr), de(outDir)); await cp(`${DIST}/${gr}/woff2`, Path.resolve(outDir, "woff2")); + await Delay(500); await createWebFontCssImpl(target, Path.resolve(outDir, `${gr}.css`), gr, webfontFormatsPages); await rm(Path.resolve(outDir, "ttf")); }); @@ -660,6 +661,7 @@ const PagesFastFontExport = task.group(`pages:fast-font-export`, async (target, const outDir = Path.resolve(pagesDir, "shared/fonts", gr); await target.need(GroupTTFs(gr), de(outDir)); await cp(`${DIST}/${gr}/ttf`, Path.resolve(outDir, "ttf")); + await Delay(500); await createWebFontCssImpl(target, Path.resolve(outDir, `${gr}.css`), gr, webfontFormatsFast); await rm(Path.resolve(outDir, "woff2")); });