99 lines
2.5 KiB
JavaScript
99 lines
2.5 KiB
JavaScript
import { createUnifont, defineFontProvider } from "unifont";
|
|
class UnifontFontResolver {
|
|
#unifont;
|
|
#hasher;
|
|
constructor({
|
|
unifont,
|
|
hasher
|
|
}) {
|
|
this.#unifont = unifont;
|
|
this.#hasher = hasher;
|
|
}
|
|
static idFromProvider({ hasher, provider }) {
|
|
const hash = hasher.hashObject({
|
|
name: provider.name,
|
|
...provider.config
|
|
});
|
|
return `${provider.name}-${hash}`;
|
|
}
|
|
static astroToUnifontProvider(astroProvider, root) {
|
|
return defineFontProvider(astroProvider.name, async (_options, ctx) => {
|
|
await astroProvider?.init?.({ ...ctx, root });
|
|
return {
|
|
async resolveFont(familyName, { options, ...rest }) {
|
|
return await astroProvider.resolveFont({ familyName, options, ...rest });
|
|
},
|
|
async listFonts() {
|
|
return astroProvider.listFonts?.();
|
|
}
|
|
};
|
|
})(astroProvider.config);
|
|
}
|
|
static extractUnifontProviders({
|
|
families,
|
|
hasher,
|
|
root
|
|
}) {
|
|
const providers = /* @__PURE__ */ new Map();
|
|
for (const { provider } of families) {
|
|
const id = this.idFromProvider({ hasher, provider });
|
|
if (!providers.has(id)) {
|
|
const unifontProvider = this.astroToUnifontProvider(provider, root);
|
|
unifontProvider._name = this.idFromProvider({ hasher, provider });
|
|
providers.set(id, unifontProvider);
|
|
}
|
|
}
|
|
return Array.from(providers.values());
|
|
}
|
|
static async create({
|
|
families,
|
|
hasher,
|
|
storage,
|
|
root
|
|
}) {
|
|
return new UnifontFontResolver({
|
|
unifont: await createUnifont(this.extractUnifontProviders({ families, hasher, root }), {
|
|
storage,
|
|
// TODO: consider enabling, would require new astro errors
|
|
throwOnError: false
|
|
}),
|
|
hasher
|
|
});
|
|
}
|
|
async resolveFont({
|
|
familyName,
|
|
provider,
|
|
options,
|
|
...rest
|
|
}) {
|
|
const id = UnifontFontResolver.idFromProvider({
|
|
hasher: this.#hasher,
|
|
provider
|
|
});
|
|
const { fonts } = await this.#unifont.resolveFont(
|
|
familyName,
|
|
{
|
|
// Options are currently namespaced by provider name, it may change in
|
|
// https://github.com/unjs/unifont/pull/287
|
|
options: {
|
|
[id]: options
|
|
},
|
|
...rest
|
|
},
|
|
[id]
|
|
);
|
|
return fonts;
|
|
}
|
|
async listFonts({ provider }) {
|
|
return await this.#unifont.listFonts([
|
|
UnifontFontResolver.idFromProvider({
|
|
hasher: this.#hasher,
|
|
provider
|
|
})
|
|
]);
|
|
}
|
|
}
|
|
export {
|
|
UnifontFontResolver
|
|
};
|