Ver código fonte

use regexp to match URLs to replace in CSS

Gildas 7 anos atrás
pai
commit
b2ce120595
1 arquivos alterados com 15 adições e 8 exclusões
  1. 15 8
      lib/single-file/single-file-core.js

+ 15 - 8
lib/single-file/single-file-core.js

@@ -705,9 +705,9 @@ this.SingleFileCore = this.SingleFileCore || (() => {
 						const styleSheetUrl = new URL(match.resourceURL, baseURI).href;
 						let importedStylesheetContent = await Download.getContent(styleSheetUrl, { asDataURI: false, maxResourceSize: options.maxResourceSize, maxResourceSizeEnabled: options.maxResourceSizeEnabled });
 						importedStylesheetContent = DomUtil.wrapMediaQuery(importedStylesheetContent, match.media);
-						if (stylesheetContent.indexOf(cssImport) != -1) {
+						if (stylesheetContent.includes(cssImport)) {
 							importedStylesheetContent = await DomProcessorHelper.resolveImportURLs(importedStylesheetContent, styleSheetUrl, options);
-							stylesheetContent = stylesheetContent.replace(cssImport, importedStylesheetContent);
+							stylesheetContent = stylesheetContent.replace(DomUtil.getRegExp(cssImport), importedStylesheetContent);
 						}
 					}
 				}
@@ -721,12 +721,15 @@ this.SingleFileCore = this.SingleFileCore || (() => {
 				let resourceURL = DomUtil.matchURL(urlFunction);
 				resourceURL = DomUtil.normalizeURL(resourceURL);
 				if (resourceURL && resourceURL != baseURI && DomUtil.testValidPath(resourceURL)) {
-					stylesheetContent = stylesheetContent.replace(urlFunction, urlFunction.replace(resourceURL, new URL(resourceURL, baseURI).href));
+					const resolvedURL = new URL(resourceURL, baseURI).href;
+					if (resourceURL != resolvedURL && stylesheetContent.includes(urlFunction)) {
+						stylesheetContent = stylesheetContent.replace(DomUtil.getRegExp(urlFunction), urlFunction.replace(resourceURL, resolvedURL));
+					}
 				} else {
 					if (resourceURL.startsWith(DATA_URI_PREFIX)) {
 						const escapedResourceURL = resourceURL.replace(/&/g, "&amp;").replace(/\u00a0/g, "&nbsp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
-						if (escapedResourceURL != resourceURL) {
-							stylesheetContent = stylesheetContent.replace(resourceURL, escapedResourceURL);
+						if (escapedResourceURL != resourceURL && stylesheetContent.includes(urlFunction)) {
+							stylesheetContent = stylesheetContent.replace(DomUtil.getRegExp(urlFunction), urlFunction.replace(resourceURL, escapedResourceURL));
 						}
 					}
 				}
@@ -750,9 +753,9 @@ this.SingleFileCore = this.SingleFileCore || (() => {
 			await Promise.all(urlFunctions.map(async urlFunction => {
 				let resourceURL = DomUtil.matchURL(urlFunction);
 				resourceURL = DomUtil.normalizeURL(resourceURL);
-				if (resourceURL && resourceURL != baseURI && DomUtil.testValidPath(resourceURL)) {
+				if (resourceURL && resourceURL != baseURI && DomUtil.testValidPath(resourceURL) && stylesheetContent.includes(urlFunction)) {
 					const dataURI = await batchRequest.addURL(resourceURL);
-					stylesheetContent = stylesheetContent.replace(urlFunction, urlFunction.replace(resourceURL, dataURI));
+					stylesheetContent = stylesheetContent.replace(DomUtil.getRegExp(urlFunction), urlFunction.replace(resourceURL, dataURI));
 				}
 			}));
 			return stylesheetContent;
@@ -856,8 +859,12 @@ this.SingleFileCore = this.SingleFileCore || (() => {
 			}
 		}
 
+		static getRegExp(string) {
+			return new RegExp(string.replace(/([{}()^$&.*?/+|[\\\\]|\]|-)/g, "\\$1"), "gi");
+		}
+
 		static getUrlFunctions(stylesheetContent) {
-			return stylesheetContent.match(REGEXP_URL_FN) || [];
+			return Array.from(new Set(stylesheetContent.match(REGEXP_URL_FN) || []));
 		}
 
 		static getImportFunctions(stylesheetContent) {