|
@@ -27,7 +27,7 @@ this.fontsMinifier = this.fontsMinifier || (() => {
|
|
|
const REGEXP_URL_NO_QUOTES_FN = /url\s*\(\s*(.*?)\s*\)/i;
|
|
const REGEXP_URL_NO_QUOTES_FN = /url\s*\(\s*(.*?)\s*\)/i;
|
|
|
|
|
|
|
|
return {
|
|
return {
|
|
|
- process: (doc, removeUnusedCSSRules, secondPass) => {
|
|
|
|
|
|
|
+ process: (doc, secondPass) => {
|
|
|
const declaredFonts = new Set();
|
|
const declaredFonts = new Set();
|
|
|
const usedFonts = new Set();
|
|
const usedFonts = new Set();
|
|
|
const stats = {
|
|
const stats = {
|
|
@@ -44,38 +44,36 @@ this.fontsMinifier = this.fontsMinifier || (() => {
|
|
|
if (style.sheet) {
|
|
if (style.sheet) {
|
|
|
const processedRules = style.sheet.cssRules.length;
|
|
const processedRules = style.sheet.cssRules.length;
|
|
|
stats.rules.processed += processedRules;
|
|
stats.rules.processed += processedRules;
|
|
|
- style.textContent = processRules(doc, style.sheet.cssRules, declaredFonts, usedFonts, removeUnusedCSSRules, stats, secondPass);
|
|
|
|
|
|
|
+ style.textContent = processRules(doc, style.sheet.cssRules, declaredFonts, usedFonts, stats, secondPass);
|
|
|
|
|
+ stats.rules.discarded += processedRules - style.sheet.cssRules.length;
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ doc.querySelectorAll("[style]").forEach(element => {
|
|
|
|
|
+ if (element.style.fontFamily) {
|
|
|
|
|
+ element.style.fontFamily.split(",").forEach(fontFamilyName => usedFonts.add(getFontFamilyName(fontFamilyName)));
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ const unusedFonts = Array.from(declaredFonts).filter(fontFamilyName => !usedFonts.has(fontFamilyName));
|
|
|
|
|
+ doc.querySelectorAll("style").forEach(style => {
|
|
|
|
|
+ if (style.sheet) {
|
|
|
|
|
+ const processedRules = style.sheet.cssRules.length;
|
|
|
|
|
+ style.textContent = deleteUnusedFonts(doc, style.sheet.cssRules, unusedFonts);
|
|
|
stats.rules.discarded += processedRules - style.sheet.cssRules.length;
|
|
stats.rules.discarded += processedRules - style.sheet.cssRules.length;
|
|
|
}
|
|
}
|
|
|
});
|
|
});
|
|
|
- if (removeUnusedCSSRules) {
|
|
|
|
|
- doc.querySelectorAll("[style]").forEach(element => {
|
|
|
|
|
- if (element.style.fontFamily) {
|
|
|
|
|
- element.style.fontFamily.split(",").forEach(fontFamilyName => usedFonts.add(getFontFamilyName(fontFamilyName)));
|
|
|
|
|
- }
|
|
|
|
|
- });
|
|
|
|
|
- const unusedFonts = Array.from(declaredFonts).filter(fontFamilyName => !usedFonts.has(fontFamilyName));
|
|
|
|
|
- doc.querySelectorAll("style").forEach(style => {
|
|
|
|
|
- if (style.sheet) {
|
|
|
|
|
- const processedRules = style.sheet.cssRules.length;
|
|
|
|
|
- style.textContent = deleteUnusedFonts(doc, style.sheet.cssRules, unusedFonts);
|
|
|
|
|
- stats.rules.discarded += processedRules - style.sheet.cssRules.length;
|
|
|
|
|
- }
|
|
|
|
|
- });
|
|
|
|
|
- }
|
|
|
|
|
return stats;
|
|
return stats;
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
- function processRules(doc, rules, declaredFonts, usedFonts, removeUnusedCSSRules, stats, secondPass) {
|
|
|
|
|
|
|
+ function processRules(doc, rules, declaredFonts, usedFonts, stats, secondPass) {
|
|
|
let stylesheetContent = "";
|
|
let stylesheetContent = "";
|
|
|
if (rules) {
|
|
if (rules) {
|
|
|
Array.from(rules).forEach(rule => {
|
|
Array.from(rules).forEach(rule => {
|
|
|
if (rule.type == CSSRule.MEDIA_RULE) {
|
|
if (rule.type == CSSRule.MEDIA_RULE) {
|
|
|
stylesheetContent += "@media " + Array.prototype.join.call(rule.media, ",") + " {";
|
|
stylesheetContent += "@media " + Array.prototype.join.call(rule.media, ",") + " {";
|
|
|
- stylesheetContent += processRules(doc, rule.cssRules, declaredFonts, usedFonts, removeUnusedCSSRules, stats, secondPass);
|
|
|
|
|
|
|
+ stylesheetContent += processRules(doc, rule.cssRules, declaredFonts, usedFonts, stats, secondPass);
|
|
|
stylesheetContent += "}";
|
|
stylesheetContent += "}";
|
|
|
- } else if (removeUnusedCSSRules && rule.type == CSSRule.STYLE_RULE) {
|
|
|
|
|
|
|
+ } else if (rule.type == CSSRule.STYLE_RULE) {
|
|
|
if (rule.style && rule.style.fontFamily) {
|
|
if (rule.style && rule.style.fontFamily) {
|
|
|
rule.style.fontFamily.split(",").forEach(fontFamilyName => usedFonts.add(getFontFamilyName(fontFamilyName)));
|
|
rule.style.fontFamily.split(",").forEach(fontFamilyName => usedFonts.add(getFontFamilyName(fontFamilyName)));
|
|
|
}
|
|
}
|