瀏覽代碼

feat: download webfonts as well

Prior to this I was manually saving the fonts, and I don't remember documenting either.

Now there should be no documentation needed.
Lewis Cowles 1 年之前
父節點
當前提交
4d6e6a85e0
共有 1 個文件被更改,包括 45 次插入0 次删除
  1. 45 0
      client/lib/exportHTML.js

+ 45 - 0
client/lib/exportHTML.js

@@ -155,6 +155,50 @@ window.ExportHtml = Popup => {
     );
   };
 
+  const getWebFonts = () => {
+    fontUrls = [];
+
+    for (let sheet of document.styleSheets) {
+      // Get the base URL of the stylesheet
+      let baseUrl = sheet.href ? new URL(sheet.href).origin : window.location.origin;
+
+      try {
+        for (let rule of sheet.cssRules) {
+          if (rule.type === CSSRule.FONT_FACE_RULE) {
+            let src = rule.style.getPropertyValue('src');
+            let urlMatch = src.match(/url\(["']?(.+?)["']?\)/);
+            if (urlMatch) {
+              let fontUrl = urlMatch[1];
+
+              // Resolve the URL relative to the stylesheet's base URL
+              let resolvedUrl = new URL(fontUrl, baseUrl);
+              fontUrls.push(resolvedUrl.href); // Using .href to get the absolute URL
+            }
+          }
+        }
+      } catch (e) {
+          console.log('Access to stylesheet blocked:', e);
+      }
+    }
+
+    return fontUrls;
+  };
+
+  const downloadFonts = async(elements, zip) => {
+    await asyncForEach(elements, async elem => {
+      const response = await fetch(elem);
+      const responseBody = await response.blob();
+      const filename = elem.split('/')
+        .pop()
+        .split('?')
+        .shift()
+        .split('#')
+        .shift();
+      const fileFullPath = `webfonts/${filename}`;
+        zip.file(fileFullPath, responseBody);
+    });
+  }
+
   const downloadCardCovers = async (elements, zip, boardSlug) => {
     await asyncForEach(elements, async elem => {
       const response = await fetch(
@@ -197,6 +241,7 @@ window.ExportHtml = Popup => {
     await downloadStylesheets(getStylesheetList(), zip);
     await downloadSrcAttached(getSrcAttached(), zip, boardSlug);
     await downloadCardCovers(getCardCovers(), zip, boardSlug);
+    await downloadFonts(getWebFonts(), zip);
 
     addBoardHTMLToZip(boardSlug, zip);