Fonts: use Deno methods

This commit is contained in:
Thibault “Adædra” Hamel 2024-06-27 09:03:53 +02:00
parent 0b373fc57e
commit 6b3d96b321

View File

@ -1,36 +1,30 @@
import File from "vinyl"; import File from "vinyl";
import tmp from "tmp"; import tmp from "tmp";
import { execFile } from "node:child_process";
import { readFileSync, unlinkSync } from "node:fs";
import hashPaths from "../hash.ts"; import hashPaths from "../hash.ts";
import { dest, fromGlob } from "../rx-utils.ts"; import { dest, fromGlob } from "../rx-utils.ts";
import { lastValueFrom, mergeMap } from "rxjs"; import { lastValueFrom, mergeMap } from "rxjs";
import { Buffer } from "node:buffer";
const FONT_PRESETS: { [variant: string]: { ranges: string[] } } = { const FONT_PRESETS: { [variant: string]: { ranges: string[] } } = {
mono: { ranges: ["20-7F", "2205", "2E22-2E25", "2713", "2717"] }, mono: { ranges: ["20-7F", "2205", "2E22-2E25", "2713", "2717"] },
text: { ranges: ["20-7F", "A0-FF", "2000-206F", "20AC"] }, text: { ranges: ["20-7F", "A0-FF", "2000-206F", "20AC"] },
}; };
function compileFont(font: File): Promise<File> { async function compileFont(font: File): Promise<File> {
const [, variant, weight] = /([A-Z][a-z]+)-(\w+)\.ttf$/.exec(font.basename) as string[]; const [, variant, weight] = /([A-Z][a-z]+)-(\w+)\.ttf$/.exec(font.basename) as string[];
const tmpOutput = tmp.fileSync({ discardDescriptor: true }); const tmpOutput = tmp.fileSync({ discardDescriptor: true });
const unicodes = FONT_PRESETS[variant.toLowerCase()].ranges; const unicodes = FONT_PRESETS[variant.toLowerCase()].ranges;
return new Promise((resolve, reject) => { await new Deno.Command("pyftsubset", {
execFile("pyftsubset", [ args: [font.path, `--unicodes=${unicodes.join(",")}`, `--output-file=${tmpOutput.name}`, "--flavor=woff2"],
font.path, }).output();
`--unicodes=${unicodes.join(",")}`,
`--output-file=${tmpOutput.name}`,
"--flavor=woff2",
]).on("error", (e) => reject(e)).once("exit", () => {
font.path = `iosevka-adaedra-${variant.toLowerCase()}-${weight.toLowerCase()}.woff2`;
font.contents = readFileSync(tmpOutput.name);
(font as any).base = null;
unlinkSync(tmpOutput.name); font.path = `iosevka-adaedra-${variant.toLowerCase()}-${weight.toLowerCase()}.woff2`;
resolve(font); font.contents = Buffer.from(await Deno.readFile(tmpOutput.name));
}); font.base = null;
});
await Deno.remove(tmpOutput.name);
return font;
} }
export const fonts = async () => { export const fonts = async () => {