|
|
@@ -20,6 +20,8 @@
|
|
|
|
|
|
const SingleFileCore = (() => {
|
|
|
|
|
|
+ const SELECTED_CONTENT_ATTRIBUTE_NAME = "data-single-file-selected-content";
|
|
|
+
|
|
|
let Download, DOM, URL;
|
|
|
|
|
|
function SingleFileCore(...args) {
|
|
|
@@ -58,7 +60,7 @@ const SingleFileCore = (() => {
|
|
|
class PageProcessor {
|
|
|
constructor(options) {
|
|
|
this.options = options;
|
|
|
- this.processor = new DOMProcessor(options.url);
|
|
|
+ this.processor = new DOMProcessor(options);
|
|
|
}
|
|
|
|
|
|
async loadPage(pageContent) {
|
|
|
@@ -174,8 +176,9 @@ const SingleFileCore = (() => {
|
|
|
const batchRequest = new BatchRequest();
|
|
|
|
|
|
class DOMProcessor {
|
|
|
- constructor(url) {
|
|
|
- this.baseURI = url;
|
|
|
+ constructor(options) {
|
|
|
+ this.options = options;
|
|
|
+ this.baseURI = options.url;
|
|
|
}
|
|
|
|
|
|
async loadPage(pageContent) {
|
|
|
@@ -206,6 +209,11 @@ const SingleFileCore = (() => {
|
|
|
}
|
|
|
|
|
|
getContent() {
|
|
|
+ if (this.options.selected) {
|
|
|
+ const selectedElement = this.doc.querySelector("[" + SELECTED_CONTENT_ATTRIBUTE_NAME + "]");
|
|
|
+ DomProcessorHelper.isolateElement(selectedElement.parentElement, selectedElement);
|
|
|
+ selectedElement.removeAttribute(SELECTED_CONTENT_ATTRIBUTE_NAME);
|
|
|
+ }
|
|
|
const titleElement = this.doc.head.querySelector("title");
|
|
|
let title;
|
|
|
if (titleElement) {
|
|
|
@@ -352,6 +360,20 @@ const SingleFileCore = (() => {
|
|
|
// DomHelper
|
|
|
// ---------
|
|
|
class DomProcessorHelper {
|
|
|
+ static isolateElement(parentElement, element) {
|
|
|
+ Array.from(parentElement.childNodes).forEach(node => {
|
|
|
+ if (node != element) {
|
|
|
+ if (node.tagName != "HEAD" && node.tagName != "STYLE") {
|
|
|
+ node.remove();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ element = element.parentElement;
|
|
|
+ if (element.parentElement) {
|
|
|
+ DomProcessorHelper.isolateElement(element.parentElement, element);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
static async resolveImportURLs(stylesheetContent, baseURI) {
|
|
|
stylesheetContent = DomUtil.removeCssComments(stylesheetContent);
|
|
|
const imports = DomUtil.getImportFunctions(stylesheetContent);
|