|
|
@@ -441,6 +441,7 @@ this.SingleFileCore = this.SingleFileCore || (() => {
|
|
|
element.remove();
|
|
|
}
|
|
|
});
|
|
|
+ this.doc.querySelectorAll("link[rel*=stylesheet][rel*=alternate][title]").forEach(element => element.remove());
|
|
|
this.doc.querySelectorAll("meta[http-equiv=\"content-security-policy\"]").forEach(element => element.remove());
|
|
|
if (this.options.compressHTML) {
|
|
|
this.doc.querySelectorAll("input[type=hidden]").forEach(element => element.remove());
|
|
|
@@ -788,41 +789,28 @@ this.SingleFileCore = this.SingleFileCore || (() => {
|
|
|
}
|
|
|
this.stylesheets.set(element, { mediaText });
|
|
|
const options = { maxResourceSize: this.options.maxResourceSize, maxResourceSizeEnabled: this.options.maxResourceSizeEnabled, url: this.options.url, charset: this.charset, compressCSS: this.options.compressCSS };
|
|
|
- const isLinkTag = element.tagName.toLowerCase() == "link";
|
|
|
- if (isLinkTag && element.rel.includes("alternate") && element.title) {
|
|
|
- this.stylesheets.delete(element);
|
|
|
- element.remove();
|
|
|
- } else {
|
|
|
- let stylesheetContent;
|
|
|
- if (isLinkTag) {
|
|
|
- if (element.charset) {
|
|
|
- options.charset = element.charset;
|
|
|
- }
|
|
|
- stylesheetContent = await ProcessorHelper.resolveLinkStylesheetURLs(element.href, this.baseURI, options);
|
|
|
- } else {
|
|
|
- stylesheetContent = await ProcessorHelper.resolveImportURLs(element.textContent, this.baseURI, options);
|
|
|
- }
|
|
|
- let stylesheet;
|
|
|
- try {
|
|
|
- stylesheet = cssTree.parse(stylesheetContent);
|
|
|
- } catch (error) {
|
|
|
- // ignored
|
|
|
+ let stylesheetContent;
|
|
|
+ if (element.tagName.toLowerCase() == "link") {
|
|
|
+ if (element.charset) {
|
|
|
+ options.charset = element.charset;
|
|
|
}
|
|
|
- if (stylesheet && stylesheet.children) {
|
|
|
- if (this.options.compressCSS) {
|
|
|
- const removedRules = [];
|
|
|
- for (let cssRule = stylesheet.children.head; cssRule; cssRule = cssRule.next) {
|
|
|
- const ruleData = cssRule.data;
|
|
|
- if (ruleData.type == "Raw" && ruleData.value && ruleData.value.trim().startsWith("//")) {
|
|
|
- removedRules.push(cssRule);
|
|
|
- }
|
|
|
- }
|
|
|
- removedRules.forEach(cssRule => stylesheet.children.remove(cssRule));
|
|
|
- }
|
|
|
- this.stylesheets.get(element).stylesheet = stylesheet;
|
|
|
- } else {
|
|
|
- this.stylesheets.delete(element);
|
|
|
+ stylesheetContent = await ProcessorHelper.resolveLinkStylesheetURLs(element.href, this.baseURI, options);
|
|
|
+ } else {
|
|
|
+ stylesheetContent = await ProcessorHelper.resolveImportURLs(element.textContent, this.baseURI, options);
|
|
|
+ }
|
|
|
+ let stylesheet;
|
|
|
+ try {
|
|
|
+ stylesheet = cssTree.parse(stylesheetContent);
|
|
|
+ } catch (error) {
|
|
|
+ // ignored
|
|
|
+ }
|
|
|
+ if (stylesheet && stylesheet.children) {
|
|
|
+ if (this.options.compressCSS) {
|
|
|
+ ProcessorHelper.removeSingleLineCssComments(stylesheet);
|
|
|
}
|
|
|
+ this.stylesheets.get(element).stylesheet = stylesheet;
|
|
|
+ } else {
|
|
|
+ this.stylesheets.delete(element);
|
|
|
}
|
|
|
}));
|
|
|
}
|
|
|
@@ -1196,6 +1184,17 @@ this.SingleFileCore = this.SingleFileCore || (() => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ static removeSingleLineCssComments(stylesheet) {
|
|
|
+ const removedRules = [];
|
|
|
+ for (let cssRule = stylesheet.children.head; cssRule; cssRule = cssRule.next) {
|
|
|
+ const ruleData = cssRule.data;
|
|
|
+ if (ruleData.type == "Raw" && ruleData.value && ruleData.value.trim().startsWith("//")) {
|
|
|
+ removedRules.push(cssRule);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ removedRules.forEach(cssRule => stylesheet.children.remove(cssRule));
|
|
|
+ }
|
|
|
+
|
|
|
static async resolveImportURLs(stylesheetContent, baseURI, options) {
|
|
|
stylesheetContent = ProcessorHelper.resolveStylesheetURLs(stylesheetContent, baseURI, options);
|
|
|
const imports = Util.getImportFunctions(stylesheetContent);
|