From 159d371ec6e2f9a0f761f5fc7b1199a9b1676b33 Mon Sep 17 00:00:00 2001 From: Lyanis Souidi Date: Mon, 13 Feb 2023 15:28:20 +0100 Subject: [PATCH] Initial commit --- README.md | 3 ++ _locales/ca/messages.json | 21 +++++++++++++ _locales/cn/messages.json | 21 +++++++++++++ _locales/de/messages.json | 21 +++++++++++++ _locales/en/messages.json | 21 +++++++++++++ _locales/es/messages.json | 21 +++++++++++++ _locales/fr/messages.json | 21 +++++++++++++ _locales/it/messages.json | 21 +++++++++++++ _locales/jp/messages.json | 21 +++++++++++++ _locales/nl/messages.json | 21 +++++++++++++ _locales/si/messages.json | 21 +++++++++++++ icons/128-dark.png | Bin 0 -> 8059 bytes icons/128-light.png | Bin 0 -> 7847 bytes icons/16-dark.png | Bin 0 -> 471 bytes icons/16-light.png | Bin 0 -> 483 bytes icons/32-dark.png | Bin 0 -> 1204 bytes icons/32-light.png | Bin 0 -> 1200 bytes icons/48-dark.png | Bin 0 -> 2128 bytes icons/48-light.png | Bin 0 -> 1987 bytes icons/96-dark.png | Bin 0 -> 5222 bytes icons/96-light.png | Bin 0 -> 5089 bytes index.html | 24 ++++++++++++++ inject.js | 47 ++++++++++++++++++++++++++++ manifest.json | 61 ++++++++++++++++++++++++++++++++++++ script.js | 37 ++++++++++++++++++++++ servers.json | 64 ++++++++++++++++++++++++++++++++++++++ 26 files changed, 446 insertions(+) create mode 100644 README.md create mode 100644 _locales/ca/messages.json create mode 100644 _locales/cn/messages.json create mode 100644 _locales/de/messages.json create mode 100644 _locales/en/messages.json create mode 100644 _locales/es/messages.json create mode 100644 _locales/fr/messages.json create mode 100644 _locales/it/messages.json create mode 100644 _locales/jp/messages.json create mode 100644 _locales/nl/messages.json create mode 100644 _locales/si/messages.json create mode 100644 icons/128-dark.png create mode 100644 icons/128-light.png create mode 100644 icons/16-dark.png create mode 100644 icons/16-light.png create mode 100644 icons/32-dark.png create mode 100644 icons/32-light.png create mode 100644 icons/48-dark.png create mode 100644 icons/48-light.png create mode 100644 icons/96-dark.png create mode 100644 icons/96-light.png create mode 100644 index.html create mode 100644 inject.js create mode 100644 manifest.json create mode 100644 script.js create mode 100644 servers.json diff --git a/README.md b/README.md new file mode 100644 index 0000000..576ead8 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# WIMS Tester + +This extension modifies the [WIMS](https://en.wikipedia.org/wiki/WWW_Interactive_Multipurpose_Server) interface in order to be able to easily launch exercises on another server, this allows them to be tested without being graded. \ No newline at end of file diff --git a/_locales/ca/messages.json b/_locales/ca/messages.json new file mode 100644 index 0000000..75c17aa --- /dev/null +++ b/_locales/ca/messages.json @@ -0,0 +1,21 @@ +{ + "extensionDescription": { + "message": "Aquesta extensió modifica la interfície WIMS per tal de poder llançar fàcilment exercicis en un altre servidor, això permet provar-los sense ser qualificats." + }, + + "openOnServer": { + "message": "Obrir en el servidor " + }, + + "serverSelection": { + "message": "Servidor WIMS:" + }, + + "openCurrentPageOnServer": { + "message": "Obrir la pàgina actual en el servidor " + }, + + "save": { + "message": "Desar" + } +} \ No newline at end of file diff --git a/_locales/cn/messages.json b/_locales/cn/messages.json new file mode 100644 index 0000000..1649215 --- /dev/null +++ b/_locales/cn/messages.json @@ -0,0 +1,21 @@ +{ + "extensionDescription": { + "message": "此扩展修改了 WIMS 界面,以便能够轻松地在另一台服务器上启动练习,这使得它们可以在不评分的情况下进行测试。" + }, + + "openOnServer": { + "message": "在服务器上打开 " + }, + + "serverSelection": { + "message": "WIMS服务器:" + }, + + "openCurrentPageOnServer": { + "message": "在服务器上打开当前页面 " + }, + + "save": { + "message": "保存" + } +} \ No newline at end of file diff --git a/_locales/de/messages.json b/_locales/de/messages.json new file mode 100644 index 0000000..1688ff5 --- /dev/null +++ b/_locales/de/messages.json @@ -0,0 +1,21 @@ +{ + "extensionDescription": { + "message": "Diese Erweiterung modifiziert die WIMS-Schnittstelle, um Aufgaben einfach auf einem anderen Server starten zu können, sodass sie ohne Benotung getestet werden können." + }, + + "openOnServer": { + "message": "Öffnen auf Server " + }, + + "serverSelection": { + "message": "WIMS-Server:" + }, + + "openCurrentPageOnServer": { + "message": "Öffne aktuelle Seite auf Server " + }, + + "save": { + "message": "Speichern" + } +} \ No newline at end of file diff --git a/_locales/en/messages.json b/_locales/en/messages.json new file mode 100644 index 0000000..cccb596 --- /dev/null +++ b/_locales/en/messages.json @@ -0,0 +1,21 @@ +{ + "extensionDescription": { + "message": "This extension modifies the WIMS interface in order to be able to easily launch exercises on another server, this allows them to be tested without being graded." + }, + + "openOnServer": { + "message": "Open on server " + }, + + "serverSelection": { + "message": "WIMS server:" + }, + + "openCurrentPageOnServer": { + "message": "Open current page on server " + }, + + "save": { + "message": "Save" + } +} \ No newline at end of file diff --git a/_locales/es/messages.json b/_locales/es/messages.json new file mode 100644 index 0000000..bf78f52 --- /dev/null +++ b/_locales/es/messages.json @@ -0,0 +1,21 @@ +{ + "extensionDescription": { + "message": "Esta extensión modifica la interfaz de WIMS para poder lanzar ejercicios fácilmente en otro servidor, esto permite que sean evaluados sin ser calificados." + }, + + "openOnServer": { + "message": "Abrir en el servidor " + }, + + "serverSelection": { + "message": "servidor WIMS:" + }, + + "openCurrentPageOnServer": { + "message": "Abrir la página actual en el servidor " + }, + + "save": { + "message": "Guardar" + } +} \ No newline at end of file diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json new file mode 100644 index 0000000..a2b2956 --- /dev/null +++ b/_locales/fr/messages.json @@ -0,0 +1,21 @@ +{ + "extensionDescription": { + "message": "Cette extension modifie l'interface WIMS afin de pouvoir lancer facilement des exercices sur un autre serveur, cela permet de les tester sans être notés." + }, + + "openOnServer": { + "message": "Ouvrir sur le serveur " + }, + + "serverSelection": { + "message": "Serveur WIMS :" + }, + + "openCurrentPageOnServer": { + "message": "Ouvrir la page actuelle sur le serveur " + }, + + "save": { + "message": "Enregistrer" + } +} \ No newline at end of file diff --git a/_locales/it/messages.json b/_locales/it/messages.json new file mode 100644 index 0000000..a760b8e --- /dev/null +++ b/_locales/it/messages.json @@ -0,0 +1,21 @@ +{ + "extensionDescription": { + "message": "Questa estensione modifica l'interfaccia WIMS per poter lanciare facilmente gli esercizi su un altro server, questo permette loro di essere testati senza essere valutati." + }, + + "openOnServer": { + "message": "Apri sul server " + }, + + "serverSelection": { + "message": "Server WIMS:" + }, + + "openCurrentPageOnServer": { + "message": "Apri la pagina attuale sul server " + }, + + "save": { + "message": "Salva" + } +} \ No newline at end of file diff --git a/_locales/jp/messages.json b/_locales/jp/messages.json new file mode 100644 index 0000000..e09b987 --- /dev/null +++ b/_locales/jp/messages.json @@ -0,0 +1,21 @@ +{ + "extensionDescription": { + "message": "この拡張機能は、WIMS インターフェイスを変更して、別のサーバーで演習を簡単に開始できるようにします。これにより、採点せずにテストすることができます。" + }, + + "openOnServer": { + "message": "サーバー上で開く " + }, + + "serverSelection": { + "message": "WIMS サーバー:" + }, + + "openCurrentPageOnServer": { + "message": "サーバー上で現在のページを開く " + }, + + "save": { + "message": "保存する" + } +} diff --git a/_locales/nl/messages.json b/_locales/nl/messages.json new file mode 100644 index 0000000..558d507 --- /dev/null +++ b/_locales/nl/messages.json @@ -0,0 +1,21 @@ +{ + "extensionDescription": { + "message": "Deze extensie past de WIMS-interface aan om oefeningen gemakkelijk op een andere server te kunnen starten, waardoor ze kunnen worden getest zonder dat ze worden beoordeeld." + }, + + "openOnServer": { + "message": "Openen op server " + }, + + "serverSelection": { + "message": "WIMS-server:" + }, + + "openCurrentPageOnServer": { + "message": "Open huidige pagina op server " + }, + + "save": { + "message": "Opslaan" + } +} \ No newline at end of file diff --git a/_locales/si/messages.json b/_locales/si/messages.json new file mode 100644 index 0000000..08d459d --- /dev/null +++ b/_locales/si/messages.json @@ -0,0 +1,21 @@ +{ + "extensionDescription": { + "message": "Toto rozšírenie upravuje rozhranie WIMS, aby bolo možné ľahko spúšťať cvičenia na inom serveri, čo umožňuje ich testovanie bez hodnotenia." + }, + + "openOnServer": { + "message": "Otvoriť na serveri " + }, + + "serverSelection": { + "message": "WIMS server:" + }, + + "openCurrentPageOnServer": { + "message": "Otvoriť aktuálnu stránku na serveri " + }, + + "save": { + "message": "Uložiť" + } +} \ No newline at end of file diff --git a/icons/128-dark.png b/icons/128-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..90dff612acf05f17910d8b37cb9ae1ac4bea2497 GIT binary patch literal 8059 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 Am;e9( literal 0 HcmV?d00001 diff --git a/icons/128-light.png b/icons/128-light.png new file mode 100644 index 0000000000000000000000000000000000000000..26aa2919d00137bf92e8f44d4029c8f9070a52d4 GIT binary patch literal 7847 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 literal 0 HcmV?d00001 diff --git a/icons/16-dark.png b/icons/16-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..b1accfef5da7db13c3fdbf69d5fcdae652a244be GIT binary patch literal 471 zcmV;|0Vw{7P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!T#=FFVmJ?D4MjrhLrkzCB8QeXawCY)gsDN|q>o5)AD210U&6xtB? zQ~-yFVHD920~kggj^L%KB#GbyrDzCI1pVg|nqvznPdLFe8Zm`IbYlkfXu>sK5af3O zr35{w#R|@${iPTCGt~JQE>RBkMn^0Cra%tnP=nx(heQ)}!DzI1{|()0jbVsdQBVK? N002ovPDHLkV1i`y!MOkc literal 0 HcmV?d00001 diff --git a/icons/16-light.png b/icons/16-light.png new file mode 100644 index 0000000000000000000000000000000000000000..9dc7c77100d85a5bd9174c16a9489c3703f3b465 GIT binary patch literal 483 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 literal 0 HcmV?d00001 diff --git a/icons/48-light.png b/icons/48-light.png new file mode 100644 index 0000000000000000000000000000000000000000..60515b2314e96a6c476e633f6dd7eb469394b6c5 GIT binary patch literal 1987 zcmV;!2R!(RP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D00Cl4M?^`71>}4H z00&D+L_t(&L*?0JhnJye1-U)wCAb*9I!`@-4@E>Wn0yBoo!uEmw_waKVZ}DvtIc2aKlfseVw=g8F z2KfE7a6&KxcZIXUC(Yl-Q@HFR;gqmeuo{Pki^Gt#8Zd8oF3c5f3cClhKTFs;EExJN zChFaAYxp6|7H$uWcsnc~ehCB8YQUD^wqTi74zC4Ect`MpFGIh@m}U>gv0LCi8wF#S zBCHZ#2yNw%U)@Upo{BCSkWk|+5xA$EB7Y6*%{3$2*Q)IpC2QM4b25GZ= zyQ8#bAu(`nct7xcfn(sR;SAxK&~GuO)q+&IZqP=Ef#-v`l-jQj12U2oPzN>%HwWe1 z>=dNfDpj3lt2%vEC*9Pcsn^XPpa?b zYTUEvx=I}bxQAv>S=ZEA_L;*M;qzd{v>kMdHh+HIgb~X%@0m@{Neum(){lS3gxPoh~u?e*I&}$WAWghpcliSgS zMp6fgc-9PU5Cr5`!NANu(SmOnG-Lew!62A@RBV_4f6qmp3@-(_mLiiWMFAIyO|LqYJf4Hv=vVKD=|-CL9>V z!CuX4KEH3E+bP(F%Ks|_13Nv?>E{(htEAue4lY55OM<~V2`SPO1FHQxp|>KZ1_jO1 zSL;A|UXfE>WtSr5`PGBjuWnM>J>SuQIx#@1L0`T0;?{&vey8gsqty*b9Rpqua=9L6 zhro3#v->i~Ji+-5-5xcBpM&Teb7AR%xwX|uc&uEha&tu5VLX#VhckZq(_ zg-zEuQ}C?D&b?A6o(}pNlXPZ~Zt1uJqt^~(zrYYWxVHbUN>5^d$k_%}DsHvhyLOLG z#?o~b;Z9bFPSI;^)MPO_%;83h^dtrhLh~iVK;ZeH`;aoZK+y}(@_w%7T&d{R3nqhD zL4jLzTJv_3HzMh_0tUc09k}xA;=?Mas?9|dFS?I{>|(aewsRaaNcUl&lf5*7vXw%o zxY0|i_7>u%NKahon($(<+=|x{fdR(^N0AKkp;FjXY=c`T7_h=crwzX%co*YM%3*;H zVnR*PG#2TJ3+X)dKkza$Zsy$gVYyr8pz{p9+2LYw*uFFZGt5?m?8$Kaie#?>JoH%Au~EAsbhfM)f$0YToOv-Z6Pe|O-=W|fXhogL(Vfh}VR zP&%6;F>p{Q9cj;GxH`~l5ya!x3-SNs!<|7JE!Al!!~wVk_oDO6$$_u)e;b_}0-e>e zsc%=XYD*mhYytiEhCj6K$ z1C%nWY0)Z3o%HV07oqd*YT6x@)G@&F+qm0BNuOLop;EMTp|X=;qmxpd$d&GsAu2bW z`?8VXRdE@okD`O)8WSUsYm3z8g{oos7gG`c0`fuCmg^XpQwQCp0jQ>or1Ojc*dmIR zM*`oc(?e+=v>;+Yi^3Q>(79KQ58wDM7@KzvN$V0i=aeNZx1!}Jqljm9pEAny!OY(i z7)z{7>30lB5p&+@qwbl2a;#!MES}7?b0dksW{LQla*k9)Oi2VpOnIiQ%o)t2k9rBW zm}rs3oFN&LqnUpNe!C!Yq@jw^X@jNCa-1@rVxVSQJrO@v&UTY~brpZ;Xv6ZdTDCFx ziJ&xm2JiTO#C5}i`-eA!7fcik;05YO+l)C}9;TP_77Al7IyFTQ%W`&VjA literal 0 HcmV?d00001 diff --git a/icons/96-dark.png b/icons/96-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..bf2a69526517a7a5610bccb8ab66c6c9fd2486f2 GIT binary patch literal 5222 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 Dg^ + + + + WIMS Tester + + + +

