@launchmenu/applet-dictionary
Version:
An applet to find dictionary definitions
159 lines • 10.2 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.WikiSection = void 0;
const model_react_1 = require("model-react");
class WikiSection {
/**
* Creates a new local model of a wikipage section
* @param page The page that this section is a part of
* @param info The section info
* @param subsections The ids of child sections
*/
constructor(page, info, subsections) {
this.content = new model_react_1.DataLoader(async () => {
const page = this.page;
console.log("start");
const result = await fetch(`${page
.getWiki()
.getApiUrl()}?action=parse&format=json&prop=text&disabletoc=true§ion=${this.info.index}&page=${page.getTitle()}`);
const data = await result.json();
console.log(data);
console.log(this);
return data.parse.text["*"];
}, null);
this.contentDom = new model_react_1.DataCacher((h, prev) => {
if (this.contentDomSource)
return this.contentDomSource(h);
if (!prev)
this.setSubsectionsContents();
const content = this.content.get(h);
if (!content)
return null;
const parser = new DOMParser();
const doc = parser.parseFromString(content, "text/xml");
return doc;
});
this.page = page;
this.info = info;
this.subsections = subsections || [];
}
/**
* Retrieves the page that this section is a part of
* @returns The page
*/
getPage() {
return this.page;
}
/**
* Retrieves all subsections of this section
* @returns All subsections
*/
getSubSections() {
return this.subsections;
}
/**
* Finds the subsections with the specified class
* @param constructor The class of the subsection to find
* @returns The subsections that were found
*/
findSubsections(constructor) {
return this.subsections.filter((subsection) => subsection instanceof constructor);
}
// Getters for the section info
/**
* Retrieves the depth of the section
* @returns The depth
*/
getLevel() {
return this.info.level;
}
/**
* Retrieves the name of the section
* @returns The section's name
*/
getName() {
return this.info.name;
}
/**
* Retrieves the non-hierarchical index of the section
* @returns The section's index
*/
getIndex() {
return this.info.index;
}
/**
* Retrieves the hierarchical id of the section, e.g. `1.3.2`
* @returns The hierarchical id
*/
getID() {
return this.info.number;
}
// Content
/**
* Retrieves the raw section content
* @param hook The hook to subscribe to changes
* @returns The currently loaded content of this section
*/
getContent(hook) {
return this.content.get(hook);
}
/**
* Retrieves the section content parsed as an html document
* @param hook The hook to subscribe to changes
* @returns The currently loaded content of this section
*/
getContentDom(hook) {
return this.contentDom.get(hook);
}
/**
* Sets the dom source in order to help with efficiency, prevents performing a data fetch if the data can be obtained from here
* @param source THe data source to retrieve the data from
*/
setContentDomSource(source) {
if (this.content.get() == null) {
this.contentDomSource = source;
}
}
/**
* Sets the contents of the subsections based on the content of this section
*/
setSubsectionsContents() {
this.subsections.forEach(section => {
this.setSubsectionContents(section);
});
}
/**
* Sets the contents of the given subsection based on the content of this section
* @param subsection The subsection to set the content for
*/
setSubsectionContents(subsection) {
const source = new model_react_1.DataCacher(hook => {
var _a;
const contents = this.getContentDom(hook);
if (!contents)
return null;
// Get the header of this section
const header = (_a = contents.querySelector(`#${subsection.getName().replace(/\s/g, "_")}`)) === null || _a === void 0 ? void 0 : _a.parentNode;
if (!header)
return null;
const headerType = header.nodeName;
// Get all nodes that fall under this section
const nodes = [header.cloneNode(true)];
let node = header.nextSibling;
while (node && node.nodeName != headerType) {
nodes.push(node.cloneNode(true));
node = node.nextSibling;
}
// Create a document with these nodes
const container = document.createElement("div");
container.append(...nodes);
container.className = "mw-parser-output";
const doc = new Document();
doc.appendChild(container);
return doc;
});
subsection.setContentDomSource(h => source.get(h));
}
}
exports.WikiSection = WikiSection;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2lraVNlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2lraS9XaWtpU2VjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBOEQ7QUFLOUQsTUFBYSxXQUFXO0lBbUNwQjs7Ozs7T0FLRztJQUNILFlBQ0ksSUFBYyxFQUNkLElBQXNCLEVBQ3RCLFdBQTJCO1FBdkNyQixZQUFPLEdBQUcsSUFBSSx3QkFBVSxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQzFDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDdkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNyQixNQUFNLE1BQU0sR0FBRyxNQUFNLEtBQUssQ0FDdEIsR0FBRyxJQUFJO2lCQUNGLE9BQU8sRUFBRTtpQkFDVCxTQUFTLEVBQUUsK0RBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxLQUNkLFNBQVMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQzdCLENBQUM7WUFDRixNQUFNLElBQUksR0FBOEIsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDNUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEMsQ0FBQyxFQUFFLElBQXFCLENBQUMsQ0FBQztRQUVoQixlQUFVLEdBQUcsSUFBSSx3QkFBVSxDQUFrQixDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUMvRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0I7Z0JBQUUsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLElBQUk7Z0JBQUUsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7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