full site update
This commit is contained in:
21
node_modules/@capsizecss/unpack/LICENSE
generated
vendored
Normal file
21
node_modules/@capsizecss/unpack/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2021 SEEK
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
108
node_modules/@capsizecss/unpack/README.md
generated
vendored
Normal file
108
node_modules/@capsizecss/unpack/README.md
generated
vendored
Normal file
@@ -0,0 +1,108 @@
|
||||
<img src="https://raw.githubusercontent.com/seek-oss/capsize/HEAD/images/capsize-header.png" alt="Capsize" title="Capsize" width="443px" />
|
||||
<br/>
|
||||
|
||||
# @capsizecss/unpack
|
||||
|
||||
Unpack the capsize font metrics directly from a font file.
|
||||
|
||||
```bash
|
||||
npm install @capsizecss/unpack
|
||||
```
|
||||
|
||||
- [Usage](#usage)
|
||||
- [fromBuffer](#frombuffer)
|
||||
- [fromBlob](#fromblob)
|
||||
- [fromUrl](#fromurl)
|
||||
- [fromFile](#fromfile)
|
||||
- [Options](#options)
|
||||
- [postscriptName](#postscriptname)
|
||||
- [Font Metrics](#font-metrics)
|
||||
|
||||
## Usage
|
||||
|
||||
### `fromBuffer`
|
||||
|
||||
Takes a buffer and returns the resolved [font metrics](#font-metrics).
|
||||
|
||||
```ts
|
||||
import { fromBuffer } from '@capsizecss/unpack';
|
||||
|
||||
const metrics = await fromBuffer(buffer);
|
||||
```
|
||||
|
||||
### `fromBlob`
|
||||
|
||||
Takes a file blob and returns the resolved [font metrics](#font-metrics).
|
||||
|
||||
```ts
|
||||
import { fromBlob } from '@capsizecss/unpack';
|
||||
|
||||
const metrics = await fromBlob(file);
|
||||
```
|
||||
|
||||
### `fromUrl`
|
||||
|
||||
Takes a url string and returns the resolved [font metrics](#font-metrics).
|
||||
|
||||
```ts
|
||||
import { fromUrl } from '@capsizecss/unpack';
|
||||
|
||||
const metrics = await fromUrl(url);
|
||||
```
|
||||
|
||||
### `fromFile`
|
||||
|
||||
Takes a file path string and returns the resolved [font metrics](#font-metrics).
|
||||
|
||||
```ts
|
||||
import { fromFile } from '@capsizecss/unpack';
|
||||
|
||||
const metrics = await fromFile(filePath);
|
||||
```
|
||||
|
||||
## Options
|
||||
|
||||
All of the above APIs accept an optional second parameter with the following options:
|
||||
|
||||
#### `postscriptName`
|
||||
|
||||
Capsize can extract the metrics for a single font from a TrueType Collection (TTC) file by providing the `postscriptName`.
|
||||
|
||||
```ts
|
||||
import { fromFile } from '@capsizecss/unpack';
|
||||
|
||||
const metrics = await fromFile('AvenirNext.ttc', {
|
||||
postscriptName: 'AvenirNext-Bold',
|
||||
});
|
||||
```
|
||||
|
||||
## Font metrics
|
||||
|
||||
The font metrics object returned contains the following properties:
|
||||
|
||||
| Property | Type | Description |
|
||||
| -------------- | ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| familyName | string | The font’s family name as authored by font creator |
|
||||
| fullName | string | The font’s full name as authored by font creator |
|
||||
| postscriptName | string | The font’s unique PostScript name as authored by font creator |
|
||||
| category | string | The style of the font: serif, sans-serif, monospace, display, or handwriting. |
|
||||
| capHeight | number | The height of capital letters above the baseline |
|
||||
| ascent | number | The height of the ascenders above baseline |
|
||||
| descent | number | The descent of the descenders below baseline |
|
||||
| lineGap | number | The amount of space included between lines |
|
||||
| unitsPerEm | number | The size of the font’s internal coordinate grid |
|
||||
| xHeight | number | The height of the main body of lower case letters above baseline |
|
||||
| xWidthAvg | number | The average width of character glyphs in the font for the selected unicode subset. Calculated [based on character frequencies in written text], falling back to the built in `xAvgCharWidth` from the OS/2 table. |
|
||||
| subsets | {<br/>[subset]: { xWidthAvg: number }<br/>} | A lookup of the `xWidthAvg` metric by subset (see [supported subsets]) |
|
||||
|
||||
[based on character frequencies in written text]: ../metrics/README.md#how-xwidthavg-is-calculated
|
||||
[supported subsets]: ../metrics/README.md#subsets
|
||||
|
||||
## Thanks
|
||||
|
||||
- [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.
|
||||
- [SEEK](https://www.seek.com.au) for giving us the space to do interesting work.
|
||||
|
||||
## License
|
||||
|
||||
MIT.
|
321
node_modules/@capsizecss/unpack/dist/index.cjs
generated
vendored
Normal file
321
node_modules/@capsizecss/unpack/dist/index.cjs
generated
vendored
Normal file
@@ -0,0 +1,321 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
||||
const blobToBuffer = require("blob-to-buffer");
|
||||
const fontkit = require("fontkit");
|
||||
const _interopDefaultCompat = (e) => e && typeof e === "object" && "default" in e ? e : { default: e };
|
||||
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 blobToBuffer__default = /* @__PURE__ */ _interopDefaultCompat(blobToBuffer);
|
||||
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
|
||||
}
|
||||
};
|
||||
const supportedSubsets = Object.keys(weightings);
|
||||
const weightingForCharacter = (character, subset) => {
|
||||
if (!Object.keys(weightings[subset]).includes(character)) {
|
||||
throw new Error(`No weighting specified for character: “${character}”`);
|
||||
}
|
||||
return weightings[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 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.
|
||||
`,
|
||||
"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 _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 fromBuffer = async (buffer, options) => {
|
||||
return _fromBuffer(buffer, "fromBuffer", "buffer", options);
|
||||
};
|
||||
const fromBlob = async (blob, options) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
blobToBuffer__default.default(blob, (err, buffer) => {
|
||||
if (err) {
|
||||
return reject(err);
|
||||
}
|
||||
try {
|
||||
resolve(_fromBuffer(buffer, "fromBlob", "blob", options));
|
||||
} catch (e) {
|
||||
reject(e);
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
const fromUrl = async (url, options) => {
|
||||
const response = await fetch(url);
|
||||
if (typeof window === "undefined") {
|
||||
const data = await response.arrayBuffer();
|
||||
return _fromBuffer(Buffer.from(data), "fromUrl", "url", options);
|
||||
}
|
||||
const blob = await response.blob();
|
||||
return fromBlob(blob, options);
|
||||
};
|
||||
exports.fromBlob = fromBlob;
|
||||
exports.fromBuffer = fromBuffer;
|
||||
exports.fromFile = fromFile;
|
||||
exports.fromUrl = fromUrl;
|
||||
exports.supportedSubsets = supportedSubsets;
|
171
node_modules/@capsizecss/unpack/dist/index.d.mts
generated
vendored
Normal file
171
node_modules/@capsizecss/unpack/dist/index.d.mts
generated
vendored
Normal file
@@ -0,0 +1,171 @@
|
||||
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 };
|
171
node_modules/@capsizecss/unpack/dist/index.d.ts
generated
vendored
Normal file
171
node_modules/@capsizecss/unpack/dist/index.d.ts
generated
vendored
Normal file
@@ -0,0 +1,171 @@
|
||||
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 };
|
300
node_modules/@capsizecss/unpack/dist/index.mjs
generated
vendored
Normal file
300
node_modules/@capsizecss/unpack/dist/index.mjs
generated
vendored
Normal file
@@ -0,0 +1,300 @@
|
||||
import blobToBuffer from "blob-to-buffer";
|
||||
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
|
||||
}
|
||||
};
|
||||
const supportedSubsets = Object.keys(weightings);
|
||||
const weightingForCharacter = (character, subset) => {
|
||||
if (!Object.keys(weightings[subset]).includes(character)) {
|
||||
throw new Error(`No weighting specified for character: “${character}”`);
|
||||
}
|
||||
return weightings[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 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.
|
||||
`,
|
||||
"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) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
blobToBuffer(blob, (err, buffer) => {
|
||||
if (err) {
|
||||
return reject(err);
|
||||
}
|
||||
try {
|
||||
resolve(_fromBuffer(buffer, "fromBlob", "blob", options));
|
||||
} catch (e) {
|
||||
reject(e);
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
const fromUrl = async (url, options) => {
|
||||
const response = await fetch(url);
|
||||
if (typeof window === "undefined") {
|
||||
const data = await response.arrayBuffer();
|
||||
return _fromBuffer(Buffer.from(data), "fromUrl", "url", options);
|
||||
}
|
||||
const blob = await response.blob();
|
||||
return fromBlob(blob, options);
|
||||
};
|
||||
export {
|
||||
fromBlob,
|
||||
fromBuffer,
|
||||
fromFile,
|
||||
fromUrl,
|
||||
supportedSubsets
|
||||
};
|
62
node_modules/@capsizecss/unpack/package.json
generated
vendored
Normal file
62
node_modules/@capsizecss/unpack/package.json
generated
vendored
Normal file
@@ -0,0 +1,62 @@
|
||||
{
|
||||
"name": "@capsizecss/unpack",
|
||||
"version": "2.4.0",
|
||||
"description": "Unpack capsize font metrics from fonts",
|
||||
"keywords": [
|
||||
"capsize",
|
||||
"leading trim",
|
||||
"white space",
|
||||
"baseline",
|
||||
"basekick",
|
||||
"cap height",
|
||||
"typography",
|
||||
"line gap",
|
||||
"leading"
|
||||
],
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/seek-oss/capsize.git",
|
||||
"directory": "packages/unpack"
|
||||
},
|
||||
"license": "MIT",
|
||||
"author": {
|
||||
"name": "Michael Taranto",
|
||||
"homepage": "https://github.com/michaeltaranto"
|
||||
},
|
||||
"exports": {
|
||||
".": {
|
||||
"types": {
|
||||
"import": "./dist/index.d.mts",
|
||||
"require": "./dist/index.d.ts"
|
||||
},
|
||||
"import": "./dist/index.mjs",
|
||||
"require": "./dist/index.cjs"
|
||||
},
|
||||
"./package.json": "./package.json"
|
||||
},
|
||||
"main": "./dist/index.cjs",
|
||||
"module": "./dist/index.mjs",
|
||||
"types": "./dist/index.d.ts",
|
||||
"files": [
|
||||
"dist"
|
||||
],
|
||||
"dependencies": {
|
||||
"blob-to-buffer": "^1.2.8",
|
||||
"cross-fetch": "^3.0.4",
|
||||
"fontkit": "^2.0.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/blob-to-buffer": "^1.2.0",
|
||||
"@types/fontkit": "^2.0.1",
|
||||
"@types/node": "^20.11.13",
|
||||
"fast-xml-parser": "^4.3.2",
|
||||
"sort-keys": "^5.0.0",
|
||||
"tsx": "^4.7.0",
|
||||
"typescript": "^5.3.3"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "crackle package",
|
||||
"dev": "crackle dev --shim=none",
|
||||
"generate": "tsx scripts/generate-weightings"
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user