WIMS Tester

+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/inject.js b/inject.js new file mode 100644 index 0000000..f09bd35 --- /dev/null +++ b/inject.js @@ -0,0 +1,47 @@ +function createLink(name, oldURL, newURL) { + let e = document.createElement("a"); + e.className = "_wims_tester_link"; + e.innerText = "[" + browser.i18n.getMessage("openOnServer") + `'${name}']`; + let link = new URL(newURL); + link.search = new URL(oldURL).search; + e.href = link.toString(); + e.target = "_blank"; + return e; +} + +function updateLink(e, name, url) { + e.innerText = "[" + browser.i18n.getMessage("openOnServer") + `'${name}']`; + let link = new URL(url); + link.search = new URL(e.href).search; + e.href = link.toString(); +} + +async function load() { + let serversList = await fetch(browser.runtime.getURL("servers.json")).then((response) => response.json()).then((data) => data["servers"]); + let preferredServer = await browser.storage.sync.get('preferredServer').then(item => item.preferredServer); + if (typeof preferredServer === "undefined" || !preferredServer.hasOwnProperty("url")) preferredServer = serversList[0]; + + let list = document.getElementsByClassName("wims_exo_item"); + for (let item of list) item.firstElementChild.after(createLink(preferredServer.name, item.firstElementChild.href, preferredServer.url)); + + list = document.querySelectorAll('a[target="wims_exo"]'); + for (let item of list) item.after(createLink(preferredServer.name, item.href, preferredServer.url)); + + list = document.querySelectorAll('ul[class="wims_home_result_list"] > li'); + for (let item of list) item.firstElementChild.after(createLink(preferredServer.name, item.firstElementChild.href, preferredServer.url)); +} + +let style = document.createElement('style'); +style.textContent = "._wims_tester_link::before { content: ' '; } ._wims_tester_link { font-size: small; color: black; }"; +document.head.append(style); + +load(); + +browser.storage.sync.onChanged.addListener((changes) => { + const changedItems = Object.keys(changes); + for (const item of changedItems) { + if (item == "preferredServer") { + document.querySelectorAll('a[class="_wims_tester_link"]').forEach(e => updateLink(e, changes[item].newValue.name, changes[item].newValue.url)); + } + } +}); \ No newline at end of file diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..22fcff6 --- /dev/null +++ b/manifest.json @@ -0,0 +1,61 @@ +{ + "manifest_version": 2, + "name": "WIMS Tester", + "author": "Lyanis Souidi", + "version": "1.0", + "browser_specific_settings": { + "gecko": { + "id": "wims-tester@lyanis.sh" + } + }, + "description": "__MSG_extensionDescription__", + "homepage_url": "https://github.com/lyanissouidi/wims-tester", + "default_locale": "en", + "browser_action": { + "default_title": "WIMS Tester", + "default_popup": "index.html", + "browser_style": true, + "default_icon": { + "16": "icons/16-light.png", + "32": "icons/32-light.png", + "48": "icons/48-light.png", + "96": "icons/96-light.png", + "128": "icons/128-light.png" + }, + "theme_icons": [{ + "light": "icons/16-light.png", + "dark": "icons/16-dark.png", + "size": 16 + }, { + "light": "icons/32-light.png", + "dark": "icons/32-dark.png", + "size": 32 + }, { + "light": "icons/48-light.png", + "dark": "icons/48-dark.png", + "size": 48 + }, { + "light": "icons/96-light.png", + "dark": "icons/96-dark.png", + "size": 96 + }, { + "light": "icons/128-light.png", + "dark": "icons/128-dark.png", + "size": 128 + }] + }, + "content_scripts": [ + { + "matches": ["*://*/*wims.cgi*"], + "js": ["inject.js"] + } + ], + "permissions": ["tabs", "storage"], + "icons": { + "16": "icons/16-light.png", + "32": "icons/32-light.png", + "48": "icons/48-light.png", + "96": "icons/96-light.png", + "128": "icons/128-light.png" + } +} \ No newline at end of file diff --git a/script.js b/script.js new file mode 100644 index 0000000..1c45d3f --- /dev/null +++ b/script.js @@ -0,0 +1,37 @@ +document.getElementsByTagName("legend")[0].innerText = browser.i18n.getMessage("serverSelection"); +async function updateLink(name, url) { + let link = new URL(url); + let tabURL = await browser.tabs.query({currentWindow: true, active: true}).then(tabs => tabs[0].url); + link.search = new URL(tabURL).search; + let a = document.getElementsByTagName("a")[0]; + a.href = link.toString(); + a.innerText = browser.i18n.getMessage("openCurrentPageOnServer") + `'${name}'`; +} + +async function load(qualifiedName, value) { + let serversList = await fetch(browser.runtime.getURL("servers.json")).then((response) => response.json()).then((data) => data["servers"]); + let preferredServer = await browser.storage.sync.get('preferredServer').then(item => item.preferredServer); + if (typeof preferredServer === "undefined" || !preferredServer.hasOwnProperty("url")) preferredServer = serversList[0]; + for (let i = 0; i < serversList.length; i++) { + let div = document.createElement("div"); + let input = document.createElement("input"); + input.type = "radio"; + input.id = serversList[i].url; + input.name = "server"; + input.value = serversList[i].name; + if (preferredServer.url === serversList[i].url) input.checked = true; + input.addEventListener("click", saveServer); + div.appendChild(input); + let label = document.createElement("label"); + label.for = serversList[i].name; + label.innerText = serversList[i].name; + div.appendChild(label); + document.getElementById("servers").appendChild(div); + } + updateLink(preferredServer.name, preferredServer.url); +} +load(); +function saveServer(e) { + browser.storage.sync.set({ preferredServer: { name: e.target.value, url: e.target.id } }); + updateLink(e.target.value, e.target.id); +} diff --git a/servers.json b/servers.json new file mode 100644 index 0000000..cf1865a --- /dev/null +++ b/servers.json @@ -0,0 +1,64 @@ +{ + "servers": [ + { + "name": "Université Côte d'Azur", + "url": "https://wims.univ-cotedazur.fr/wims/wims.cgi" + }, + { + "name": "CNRS", + "url": "https://wims.math.cnrs.fr/wims/wims.cgi" + }, + { + "name": "Université Caen Normandie", + "url": "https://wims.unicaen.fr/wims/wims.cgi" + }, + { + "name": "Université Sorbonne Paris Nord", + "url": "https://sercalwims.ig-edu.univ-paris13.fr/wims/wims.cgi" + }, + { + "name": "Université Paris-Saclay", + "url": "https://wimsauto.universite-paris-saclay.fr/wims/wims.cgi" + }, + { + "name": "Aix-Marseille Université", + "url": "https://wims.univ-mrs.fr/wims/wims.cgi" + }, + { + "name": "Université de Picardie", + "url": "https://www.u-picardie.fr/wims/wims.cgi" + }, + { + "name": "Académie de Versailles", + "url": "https://euler-ressources.ac-versailles.fr/wims/wims.cgi" + }, + { + "name": "Université de Nice", + "url": "http://wims.espe-nice-toulon.fr/wims/wims.cgi" + }, + { + "name": "Université Littoral Côte d'Opale", + "url": "http://wims.univ-littoral.fr/wims/wims.cgi" + }, + { + "name": "Lycée polyvalent Diderot Paris", + "url": "http://www.f-lasne.com/wims/wims.cgi" + }, + { + "name": "Università degli Studi di Milano-Bicocca", + "url": "https://wims.matapp.unimib.it/wims/wims.cgi" + }, + { + "name": "Universitat Rovira i Virgili", + "url": "http://wims-deq.urv.cat/wims/wims.cgi" + }, + { + "name": "Xarxa Telemàtica Educativa de Catalunya", + "url": "http://insbaixpenedes.xtec.cat/wims/wims.cgi" + }, + { + "name": "Uniwersytet Mikołaja Kopernika", + "url": "https://cosmo.astro.uni.torun.pl/wims/wims.cgi" + } + ] +} \ No newline at end of file