|
|
@@ -43,6 +43,7 @@ this.singlefile.lib.helper = this.singlefile.lib.helper || (() => {
|
|
|
const STYLESHEET_ATTRIBUTE_NAME = "data-single-file-stylesheet";
|
|
|
const DISABLED_NOSCRIPT_ATTRIBUTE_NAME = "data-single-file-disabled-noscript";
|
|
|
const SELECTED_CONTENT_ATTRIBUTE_NAME = "data-single-file-selected-content";
|
|
|
+ const ASYNC_SCRIPT_ATTRIBUTE_NAME = "data-single-file-async-script";
|
|
|
const IGNORED_REMOVED_TAG_NAMES = ["NOSCRIPT", "DISABLED-NOSCRIPT", "META", "LINK", "STYLE", "TITLE", "TEMPLATE", "SOURCE", "OBJECT", "SCRIPT", "HEAD"];
|
|
|
const REGEXP_SIMPLE_QUOTES_STRING = /^'(.*?)'$/;
|
|
|
const REGEXP_DOUBLE_QUOTES_STRING = /^"(.*?)"$/;
|
|
|
@@ -79,7 +80,8 @@ this.singlefile.lib.helper = this.singlefile.lib.helper || (() => {
|
|
|
HTML_IMPORT_ATTRIBUTE_NAME,
|
|
|
LAZY_SRC_ATTRIBUTE_NAME,
|
|
|
STYLESHEET_ATTRIBUTE_NAME,
|
|
|
- SELECTED_CONTENT_ATTRIBUTE_NAME
|
|
|
+ SELECTED_CONTENT_ATTRIBUTE_NAME,
|
|
|
+ ASYNC_SCRIPT_ATTRIBUTE_NAME
|
|
|
};
|
|
|
|
|
|
function initDoc(doc) {
|
|
|
@@ -90,7 +92,6 @@ this.singlefile.lib.helper = this.singlefile.lib.helper || (() => {
|
|
|
}
|
|
|
|
|
|
function preProcessDoc(doc, win, options) {
|
|
|
- doc.querySelectorAll("script").forEach(element => element.textContent = element.textContent.replace(/<\/script>/gi, "<\\/script>"));
|
|
|
doc.querySelectorAll("noscript").forEach(element => {
|
|
|
element.setAttribute(DISABLED_NOSCRIPT_ATTRIBUTE_NAME, element.textContent);
|
|
|
element.textContent = "";
|
|
|
@@ -266,6 +267,13 @@ this.singlefile.lib.helper = this.singlefile.lib.helper || (() => {
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
+ if (element.tagName == "SCRIPT") {
|
|
|
+ if (element.async && element.getAttribute("async") != "" && element.getAttribute("async") != "async") {
|
|
|
+ element.setAttribute(ASYNC_SCRIPT_ATTRIBUTE_NAME, "");
|
|
|
+ data.markedElements.push(element);
|
|
|
+ }
|
|
|
+ element.textContent = element.textContent.replace(/<\/script>/gi, "<\\/script>");
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
function getUsedFont(computedStyle, options, usedFonts) {
|
|
|
@@ -320,7 +328,7 @@ this.singlefile.lib.helper = this.singlefile.lib.helper || (() => {
|
|
|
doc.head.querySelectorAll("*:not(base):not(link):not(meta):not(noscript):not(script):not(style):not(template):not(title)").forEach(element => element.removeAttribute("hidden"));
|
|
|
}
|
|
|
if (!markedElements) {
|
|
|
- const singleFileAttributes = [REMOVED_CONTENT_ATTRIBUTE_NAME, HIDDEN_CONTENT_ATTRIBUTE_NAME, PRESERVED_SPACE_ELEMENT_ATTRIBUTE_NAME, IMAGE_ATTRIBUTE_NAME, POSTER_ATTRIBUTE_NAME, CANVAS_ATTRIBUTE_NAME, INPUT_VALUE_ATTRIBUTE_NAME, SHADOW_ROOT_ATTRIBUTE_NAME, HTML_IMPORT_ATTRIBUTE_NAME, STYLESHEET_ATTRIBUTE_NAME];
|
|
|
+ const singleFileAttributes = [REMOVED_CONTENT_ATTRIBUTE_NAME, HIDDEN_CONTENT_ATTRIBUTE_NAME, PRESERVED_SPACE_ELEMENT_ATTRIBUTE_NAME, IMAGE_ATTRIBUTE_NAME, POSTER_ATTRIBUTE_NAME, CANVAS_ATTRIBUTE_NAME, INPUT_VALUE_ATTRIBUTE_NAME, SHADOW_ROOT_ATTRIBUTE_NAME, HTML_IMPORT_ATTRIBUTE_NAME, STYLESHEET_ATTRIBUTE_NAME, ASYNC_SCRIPT_ATTRIBUTE_NAME];
|
|
|
markedElements = doc.querySelectorAll(singleFileAttributes.map(name => "[" + name + "]").join(","));
|
|
|
}
|
|
|
markedElements.forEach(element => {
|
|
|
@@ -334,6 +342,7 @@ this.singlefile.lib.helper = this.singlefile.lib.helper || (() => {
|
|
|
element.removeAttribute(SHADOW_ROOT_ATTRIBUTE_NAME);
|
|
|
element.removeAttribute(HTML_IMPORT_ATTRIBUTE_NAME);
|
|
|
element.removeAttribute(STYLESHEET_ATTRIBUTE_NAME);
|
|
|
+ element.removeAttribute(ASYNC_SCRIPT_ATTRIBUTE_NAME);
|
|
|
});
|
|
|
}
|
|
|
|