|
|
@@ -344,55 +344,12 @@ const SingleFileCore = (() => {
|
|
|
doc.querySelectorAll("style").forEach(style => {
|
|
|
const cssRules = [];
|
|
|
if (style.sheet) {
|
|
|
- processRules(style.sheet.cssRules, cssRules);
|
|
|
+ DomProcessorHelper.processRules(this.doc, style.sheet.cssRules, cssRules);
|
|
|
const stylesheetContent = cssRules.join("");
|
|
|
style.textContent = this.options.compressCSS ? this.dom.uglifycss(stylesheetContent) : stylesheetContent;
|
|
|
}
|
|
|
});
|
|
|
-
|
|
|
- function processRules(rules, cssRules) {
|
|
|
- const REGEXP = /::after|::before|::first-line|::first-letter|:focus|:focus-within|:hover|:link|:visited|:active/gi;
|
|
|
- if (rules) {
|
|
|
- Array.from(rules).forEach(rule => {
|
|
|
- if (rule.media) {
|
|
|
- cssRules.push("@media " + Array.prototype.join.call(rule.media, ",") + " {");
|
|
|
- processRules(rule.cssRules, cssRules);
|
|
|
- cssRules.push("}");
|
|
|
- } else if (rule.selectorText) {
|
|
|
- let selector = rule.selectorText;
|
|
|
- if (selector.match(REGEXP)) {
|
|
|
- let selectors = selector.split(/\s*,\s*/g);
|
|
|
- selector = selectors.map(selector => {
|
|
|
- const simpleSelectors = selector.split(/\s*[ >~+]\s*/g);
|
|
|
- const separators = selector.match(/\s*[ >~+]\s*/g);
|
|
|
- return simpleSelectors.map((selector, selectorIndex) => {
|
|
|
- while (selector.match(REGEXP)) {
|
|
|
- selector = selector.replace(REGEXP, "").trim();
|
|
|
- }
|
|
|
- selector = selector.replace(/:?:[^(]+\(\)/g, "");
|
|
|
- if (selector == "") {
|
|
|
- selector = "*";
|
|
|
}
|
|
|
- return selector + (separators && separators[selectorIndex] ? separators[selectorIndex] : "");
|
|
|
- }).join("");
|
|
|
- }).join(",");
|
|
|
- }
|
|
|
- if (selector) {
|
|
|
- try {
|
|
|
- if (doc.querySelector(selector)) {
|
|
|
- cssRules.push(rule.cssText);
|
|
|
- }
|
|
|
- } catch (e) {
|
|
|
- cssRules.push(rule.cssText);
|
|
|
- }
|
|
|
- }
|
|
|
- } else {
|
|
|
- cssRules.push(rule.cssText);
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
|
|
|
removeHiddenElements() {
|
|
|
this.doc.querySelectorAll("[" + REMOVED_CONTENT_ATTRIBUTE_NAME + "]").forEach(element => element.remove());
|
|
|
@@ -728,6 +685,31 @@ const SingleFileCore = (() => {
|
|
|
resourceElement.setAttribute(attributeName, srcsetValues.join(","));
|
|
|
}));
|
|
|
}
|
|
|
+
|
|
|
+ static processRules(doc, rules, cssRules) {
|
|
|
+ if (rules) {
|
|
|
+ Array.from(rules).forEach(rule => {
|
|
|
+ if (rule.media) {
|
|
|
+ cssRules.push("@media " + Array.prototype.join.call(rule.media, ",") + " {");
|
|
|
+ DomProcessorHelper.processRules(doc, rule.cssRules, cssRules);
|
|
|
+ cssRules.push("}");
|
|
|
+ } else if (rule.selectorText) {
|
|
|
+ const selector = DomUtil.getFilteredSelector(rule.selectorText);
|
|
|
+ if (selector) {
|
|
|
+ try {
|
|
|
+ if (doc.querySelector(selector)) {
|
|
|
+ cssRules.push(rule.cssText);
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
+ cssRules.push(rule.cssText);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ cssRules.push(rule.cssText);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// -------
|
|
|
@@ -747,6 +729,7 @@ const SingleFileCore = (() => {
|
|
|
const REGEXP_IMPORT_SIMPLE_QUOTES_FN = /@import\s*'([^']*)'\s*([^;]*)/i;
|
|
|
const REGEXP_IMPORT_DOUBLE_QUOTES_FN = /@import\s*"([^"]*)"\s*([^;]*)/i;
|
|
|
const REGEXP_IMPORT_NO_QUOTES_FN = /@import\s*([^;]*)\s*([^;]*)/i;
|
|
|
+ const REGEXP_PSEUDO_CLASSES = /::after|::before|::first-line|::first-letter|:focus|:focus-within|:hover|:link|:visited|:active/gi;
|
|
|
|
|
|
class DomUtil {
|
|
|
static normalizeURL(url) {
|
|
|
@@ -814,6 +797,27 @@ const SingleFileCore = (() => {
|
|
|
return !element;
|
|
|
});
|
|
|
}
|
|
|
+
|
|
|
+ static getFilteredSelector(selector) {
|
|
|
+ if (selector.match(REGEXP_PSEUDO_CLASSES)) {
|
|
|
+ let selectors = selector.split(/\s*,\s*/g);
|
|
|
+ selector = selectors.map(selector => {
|
|
|
+ const simpleSelectors = selector.split(/\s*[ >~+]\s*/g);
|
|
|
+ const separators = selector.match(/\s*[ >~+]\s*/g);
|
|
|
+ return simpleSelectors.map((selector, selectorIndex) => {
|
|
|
+ while (selector.match(REGEXP_PSEUDO_CLASSES)) {
|
|
|
+ selector = selector.replace(REGEXP_PSEUDO_CLASSES, "").trim();
|
|
|
+ }
|
|
|
+ selector = selector.replace(/:?:[^(]+\(\)/g, "");
|
|
|
+ if (selector == "") {
|
|
|
+ selector = "*";
|
|
|
+ }
|
|
|
+ return selector + (separators && separators[selectorIndex] ? separators[selectorIndex] : "");
|
|
|
+ }).join("");
|
|
|
+ }).join(",");
|
|
|
+ }
|
|
|
+ return selector;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
return SingleFileCore;
|