diff --git a/extensions/SamuelLouf/Wikipedia.js b/extensions/SamuelLouf/Wikipedia.js new file mode 100644 index 0000000000..47ec2d3452 --- /dev/null +++ b/extensions/SamuelLouf/Wikipedia.js @@ -0,0 +1,310 @@ +// Name: Wikipedia +// ID: samuelloufwikipedia +// Description: Allow you to fetch the content of wikipedia pages. +// By: SamuelLouf +// License: MPL-2.0 + +(function (Scratch) { + "use strict"; + + const icon = + "data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSIxOTkuMjYzMzkiIGhlaWdodD0iMTk5LjA5MTgzIiB2aWV3Qm94PSIwLDAsMTk5LjI2MzM5LDE5OS4wOTE4MyI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE0OS4zNzY4MywtNjguNDQwOTUpIj48ZyBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCI+PHBhdGggZD0iTTE0OS4zNzY4MywyNjcuNTMyNzhjMCwwIDAsLTI3Ljg4Nzk3IDAsLTU0LjgzNjE5YzAsLTE0LjQ3MzQzIDM1LjI3MzgsMjkuNDg0NzUgMzUuNjM5ODUsLTMzLjc2NDA3YzAuNDY2MjksLTgwLjU2OTEgLTM1LjYzOTg1LC0yMi41MDAzNiAtMzUuNjM5ODUsLTMxLjg4ODI5YzAsLTE1LjE2MzIgMCwtMjguNTEyOSAwLC0yOC41MTI5YzAsMCA0Ny41MjAxNSwwIDc4LjE4MTU1LDBjNi41NTQxNiwwIC01My4zMTY1LC00My41NTA0MyAyNC41ODY3NywtNDkuNDIxODdjOTguMzA3NTEsLTcuNDA5MjggMjMuMTQzNTgsNDkuMjA5ODIgMzUuNTY1NjYsNDkuNDIxODdjMTMuMzE2MTEsMC4yMjczMSAxOS40MzcwOSwwIDE5LjQzNzA5LDBjMCwwIDAuMjI3MzEsMjcuNzEzMjIgMCw0My41MTkxNWMtMC4yMDYyNywxNC4zNDMwNiA0NS4wNTQ2NiwtMTIuMTU4MTcgNDEuMjY3MiwzOS4zOTE0MWMtMi42NTk0NiwzNi4xOTY3NyAtNDEuMjY3MiwxOC41NjA0MiAtNDEuMjY3MiwyOC43NjE5OGMwLDE5LjEyMjY0IDAsMzcuMzI4OSAwLDM3LjMyODljMCwwIC03LjgwOTg4LDAgLTQxLjYyMTMsMGMtMTQuMDcyMjMsMCA1OC45ODk2MywtMzIuNzI1NTggLTMyLjUxMzU1LC0zNy41MTU2M2MtNjkuMzIzMTQsMTQuMDYzNjggLTI3LjU2MTM1LDM3LjUxNTYzIC0zNC4zODkzMywzNy41MTU2M2MtMjYuMDE5MzcsMCAtNDkuMjQ2ODksMCAtNDkuMjQ2ODksMHoiIGZpbGw9IiNhYWFhYWEiIHN0cm9rZS13aWR0aD0ibm9uZSIvPjx0ZXh0IHRyYW5zZm9ybT0idHJhbnNsYXRlKDE5Mi4yNzMyNCwyMDkuMTcwMzYpIHNjYWxlKDIuNTI4MzEsMi41MjgzMSkiIGZvbnQtc2l6ZT0iNDAiIHhtbDpzcGFjZT0icHJlc2VydmUiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMSIgZm9udC1mYW1pbHk9IlNlcmlmIiBmb250LXdlaWdodD0ibm9ybWFsIiB0ZXh0LWFuY2hvcj0ic3RhcnQiPjx0c3BhbiB4PSIwIiBkeT0iMCI+VzwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PC9zdmc+PCEtLXJvdGF0aW9uQ2VudGVyOjkwLjYyMzE2NTE2MzU1Njk5OjExMS41NTkwNDgwNDU3MTI2MS0tPg=="; + + const languages_list = [ + { + text: Scratch.translate("English"), + value: "en", + }, + { + text: Scratch.translate("French"), + value: "fr", + }, + { + text: Scratch.translate("Spanish"), + value: "es", + }, + { + text: Scratch.translate("German"), + value: "de", + }, + { + text: Scratch.translate("Italian"), + value: "it", + }, + { + text: Scratch.translate("Portuguese"), + value: "pt", + }, + { + text: Scratch.translate("Russian"), + value: "ru", + }, + { + text: Scratch.translate("Japanese"), + value: "ja", + }, + { + text: Scratch.translate("Chinese"), + value: "zh", + }, + { + text: Scratch.translate("Arabic"), + value: "ar", + }, + { + text: Scratch.translate("Polish"), + value: "pl", + }, + { + text: Scratch.translate("Egypt"), + value: "arz", + }, + { + text: Scratch.translate("Dutch"), + value: "nl", + }, + { + text: Scratch.translate("Vietnamese"), + value: "vi", + }, + { + text: Scratch.translate("Ukrainian"), + value: "uk", + }, + { + text: Scratch.translate("Swedish"), + value: "sv", + }, + { + text: Scratch.translate("Vietnamese"), + value: "vi", + }, + ]; + + const hasOwn = (obj, property) => + Object.prototype.hasOwnProperty.call(obj, property); + + function json_array_filter(key, json) { + json = JSON.stringify(json); + try { + json = JSON.parse(json); + return json.map((x) => { + if (hasOwn(x, key)) { + return x[key]; + } + return null; + }); + } catch (e) { + return null; + } + } + + class Wikipedia { + constructor() { + this.wikipediaLanguages = "en"; + } + + getInfo() { + return { + id: "samuelloufwikipedia", + name: Scratch.translate("Wikipedia"), + color1: "#bcbcbc", + menuIconURI: icon, + blocks: [ + { + opcode: "fetchFirstParagraph", + blockType: Scratch.BlockType.REPORTER, + text: Scratch.translate("first paragraph on [NAME]'s article"), + disableMonitor: true, + arguments: { + NAME: { + type: Scratch.ArgumentType.STRING, + defaultValue: "Scratch (programming language)", + }, + }, + }, + { + opcode: "fetchShortPhrase", + blockType: Scratch.BlockType.REPORTER, + text: Scratch.translate("short phrase about [NAME]"), + disableMonitor: true, + arguments: { + NAME: { + type: Scratch.ArgumentType.STRING, + defaultValue: Scratch.translate( + "Scratch (programming language)" + ), + }, + }, + }, + { + opcode: "getPageURL", + blockType: Scratch.BlockType.REPORTER, + text: Scratch.translate("URL of page [NAME]"), + disableMonitor: true, + arguments: { + NAME: { + type: Scratch.ArgumentType.STRING, + defaultValue: Scratch.translate( + "Scratch (programming language)" + ), + }, + }, + }, + { + opcode: "doesPageExists", + blockType: Scratch.BlockType.BOOLEAN, + text: Scratch.translate("does page [NAME] exists?"), + disableMonitor: true, + arguments: { + NAME: { + type: Scratch.ArgumentType.STRING, + defaultValue: Scratch.translate("Unexistant page"), + }, + }, + }, + "---", + "---", + { + opcode: "addLanguage", + blockType: Scratch.BlockType.COMMAND, + text: Scratch.translate( + "add the language [text] with the id [value]" + ), + arguments: { + text: { + type: Scratch.ArgumentType.STRING, + defaultValue: Scratch.translate("Esperanto"), + }, + value: { + type: Scratch.ArgumentType.STRING, + defaultValue: "eo", + }, + }, + }, + { + opcode: "selectLanguage", + blockType: Scratch.BlockType.COMMAND, + text: Scratch.translate("switch wikipedia to [LANGUAGE]"), + arguments: { + LANGUAGE: { + type: Scratch.ArgumentType.STRING, + menu: "languages", + }, + }, + }, + { + opcode: "getLanguage", + blockType: Scratch.BlockType.REPORTER, + text: Scratch.translate("Wikipedia's language"), + }, + ], + menus: { + languages: { + acceptReporters: false, + items: languages_list, + }, + }, + }; + } + + fetchFirstParagraph(args) { + return Scratch.fetch( + `https://${this.wikipediaLanguages}.wikipedia.org/w/api.php?action=query&prop=extracts&exlimit=1&titles=${encodeURIComponent(args.NAME)}&explaintext=1&exsectionformat=plain&format=json&origin=*` + ) + .then((response) => { + if (response.ok == true) { + return response.json(); + } else { + return ""; + } + }) + .then((data) => { + const pageId = Object.keys(data.query.pages)[0]; + let extract = data.query.pages[pageId].extract; + extract = extract.replace(/\s{2,}/g, " "); + var paragraph = extract.split("\n")[0]; + var split_paragraph = paragraph.split("."); + var result = ""; + for (var i in split_paragraph) { + // @ts-ignore + if (i != split_paragraph.length - 1) { + result = result + split_paragraph[i] + "."; + } + } + return result; + }); + } + + fetchShortPhrase(args) { + return Scratch.fetch( + `https://${this.wikipediaLanguages}.wikipedia.org/w/api.php?action=query&prop=extracts&exlimit=1&titles=${encodeURIComponent(args.NAME)}&explaintext=1&exsectionformat=plain&format=json&origin=*` + ) + .then((response) => { + if (response.ok == true) { + return response.json(); + } else { + return ""; + } + }) + .then((data) => { + const pageId = Object.keys(data.query.pages)[0]; + let extract = data.query.pages[pageId].extract; + extract = extract.replace(/\s{2,}/g, " "); + return extract.split(".").slice(0, 2).join(".") + "."; + }) + .catch((error) => { + return ""; + }); + } + + getPageURL(args) { + return `https://${this.wikipediaLanguages}.wikipedia.org/wiki/${args.NAME.replace(/\s/g, "_")}`; + } + + doesPageExists(args) { + return Scratch.fetch( + `https://${this.wikipediaLanguages}.wikipedia.org/w/api.php?action=query&prop=extracts&exlimit=1&titles=${encodeURIComponent(args.NAME)}&explaintext=1&exsectionformat=plain&format=json&origin=*` + ) + .then((response) => { + if (response.ok == true) { + return response.json(); + } else { + return ""; + } + }) + .then((data) => { + return !!data.query.pages[0]; + }) + .catch((error) => { + return ""; + }); + } + + // --- + // --- + + addLanguage(args) { + languages_list.push(args); + Scratch.vm.extensionManager.refreshBlocks(); + } + + selectLanguage(args) { + this.wikipediaLanguages = args.LANGUAGE; + } + + getLanguage(args) { + try { + return json_array_filter("text", languages_list)[ + json_array_filter("value", languages_list).indexOf( + this.wikipediaLanguages + ) + ]; + } catch { + return ""; + } + } + } + Scratch.extensions.register(new Wikipedia()); + // @ts-ignore +})(Scratch); diff --git a/extensions/extensions.json b/extensions/extensions.json index d8ed71e33d..fc061fd990 100644 --- a/extensions/extensions.json +++ b/extensions/extensions.json @@ -97,5 +97,6 @@ "itchio", "gamejolt", "obviousAlexC/newgroundsIO", + "SamuelLouf/Wikipedia", "Lily/McUtils" // McUtils should always be the last item. ] diff --git a/images/SamuelLouf/Wikipedia.svg b/images/SamuelLouf/Wikipedia.svg new file mode 100644 index 0000000000..bf5fb5015f --- /dev/null +++ b/images/SamuelLouf/Wikipedia.svg @@ -0,0 +1 @@ + \ No newline at end of file