🚀 Socket Launch Week Day 5:Introducing Repository Access Permissions and Custom Roles.Learn more
Sign In

@capsizecss/unpack

Package Overview
Dependencies
Maintainers
2
Versions
38
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@capsizecss/unpack - npm Package Compare versions

Comparing version
3.0.1
to
4.0.0
+20
dist/fs.d.mts
import { n as Options } from "./shared-CnZ3qQtb.mjs";
//#region src/fs.d.ts
declare const fromFile: (path: string, options?: Options) => Promise<{
familyName: string;
fullName: string;
postscriptName: string;
capHeight: number;
ascent: number;
descent: number;
lineGap: number;
unitsPerEm: number;
xHeight: number;
xWidthAvg: number;
subsets: Record<"latin" | "thai", {
xWidthAvg: number;
}>;
}>;
//#endregion
export { fromFile };
import { t as _fromBuffer } from "./shared-KjM_oZR2.mjs";
import { readFile } from "node:fs/promises";
//#region src/fs.ts
const fromFile = async (path, options) => {
return _fromBuffer(await readFile(path), "fromFile", "path", options);
};
//#endregion
export { fromFile };
import { Font } from "fontkitten";
//#region src/weightings.d.ts
declare const _default: {
latin: {
"0": number;
"1": number;
"2": number;
"3": number;
"4": number;
"5": number;
"6": number;
"7": number;
"8": number;
"9": number;
",": number;
" ": number;
t: number;
h: number;
e: number;
o: number;
f: number;
P: number;
p: number;
l: number;
"'": number;
s: number;
R: number;
u: number;
b: number;
i: number;
c: number;
C: number;
n: number;
a: number;
d: number;
y: number;
w: number;
B: number;
r: number;
z: number;
G: number;
j: number;
T: number;
".": number;
L: number;
k: number;
m: number;
"]": number;
J: number;
F: number;
v: number;
g: number;
A: number;
N: number;
"-": number;
H: number;
D: number;
M: number;
I: number;
E: number;
"\"": number;
S: number;
"(": number;
")": number;
x: number;
W: number;
Q: number;
Y: number;
q: number;
V: number;
á: number;
K: number;
U: number;
"=": number;
"[": number;
O: number;
é: number;
$: number;
":": number;
"|": number;
"/": number;
"%": number;
Z: number;
";": number;
X: number;
};
thai: {
ส: number;
ว: number;
น: number;
บ: number;
จ: number;
า: number;
ก: number;
เ: number;
ร: number;
ม: number;
ค: number;
ำ: number;
ข: number;
อ: number;
ป: number;
ด: number;
ใ: number;
ภ: number;
ท: number;
พ: number;
ฤ: number;
ษ: number;
ศ: number;
ะ: number;
ช: number;
แ: number;
ล: number;
ง: number;
ย: number;
ห: number;
ฝ: number;
ต: number;
โ: number;
ญ: number;
ณ: number;
ผ: number;
ไ: number;
ฯ: number;
ฟ: number;
ธ: number;
ถ: number;
ฐ: number;
ซ: number;
ฉ: number;
ฑ: number;
ฆ: number;
ฬ: number;
ฏ: number;
ฎ: number;
ฒ: number;
ๆ: number;
ฮ: number;
"\u0E52": number;
"\u0E55": number;
};
};
//#endregion
//#region src/shared.d.ts
type SupportedSubsets = keyof typeof _default;
declare const supportedSubsets: SupportedSubsets[];
declare const unpackMetricsFromFont: (font: Font) => {
familyName: string;
fullName: string;
postscriptName: string;
capHeight: number;
ascent: number;
descent: number;
lineGap: number;
unitsPerEm: number;
xHeight: number;
xWidthAvg: number;
subsets: Record<"latin" | "thai", {
xWidthAvg: number;
}>;
};
type Font$1 = ReturnType<typeof unpackMetricsFromFont>;
interface Options {
postscriptName?: string;
}
declare const fromBuffer: (buffer: Buffer, options?: Options) => Promise<{
familyName: string;
fullName: string;
postscriptName: string;
capHeight: number;
ascent: number;
descent: number;
lineGap: number;
unitsPerEm: number;
xHeight: number;
xWidthAvg: number;
subsets: Record<"latin" | "thai", {
xWidthAvg: number;
}>;
}>;
declare const fromBlob: (blob: Blob, options?: Options) => Promise<{
familyName: string;
fullName: string;
postscriptName: string;
capHeight: number;
ascent: number;
descent: number;
lineGap: number;
unitsPerEm: number;
xHeight: number;
xWidthAvg: number;
subsets: Record<"latin" | "thai", {
xWidthAvg: number;
}>;
}>;
declare const fromUrl: (url: string, options?: Options) => Promise<{
familyName: string;
fullName: string;
postscriptName: string;
capHeight: number;
ascent: number;
descent: number;
lineGap: number;
unitsPerEm: number;
xHeight: number;
xWidthAvg: number;
subsets: Record<"latin" | "thai", {
xWidthAvg: number;
}>;
}>;
//#endregion
export { fromBuffer as a, fromBlob as i, Options as n, fromUrl as o, SupportedSubsets as r, supportedSubsets as s, Font$1 as t };
import { create } from "fontkitten";
//#region src/weightings.ts
var weightings_default = {
"latin": {
"0": .0053,
"1": .0023,
"2": .0026,
"3": .001,
"4": 8e-4,
"5": .0015,
"6": 7e-4,
"7": 5e-4,
"8": 7e-4,
"9": 6e-4,
",": .0083,
" ": .154,
"t": .0672,
"h": .0351,
"e": .0922,
"o": .0571,
"f": .017,
"P": .0023,
"p": .0163,
"l": .0304,
"'": .0014,
"s": .0469,
"R": .0015,
"u": .0207,
"b": .0114,
"i": .0588,
"c": .0232,
"C": .0031,
"n": .0578,
"a": .0668,
"d": .0298,
"y": .0123,
"w": .011,
"B": .002,
"r": .0526,
"z": .0011,
"G": .0011,
"j": 9e-4,
"T": .0041,
".": .0079,
"L": .0012,
"k": .0046,
"m": .0181,
"]": 7e-4,
"J": 9e-4,
"F": .0015,
"v": .0076,
"g": .0155,
"A": .004,
"N": .0014,
"-": .0018,
"H": .0013,
"D": .0013,
"M": .0025,
"I": .0022,
"E": .0011,
"\"": .0012,
"S": .0041,
"(": .001,
")": .001,
"x": .0025,
"W": .0012,
"Q": 1e-4,
"Y": 3e-4,
"q": 8e-4,
"V": 5e-4,
"á": 1e-4,
"K": 7e-4,
"U": .0016,
"=": 7e-4,
"[": .0021,
"O": 9e-4,
"é": 1e-4,
"$": 2e-4,
":": 8e-4,
"|": .0038,
"/": 1e-4,
"%": 1e-4,
"Z": 2e-4,
";": 1e-4,
"X": 1e-4
},
"thai": {
"ส": .0258,
"ว": .0372,
"น": .0711,
"บ": .0258,
"จ": .0169,
"า": .1024,
"ก": .0552,
"เ": .0419,
"ร": .0873,
"ม": .0416,
"ค": .0214,
"ำ": .0097,
"ข": .0127,
"อ": .0459,
"ป": .0204,
"ด": .0271,
"ใ": .0109,
"ภ": .0046,
"ท": .0311,
"พ": .0175,
"ฤ": 9e-4,
"ษ": .0042,
"ศ": .0063,
"ะ": .0255,
"ช": .0158,
"แ": .0158,
"ล": .0339,
"ง": .0433,
"ย": .0345,
"ห": .0197,
"ฝ": 6e-4,
"ต": .0239,
"โ": .0077,
"ญ": .0039,
"ณ": .0071,
"ผ": .0077,
"ไ": .0111,
"ฯ": 7e-4,
"ฟ": .0044,
"ธ": .0068,
"ถ": .0061,
"ฐ": .0033,
"ซ": .0046,
"ฉ": .0023,
"ฑ": 4e-4,
"ฆ": 2e-4,
"ฬ": 3e-4,
"ฏ": 2e-4,
"ฎ": 3e-4,
"ฒ": .0012,
"ๆ": 3e-4,
"ฮ": 4e-4,
"๒": 1e-4,
"๕": 1e-4
}
};
//#endregion
//#region src/shared.ts
const supportedSubsets = Object.keys(weightings_default);
const weightingForCharacter = (character, subset) => {
if (!Object.keys(weightings_default[subset]).includes(character)) throw new Error(`No weighting specified for character: “${character}”`);
return weightings_default[subset][character];
};
const avgWidthForSubset = (font, subset) => {
const sampleString = Object.keys(weightings_default[subset]).join("");
const weightedWidth = font.glyphsForString(sampleString).reduce((sum, glyph, index) => {
const character = sampleString.charAt(index);
let charWidth = font["OS/2"].xAvgCharWidth;
try {
charWidth = glyph.advanceWidth;
} catch (e) {
console.warn(`Couldn’t read 'advanceWidth' for character “${character === " " ? "<space>" : character}” from “${font.familyName}”. Falling back to “xAvgCharWidth”.`);
}
if (glyph.isMark) return sum;
return sum + charWidth * weightingForCharacter(character, subset);
}, 0);
return Math.round(weightedWidth);
};
const unpackMetricsFromFont = (font) => {
const { capHeight, ascent, descent, lineGap, unitsPerEm, familyName, fullName, postscriptName, xHeight } = font;
const subsets = supportedSubsets.reduce((acc, subset) => ({
...acc,
[subset]: { xWidthAvg: avgWidthForSubset(font, subset) }
}), {});
return {
familyName,
fullName,
postscriptName,
capHeight,
ascent,
descent,
lineGap,
unitsPerEm,
xHeight,
xWidthAvg: subsets.latin.xWidthAvg,
subsets
};
};
function handleCollectionErrors(font, { postscriptName, apiName, apiParamName }) {
if (postscriptName && font === null) throw new Error([
`The provided \`postscriptName\` of “${postscriptName}” cannot be found in the provided font collection.\n`,
"Run the same command without specifying a `postscriptName` in the options to see the available names in the collection.",
"For example:",
"------------------------------------------",
`const metrics = await ${apiName}('<${apiParamName}>');`,
"------------------------------------------\n",
""
].join("\n"));
if (font !== null && font.isCollection) {
const availableNames = font.fonts.map((f) => f.postscriptName);
throw new Error([
"Metrics cannot be unpacked from a font collection.\n",
"Provide either a single font or specify a `postscriptName` to extract from the collection via the options.",
"For example:",
"------------------------------------------",
`const metrics = await ${apiName}('<${apiParamName}>', {`,
` postscriptName: '${availableNames[0]}'`,
"});",
"------------------------------------------\n",
"Available `postscriptNames` in this font collection are:",
...availableNames.map((fontName) => ` - ${fontName}`),
""
].join("\n"));
}
}
const _fromBuffer = async (buffer, apiName, apiParamName, options) => {
const { postscriptName } = options || {};
const fontkitFont = create(buffer instanceof Buffer ? buffer : Buffer.from(buffer), postscriptName);
handleCollectionErrors(fontkitFont, {
postscriptName,
apiName,
apiParamName
});
return unpackMetricsFromFont(fontkitFont);
};
const fromBuffer = async (buffer, options) => {
return _fromBuffer(buffer, "fromBuffer", "buffer", options);
};
const fromBlob = async (blob, options) => {
const arrayBuffer = await blob.arrayBuffer();
return _fromBuffer(new Uint8Array(arrayBuffer), "fromBlob", "blob", options);
};
const fromUrl = async (url, options) => {
const arrayBuffer = await (await fetch(url)).arrayBuffer();
return _fromBuffer(new Uint8Array(arrayBuffer), "fromUrl", "url", options);
};
//#endregion
export { supportedSubsets as a, fromUrl as i, fromBlob as n, fromBuffer as r, _fromBuffer as t };
+2
-174

