@launchmenu/applet-dictionary
Version:
An applet to find dictionary definitions
156 lines • 9.9 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;
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();
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2lraVNlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2NyYXBlci93aWtpL1dpa2lTZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUE4RDtBQUs5RCxNQUFhLFdBQVc7SUFnQ3BCOzs7OztPQUtHO0lBQ0gsWUFDSSxJQUFjLEVBQ2QsSUFBc0IsRUFDdEIsV0FBMkI7UUFwQ3JCLFlBQU8sR0FBRyxJQUFJLHdCQUFVLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDMUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztZQUN2QixNQUFNLE1BQU0sR0FBRyxNQUFNLEtBQUssQ0FDdEIsR0FBRyxJQUFJO2lCQUNGLE9BQU8sRUFBRTtpQkFDVCxTQUFTLEVBQUUsK0RBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxLQUNkLFNBQVMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQzdCLENBQUM7WUFDRixNQUFNLElBQUksR0FBOEIsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDNUQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxDQUFDLEVBQUUsSUFBcUIsQ0FBQyxDQUFDO1FBRWhCLGVBQVUsR0FBRyxJQUFJLHdCQUFVLENBQWtCLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQy9ELElBQUksSUFBSSxDQUFDLGdCQUFnQjtnQkFBRSxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzRCxJQUFJLENBQUMsSUFBSTtnQkFBRSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUV6QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsT0FBTztnQkFBRSxPQUFPLElBQUksQ0FBQztZQUUx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