forked from vercel/next.js
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfont-utils.ts
More file actions
44 lines (39 loc) · 1.47 KB
/
font-utils.ts
File metadata and controls
44 lines (39 loc) · 1.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import {
DEFAULT_SERIF_FONT,
DEFAULT_SANS_SERIF_FONT,
} from '../shared/lib/constants'
const capsizeFontsMetrics = require('next/dist/server/capsize-font-metrics.json')
function formatName(str: string): string {
return str
.replace(/(?:^\w|[A-Z]|\b\w)/g, function (word, index) {
return index === 0 ? word.toLowerCase() : word.toUpperCase()
})
.replace(/\s+/g, '')
}
function formatOverrideValue(val: number) {
return Math.abs(val * 100).toFixed(2)
}
export function calculateSizeAdjustValues(fontName: string) {
const fontKey = formatName(fontName)
const fontMetrics = capsizeFontsMetrics[fontKey]
let { category, ascent, descent, lineGap, unitsPerEm, xWidthAvg } =
fontMetrics
const mainFontAvgWidth = xWidthAvg / unitsPerEm
const fallbackFont =
category === 'serif' ? DEFAULT_SERIF_FONT : DEFAULT_SANS_SERIF_FONT
const fallbackFontName = formatName(fallbackFont.name)
const fallbackFontMetrics = capsizeFontsMetrics[fallbackFontName]
const fallbackFontAvgWidth =
fallbackFontMetrics.xWidthAvg / fallbackFontMetrics.unitsPerEm
let sizeAdjust = xWidthAvg ? mainFontAvgWidth / fallbackFontAvgWidth : 1
ascent = formatOverrideValue(ascent / (unitsPerEm * sizeAdjust))
descent = formatOverrideValue(descent / (unitsPerEm * sizeAdjust))
lineGap = formatOverrideValue(lineGap / (unitsPerEm * sizeAdjust))
return {
ascent,
descent,
lineGap,
fallbackFont: fallbackFont.name,
sizeAdjust: formatOverrideValue(sizeAdjust),
}
}