@@ -1,174 +0,2 @@

/// <reference types="node" />
import { Font as Font$1 } from "fontkit";
//#region src/weightings.d.ts
declare const _default: {
latin: {
"0": number;
"1": number;
"2": number;
"3": number;
"4": number;
"5": number;
"6": number;
"7": number;
"8": number;
"9": number;
",": number;
" ": number;
t: number;
h: number;
e: number;
o: number;
f: number;
P: number;
p: number;
l: number;
"'": number;
s: number;
R: number;
u: number;
b: number;
i: number;
c: number;
C: number;
n: number;
a: number;
d: number;
y: number;
w: number;
B: number;
r: number;
z: number;
G: number;
j: number;
T: number;
".": number;
L: number;
k: number;
m: number;
"]": number;
J: number;
F: number;
v: number;
g: number;
A: number;
N: number;
"-": number;
H: number;
D: number;
M: number;
I: number;
E: number;
"\"": number;
S: number;
"(": number;
")": number;
x: number;
W: number;
Q: number;
Y: number;
q: number;
V: number;
á: number;
K: number;
U: number;
"=": number;
"[": number;
O: number;
é: number;
$: number;
":": number;
"|": number;
"/": number;
"%": number;
Z: number;
";": number;
X: number;
};
thai: {
ส: number;
ว: number;
น: number;
บ: number;
จ: number;
า: number;
ก: number;
เ: number;
ร: number;
ม: number;
ค: number;
ำ: number;
ข: number;
อ: number;
ป: number;
ด: number;
ใ: number;
ภ: number;
ท: number;
พ: number;
ฤ: number;
ษ: number;
ศ: number;
ะ: number;
ช: number;
แ: number;
ล: number;
ง: number;
ย: number;
ห: number;
ฝ: number;
ต: number;
โ: number;
ญ: number;
ณ: number;
ผ: number;
ไ: number;
ฯ: number;
ฟ: number;
ธ: number;
ถ: number;
ฐ: number;
ซ: number;
ฉ: number;
ฑ: number;
ฆ: number;
ฬ: number;
ฏ: number;
ฎ: number;
ฒ: number;
ๆ: number;
ฮ: number;
"\u0E52": number;
"\u0E55": number;
};
};
//#endregion
//#region src/index.d.ts
type SupportedSubsets = keyof typeof _default;
declare const supportedSubsets: ("latin" | "thai")[];
declare const unpackMetricsFromFont: (font: Font$1) => {
familyName: string;
fullName: string;
postscriptName: string;
capHeight: number;
ascent: number;
descent: number;
lineGap: number;
unitsPerEm: number;
xHeight: number;
xWidthAvg: number;
subsets: Record<"latin" | "thai", {
xWidthAvg: number;
}>;
};
type Font = ReturnType<typeof unpackMetricsFromFont>;
interface Options {
postscriptName?: string;
}
declare const fromFile: (path: string, options?: Options) => Promise<Font>;
declare const fromBuffer: (buffer: Buffer, options?: Options) => Promise<Font>;
declare const fromBlob: (blob: Blob, options?: Options) => Promise<Font>;
declare const fromUrl: (url: string, options?: Options) => Promise<Font>;
//#endregion
export { Font, SupportedSubsets, fromBlob, fromBuffer, fromFile, fromUrl, supportedSubsets };
import { a as fromBuffer, i as fromBlob, o as fromUrl, r as SupportedSubsets, s as supportedSubsets, t as Font } from "./shared-CnZ3qQtb.mjs";
export { type Font, type SupportedSubsets, fromBlob, fromBuffer, fromUrl, supportedSubsets };

