🚀 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.0
to
3.0.1
+174
dist/index.d.cts
/// <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 };
+257
-284

@@ -1,302 +0,275 @@

"use strict";
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
const fontkit = require("fontkit");
function _interopNamespaceCompat(e) {
if (e && typeof e === "object" && "default" in e)
return e;
const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
if (e) {
for (const k in e) {
if (k !== "default") {
const d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: () => e[k]
});
}
}
}
n.default = e;
return Object.freeze(n);
}
const fontkit__namespace = /* @__PURE__ */ _interopNamespaceCompat(fontkit);
const weightings = {
"latin": {
"0": 53e-4,
"1": 23e-4,
"2": 26e-4,
"3": 1e-3,
"4": 8e-4,
"5": 15e-4,
"6": 7e-4,
"7": 5e-4,
"8": 7e-4,
"9": 6e-4,
",": 83e-4,
" ": 0.154,
"t": 0.0672,
"h": 0.0351,
"e": 0.0922,
"o": 0.0571,
"f": 0.017,
"P": 23e-4,
"p": 0.0163,
"l": 0.0304,
"'": 14e-4,
"s": 0.0469,
"R": 15e-4,
"u": 0.0207,
"b": 0.0114,
"i": 0.0588,
"c": 0.0232,
"C": 31e-4,
"n": 0.0578,
"a": 0.0668,
"d": 0.0298,
"y": 0.0123,
"w": 0.011,
"B": 2e-3,
"r": 0.0526,
"z": 11e-4,
"G": 11e-4,
"j": 9e-4,
"T": 41e-4,
".": 79e-4,
"L": 12e-4,
"k": 46e-4,
"m": 0.0181,
"]": 7e-4,
"J": 9e-4,
"F": 15e-4,
"v": 76e-4,
"g": 0.0155,
"A": 4e-3,
"N": 14e-4,
"-": 18e-4,
"H": 13e-4,
"D": 13e-4,
"M": 25e-4,
"I": 22e-4,
"E": 11e-4,
'"': 12e-4,
"S": 41e-4,
"(": 1e-3,
")": 1e-3,
"x": 25e-4,
"W": 12e-4,
"Q": 1e-4,
"Y": 3e-4,
"q": 8e-4,
"V": 5e-4,
"á": 1e-4,
"K": 7e-4,
"U": 16e-4,
"=": 7e-4,
"[": 21e-4,
"O": 9e-4,
"é": 1e-4,
"$": 2e-4,
":": 8e-4,
"|": 38e-4,
"/": 1e-4,
"%": 1e-4,
"Z": 2e-4,
";": 1e-4,
"X": 1e-4
},
"thai": {
"ส": 0.0258,
"ว": 0.0372,
"น": 0.0711,
"บ": 0.0258,
"จ": 0.0169,
"า": 0.1024,
"ก": 0.0552,
"เ": 0.0419,
"ร": 0.0873,
"ม": 0.0416,
"ค": 0.0214,
"ำ": 97e-4,
"ข": 0.0127,
"อ": 0.0459,
"ป": 0.0204,
"ด": 0.0271,
"ใ": 0.0109,
"ภ": 46e-4,
"ท": 0.0311,
"พ": 0.0175,
"ฤ": 9e-4,
"ษ": 42e-4,
"ศ": 63e-4,
"ะ": 0.0255,
"ช": 0.0158,
"แ": 0.0158,
"ล": 0.0339,
"ง": 0.0433,
"ย": 0.0345,
"ห": 0.0197,
"ฝ": 6e-4,
"ต": 0.0239,
"โ": 77e-4,
"ญ": 39e-4,
"ณ": 71e-4,
"ผ": 77e-4,
"ไ": 0.0111,
"ฯ": 7e-4,
"ฟ": 44e-4,
"ธ": 68e-4,
"ถ": 61e-4,
"ฐ": 33e-4,
"ซ": 46e-4,
"ฉ": 23e-4,
"ฑ": 4e-4,
"ฆ": 2e-4,
"ฬ": 3e-4,
"ฏ": 2e-4,
"ฎ": 3e-4,
"ฒ": 12e-4,
"ๆ": 3e-4,
"ฮ": 4e-4,
"๒": 1e-4,
"๕": 1e-4
}
//#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;
};
const supportedSubsets = Object.keys(weightings);
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[subset]).includes(character)) {
throw new Error(`No weighting specified for character: “${character}”`);
}
return weightings[subset][character];
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[subset]).join("");
const glyphs = font.glyphsForString(sampleString);
const weightedWidth = glyphs.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 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 { 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.
`,
"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 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__namespace.open(path, postscriptName).then((font) => {
handleCollectionErrors({
font,
postscriptName,
apiName: "fromFile",
apiParamName: "path"
});
return unpackMetricsFromFont(font);
});
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__namespace.create(buffer, postscriptName);
handleCollectionErrors({
font: fontkitFont,
postscriptName,
apiName,
apiParamName
});
return unpackMetricsFromFont(fontkitFont);
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);
return _fromBuffer(buffer, "fromBuffer", "buffer", options);
};
const fromBlob = async (blob, options) => {
const arrayBuffer = await blob.arrayBuffer();
const buffer = Buffer.from(arrayBuffer);
return _fromBuffer(buffer, "fromBlob", "blob", options);
const arrayBuffer = await blob.arrayBuffer();
return _fromBuffer(Buffer.from(arrayBuffer), "fromBlob", "blob", options);
};
const fromUrl = async (url, options) => {
const response = await fetch(url);
const arrayBuffer = await response.arrayBuffer();
const buffer = Buffer.from(arrayBuffer);
return _fromBuffer(buffer, "fromUrl", "url", options);
const arrayBuffer = await (await fetch(url)).arrayBuffer();
return _fromBuffer(Buffer.from(arrayBuffer), "fromUrl", "url", options);
};
//#endregion
exports.fromBlob = fromBlob;

@@ -306,2 +279,2 @@ exports.fromBuffer = fromBuffer;

exports.fromUrl = fromUrl;
exports.supportedSubsets = supportedSubsets;
exports.supportedSubsets = supportedSubsets;

@@ -1,165 +0,168 @@

import { Font as Font$1 } from 'fontkit';
/// <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;
};
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;
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;
subsets: Record<"latin" | "thai", {
xWidthAvg: number;
}>;
}>;
};
type Font = ReturnType<typeof unpackMetricsFromFont>;
interface Options {
postscriptName?: string;
postscriptName?: string;
}

@@ -170,3 +173,3 @@ declare const fromFile: (path: string, options?: Options) => Promise<Font>;

declare const fromUrl: (url: string, options?: Options) => Promise<Font>;
export { type Font, type SupportedSubsets, fromBlob, fromBuffer, fromFile, fromUrl, supportedSubsets };
//#endregion
export { Font, SupportedSubsets, fromBlob, fromBuffer, fromFile, fromUrl, supportedSubsets };
import * as fontkit from "fontkit";
const weightings = {
"latin": {
"0": 53e-4,
"1": 23e-4,
"2": 26e-4,
"3": 1e-3,
"4": 8e-4,
"5": 15e-4,
"6": 7e-4,
"7": 5e-4,
"8": 7e-4,
"9": 6e-4,
",": 83e-4,
" ": 0.154,
"t": 0.0672,
"h": 0.0351,
"e": 0.0922,
"o": 0.0571,
"f": 0.017,
"P": 23e-4,
"p": 0.0163,
"l": 0.0304,
"'": 14e-4,
"s": 0.0469,
"R": 15e-4,
"u": 0.0207,
"b": 0.0114,
"i": 0.0588,
"c": 0.0232,
"C": 31e-4,
"n": 0.0578,
"a": 0.0668,
"d": 0.0298,
"y": 0.0123,
"w": 0.011,
"B": 2e-3,
"r": 0.0526,
"z": 11e-4,
"G": 11e-4,
"j": 9e-4,
"T": 41e-4,
".": 79e-4,
"L": 12e-4,
"k": 46e-4,
"m": 0.0181,
"]": 7e-4,
"J": 9e-4,
"F": 15e-4,
"v": 76e-4,
"g": 0.0155,
"A": 4e-3,
"N": 14e-4,
"-": 18e-4,
"H": 13e-4,
"D": 13e-4,
"M": 25e-4,
"I": 22e-4,
"E": 11e-4,
'"': 12e-4,
"S": 41e-4,
"(": 1e-3,
")": 1e-3,
"x": 25e-4,
"W": 12e-4,
"Q": 1e-4,
"Y": 3e-4,
"q": 8e-4,
"V": 5e-4,
"á": 1e-4,
"K": 7e-4,
"U": 16e-4,
"=": 7e-4,
"[": 21e-4,
"O": 9e-4,
"é": 1e-4,
"$": 2e-4,
":": 8e-4,
"|": 38e-4,
"/": 1e-4,
"%": 1e-4,
"Z": 2e-4,
";": 1e-4,
"X": 1e-4
},
"thai": {
"ส": 0.0258,
"ว": 0.0372,
"น": 0.0711,
"บ": 0.0258,
"จ": 0.0169,
"า": 0.1024,
"ก": 0.0552,
"เ": 0.0419,
"ร": 0.0873,
"ม": 0.0416,
"ค": 0.0214,
"ำ": 97e-4,
"ข": 0.0127,
"อ": 0.0459,
"ป": 0.0204,
"ด": 0.0271,
"ใ": 0.0109,
"ภ": 46e-4,
"ท": 0.0311,
"พ": 0.0175,
"ฤ": 9e-4,
"ษ": 42e-4,
"ศ": 63e-4,
"ะ": 0.0255,
"ช": 0.0158,
"แ": 0.0158,
"ล": 0.0339,
"ง": 0.0433,
"ย": 0.0345,
"ห": 0.0197,
"ฝ": 6e-4,
"ต": 0.0239,
"โ": 77e-4,
"ญ": 39e-4,
"ณ": 71e-4,
"ผ": 77e-4,
"ไ": 0.0111,
"ฯ": 7e-4,
"ฟ": 44e-4,
"ธ": 68e-4,
"ถ": 61e-4,
"ฐ": 33e-4,
"ซ": 46e-4,
"ฉ": 23e-4,
"ฑ": 4e-4,
"ฆ": 2e-4,
"ฬ": 3e-4,
"ฏ": 2e-4,
"ฎ": 3e-4,
"ฒ": 12e-4,
"ๆ": 3e-4,
"ฮ": 4e-4,
"๒": 1e-4,
"๕": 1e-4
}
//#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
}
};
const supportedSubsets = Object.keys(weightings);
//#endregion
//#region src/index.ts
const supportedSubsets = Object.keys(weightings_default);
const weightingForCharacter = (character, subset) => {
if (!Object.keys(weightings[subset]).includes(character)) {
throw new Error(`No weighting specified for character: “${character}”`);
}
return weightings[subset][character];
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[subset]).join("");
const glyphs = font.glyphsForString(sampleString);
const weightedWidth = glyphs.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 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 { 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.
`,
"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 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 { 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 { 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);
return _fromBuffer(buffer, "fromBuffer", "buffer", options);
};
const fromBlob = async (blob, options) => {
const arrayBuffer = await blob.arrayBuffer();
const buffer = Buffer.from(arrayBuffer);
return _fromBuffer(buffer, "fromBlob", "blob", options);
const arrayBuffer = await blob.arrayBuffer();
return _fromBuffer(Buffer.from(arrayBuffer), "fromBlob", "blob", options);
};
const fromUrl = async (url, options) => {
const response = await fetch(url);
const arrayBuffer = await response.arrayBuffer();
const buffer = Buffer.from(arrayBuffer);
return _fromBuffer(buffer, "fromUrl", "url", options);
const arrayBuffer = await (await fetch(url)).arrayBuffer();
return _fromBuffer(Buffer.from(arrayBuffer), "fromUrl", "url", options);
};
export {
fromBlob,
fromBuffer,
fromFile,
fromUrl,
supportedSubsets
};
//#endregion
export { fromBlob, fromBuffer, fromFile, fromUrl, supportedSubsets };
{
"name": "@capsizecss/unpack",
"version": "3.0.0",
"version": "3.0.1",
"description": "Unpack capsize font metrics from fonts",

@@ -28,6 +28,2 @@ "keywords": [

".": {
"types": {
"import": "./dist/index.d.mts",
"require": "./dist/index.d.ts"
},
"import": "./dist/index.mjs",

@@ -40,3 +36,3 @@ "require": "./dist/index.cjs"

"module": "./dist/index.mjs",
"types": "./dist/index.d.ts",
"types": "./dist/index.d.cts",
"files": [

@@ -50,3 +46,3 @@ "dist"

"@types/fontkit": "^2.0.1",
"@types/node": "^20.11.13",
"@types/node": "^22.18.8",
"fast-xml-parser": "^4.3.2",

@@ -61,6 +57,5 @@ "sort-keys": "^5.0.0",

"scripts": {
"build": "crackle package",
"dev": "crackle dev --shim=none",
"build": "tsdown",
"generate": "tsx scripts/generate-weightings"
}
}
import { Font as Font$1 } from 'fontkit';
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;
};
};
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>;
export { type Font, type SupportedSubsets, fromBlob, fromBuffer, fromFile, fromUrl, supportedSubsets };