diff options
Diffstat (limited to '')
11 files changed, 706 insertions, 0 deletions
diff --git a/docusaurus/static/ajax/libs/wolfree/23.7.8/js/AJAX.js b/docusaurus/static/ajax/libs/wolfree/23.7.8/js/AJAX.js new file mode 100644 index 0000000..465787d --- /dev/null +++ b/docusaurus/static/ajax/libs/wolfree/23.7.8/js/AJAX.js @@ -0,0 +1,56 @@ +/** + * @license + * SPDX-License-Identifier: AGPL-3.0-or-later + * This file is part of Wolfree. + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + */ + +// @ts-check + +import SearchParams from "./SearchParams.js"; + +export default class AJAX { + ajax = async ({ + input = String(), + i2d = Boolean(), + extraPodstates = Array(), + } = {}) => { + try { + const data = new SearchParams().getSearchParams({ + input, + extraPodstates, + i2d, + }); + + const options = { + url: "https://api.wolframalpha.com/v2/query", + dataType: "jsonp", + traditional: true, + data, + }; + + try { + /** + * https://www.npmjs.com/package/@types/jquery + * @type {import('jQuery')} + */ + const response = await jQuery.ajax(options); + return ( + console.assert(response instanceof Object), + console.assert(response.hasOwnProperty("queryresult")), + { response } + ); + } catch (error) { + return ( + console.error( + { error }, + "We encountered an issue while attempting to retrieve a response from the Wolfram Alpha API using the jQuery library." + ), + { error } + ); + } + } catch (error) { + return console.error({ error }), { error }; + } + }; +} diff --git a/docusaurus/static/ajax/libs/wolfree/23.7.8/js/AppID.js b/docusaurus/static/ajax/libs/wolfree/23.7.8/js/AppID.js new file mode 100644 index 0000000..070e4e1 --- /dev/null +++ b/docusaurus/static/ajax/libs/wolfree/23.7.8/js/AppID.js @@ -0,0 +1,57 @@ +/** + * @license + * SPDX-License-Identifier: AGPL-3.0-or-later + * This file is part of Wolfree. + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + */ + +// @ts-check + +// To generate a new AppID: +// 1. Open Tor Browser and go to: https://products.wolframalpha.com/api/ +// 2. Click the orangish "Get API Access" button. You will go to: https://account.wolfram.com/login/oauth2/sign-in +// 3. Click the reddish "Create one" hyperlink to create a new Wolfram ID. You will go to: https://account.wolfram.com/login/create +// 4. Fill out the form using random alphanumeric characters. +// 5. Click the reddish "Create Wolfram ID" button. You will go to: https://developer.wolframalpha.com/portal/myapps/index.html +// 6. Click the orangish "Sign up to get your first AppID" button. +// 7. Fill out the form using random alphanumeric characters. +// 8. Click the orangish "Sign up" button. +// 9. Click the orangish "Get an AppID" button. +// 10. Fill out the form using random alphanumeric characters. +// 11. Click the orangish "Get AppID" button. + +export default class AppID { + appIDArray = Array(); + + constructor( + appIDArray = ["H9V325-HTALUWHKGK", "AKJTJT-LR5LL8WTG6", "LKY83U-XW6ATU9URU"] + ) { + (this.appIDArray = appIDArray), + Array.from(this.appIDArray).forEach( + (appID) => ( + console.assert(17 === appID.length), + console.assert(/[0-9A-Z]{6}-[0-9A-Z]{10}/.test(appID)) + ) + ); + } + + getAppID = ({ + appID = this.appIDArray[this.getRandomInt() % this.appIDArray.length], + } = {}) => { + try { + return appID; + } catch (error) { + return console.error({ error }), String(); + } + }; + + getRandomInt = ({ + randomInt = crypto.getRandomValues(new Uint32Array(1))[0], + } = {}) => { + try { + return randomInt; + } catch (error) { + return console.error({ error }), Number(); + } + }; +} diff --git a/docusaurus/static/ajax/libs/wolfree/23.7.8/js/Entrypoint.js b/docusaurus/static/ajax/libs/wolfree/23.7.8/js/Entrypoint.js new file mode 100644 index 0000000..0fe9d31 --- /dev/null +++ b/docusaurus/static/ajax/libs/wolfree/23.7.8/js/Entrypoint.js @@ -0,0 +1,26 @@ +/** + * @license + * SPDX-License-Identifier: AGPL-3.0-or-later + * This file is part of Wolfree. + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + */ + +// @ts-check + +import Processor from "./Processor.js"; +import Preprocessor from "./Preprocessor.js"; +import PostProcessor from "./PostProcessor.js"; + +export default async ({ + input = String(), + i2d = Boolean(), + extraPodstates = Array(), +} = {}) => { + try { + new Preprocessor().process(); + await new Processor().process({ input, i2d, extraPodstates }); + new PostProcessor().process({ input, i2d }); + } catch (error) { + console.error({ error }); + } +}; diff --git a/docusaurus/static/ajax/libs/wolfree/23.7.8/js/Placeholder.js b/docusaurus/static/ajax/libs/wolfree/23.7.8/js/Placeholder.js new file mode 100644 index 0000000..d5b45a6 --- /dev/null +++ b/docusaurus/static/ajax/libs/wolfree/23.7.8/js/Placeholder.js @@ -0,0 +1,69 @@ +/** + * @license + * SPDX-License-Identifier: AGPL-3.0-or-later + * This file is part of Wolfree. + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + */ + +// @ts-check + +export default class Placeholder { + className = "wolfree-placeholder"; + + placeholderHTML = ` + <div class="${this.className}"> + <div> + <div> + <div><div></div></div> + <div><div></div></div> + <div><div></div></div> + </div> + </div> + </div> + `; + + insert = ({ + container = document.querySelector( + "html > body > #__next > div > main > main > div:nth-of-type(1)" + ), + } = {}) => { + try { + return ( + container instanceof HTMLDivElement + ? container.insertAdjacentHTML("afterend", this.placeholderHTML) + : console.error({ container }), + { container } + ); + } catch (error) { + return ( + console.error( + { error }, + "Fail to insert the skeleton placeholder components." + ), + { error } + ); + } + }; + + remove = ({ + allPlaceholders = document.querySelectorAll( + `html > body > #__next > div > main > main > div.${this.className}` + ), + } = {}) => { + try { + return ( + console.assert(allPlaceholders.length === 1), + allPlaceholders.forEach((placeholder) => placeholder.remove()), + { allPlaceholders } + ); + } catch (error) { + return ( + console.error( + { error }, + "Fail to remove the skeleton placeholder components." + ), + { error } + ); + } + }; +} diff --git a/docusaurus/static/ajax/libs/wolfree/23.7.8/js/Pods.js b/docusaurus/static/ajax/libs/wolfree/23.7.8/js/Pods.js new file mode 100644 index 0000000..7b31e48 --- /dev/null +++ b/docusaurus/static/ajax/libs/wolfree/23.7.8/js/Pods.js @@ -0,0 +1,56 @@ +/** + * @license + * SPDX-License-Identifier: AGPL-3.0-or-later + * This file is part of Wolfree. + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + */ + +// @ts-check + +export default class Pods { + insert = ({ + container = document.querySelector("main > div:nth-of-type(1)"), + html = String(), + } = {}) => { + try { + /** + * https://www.npmjs.com/package/@types/dompurify + * @type {import('DOMPurify')} + */ + return ( + container instanceof HTMLDivElement + ? container.insertAdjacentHTML( + "afterend", + globalThis.DOMPurify.sanitize(html) + ) + : console.error({ container }), + { container, html } + ); + } catch (error) { + return ( + console.error( + { error }, + "Fail to insert the results of the calculation." + ), + { error } + ); + } + }; + + remove = ({ + pods = document.querySelectorAll("main > div.wolfree-pods"), + } = {}) => { + try { + pods.forEach((element) => { + element.remove(); + }); + return { pods }; + } catch (error) { + console.error( + "Fail to remove the results of the previous calculation.", + error + ); + return { error }; + } + }; +} diff --git a/docusaurus/static/ajax/libs/wolfree/23.7.8/js/PodsParser.js b/docusaurus/static/ajax/libs/wolfree/23.7.8/js/PodsParser.js new file mode 100644 index 0000000..bfb0ab0 --- /dev/null +++ b/docusaurus/static/ajax/libs/wolfree/23.7.8/js/PodsParser.js @@ -0,0 +1,201 @@ +/** + * @license + * SPDX-License-Identifier: AGPL-3.0-or-later + * This file is part of Wolfree. + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + */ + +// @ts-check + +export default class PodsParser { + parse = ({ + input = String(), + i2d = Boolean(), + extraPodstates = Array(), + response = { queryresult: { pods: Array() } }, + } = {}) => { + try { + return { html: this.buildHTML({ input, i2d, extraPodstates, response }) }; + } catch (error) { + return console.error({ error }), { error }; + } + }; + + buildHTML = ({ + input = String(), + i2d = Boolean(), + extraPodstates = Array(), + response = { queryresult: { pods: Array() } }, + } = {}) => { + return ` + <div class="wolfree-pods"> + <div> + <div> + <section> + ${this.parseQueryResult({ response })} + ${this.buildTechnicalInfo({ + input, + i2d, + extraPodstates, + response, + })} + </section> + </div> + </div> + </div> + `; + }; + + parseQueryResult = ({ response = { queryresult: { pods: Array() } } }) => { + const { queryresult } = response; + const { pods } = queryresult; + if (pods) { + return pods.map(this.parsePod).join(""); + } + return ""; + }; + + parsePod = ( + pod = { + title: String(), + states: Array(), + subpods: Array(), + } + ) => { + return ` + <section> + ${this.buildPodHeader(pod)} + <div></div> + ${pod.subpods.map(this.buildSubpod).join("")} + </section> + `; + }; + + buildPodHeader = (pod = { title: String(), states: Array() }) => { + return ` + <div> + <h2>${this.escapeHTML(pod.title)}</h2> + ${pod.states ? pod.states.map(this.buildSelectElement).join("") : ""} + </div> + `; + }; + + buildSubpod = ( + subpod = { img: { src: String(), alt: String() }, plaintext: String() } + ) => { + return ` + <div><div> + <img + src="${this.escapeHTML(subpod.img.src)}" + alt="${this.escapeHTML(subpod.img.alt)}" + > + </div></div> + <div style="font-family: monospace; overflow: auto;"> + <div><div>${this.buildSubpodDetails(subpod)}</div></div> + </div> + `; + }; + + buildSubpodDetails = (subpod = { plaintext: String() }) => { + return ` + <details> + <summary style="direction: rtl;"></summary> + <div><pre>${this.escapeHTML(subpod.plaintext)}</pre></div> + <br> + </details> + `; + }; + + buildSelectElement = (state = { value: String(), states: Array() }) => { + if (state.states) { + return ` + <select name="pod-states"> + <option>${this.escapeHTML(state.value)}</option> + ${state.states.map(this.buildOption).join("")} + </select> + `; + } + return ""; + }; + + buildOption = (state = { name: String() }) => { + return ` + <option>${this.escapeHTML(state.name)}</option> + `; + }; + + buildTechnicalInfo = ({ + input = String(), + i2d = Boolean(), + extraPodstates = Array(), + response = { queryresult: { pods: Array() } }, + }) => { + return ` + <section> + <div><h2>Technical information</h2></div> + <div></div> + <div><div><div>${this.buildTechnicalInfoDetails({ + input, + i2d, + extraPodstates, + response, + })}</div></div></div> + <div></div> + </section> + `; + }; + + buildTechnicalInfoDetails = ({ + input = String(), + i2d = Boolean(), + extraPodstates = Array(), + response = { queryresult: { pods: Array() } }, + }) => { + return ` + <details> + <div> + If you have programming knowledge, feel free to explore the technical information provided below: + </div> + ${this.buildTextarea({ input, i2d, extraPodstates, response })} + </details> + `; + }; + + buildTextarea = ({ + input = String(), + i2d = Boolean(), + extraPodstates = Array(), + response = { queryresult: { pods: Array() } }, + }) => { + return ` + <textarea name="technical-information">${this.escapeHTML( + JSON.stringify( + { + document, + input, + i2d, + extraPodstates, + response, + }, + null, + 4 + ) + )}</textarea> + `; + }; + + escapeHTML = (unsafe = String()) => { + return unsafe + .replace(/&/g, "&") + .replace(/</g, "<") + .replace(/>/g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); + }; +} + +// Can I escape HTML special chars in JavaScript? - Stack Overflow +// https://stackoverflow.com/questions/6234773/can-i-escape-html-special-chars-in-javascript + +// test case: +// https://www.wolframalpha.com/input?i=solve+%7By%27%28x%29+%3D+-2+y%2C+y%280%29%3D1%7D+from+0+to+10+using+r+k+f+algorithm diff --git a/docusaurus/static/ajax/libs/wolfree/23.7.8/js/PostProcessor.js b/docusaurus/static/ajax/libs/wolfree/23.7.8/js/PostProcessor.js new file mode 100644 index 0000000..1061d8a --- /dev/null +++ b/docusaurus/static/ajax/libs/wolfree/23.7.8/js/PostProcessor.js @@ -0,0 +1,63 @@ +/** + * @license + * SPDX-License-Identifier: AGPL-3.0-or-later + * This file is part of Wolfree. + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + */ + +// @ts-check + +import Placeholder from "./Placeholder.js"; +import Entrypoint from "./Entrypoint.js"; + +export default class PostProcessor { + process = ({ input = String(), i2d = Boolean() } = {}) => { + try { + new Placeholder().remove(); + + try { + document + .querySelectorAll( + "html > body > div#__next > div > main > main > div.wolfree-pods > div > div > section > section > div > div > div > details > div" + ) + .forEach((element = new HTMLElement()) => + element.setAttribute("contenteditable", "") + ); + } catch (error) { + console.error( + "Fail to make the plaintext in details tags easy to copy.", + error + ); + } + + try { + document + .querySelectorAll( + "html > body > div#__next > div > main > main > div.wolfree-pods > div > div > section > section > div:is(:first-child) > select" + ) + .forEach((element = new HTMLSelectElement()) => + element.addEventListener( + "change", + async (event = new Event(String())) => + Entrypoint({ + input, + i2d, + extraPodstates: [ + event.target instanceof HTMLSelectElement + ? event.target.value + : (console.error({ event }), String()), + ], + }) + ) + ); + } catch (error) { + console.error( + "Fail to set up the drop-down menu for problem-solving strategies.", + error + ); + } + } catch (error) { + console.error({ error }); + } + }; +} diff --git a/docusaurus/static/ajax/libs/wolfree/23.7.8/js/Preprocessor.js b/docusaurus/static/ajax/libs/wolfree/23.7.8/js/Preprocessor.js new file mode 100644 index 0000000..5d88bbc --- /dev/null +++ b/docusaurus/static/ajax/libs/wolfree/23.7.8/js/Preprocessor.js @@ -0,0 +1,29 @@ +/** + * @license + * SPDX-License-Identifier: AGPL-3.0-or-later + * This file is part of Wolfree. + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + */ + +// @ts-check + +import Placeholder from "./Placeholder.js"; +import Pods from "./Pods.js"; + +export default class Preprocessor { + process = () => { + try { + try { + window.scroll(0, 0); + } catch (error) { + console.error({ error }, "Fail to scroll to the top of the webpage."); + } + + new Placeholder().insert(); + + new Pods().remove(); + } catch (error) { + console.error({ error }); + } + }; +} diff --git a/docusaurus/static/ajax/libs/wolfree/23.7.8/js/Processor.js b/docusaurus/static/ajax/libs/wolfree/23.7.8/js/Processor.js new file mode 100644 index 0000000..eaf9c2a --- /dev/null +++ b/docusaurus/static/ajax/libs/wolfree/23.7.8/js/Processor.js @@ -0,0 +1,54 @@ +/** + * @license + * SPDX-License-Identifier: AGPL-3.0-or-later + * This file is part of Wolfree. + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + */ + +// @ts-check + +import AJAX from "./AJAX.js"; +import PodsParser from "./PodsParser.js"; +import Pods from "./Pods.js"; + +export default class Processor { + process = async ({ + input = String(), + i2d = Boolean(), + extraPodstates = Array(), + } = {}) => { + try { + const { response } = await new AJAX().ajax({ + input, + i2d, + extraPodstates, + }); + + try { + const { html } = new PodsParser().parse({ + input, + i2d, + extraPodstates, + /** @type {any} */ + response, + }); + + try { + new Pods().remove(); + } catch (error) { + console.error(error); + } + + try { + new Pods().insert({ html }); + } catch (error) { + console.error(error); + } + } catch (error) { + console.error(error); + } + } catch (error) { + console.error(error); + } + }; +} diff --git a/docusaurus/static/ajax/libs/wolfree/23.7.8/js/SearchParams.js b/docusaurus/static/ajax/libs/wolfree/23.7.8/js/SearchParams.js new file mode 100644 index 0000000..828d06f --- /dev/null +++ b/docusaurus/static/ajax/libs/wolfree/23.7.8/js/SearchParams.js @@ -0,0 +1,44 @@ +/** + * @license + * SPDX-License-Identifier: AGPL-3.0-or-later + * This file is part of Wolfree. + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + */ + +// @ts-check + +import AppID from "./AppID.js"; + +export default class SearchParams { + constructor({ getAppID = new AppID().getAppID } = {}) { + this.getAppID = getAppID; + } + + getSearchParams = ({ + input = String(), + i2d = Boolean(), + extraPodstates = Array(), + } = {}) => { + const appid = this.getAppID(); + return { + ...(appid && { appid }), + ...(input && { input }), + ...(i2d && { i2d }), + podstate: [ + "Step-by-step solution", + "Step-by-step", + "Show all steps", + ...extraPodstates, + // Note: extraPodstates must be the last item in the array. + // Otherwise, the Wolfram Alpha API may ignore the pod states in extraPodstates. + ], + output: "json", + reinterpret: true, + podtimeout: 30, + scantimeout: 30, + parsetimeout: 30, + totaltimeout: 30, + formattimeout: 30, + }; + }; +} diff --git a/docusaurus/static/ajax/libs/wolfree/23.7.8/js/onload.js b/docusaurus/static/ajax/libs/wolfree/23.7.8/js/onload.js new file mode 100644 index 0000000..5767c4e --- /dev/null +++ b/docusaurus/static/ajax/libs/wolfree/23.7.8/js/onload.js @@ -0,0 +1,51 @@ +/** + * @license + * SPDX-License-Identifier: AGPL-3.0-or-later + * This file is part of Wolfree. + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + */ + +// @ts-check + +export default addEventListener( + "load", + () => ( + setTimeout( + () => + document + .querySelectorAll( + "html > body > #__next > div > main > main > div > div > section > form > div > div > input" + ) + .forEach((input) => + input instanceof HTMLInputElement + ? input.focus() + : console.error({ input }) + ), + 1000 + ), + [ + () => + document + .querySelectorAll( + 'html > body > #__next > div > main > main > div > div > div > section > section > div:is(:first-child) > ul > li' + ) + .forEach( + (li) => + li.innerHTML.includes("Step-by-step") && + (li instanceof HTMLElement + ? (li.style.display = "none") + : console.error({ li })) + ), + () => + (document.title = document.title.replace( + "- Wolfram|Alpha", + "- Free Wolfram|Alpha Step-by-step Solution - Wolfree" + )), + ].forEach( + (callback) => ( + setInterval(callback, 2000), addEventListener("click", callback) + ) + ), + scroll(0, 0) + ) +); |