@@ -1,251 +0,3 @@

import * as fontkit from "fontkit";
import { a as supportedSubsets, i as fromUrl, n as fromBlob, r as fromBuffer } from "./shared-KjM_oZR2.mjs";
//#region src/weightings.ts
var weightings_default = {
"latin": {
"0": .0053,
"1": .0023,
"2": .0026,
"3": .001,
"4": 8e-4,
"5": .0015,
"6": 7e-4,
"7": 5e-4,
"8": 7e-4,
"9": 6e-4,
",": .0083,
" ": .154,
"t": .0672,
"h": .0351,
"e": .0922,
"o": .0571,
"f": .017,
"P": .0023,
"p": .0163,
"l": .0304,
"'": .0014,
"s": .0469,
"R": .0015,
"u": .0207,
"b": .0114,
"i": .0588,
"c": .0232,
"C": .0031,
"n": .0578,
"a": .0668,
"d": .0298,
"y": .0123,
"w": .011,
"B": .002,
"r": .0526,
"z": .0011,
"G": .0011,
"j": 9e-4,
"T": .0041,
".": .0079,
"L": .0012,
"k": .0046,
"m": .0181,
"]": 7e-4,
"J": 9e-4,
"F": .0015,
"v": .0076,
"g": .0155,
"A": .004,
"N": .0014,
"-": .0018,
"H": .0013,
"D": .0013,
"M": .0025,
"I": .0022,
"E": .0011,
"\"": .0012,
"S": .0041,
"(": .001,
")": .001,
"x": .0025,
"W": .0012,
"Q": 1e-4,
"Y": 3e-4,
"q": 8e-4,
"V": 5e-4,
"á": 1e-4,
"K": 7e-4,
"U": .0016,
"=": 7e-4,
"[": .0021,
"O": 9e-4,
"é": 1e-4,
"$": 2e-4,
":": 8e-4,
"|": .0038,
"/": 1e-4,
"%": 1e-4,
"Z": 2e-4,
";": 1e-4,
"X": 1e-4
},
"thai": {
"ส": .0258,
"ว": .0372,
"น": .0711,
"บ": .0258,
"จ": .0169,
"า": .1024,
"ก": .0552,
"เ": .0419,
"ร": .0873,
"ม": .0416,
"ค": .0214,
"ำ": .0097,
"ข": .0127,
"อ": .0459,
"ป": .0204,
"ด": .0271,
"ใ": .0109,
"ภ": .0046,
"ท": .0311,
"พ": .0175,
"ฤ": 9e-4,
"ษ": .0042,
"ศ": .0063,
"ะ": .0255,
"ช": .0158,
"แ": .0158,
"ล": .0339,
"ง": .0433,
"ย": .0345,
"ห": .0197,
"ฝ": 6e-4,
"ต": .0239,
"โ": .0077,
"ญ": .0039,
"ณ": .0071,
"ผ": .0077,
"ไ": .0111,
"ฯ": 7e-4,
"ฟ": .0044,
"ธ": .0068,
"ถ": .0061,
"ฐ": .0033,
"ซ": .0046,
"ฉ": .0023,
"ฑ": 4e-4,
"ฆ": 2e-4,
"ฬ": 3e-4,
"ฏ": 2e-4,
"ฎ": 3e-4,
"ฒ": .0012,
"ๆ": 3e-4,
"ฮ": 4e-4,
"๒": 1e-4,
"๕": 1e-4
}
};
//#endregion
//#region src/index.ts
const supportedSubsets = Object.keys(weightings_default);
const weightingForCharacter = (character, subset) => {
if (!Object.keys(weightings_default[subset]).includes(character)) throw new Error(`No weighting specified for character: “${character}”`);
return weightings_default[subset][character];
};
const avgWidthForSubset = (font, subset) => {
const sampleString = Object.keys(weightings_default[subset]).join("");
const weightedWidth = font.glyphsForString(sampleString).reduce((sum, glyph, index) => {
const character = sampleString.charAt(index);
let charWidth = font["OS/2"].xAvgCharWidth;
try {
charWidth = glyph.advanceWidth;
} catch (e) {
console.warn(`Couldn’t read 'advanceWidth' for character “${character === " " ? "<space>" : character}” from “${font.familyName}”. Falling back to “xAvgCharWidth”.`);
}
if (glyph.isMark) return sum;
return sum + charWidth * weightingForCharacter(character, subset);
}, 0);
return Math.round(weightedWidth);
};
const unpackMetricsFromFont = (font) => {
const { capHeight, ascent, descent, lineGap, unitsPerEm, familyName, fullName, postscriptName, xHeight } = font;
const subsets = supportedSubsets.reduce((acc, subset) => ({
...acc,
[subset]: { xWidthAvg: avgWidthForSubset(font, subset) }
}), {});
return {
familyName,
fullName,
postscriptName,
capHeight,
ascent,
descent,
lineGap,
unitsPerEm,
xHeight,
xWidthAvg: subsets.latin.xWidthAvg,
subsets
};
};
const handleCollectionErrors = ({ font, postscriptName, apiName, apiParamName }) => {
if (postscriptName && font === null) throw new Error([
`The provided \`postscriptName\` of “${postscriptName}” cannot be found in the provided font collection.\n`,
"Run the same command without specifying a `postscriptName` in the options to see the available names in the collection.",
"For example:",
"------------------------------------------",
`const metrics = await ${apiName}('<${apiParamName}>');`,
"------------------------------------------\n",
""
].join("\n"));
if (font !== null && "fonts" in font && Array.isArray(font.fonts)) {
const availableNames = font.fonts.map((f) => f.postscriptName);
throw new Error([
"Metrics cannot be unpacked from a font collection.\n",
"Provide either a single font or specify a `postscriptName` to extract from the collection via the options.",
"For example:",
"------------------------------------------",
`const metrics = await ${apiName}('<${apiParamName}>', {`,
` postscriptName: '${availableNames[0]}'`,
"});",
"------------------------------------------\n",
"Available `postscriptNames` in this font collection are:",
...availableNames.map((fontName) => ` - ${fontName}`),
""
].join("\n"));
}
};
const fromFile = (path, options) => {
const { postscriptName } = options || {};
return fontkit.open(path, postscriptName).then((font) => {
handleCollectionErrors({
font,
postscriptName,
apiName: "fromFile",
apiParamName: "path"
});
return unpackMetricsFromFont(font);
});
};
const _fromBuffer = async (buffer, apiName, apiParamName, options) => {
const { postscriptName } = options || {};
const fontkitFont = fontkit.create(buffer, postscriptName);
handleCollectionErrors({
font: fontkitFont,
postscriptName,
apiName,
apiParamName
});
return unpackMetricsFromFont(fontkitFont);
};
const fromBuffer = async (buffer, options) => {
return _fromBuffer(buffer, "fromBuffer", "buffer", options);
};
const fromBlob = async (blob, options) => {
const arrayBuffer = await blob.arrayBuffer();
return _fromBuffer(Buffer.from(arrayBuffer), "fromBlob", "blob", options);
};
const fromUrl = async (url, options) => {
const arrayBuffer = await (await fetch(url)).arrayBuffer();
return _fromBuffer(Buffer.from(arrayBuffer), "fromUrl", "url", options);
};
//#endregion
export { fromBlob, fromBuffer, fromFile, fromUrl, supportedSubsets };
export { fromBlob, fromBuffer, fromUrl, supportedSubsets };
{
"name": "@capsizecss/unpack",
"version": "3.0.1",
"version": "4.0.0",
"description": "Unpack capsize font metrics from fonts",

@@ -26,12 +26,10 @@ "keywords": [

},
"type": "module",
"exports": {
".": {
"import": "./dist/index.mjs",
"require": "./dist/index.cjs"
},
".": "./dist/index.mjs",
"./fs": "./dist/fs.mjs",
"./package.json": "./package.json"
},
"main": "./dist/index.cjs",
"module": "./dist/index.mjs",
"types": "./dist/index.d.cts",
"types": "./dist/index.d.mts",
"files": [

@@ -41,6 +39,5 @@ "dist"

"dependencies": {
"fontkit": "^2.0.2"
"fontkitten": "^1.0.0"
},
"devDependencies": {
"@types/fontkit": "^2.0.1",
"@types/node": "^22.18.8",

@@ -50,3 +47,3 @@ "fast-xml-parser": "^4.3.2",

"tsx": "^4.7.0",
"typescript": "^5.3.3"
"typescript": "^5.9.3"
},

@@ -56,2 +53,3 @@ "engines": {

},
"main": "./dist/index.mjs",
"scripts": {

@@ -58,0 +56,0 @@ "build": "tsdown",

@@ -58,3 +58,3 @@ <img src="https://raw.githubusercontent.com/seek-oss/capsize/HEAD/images/capsize-header.png" alt="Capsize" title="Capsize" width="443px" />

```ts
import { fromFile } from '@capsizecss/unpack';
import { fromFile } from '@capsizecss/unpack/fs';

@@ -104,3 +104,3 @@ const metrics = await fromFile(filePath);

- [Devon Govett](https://github.com/devongovett) for creating [Fontkit](https://github.com/foliojs/fontkit), which does all the heavy lifting of extracting the font metrics under the covers.
- [Devon Govett](https://github.com/devongovett) for creating [Fontkit](https://github.com/foliojs/fontkit). A [fork of Fontkit](https://github.com/delucis/fontkitten) does all the heavy lifting of extracting the font metrics under the covers.
- [SEEK](https://www.seek.com.au) for giving us the space to do interesting work.

@@ -107,0 +107,0 @@

//#region rolldown:runtime
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
key = keys[i];
if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
get: ((k) => from[k]).bind(null, key),
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
});
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
value: mod,
enumerable: true
}) : target, mod));
//#endregion
let fontkit = require("fontkit");
fontkit = __toESM(fontkit);
//#region src/weightings.ts
var weightings_default = {
"latin": {
"0": .0053,
"1": .0023,
"2": .0026,
"3": .001,
"4": 8e-4,
"5": .0015,
"6": 7e-4,
"7": 5e-4,
"8": 7e-4,
"9": 6e-4,
",": .0083,
" ": .154,
"t": .0672,
"h": .0351,
"e": .0922,
"o": .0571,
"f": .017,
"P": .0023,
"p": .0163,
"l": .0304,
"'": .0014,
"s": .0469,
"R": .0015,
"u": .0207,
"b": .0114,
"i": .0588,
"c": .0232,
"C": .0031,
"n": .0578,
"a": .0668,
"d": .0298,
"y": .0123,
"w": .011,
"B": .002,
"r": .0526,
"z": .0011,
"G": .0011,
"j": 9e-4,
"T": .0041,
".": .0079,
"L": .0012,
"k": .0046,
"m": .0181,
"]": 7e-4,
"J": 9e-4,
"F": .0015,
"v": .0076,
"g": .0155,
"A": .004,
"N": .0014,
"-": .0018,
"H": .0013,
"D": .0013,
"M": .0025,
"I": .0022,
"E": .0011,
"\"": .0012,
"S": .0041,
"(": .001,
")": .001,
"x": .0025,
"W": .0012,
"Q": 1e-4,
"Y": 3e-4,
"q": 8e-4,
"V": 5e-4,
"á": 1e-4,
"K": 7e-4,
"U": .0016,
"=": 7e-4,
"[": .0021,
"O": 9e-4,
"é": 1e-4,
"$": 2e-4,
":": 8e-4,
"|": .0038,
"/": 1e-4,
"%": 1e-4,
"Z": 2e-4,
";": 1e-4,
"X": 1e-4
},
"thai": {
"ส": .0258,
"ว": .0372,
"น": .0711,
"บ": .0258,
"จ": .0169,
"า": .1024,
"ก": .0552,
"เ": .0419,
"ร": .0873,
"ม": .0416,
"ค": .0214,
"ำ": .0097,
"ข": .0127,
"อ": .0459,
"ป": .0204,
"ด": .0271,
"ใ": .0109,
"ภ": .0046,
"ท": .0311,
"พ": .0175,
"ฤ": 9e-4,
"ษ": .0042,
"ศ": .0063,
"ะ": .0255,
"ช": .0158,
"แ": .0158,
"ล": .0339,
"ง": .0433,
"ย": .0345,
"ห": .0197,
"ฝ": 6e-4,
"ต": .0239,
"โ": .0077,
"ญ": .0039,
"ณ": .0071,
"ผ": .0077,
"ไ": .0111,
"ฯ": 7e-4,
"ฟ": .0044,
"ธ": .0068,
"ถ": .0061,
"ฐ": .0033,
"ซ": .0046,
"ฉ": .0023,
"ฑ": 4e-4,
"ฆ": 2e-4,
"ฬ": 3e-4,
"ฏ": 2e-4,
"ฎ": 3e-4,
"ฒ": .0012,
"ๆ": 3e-4,
"ฮ": 4e-4,
"๒": 1e-4,
"๕": 1e-4
}
};
//#endregion
//#region src/index.ts
const supportedSubsets = Object.keys(weightings_default);
const weightingForCharacter = (character, subset) => {
if (!Object.keys(weightings_default[subset]).includes(character)) throw new Error(`No weighting specified for character: “${character}”`);
return weightings_default[subset][character];
};
const avgWidthForSubset = (font, subset) => {
const sampleString = Object.keys(weightings_default[subset]).join("");
const weightedWidth = font.glyphsForString(sampleString).reduce((sum, glyph, index) => {
const character = sampleString.charAt(index);
let charWidth = font["OS/2"].xAvgCharWidth;
try {
charWidth = glyph.advanceWidth;
} catch (e) {
console.warn(`Couldn’t read 'advanceWidth' for character “${character === " " ? "<space>" : character}” from “${font.familyName}”. Falling back to “xAvgCharWidth”.`);
}
if (glyph.isMark) return sum;
return sum + charWidth * weightingForCharacter(character, subset);
}, 0);
return Math.round(weightedWidth);
};
const unpackMetricsFromFont = (font) => {
const { capHeight, ascent, descent, lineGap, unitsPerEm, familyName, fullName, postscriptName, xHeight } = font;
const subsets = supportedSubsets.reduce((acc, subset) => ({
...acc,
[subset]: { xWidthAvg: avgWidthForSubset(font, subset) }
}), {});
return {
familyName,
fullName,
postscriptName,
capHeight,
ascent,
descent,
lineGap,
unitsPerEm,
xHeight,
xWidthAvg: subsets.latin.xWidthAvg,
subsets
};
};
const handleCollectionErrors = ({ font, postscriptName, apiName, apiParamName }) => {
if (postscriptName && font === null) throw new Error([
`The provided \`postscriptName\` of “${postscriptName}” cannot be found in the provided font collection.\n`,
"Run the same command without specifying a `postscriptName` in the options to see the available names in the collection.",
"For example:",
"------------------------------------------",
`const metrics = await ${apiName}('<${apiParamName}>');`,
"------------------------------------------\n",
""
].join("\n"));
if (font !== null && "fonts" in font && Array.isArray(font.fonts)) {
const availableNames = font.fonts.map((f) => f.postscriptName);
throw new Error([
"Metrics cannot be unpacked from a font collection.\n",
"Provide either a single font or specify a `postscriptName` to extract from the collection via the options.",
"For example:",
"------------------------------------------",
`const metrics = await ${apiName}('<${apiParamName}>', {`,
` postscriptName: '${availableNames[0]}'`,
"});",
"------------------------------------------\n",
"Available `postscriptNames` in this font collection are:",
...availableNames.map((fontName) => ` - ${fontName}`),
""
].join("\n"));
}
};
const fromFile = (path, options) => {
const { postscriptName } = options || {};
return fontkit.open(path, postscriptName).then((font) => {
handleCollectionErrors({
font,
postscriptName,
apiName: "fromFile",
apiParamName: "path"
});
return unpackMetricsFromFont(font);
});
};
const _fromBuffer = async (buffer, apiName, apiParamName, options) => {
const { postscriptName } = options || {};
const fontkitFont = fontkit.create(buffer, postscriptName);
handleCollectionErrors({
font: fontkitFont,
postscriptName,
apiName,
apiParamName
});
return unpackMetricsFromFont(fontkitFont);
};
const fromBuffer = async (buffer, options) => {
return _fromBuffer(buffer, "fromBuffer", "buffer", options);
};
const fromBlob = async (blob, options) => {
const arrayBuffer = await blob.arrayBuffer();
return _fromBuffer(Buffer.from(arrayBuffer), "fromBlob", "blob", options);
};
const fromUrl = async (url, options) => {
const arrayBuffer = await (await fetch(url)).arrayBuffer();
return _fromBuffer(Buffer.from(arrayBuffer), "fromUrl", "url", options);
};
//#endregion
exports.fromBlob = fromBlob;
exports.fromBuffer = fromBuffer;
exports.fromFile = fromFile;
exports.fromUrl = fromUrl;
exports.supportedSubsets = supportedSubsets;
/// <reference types="node" />
import { Font as Font$1 } from "fontkit";
//#region src/weightings.d.ts
declare const _default: {
latin: {
"0": number;
"1": number;
"2": number;
"3": number;
"4": number;
"5": number;
"6": number;
"7": number;
"8": number;
"9": number;
",": number;
" ": number;
t: number;
h: number;
e: number;
o: number;
f: number;
P: number;
p: number;
l: number;
"'": number;
s: number;
R: number;
u: number;
b: number;
i: number;
c: number;
C: number;
n: number;
a: number;
d: number;
y: number;
w: number;
B: number;
r: number;
z: number;
G: number;
j: number;
T: number;
".": number;
L: number;
k: number;
m: number;
"]": number;
J: number;
F: number;
v: number;
g: number;
A: number;
N: number;
"-": number;
H: number;
D: number;
M: number;
I: number;
E: number;
"\"": number;
S: number;
"(": number;
")": number;
x: number;
W: number;
Q: number;
Y: number;
q: number;
V: number;
á: number;
K: number;
U: number;
"=": number;
"[": number;
O: number;
é: number;
$: number;
":": number;
"|": number;
"/": number;
"%": number;
Z: number;
";": number;
X: number;
};
thai: {
ส: number;
ว: number;
น: number;
บ: number;
จ: number;
า: number;
ก: number;
เ: number;
ร: number;
ม: number;
ค: number;
ำ: number;
ข: number;
อ: number;
ป: number;
ด: number;
ใ: number;
ภ: number;
ท: number;
พ: number;
ฤ: number;
ษ: number;
ศ: number;
ะ: number;
ช: number;
แ: number;
ล: number;
ง: number;
ย: number;
ห: number;
ฝ: number;
ต: number;
โ: number;
ญ: number;
ณ: number;
ผ: number;
ไ: number;
ฯ: number;
ฟ: number;
ธ: number;
ถ: number;
ฐ: number;
ซ: number;
ฉ: number;
ฑ: number;
ฆ: number;
ฬ: number;
ฏ: number;
ฎ: number;
ฒ: number;
ๆ: number;
ฮ: number;
"\u0E52": number;
"\u0E55": number;
};
};
//#endregion
//#region src/index.d.ts
type SupportedSubsets = keyof typeof _default;
declare const supportedSubsets: ("latin" | "thai")[];
declare const unpackMetricsFromFont: (font: Font$1) => {
familyName: string;
fullName: string;
postscriptName: string;
capHeight: number;
ascent: number;
descent: number;
lineGap: number;
unitsPerEm: number;
xHeight: number;
xWidthAvg: number;
subsets: Record<"latin" | "thai", {
xWidthAvg: number;
}>;
};
type Font = ReturnType<typeof unpackMetricsFromFont>;
interface Options {
postscriptName?: string;
}
declare const fromFile: (path: string, options?: Options) => Promise<Font>;
declare const fromBuffer: (buffer: Buffer, options?: Options) => Promise<Font>;
declare const fromBlob: (blob: Blob, options?: Options) => Promise<Font>;
declare const fromUrl: (url: string, options?: Options) => Promise<Font>;
//#endregion
export { Font, SupportedSubsets, fromBlob, fromBuffer, fromFile, fromUrl, supportedSubsets };