UNPKG

@launchmenu/applet-dictionary

Version:
156 lines 9.9 kB
"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&section=${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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