|
@@ -0,0 +1,57 @@
|
|
|
+function checkFont(name) {
|
|
|
+ if (!document.fonts) return false;
|
|
|
+ const fonts = [...document.fonts.values()];
|
|
|
+ return !!fonts.find(font => font.family === name);
|
|
|
+}
|
|
|
+
|
|
|
+function loadFont(font) {
|
|
|
+ return new Promise(resolve => {
|
|
|
+ if (!font) return resolve(true);
|
|
|
+ const { name, url, descriptors = {} } = font;
|
|
|
+ if (!name || !url) return resolve(true);
|
|
|
+ if (!document.fonts || checkFont(name)) return resolve(true);
|
|
|
+ const fontFace = new FontFace(name, `url(${url})`, descriptors);
|
|
|
+ fontFace
|
|
|
+ .load()
|
|
|
+ .then(font => {
|
|
|
+ document.fonts.add(font);
|
|
|
+ resolve(true);
|
|
|
+ })
|
|
|
+ .catch(err => {
|
|
|
+ console.error(err);
|
|
|
+ resolve(true);
|
|
|
+ });
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
+function allSettled(arr) {
|
|
|
+ return new Promise(resolve => {
|
|
|
+ let res = [];
|
|
|
+ const push = data => {
|
|
|
+ res.push(data);
|
|
|
+ if (res.length === arr.length) {
|
|
|
+ resolve(res);
|
|
|
+ }
|
|
|
+ };
|
|
|
+ arr.forEach(p => {
|
|
|
+ p.then(value => {
|
|
|
+ push({ status: 'fulfilled', value });
|
|
|
+ }).catch(reason => {
|
|
|
+ push({ status: 'rejected', reason });
|
|
|
+ });
|
|
|
+ });
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
+export default async function (fonts) {
|
|
|
+ if (typeof fonts === 'string' && fonts.length > 0) {
|
|
|
+ fonts = fonts.split('|').map(font => {
|
|
|
+ font = font.split('=');
|
|
|
+ const [name, url] = font;
|
|
|
+ return { name, url };
|
|
|
+ });
|
|
|
+ }
|
|
|
+ if (!Array.isArray(fonts) && !fonts.length) return;
|
|
|
+ console.log('fonts', fonts);
|
|
|
+ return allSettled(fonts.map(font => loadFont(font)));
|
|
|
+}
|