diff options
Diffstat (limited to 'docusaurus/static/ajax/libs/wolfree/23.7.8/js/PodsParser.js')
-rw-r--r-- | docusaurus/static/ajax/libs/wolfree/23.7.8/js/PodsParser.js | 201 |
1 files changed, 201 insertions, 0 deletions
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 |