From 47b239ae54dbbf7e5ca71a1e98d997c1d3594c88 Mon Sep 17 00:00:00 2001 From: yoannchb-pro <71560747+yoannchb-pro@users.noreply.github.com> Date: Mon, 19 Jun 2023 22:08:27 -0400 Subject: [PATCH 01/35] v1.0.3 --- CHANGELOG.md | 4 + README.md | 19 +- TODO.md | 1 + extension/MoodleGPT.js | 34 +- extension/MoodleGPT.js.map | 2 +- extension/manifest.json | 4 +- extension/popup/index.html | 4 - extension/popup/js/index.js | 4 +- extension/popup/js/version.js | 2 +- package.json | 2 +- src/core/code-listener.ts | 4 +- ...rmalize-question.ts => create-question.ts} | 62 +-- src/core/questions/contenteditable.ts | 2 +- src/core/questions/select.ts | 4 +- src/core/reply.ts | 6 +- src/types/config.d.ts | 1 - src/utils/html-table-to-string.ts | 7 +- src/utils/normalize-text.ts | 3 +- test/{ => fake-moodle}/css/style.css | 134 ++--- test/{ => fake-moodle}/index.html | 522 +++++++++--------- .../reset-moodle-inputs}/reset.js | 43 +- .../banner.png => webstore-assets/banner1.png | Bin .../icon-128x128.png | Bin 23 files changed, 432 insertions(+), 432 deletions(-) rename src/core/{normalize-question.ts => create-question.ts} (54%) rename test/{ => fake-moodle}/css/style.css (88%) rename test/{ => fake-moodle}/index.html (96%) rename {reset-moodle-inputs => test/reset-moodle-inputs}/reset.js (90%) rename extension/banner.png => webstore-assets/banner1.png (100%) rename extension/128x128.png => webstore-assets/icon-128x128.png (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 96fa5d9..ac5d083 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # CHANGELOG +## v1.0.3 + +- Removed the option `table formating` because it will now set to true by default + ## v1.0.2 - Added `mode` diff --git a/README.md b/README.md index 5caa984..8d28051 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ href="https://www.flaticon.com/free-icons/mortarboard" target="_blank" rel="noopener noreferrer" title="Mortarboard icons created by itim2101 - Flaticon" >Mortarboard icons created by itim2101 - Flaticon

-# MoodleGPT v1.0.2 +# MoodleGPT v1.0.3 This extension allows you to hide CHAT-GPT in a Moodle quiz. You just need to enter the code configured in the extension on the keyboard and then click on the question you want to solve, and CHAT-GPT will automatically provide the answer. However, one needs to be careful because as we know, CHAT-GPT can make errors especially in calculations. @@ -12,7 +12,7 @@ I'm actually waiting for a review of my extension. It should be available in som ## Summary -- [MoodleGPT v1.0.2](#moodlegpt-v102) +- [MoodleGPT v1.0.3](#moodlegpt-v103) - [Chrome Webstore](#chrome-webstore) - [Summary](#summary) - [Disclaimer !](#disclaimer-) @@ -24,6 +24,8 @@ I'm actually waiting for a review of my extension. It should be available in som - [Remove injection](#remove-injection) - [Mode](#mode) - [Settings](#settings) + - [Internal Features](#internal-features) + - [Support table](#support-table) - [Supported questions type](#supported-questions-type) - [Select](#select) - [Put in order question](#put-in-order-question) @@ -101,7 +103,14 @@ Type back the code on the keyboard and the code will be removed from the - Mouseover effect: you will need to hover (or click for select) the question response to complete it automaticaly.
![Mouseover](./assets/mouseover.gif)
![Mouseover2](./assets/mouseover2.gif) -- Table formatting: format table from the question to make it more readable for CHAT-GPT but cost more tokens (so if the question is too large it will make an error). Example of formatted table: + +- Infinite try: click as much as you want on the question (don't forget to reset the question). + +## Internal Features + +### Support table + +Table are formated from the question to make it more readable for CHAT-GPT. Example of formatted table output: ``` | id | name | birthDate | cars | @@ -110,8 +119,6 @@ Type back the code on the keyboard and the code will be removed from the | Person 2 | Yann | 19/01/2000 | no | ``` -- Infinite try: click as much as you want on the question (don't forget to reset the question). - ## Supported questions type ### Select @@ -154,4 +161,4 @@ To know if the answer has been copied to the clipboard, you can look at the titl ## Test -To test the code, you can run the index.html file located in the "test" folder. Or a better solution is to install moodle locally. +To test the code, you can run the index.html file located in the "test/fake-moodle" folder. Or a better solution is to install moodle locally. diff --git a/TODO.md b/TODO.md index 73467d0..0a69238 100644 --- a/TODO.md +++ b/TODO.md @@ -4,6 +4,7 @@ - [ ] Fixe `normalizeText` (line break are sometimes removed for nothing e.g: checkbox) - [ ] Support math equation from image stocked in the `data-mathml` attribute +- [ ] Increment question when there is statement ## Priority: 3 (because hard to make) diff --git a/extension/MoodleGPT.js b/extension/MoodleGPT.js index f8f8b99..1ab2d3f 100644 --- a/extension/MoodleGPT.js +++ b/extension/MoodleGPT.js @@ -61,7 +61,8 @@ */ function normalizeText(text) { return text - .replace(/(\n\s*)+/gi, "\n") + .replace(/\n+/gi, "\n") + .replace(/(\n\s*\n)+/g, "\n") //remove useless white sapce from textcontent .replace(/[ \t]+/gi, " ") .toLowerCase() .trim() @@ -124,8 +125,7 @@ const lineSeparationSize = maxColumnsLength.reduce((a, b) => a + b) + tab[0].length * 3 + 1; const lineSeparation = "\n" + Array(lineSeparationSize).fill("-").join("") + "\n"; const mappedTab = tab.map((line) => { - const mappedLine = line.map((content, index) => content.padEnd(maxColumnsLength[index], "\u00A0") //for no matching with \s - ); + const mappedLine = line.map((content, index) => content.padEnd(maxColumnsLength[index], "\u00A0" /* For no matching with \s */)); return "| " + mappedLine.join(" | ") + " |"; }); const head = mappedTab.shift(); @@ -138,14 +138,12 @@ * @param question * @returns */ - function normalizeQuestion(config, questionContainer) { - let question = questionContainer.textContent; - if (config.table) { - //make table more readable for chat-gpt - const tables = questionContainer.querySelectorAll(".qtext table"); - for (const table of tables) { - question = question.replace(table.textContent, "\n" + htmlTableToString(table) + "\n"); - } + function createQuestion(config, questionContainer) { + let question = questionContainer.innerText; + /* Make tables more readable for chat-gpt */ + const tables = questionContainer.querySelectorAll(".qtext table"); + for (const table of tables) { + question = question.replace(table.innerText, "\n" + htmlTableToString(table) + "\n"); } const finalQuestion = `Give a short response as possible for this question, reply in the following question langage and only show the result: ${question} @@ -202,7 +200,7 @@ for (const option of options) { const content = normalizeText(option.textContent); const valide = correct[j].includes(content); - //if it's a put in order + /* Handle put in order question */ if (!isNaN(parseInt(content))) { const content = normalizeText(option.parentNode .closest("tr") @@ -225,7 +223,7 @@ break; } } - //end put in order + /* End */ if (config.logs) Logs.responseTry(content, valide); if (valide) { @@ -337,7 +335,7 @@ return; event.preventDefault(); input.textContent = response.slice(0, ++index); - //put the cursor at the end + /* Put the cursor at the end of the typed text */ input.focus(); const range = document.createRange(); range.selectNodeContents(input); @@ -362,12 +360,10 @@ * @returns */ function reply(config, hiddenButton, form, query) { - var _a; return __awaiter(this, void 0, void 0, function* () { if (config.cursor) hiddenButton.style.cursor = "wait"; - (_a = form.querySelector(".accesshide")) === null || _a === void 0 ? void 0 : _a.remove(); - const question = normalizeQuestion(config, form); + const question = createQuestion(config, form); const inputList = form.querySelectorAll(query); const response = yield getChatGPTResponse(config, question).catch((error) => ({ error, @@ -436,7 +432,7 @@ * @returns */ function setUpMoodleGpt(config) { - //removing events + /* Removing events */ if (listeners.length > 0) { for (const listener of listeners) { if (config.cursor) @@ -448,7 +444,7 @@ listeners.length = 0; return; } - //injection + /* Code injection */ const inputQuery = ["checkbox", "radio", "text", "number"] .map((e) => `input[type="${e}"]`) .join(","); diff --git a/extension/MoodleGPT.js.map b/extension/MoodleGPT.js.map index 6ee6e3a..1d03499 100644 --- a/extension/MoodleGPT.js.map +++ b/extension/MoodleGPT.js.map @@ -1 +1 @@ -{"version":3,"file":"MoodleGPT.js","sources":["../src/utils/title-indications.ts","../node_modules/tslib/tslib.es6.js","../src/utils/logs.ts","../src/utils/normalize-text.ts","../src/core/get-response.ts","../src/utils/html-table-to-string.ts","../src/core/normalize-question.ts","../src/core/questions/radio-checkbox.ts","../src/core/questions/select.ts","../src/core/questions/textbox.ts","../src/core/questions/clipboard.ts","../src/core/questions/number.ts","../src/core/questions/contenteditable.ts","../src/core/reply.ts","../src/core/code-listener.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Show some informations into the document title and remove it after 3000ms\r\n * @param text\r\n */\r\nfunction titleIndications(text: string) {\r\n const backTitle = document.title;\r\n document.title = text;\r\n setTimeout(() => (document.title = backTitle), 3000);\r\n}\r\n\r\nexport default titleIndications;\r\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.push(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.push(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","class Logs {\r\n static question(text: string) {\r\n const css = \"color: cyan\";\r\n console.log(\"%c[QUESTION]: %s\", css, text);\r\n }\r\n\r\n static responseTry(text: string, valide: boolean) {\r\n const css = \"color: \" + (valide ? \"green\" : \"red\");\r\n console.log(\"%c[CHECKING]: %s\", css, text);\r\n }\r\n\r\n static array(arr: unknown[]) {\r\n console.log(\"[CORRECTS] \", arr);\r\n }\r\n\r\n static response(text: string) {\r\n console.log(text);\r\n }\r\n}\r\n\r\nexport default Logs;\r\n","/**\r\n * Normlize text\r\n * @param text\r\n */\r\nfunction normalizeText(text: string) {\r\n return text\r\n .replace(/(\\n\\s*)+/gi, \"\\n\")\r\n .replace(/[ \\t]+/gi, \" \")\r\n .toLowerCase()\r\n .trim()\r\n .replace(/^[a-z\\d]\\.\\s/gi, \"\") //a. text, b. text, c. text, 1. text, 2. text, 3.text\r\n .replace(/\\n[a-z\\d]\\.\\s/gi, \"\\n\"); //same but with new line\r\n}\r\n\r\nexport default normalizeText;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\n\r\n/**\r\n * Get the response from chatGPT api\r\n * @param config\r\n * @param question\r\n * @returns\r\n */\r\nasync function getChatGPTResponse(\r\n config: Config,\r\n question: string\r\n): Promise {\r\n const controller = new AbortController();\r\n const timeoutControler = setTimeout(() => controller.abort(), 10000);\r\n const req = await fetch(\"https://api.openai.com/v1/chat/completions\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${config.apiKey}`,\r\n },\r\n signal: config.timeout ? controller.signal : null,\r\n body: JSON.stringify({\r\n model: config.model,\r\n messages: [{ role: \"user\", content: question }],\r\n temperature: 0.8,\r\n top_p: 1.0,\r\n presence_penalty: 1.0,\r\n stop: null,\r\n }),\r\n });\r\n clearTimeout(timeoutControler);\r\n const rep = await req.json();\r\n const response = rep.choices[0].message.content;\r\n return normalizeText(response);\r\n}\r\n\r\nexport default getChatGPTResponse;\r\n","/**\r\n * Convert table to representating string table\r\n * @param table\r\n * @returns\r\n */\r\nfunction htmlTableToString(table: HTMLTableElement) {\r\n const tab: string[][] = [];\r\n const lines = Array.from(table.querySelectorAll(\"tr\"));\r\n const maxColumnsLength: number[] = [];\r\n lines.map((line) => {\r\n const cells = Array.from(line.querySelectorAll(\"td, th\"));\r\n const cellsContent = cells.map((cell, index) => {\r\n const content = cell.textContent?.trim();\r\n maxColumnsLength[index] = Math.max(\r\n maxColumnsLength[index] || 0,\r\n content.length || 0\r\n );\r\n return content;\r\n });\r\n tab.push(cellsContent);\r\n });\r\n\r\n const lineSeparationSize =\r\n maxColumnsLength.reduce((a, b) => a + b) + tab[0].length * 3 + 1;\r\n const lineSeparation =\r\n \"\\n\" + Array(lineSeparationSize).fill(\"-\").join(\"\") + \"\\n\";\r\n\r\n const mappedTab = tab.map((line) => {\r\n const mappedLine = line.map(\r\n (content, index) => content.padEnd(maxColumnsLength[index], \"\\u00A0\") //for no matching with \\s\r\n );\r\n return \"| \" + mappedLine.join(\" | \") + \" |\";\r\n });\r\n const head = mappedTab.shift();\r\n return head + lineSeparation + mappedTab.join(\"\\n\");\r\n}\r\n\r\nexport default htmlTableToString;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\nimport htmlTableToString from \"../utils/html-table-to-string\";\r\n\r\n/**\r\n * Normalize the question and add sub informations\r\n * @param langage\r\n * @param question\r\n * @returns\r\n */\r\nfunction normalizeQuestion(config: Config, questionContainer: HTMLElement) {\r\n let question = questionContainer.textContent;\r\n\r\n if (config.table) {\r\n //make table more readable for chat-gpt\r\n const tables: NodeListOf =\r\n questionContainer.querySelectorAll(\".qtext table\");\r\n for (const table of tables) {\r\n question = question.replace(\r\n table.textContent,\r\n \"\\n\" + htmlTableToString(table) + \"\\n\"\r\n );\r\n }\r\n }\r\n\r\n const finalQuestion = `Give a short response as possible for this question, reply in the following question langage and only show the result: \r\n ${question} \r\n (If you have to choose between multiple results only show the corrects one, separate them with new line and take the same text as the question)`;\r\n return normalizeText(finalQuestion);\r\n}\r\n\r\nexport default normalizeQuestion;\r\n","import Config from \"../../types/config\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle checkbox and input elements\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n */\r\nfunction handleRadioAndCheckbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList?.[0] as HTMLInputElement;\r\n\r\n if (!input || (input.type !== \"checkbox\" && input.type !== \"radio\"))\r\n return false;\r\n\r\n for (const input of inputList as NodeListOf) {\r\n const content = normalizeText(input.parentNode.textContent);\r\n const valide = response.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n if (valide) {\r\n if (config.mouseover) {\r\n input.addEventListener(\"mouseover\", () => (input.checked = true), {\r\n once: true,\r\n });\r\n } else {\r\n input.checked = true;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport default handleRadioAndCheckbox;\r\n","import Config from \"../../types/config\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle select elements (and put in order select)\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @returns\r\n */\r\nfunction handleSelect(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n if (inputList.length === 0 || inputList[0].tagName !== \"SELECT\") return false;\r\n\r\n let correct = response.split(\"\\n\");\r\n if (correct.length === 1 && correct.length !== inputList.length)\r\n correct = response.split(\",\");\r\n\r\n if (config.logs) Logs.array(correct);\r\n\r\n for (let j = 0; j < inputList.length; ++j) {\r\n const options = inputList[j].querySelectorAll(\"option\");\r\n\r\n for (const option of options) {\r\n const content = normalizeText(option.textContent);\r\n const valide = correct[j].includes(content);\r\n\r\n //if it's a put in order\r\n if (!isNaN(parseInt(content))) {\r\n const content = normalizeText(\r\n (option.parentNode as HTMLElement)\r\n .closest(\"tr\")\r\n .querySelector(\".text\").textContent\r\n );\r\n const index = correct.findIndex((c) => {\r\n const valide = c.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n return valide;\r\n });\r\n if (index !== -1) {\r\n if (config.mouseover) {\r\n options[index + 1].closest(\"select\").addEventListener(\r\n \"click\",\r\n function () {\r\n options[index + 1].selected = \"selected\" as any;\r\n },\r\n { once: true }\r\n );\r\n } else {\r\n options[index + 1].selected = \"selected\" as any;\r\n }\r\n break;\r\n }\r\n }\r\n //end put in order\r\n\r\n if (config.logs) Logs.responseTry(content, valide);\r\n\r\n if (valide) {\r\n if (config.mouseover) {\r\n option\r\n .closest(\"select\")\r\n .addEventListener(\"click\", () => (option.selected = true), {\r\n once: true,\r\n });\r\n } else {\r\n option.selected = true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleSelect;\r\n","import Config from \"../../types/config\";\r\n\r\n/**\r\n * Handle textbox\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @returns\r\n */\r\nfunction handleTextbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n (input.tagName !== \"TEXTAREA\" && input.type !== \"text\")\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = response.length + 1;\r\n if (index > response.length) return;\r\n event.preventDefault();\r\n input.value = response.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleTextbox;\r\n","import Config from \"../../types/config\";\r\nimport titleIndications from \"../../utils/title-indications\";\r\n\r\n/**\r\n * Copy the response in the clipboard if we can automaticaly fill the question\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @param force Force the copy to clipboard\r\n * @returns\r\n */\r\nfunction handleClipboard(config: Config, response: string) {\r\n if (config.title) titleIndications(\"Copied to clipboard\");\r\n navigator.clipboard.writeText(response);\r\n}\r\n\r\nexport default handleClipboard;\r\n","import Config from \"../../types/config\";\r\n\r\n/**\r\n * Handle number input\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @returns\r\n */\r\nfunction handleNumber(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (inputList.length !== 1 || input.type !== \"number\") return false;\r\n\r\n const number = response.match(/\\d+([,\\.]\\d+)?/gi)?.[0]?.replace(\",\", \".\");\r\n\r\n if (!number) return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = number.length + 1;\r\n if (index > number.length) return;\r\n event.preventDefault();\r\n if (number.slice(index, index + 1) === \".\") ++index;\r\n input.value = number.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = number;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleNumber;\r\n","import Config from \"../../types/config\";\r\n\r\nfunction handleContentEditable(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList[0];\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n input.getAttribute(\"contenteditable\") !== \"true\"\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = response.length + 1;\r\n if (index > response.length) return;\r\n event.preventDefault();\r\n input.textContent = response.slice(0, ++index);\r\n\r\n //put the cursor at the end\r\n input.focus();\r\n const range = document.createRange();\r\n range.selectNodeContents(input);\r\n range.collapse(false);\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n });\r\n } else {\r\n input.textContent = response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleContentEditable;\r\n","import Config from \"../types/config\";\r\nimport Logs from \"../utils/logs\";\r\nimport getChatGPTResponse from \"./get-response\";\r\nimport normalizeQuestion from \"./normalize-question\";\r\nimport handleRadioAndCheckbox from \"./questions/radio-checkbox\";\r\nimport handleSelect from \"./questions/select\";\r\nimport handleTextbox from \"./questions/textbox\";\r\nimport handleClipboard from \"./questions/clipboard\";\r\nimport handleNumber from \"./questions/number\";\r\nimport handleContentEditable from \"./questions/contenteditable\";\r\n\r\n/**\r\n * Reply to the question\r\n * @param config\r\n * @param hiddenButton\r\n * @param form\r\n * @param query\r\n * @returns\r\n */\r\nasync function reply(\r\n config: Config,\r\n hiddenButton: HTMLElement,\r\n form: HTMLElement,\r\n query: string\r\n) {\r\n if (config.cursor) hiddenButton.style.cursor = \"wait\";\r\n\r\n form.querySelector(\".accesshide\")?.remove();\r\n\r\n const question = normalizeQuestion(config, form);\r\n const inputList: NodeListOf = form.querySelectorAll(query);\r\n\r\n const response = await getChatGPTResponse(config, question).catch(\r\n (error) => ({\r\n error,\r\n })\r\n );\r\n\r\n if (config.cursor)\r\n hiddenButton.style.cursor = config.infinite ? \"pointer\" : \"initial\";\r\n\r\n if (typeof response === \"object\" && \"error\" in response) {\r\n console.error(response.error);\r\n return;\r\n }\r\n\r\n if (config.logs) {\r\n Logs.question(question);\r\n Logs.response(response);\r\n }\r\n\r\n if (config.mode === \"clipboard\") {\r\n return handleClipboard(config, response);\r\n }\r\n\r\n if (config.mode === \"question-to-answer\") {\r\n const questionBackup = form.textContent;\r\n const questionContainer = form.querySelector(\".qtext\");\r\n questionContainer.textContent = response;\r\n questionContainer.addEventListener(\"click\", function () {\r\n questionContainer.textContent =\r\n questionContainer.textContent === questionBackup\r\n ? response\r\n : questionBackup;\r\n });\r\n return;\r\n }\r\n\r\n const handlers = [\r\n handleContentEditable,\r\n handleTextbox,\r\n handleNumber,\r\n handleSelect,\r\n handleRadioAndCheckbox,\r\n ];\r\n\r\n for (const handler of handlers) {\r\n if (handler(config, inputList, response)) return;\r\n }\r\n\r\n /** In the case we can't auto complete the question */\r\n handleClipboard(config, response);\r\n}\r\n\r\nexport default reply;\r\n","import Config from \"../types/config\";\r\nimport titleIndications from \"../utils/title-indications\";\r\nimport reply from \"./reply\";\r\n\r\nconst pressedKeys: string[] = [];\r\nconst listeners: {\r\n element: HTMLElement;\r\n fn: (this: HTMLElement, ev: MouseEvent) => any;\r\n}[] = [];\r\n\r\n/**\r\n * Create a listener on the keyboard to inject the code\r\n * @param config\r\n */\r\nfunction codeListener(config: Config) {\r\n document.body.addEventListener(\"keydown\", function (event) {\r\n pressedKeys.push(event.key);\r\n if (pressedKeys.length > config.code.length) pressedKeys.shift();\r\n if (pressedKeys.join(\"\") === config.code) {\r\n pressedKeys.length = 0;\r\n setUpMoodleGpt(config);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Setup moodleGPT into the page (remove/injection)\r\n * @param config\r\n * @returns\r\n */\r\nfunction setUpMoodleGpt(config: Config) {\r\n //removing events\r\n if (listeners.length > 0) {\r\n for (const listener of listeners) {\r\n if (config.cursor) listener.element.style.cursor = \"initial\";\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n if (config.title) titleIndications(\"Removed\");\r\n listeners.length = 0;\r\n return;\r\n }\r\n\r\n //injection\r\n const inputQuery = [\"checkbox\", \"radio\", \"text\", \"number\"]\r\n .map((e) => `input[type=\"${e}\"]`)\r\n .join(\",\");\r\n const query = inputQuery + \", textarea, select, [contenteditable]\";\r\n const forms = Array.from(document.querySelectorAll(\".formulation\"));\r\n\r\n for (const form of forms) {\r\n const hiddenButton: HTMLElement = form.querySelector(\".qtext\");\r\n\r\n if (config.cursor) hiddenButton.style.cursor = \"pointer\";\r\n const fn = reply.bind(null, config, hiddenButton, form, query);\r\n listeners.push({ element: hiddenButton, fn });\r\n hiddenButton.addEventListener(\"click\", fn, { once: !config.infinite });\r\n }\r\n\r\n if (config.title) titleIndications(\"Injected\");\r\n}\r\n\r\nexport default codeListener;\r\n","import codeListener from \"./core/code-listener\";\r\n\r\nchrome.storage.sync.get([\"moodleGPT\"]).then(function (storage) {\r\n const config = storage.moodleGPT;\r\n\r\n if (!config) throw new Error(\"Please configure MoodleGPT into the extension\");\r\n\r\n codeListener(config);\r\n});\r\n"],"names":[],"mappings":"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","x_google_ignoreList":[1]} \ No newline at end of file +{"version":3,"file":"MoodleGPT.js","sources":["../src/utils/title-indications.ts","../node_modules/tslib/tslib.es6.js","../src/utils/logs.ts","../src/utils/normalize-text.ts","../src/core/get-response.ts","../src/utils/html-table-to-string.ts","../src/core/create-question.ts","../src/core/questions/radio-checkbox.ts","../src/core/questions/select.ts","../src/core/questions/textbox.ts","../src/core/questions/clipboard.ts","../src/core/questions/number.ts","../src/core/questions/contenteditable.ts","../src/core/reply.ts","../src/core/code-listener.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Show some informations into the document title and remove it after 3000ms\r\n * @param text\r\n */\r\nfunction titleIndications(text: string) {\r\n const backTitle = document.title;\r\n document.title = text;\r\n setTimeout(() => (document.title = backTitle), 3000);\r\n}\r\n\r\nexport default titleIndications;\r\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.push(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.push(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","class Logs {\r\n static question(text: string) {\r\n const css = \"color: cyan\";\r\n console.log(\"%c[QUESTION]: %s\", css, text);\r\n }\r\n\r\n static responseTry(text: string, valide: boolean) {\r\n const css = \"color: \" + (valide ? \"green\" : \"red\");\r\n console.log(\"%c[CHECKING]: %s\", css, text);\r\n }\r\n\r\n static array(arr: unknown[]) {\r\n console.log(\"[CORRECTS] \", arr);\r\n }\r\n\r\n static response(text: string) {\r\n console.log(text);\r\n }\r\n}\r\n\r\nexport default Logs;\r\n","/**\r\n * Normlize text\r\n * @param text\r\n */\r\nfunction normalizeText(text: string) {\r\n return text\r\n .replace(/\\n+/gi, \"\\n\")\r\n .replace(/(\\n\\s*\\n)+/g, \"\\n\") //remove useless white sapce from textcontent\r\n .replace(/[ \\t]+/gi, \" \")\r\n .toLowerCase()\r\n .trim()\r\n .replace(/^[a-z\\d]\\.\\s/gi, \"\") //a. text, b. text, c. text, 1. text, 2. text, 3.text\r\n .replace(/\\n[a-z\\d]\\.\\s/gi, \"\\n\"); //same but with new line\r\n}\r\n\r\nexport default normalizeText;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\n\r\n/**\r\n * Get the response from chatGPT api\r\n * @param config\r\n * @param question\r\n * @returns\r\n */\r\nasync function getChatGPTResponse(\r\n config: Config,\r\n question: string\r\n): Promise {\r\n const controller = new AbortController();\r\n const timeoutControler = setTimeout(() => controller.abort(), 10000);\r\n const req = await fetch(\"https://api.openai.com/v1/chat/completions\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${config.apiKey}`,\r\n },\r\n signal: config.timeout ? controller.signal : null,\r\n body: JSON.stringify({\r\n model: config.model,\r\n messages: [{ role: \"user\", content: question }],\r\n temperature: 0.8,\r\n top_p: 1.0,\r\n presence_penalty: 1.0,\r\n stop: null,\r\n }),\r\n });\r\n clearTimeout(timeoutControler);\r\n const rep = await req.json();\r\n const response = rep.choices[0].message.content;\r\n return normalizeText(response);\r\n}\r\n\r\nexport default getChatGPTResponse;\r\n","/**\r\n * Convert table to representating string table\r\n * @param table\r\n * @returns\r\n */\r\nfunction htmlTableToString(table: HTMLTableElement) {\r\n const tab: string[][] = [];\r\n const lines = Array.from(table.querySelectorAll(\"tr\"));\r\n const maxColumnsLength: number[] = [];\r\n lines.map((line) => {\r\n const cells = Array.from(line.querySelectorAll(\"td, th\"));\r\n const cellsContent = cells.map((cell, index) => {\r\n const content = cell.textContent?.trim();\r\n maxColumnsLength[index] = Math.max(\r\n maxColumnsLength[index] || 0,\r\n content.length || 0\r\n );\r\n return content;\r\n });\r\n tab.push(cellsContent);\r\n });\r\n\r\n const lineSeparationSize =\r\n maxColumnsLength.reduce((a, b) => a + b) + tab[0].length * 3 + 1;\r\n const lineSeparation =\r\n \"\\n\" + Array(lineSeparationSize).fill(\"-\").join(\"\") + \"\\n\";\r\n\r\n const mappedTab = tab.map((line) => {\r\n const mappedLine = line.map((content, index) =>\r\n content.padEnd(\r\n maxColumnsLength[index],\r\n \"\\u00A0\" /* For no matching with \\s */\r\n )\r\n );\r\n return \"| \" + mappedLine.join(\" | \") + \" |\";\r\n });\r\n const head = mappedTab.shift();\r\n return head + lineSeparation + mappedTab.join(\"\\n\");\r\n}\r\n\r\nexport default htmlTableToString;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\nimport htmlTableToString from \"../utils/html-table-to-string\";\r\n\r\n/**\r\n * Normalize the question and add sub informations\r\n * @param langage\r\n * @param question\r\n * @returns\r\n */\r\nfunction createQuestion(config: Config, questionContainer: HTMLElement) {\r\n let question = questionContainer.innerText;\r\n\r\n /* Make tables more readable for chat-gpt */\r\n const tables: NodeListOf =\r\n questionContainer.querySelectorAll(\".qtext table\");\r\n for (const table of tables) {\r\n question = question.replace(\r\n table.innerText,\r\n \"\\n\" + htmlTableToString(table) + \"\\n\"\r\n );\r\n }\r\n\r\n const finalQuestion = `Give a short response as possible for this question, reply in the following question langage and only show the result: \r\n ${question} \r\n (If you have to choose between multiple results only show the corrects one, separate them with new line and take the same text as the question)`;\r\n return normalizeText(finalQuestion);\r\n}\r\n\r\nexport default createQuestion;\r\n","import Config from \"../../types/config\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle checkbox and input elements\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n */\r\nfunction handleRadioAndCheckbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList?.[0] as HTMLInputElement;\r\n\r\n if (!input || (input.type !== \"checkbox\" && input.type !== \"radio\"))\r\n return false;\r\n\r\n for (const input of inputList as NodeListOf) {\r\n const content = normalizeText(input.parentNode.textContent);\r\n const valide = response.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n if (valide) {\r\n if (config.mouseover) {\r\n input.addEventListener(\"mouseover\", () => (input.checked = true), {\r\n once: true,\r\n });\r\n } else {\r\n input.checked = true;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport default handleRadioAndCheckbox;\r\n","import Config from \"../../types/config\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle select elements (and put in order select)\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @returns\r\n */\r\nfunction handleSelect(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n if (inputList.length === 0 || inputList[0].tagName !== \"SELECT\") return false;\r\n\r\n let correct = response.split(\"\\n\");\r\n if (correct.length === 1 && correct.length !== inputList.length)\r\n correct = response.split(\",\");\r\n\r\n if (config.logs) Logs.array(correct);\r\n\r\n for (let j = 0; j < inputList.length; ++j) {\r\n const options = inputList[j].querySelectorAll(\"option\");\r\n\r\n for (const option of options) {\r\n const content = normalizeText(option.textContent);\r\n const valide = correct[j].includes(content);\r\n\r\n /* Handle put in order question */\r\n if (!isNaN(parseInt(content))) {\r\n const content = normalizeText(\r\n (option.parentNode as HTMLElement)\r\n .closest(\"tr\")\r\n .querySelector(\".text\").textContent\r\n );\r\n const index = correct.findIndex((c) => {\r\n const valide = c.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n return valide;\r\n });\r\n if (index !== -1) {\r\n if (config.mouseover) {\r\n options[index + 1].closest(\"select\").addEventListener(\r\n \"click\",\r\n function () {\r\n options[index + 1].selected = \"selected\" as any;\r\n },\r\n { once: true }\r\n );\r\n } else {\r\n options[index + 1].selected = \"selected\" as any;\r\n }\r\n break;\r\n }\r\n }\r\n /* End */\r\n\r\n if (config.logs) Logs.responseTry(content, valide);\r\n\r\n if (valide) {\r\n if (config.mouseover) {\r\n option\r\n .closest(\"select\")\r\n .addEventListener(\"click\", () => (option.selected = true), {\r\n once: true,\r\n });\r\n } else {\r\n option.selected = true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleSelect;\r\n","import Config from \"../../types/config\";\r\n\r\n/**\r\n * Handle textbox\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @returns\r\n */\r\nfunction handleTextbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n (input.tagName !== \"TEXTAREA\" && input.type !== \"text\")\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = response.length + 1;\r\n if (index > response.length) return;\r\n event.preventDefault();\r\n input.value = response.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleTextbox;\r\n","import Config from \"../../types/config\";\r\nimport titleIndications from \"../../utils/title-indications\";\r\n\r\n/**\r\n * Copy the response in the clipboard if we can automaticaly fill the question\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @param force Force the copy to clipboard\r\n * @returns\r\n */\r\nfunction handleClipboard(config: Config, response: string) {\r\n if (config.title) titleIndications(\"Copied to clipboard\");\r\n navigator.clipboard.writeText(response);\r\n}\r\n\r\nexport default handleClipboard;\r\n","import Config from \"../../types/config\";\r\n\r\n/**\r\n * Handle number input\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @returns\r\n */\r\nfunction handleNumber(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (inputList.length !== 1 || input.type !== \"number\") return false;\r\n\r\n const number = response.match(/\\d+([,\\.]\\d+)?/gi)?.[0]?.replace(\",\", \".\");\r\n\r\n if (!number) return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = number.length + 1;\r\n if (index > number.length) return;\r\n event.preventDefault();\r\n if (number.slice(index, index + 1) === \".\") ++index;\r\n input.value = number.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = number;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleNumber;\r\n","import Config from \"../../types/config\";\r\n\r\nfunction handleContentEditable(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList[0];\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n input.getAttribute(\"contenteditable\") !== \"true\"\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = response.length + 1;\r\n if (index > response.length) return;\r\n event.preventDefault();\r\n input.textContent = response.slice(0, ++index);\r\n\r\n /* Put the cursor at the end of the typed text */\r\n input.focus();\r\n const range = document.createRange();\r\n range.selectNodeContents(input);\r\n range.collapse(false);\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n });\r\n } else {\r\n input.textContent = response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleContentEditable;\r\n","import Config from \"../types/config\";\r\nimport Logs from \"../utils/logs\";\r\nimport getChatGPTResponse from \"./get-response\";\r\nimport createQuestion from \"./create-question\";\r\nimport handleRadioAndCheckbox from \"./questions/radio-checkbox\";\r\nimport handleSelect from \"./questions/select\";\r\nimport handleTextbox from \"./questions/textbox\";\r\nimport handleClipboard from \"./questions/clipboard\";\r\nimport handleNumber from \"./questions/number\";\r\nimport handleContentEditable from \"./questions/contenteditable\";\r\n\r\n/**\r\n * Reply to the question\r\n * @param config\r\n * @param hiddenButton\r\n * @param form\r\n * @param query\r\n * @returns\r\n */\r\nasync function reply(\r\n config: Config,\r\n hiddenButton: HTMLElement,\r\n form: HTMLElement,\r\n query: string\r\n) {\r\n if (config.cursor) hiddenButton.style.cursor = \"wait\";\r\n\r\n const question = createQuestion(config, form);\r\n const inputList: NodeListOf = form.querySelectorAll(query);\r\n\r\n const response = await getChatGPTResponse(config, question).catch(\r\n (error) => ({\r\n error,\r\n })\r\n );\r\n\r\n if (config.cursor)\r\n hiddenButton.style.cursor = config.infinite ? \"pointer\" : \"initial\";\r\n\r\n if (typeof response === \"object\" && \"error\" in response) {\r\n console.error(response.error);\r\n return;\r\n }\r\n\r\n if (config.logs) {\r\n Logs.question(question);\r\n Logs.response(response);\r\n }\r\n\r\n if (config.mode === \"clipboard\") {\r\n return handleClipboard(config, response);\r\n }\r\n\r\n if (config.mode === \"question-to-answer\") {\r\n const questionBackup = form.textContent;\r\n const questionContainer = form.querySelector(\".qtext\");\r\n questionContainer.textContent = response;\r\n questionContainer.addEventListener(\"click\", function () {\r\n questionContainer.textContent =\r\n questionContainer.textContent === questionBackup\r\n ? response\r\n : questionBackup;\r\n });\r\n return;\r\n }\r\n\r\n const handlers = [\r\n handleContentEditable,\r\n handleTextbox,\r\n handleNumber,\r\n handleSelect,\r\n handleRadioAndCheckbox,\r\n ];\r\n\r\n for (const handler of handlers) {\r\n if (handler(config, inputList, response)) return;\r\n }\r\n\r\n /** In the case we can't auto complete the question */\r\n handleClipboard(config, response);\r\n}\r\n\r\nexport default reply;\r\n","import Config from \"../types/config\";\r\nimport titleIndications from \"../utils/title-indications\";\r\nimport reply from \"./reply\";\r\n\r\nconst pressedKeys: string[] = [];\r\nconst listeners: {\r\n element: HTMLElement;\r\n fn: (this: HTMLElement, ev: MouseEvent) => any;\r\n}[] = [];\r\n\r\n/**\r\n * Create a listener on the keyboard to inject the code\r\n * @param config\r\n */\r\nfunction codeListener(config: Config) {\r\n document.body.addEventListener(\"keydown\", function (event) {\r\n pressedKeys.push(event.key);\r\n if (pressedKeys.length > config.code.length) pressedKeys.shift();\r\n if (pressedKeys.join(\"\") === config.code) {\r\n pressedKeys.length = 0;\r\n setUpMoodleGpt(config);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Setup moodleGPT into the page (remove/injection)\r\n * @param config\r\n * @returns\r\n */\r\nfunction setUpMoodleGpt(config: Config) {\r\n /* Removing events */\r\n if (listeners.length > 0) {\r\n for (const listener of listeners) {\r\n if (config.cursor) listener.element.style.cursor = \"initial\";\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n if (config.title) titleIndications(\"Removed\");\r\n listeners.length = 0;\r\n return;\r\n }\r\n\r\n /* Code injection */\r\n const inputQuery = [\"checkbox\", \"radio\", \"text\", \"number\"]\r\n .map((e) => `input[type=\"${e}\"]`)\r\n .join(\",\");\r\n const query = inputQuery + \", textarea, select, [contenteditable]\";\r\n const forms = Array.from(document.querySelectorAll(\".formulation\"));\r\n\r\n for (const form of forms) {\r\n const hiddenButton: HTMLElement = form.querySelector(\".qtext\");\r\n\r\n if (config.cursor) hiddenButton.style.cursor = \"pointer\";\r\n const fn = reply.bind(null, config, hiddenButton, form, query);\r\n listeners.push({ element: hiddenButton, fn });\r\n hiddenButton.addEventListener(\"click\", fn, { once: !config.infinite });\r\n }\r\n\r\n if (config.title) titleIndications(\"Injected\");\r\n}\r\n\r\nexport default codeListener;\r\n","import codeListener from \"./core/code-listener\";\r\n\r\nchrome.storage.sync.get([\"moodleGPT\"]).then(function (storage) {\r\n const config = storage.moodleGPT;\r\n\r\n if (!config) throw new Error(\"Please configure MoodleGPT into the extension\");\r\n\r\n codeListener(config);\r\n});\r\n"],"names":[],"mappings":"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","x_google_ignoreList":[1]} \ No newline at end of file diff --git a/extension/manifest.json b/extension/manifest.json index 5b20387..511db99 100644 --- a/extension/manifest.json +++ b/extension/manifest.json @@ -1,9 +1,9 @@ { "manifest_version": 3, "name": "MoodleGPT", - "version": "1.0.2", + "version": "1.0.3", "description": "Hidden chat-gpt for your moodle quiz", - "permissions": ["activeTab", "tabs", "storage"], + "permissions": ["storage"], "action": { "default_icon": "icon.png", "default_popup": "./popup/index.html" diff --git a/extension/popup/index.html b/extension/popup/index.html index 412168f..b602152 100644 --- a/extension/popup/index.html +++ b/extension/popup/index.html @@ -79,10 +79,6 @@

MoodleGPT

-
- - -
diff --git a/extension/popup/js/index.js b/extension/popup/js/index.js index c9487f4..304002e 100644 --- a/extension/popup/js/index.js +++ b/extension/popup/js/index.js @@ -10,7 +10,6 @@ const inputsCheckbox = [ "typing", "mouseover", "infinite", - "table", "timeout", ]; @@ -73,7 +72,7 @@ saveBtn.addEventListener("click", function () { const [apiKey, code, model] = inputsText.map((selector) => document.querySelector("#" + selector).value.trim() ); - const [logs, title, cursor, typing, mouseover, infinite, table, timeout] = + const [logs, title, cursor, typing, mouseover, infinite, timeout] = inputsCheckbox.map((selector) => { const element = document.querySelector("#" + selector); return element.checked && element.parentElement.style.display !== "none"; @@ -100,7 +99,6 @@ saveBtn.addEventListener("click", function () { typing, mouseover, infinite, - table, timeout, mode: actualMode, }, diff --git a/extension/popup/js/version.js b/extension/popup/js/version.js index a245508..030532c 100644 --- a/extension/popup/js/version.js +++ b/extension/popup/js/version.js @@ -1,4 +1,4 @@ -const currentVersion = "1.0.2"; +const currentVersion = "1.0.3"; const versionDisplay = document.querySelector("#version"); /** diff --git a/package.json b/package.json index 5cd74ca..8a6f118 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "moodlegpt", - "version": "1.0.2", + "version": "1.0.3", "description": "This extension allows you to hide CHAT-GPT in a Moodle quiz.", "scripts": { "build": "rollup -c" diff --git a/src/core/code-listener.ts b/src/core/code-listener.ts index f281506..196674b 100644 --- a/src/core/code-listener.ts +++ b/src/core/code-listener.ts @@ -29,7 +29,7 @@ function codeListener(config: Config) { * @returns */ function setUpMoodleGpt(config: Config) { - //removing events + /* Removing events */ if (listeners.length > 0) { for (const listener of listeners) { if (config.cursor) listener.element.style.cursor = "initial"; @@ -40,7 +40,7 @@ function setUpMoodleGpt(config: Config) { return; } - //injection + /* Code injection */ const inputQuery = ["checkbox", "radio", "text", "number"] .map((e) => `input[type="${e}"]`) .join(","); diff --git a/src/core/normalize-question.ts b/src/core/create-question.ts similarity index 54% rename from src/core/normalize-question.ts rename to src/core/create-question.ts index 1be2239..bc14b38 100644 --- a/src/core/normalize-question.ts +++ b/src/core/create-question.ts @@ -1,32 +1,30 @@ -import Config from "../types/config"; -import normalizeText from "../utils/normalize-text"; -import htmlTableToString from "../utils/html-table-to-string"; - -/** - * Normalize the question and add sub informations - * @param langage - * @param question - * @returns - */ -function normalizeQuestion(config: Config, questionContainer: HTMLElement) { - let question = questionContainer.textContent; - - if (config.table) { - //make table more readable for chat-gpt - const tables: NodeListOf = - questionContainer.querySelectorAll(".qtext table"); - for (const table of tables) { - question = question.replace( - table.textContent, - "\n" + htmlTableToString(table) + "\n" - ); - } - } - - const finalQuestion = `Give a short response as possible for this question, reply in the following question langage and only show the result: - ${question} - (If you have to choose between multiple results only show the corrects one, separate them with new line and take the same text as the question)`; - return normalizeText(finalQuestion); -} - -export default normalizeQuestion; +import Config from "../types/config"; +import normalizeText from "../utils/normalize-text"; +import htmlTableToString from "../utils/html-table-to-string"; + +/** + * Normalize the question and add sub informations + * @param langage + * @param question + * @returns + */ +function createQuestion(config: Config, questionContainer: HTMLElement) { + let question = questionContainer.innerText; + + /* Make tables more readable for chat-gpt */ + const tables: NodeListOf = + questionContainer.querySelectorAll(".qtext table"); + for (const table of tables) { + question = question.replace( + table.innerText, + "\n" + htmlTableToString(table) + "\n" + ); + } + + const finalQuestion = `Give a short response as possible for this question, reply in the following question langage and only show the result: + ${question} + (If you have to choose between multiple results only show the corrects one, separate them with new line and take the same text as the question)`; + return normalizeText(finalQuestion); +} + +export default createQuestion; diff --git a/src/core/questions/contenteditable.ts b/src/core/questions/contenteditable.ts index 9870bc2..fbe9508 100644 --- a/src/core/questions/contenteditable.ts +++ b/src/core/questions/contenteditable.ts @@ -21,7 +21,7 @@ function handleContentEditable( event.preventDefault(); input.textContent = response.slice(0, ++index); - //put the cursor at the end + /* Put the cursor at the end of the typed text */ input.focus(); const range = document.createRange(); range.selectNodeContents(input); diff --git a/src/core/questions/select.ts b/src/core/questions/select.ts index 0b65e36..e310fb9 100644 --- a/src/core/questions/select.ts +++ b/src/core/questions/select.ts @@ -29,7 +29,7 @@ function handleSelect( const content = normalizeText(option.textContent); const valide = correct[j].includes(content); - //if it's a put in order + /* Handle put in order question */ if (!isNaN(parseInt(content))) { const content = normalizeText( (option.parentNode as HTMLElement) @@ -56,7 +56,7 @@ function handleSelect( break; } } - //end put in order + /* End */ if (config.logs) Logs.responseTry(content, valide); diff --git a/src/core/reply.ts b/src/core/reply.ts index 2a861b3..97b61b2 100644 --- a/src/core/reply.ts +++ b/src/core/reply.ts @@ -1,7 +1,7 @@ import Config from "../types/config"; import Logs from "../utils/logs"; import getChatGPTResponse from "./get-response"; -import normalizeQuestion from "./normalize-question"; +import createQuestion from "./create-question"; import handleRadioAndCheckbox from "./questions/radio-checkbox"; import handleSelect from "./questions/select"; import handleTextbox from "./questions/textbox"; @@ -25,9 +25,7 @@ async function reply( ) { if (config.cursor) hiddenButton.style.cursor = "wait"; - form.querySelector(".accesshide")?.remove(); - - const question = normalizeQuestion(config, form); + const question = createQuestion(config, form); const inputList: NodeListOf = form.querySelectorAll(query); const response = await getChatGPTResponse(config, question).catch( diff --git a/src/types/config.d.ts b/src/types/config.d.ts index 3259f61..dc5392a 100644 --- a/src/types/config.d.ts +++ b/src/types/config.d.ts @@ -8,7 +8,6 @@ type Config = { cursor?: boolean; logs?: boolean; title?: boolean; - table?: boolean; timeout?: boolean; mode?: "autocomplete" | "question-to-answer" | "clipboard"; }; diff --git a/src/utils/html-table-to-string.ts b/src/utils/html-table-to-string.ts index e60cd58..0d23c7c 100644 --- a/src/utils/html-table-to-string.ts +++ b/src/utils/html-table-to-string.ts @@ -26,8 +26,11 @@ function htmlTableToString(table: HTMLTableElement) { "\n" + Array(lineSeparationSize).fill("-").join("") + "\n"; const mappedTab = tab.map((line) => { - const mappedLine = line.map( - (content, index) => content.padEnd(maxColumnsLength[index], "\u00A0") //for no matching with \s + const mappedLine = line.map((content, index) => + content.padEnd( + maxColumnsLength[index], + "\u00A0" /* For no matching with \s */ + ) ); return "| " + mappedLine.join(" | ") + " |"; }); diff --git a/src/utils/normalize-text.ts b/src/utils/normalize-text.ts index 7b65481..3442828 100644 --- a/src/utils/normalize-text.ts +++ b/src/utils/normalize-text.ts @@ -4,7 +4,8 @@ */ function normalizeText(text: string) { return text - .replace(/(\n\s*)+/gi, "\n") + .replace(/\n+/gi, "\n") + .replace(/(\n\s*\n)+/g, "\n") //remove useless white sapce from textcontent .replace(/[ \t]+/gi, " ") .toLowerCase() .trim() diff --git a/test/css/style.css b/test/fake-moodle/css/style.css similarity index 88% rename from test/css/style.css rename to test/fake-moodle/css/style.css index ac8c39d..bc8746f 100644 --- a/test/css/style.css +++ b/test/fake-moodle/css/style.css @@ -1,67 +1,67 @@ -@font-face { - font-family: Segeo UI; - src: url(../../extension/fonts/Segoe\ UI.ttf); -} - -* { - box-sizing: border-box; - padding: 0; - margin: 0; - font-family: "Segeo UI"; -} - -body { - display: flex; - align-items: center; - flex-direction: column; - padding: 1rem; - gap: 1rem; -} - -h1 { - text-align: center; -} - -.formulation { - width: 60%; - background-color: #e7f3f5; - padding: 1.5rem; - display: flex; - flex-direction: column; - gap: 1rem; -} - -.inp { - margin-top: 0.5rem; - display: flex; - gap: 0.5rem; - align-items: center; - position: relative; -} - -select { - position: absolute; - right: 0; -} - -.editable { - background-color: #fff; - height: 10rem; - width: 100%; - resize: vertical; - overflow-y: auto; - white-space: pre-wrap; - padding: 0.5rem; - outline: none; - border: thin solid #000; -} - -textarea { - outline: none; - padding: 0.5rem; - height: 10rem; - width: 100%; - resize: vertical; - white-space: pre-wrap; - overflow-y: auto; -} +@font-face { + font-family: Segeo UI; + src: url(../../../extension/fonts/Segoe\ UI.ttf); +} + +* { + box-sizing: border-box; + padding: 0; + margin: 0; + font-family: "Segeo UI"; +} + +body { + display: flex; + align-items: center; + flex-direction: column; + padding: 1rem; + gap: 1rem; +} + +h1 { + text-align: center; +} + +.formulation { + width: 60%; + background-color: #e7f3f5; + padding: 1.5rem; + display: flex; + flex-direction: column; + gap: 1rem; +} + +.inp { + margin-top: 0.5rem; + display: flex; + gap: 0.5rem; + align-items: center; + position: relative; +} + +select { + position: absolute; + right: 0; +} + +.editable { + background-color: #fff; + height: 10rem; + width: 100%; + resize: vertical; + overflow-y: auto; + white-space: pre-wrap; + padding: 0.5rem; + outline: none; + border: thin solid #000; +} + +textarea { + outline: none; + padding: 0.5rem; + height: 10rem; + width: 100%; + resize: vertical; + white-space: pre-wrap; + overflow-y: auto; +} diff --git a/test/index.html b/test/fake-moodle/index.html similarity index 96% rename from test/index.html rename to test/fake-moodle/index.html index b6631ad..aac6a83 100644 --- a/test/index.html +++ b/test/fake-moodle/index.html @@ -1,261 +1,261 @@ - - - - - - - Moodle test - - - - -
-
-

Which words are animals ?

-
-
-
- - -
-
- - -
-
- - -
-
-
- - -
-
-

What is the french president name ?

-
-
-
- - -
-
- - -
-
- - -
-
-
- - -
-
-

The cat sometimes drink milk?

-
-
-
- - -
-
- - -
-
-
- - -
-
-

What is the result of 17/20

-
-
- -
-
- - -
-
-

Choose the correct answer

-
-
-
- - - - - - - - - - - - - - -
-

I am a feline

-
- -
-

I am a descendant of the wolf

-
- -

I produce milk

- -
-
-
-
- - -
-
-

- Put the three steps needed in a general sense for a computer program - to solve the problem in the correct order -

-
-
-
- - - - - - - - - - - - - - -
-

Understand the problem

-
- -
-

Carry out the plan and write the actual code

-
- -
-

Create a step-by-step plan for how you'll solve it

-
- -
-
-
-
- - -
-
-

Solve those equations:

-
-
-
- - - - - - - - - - - - - - -
-

1. 5*5

-
- -
-

2. 20 - 10

-
- -

3. 10+10

- -
-
-
-
- - -
-
-

Give me five diferences between a dog and a cat

-
-
- -
-
- - -
-
-

- Gives a "reverseWorld" function in javascript which takes as a - parameter a word and flips it in the opposite direction -

-
-
-
-
-
- - + + + + + + + Moodle test + + + + +
+
+

Which words are animals ?

+
+
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+

What is the french president name ?

+
+
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+

The cat sometimes drink milk?

+
+
+
+ + +
+
+ + +
+
+
+ + +
+
+

What is the result of 17/20

+
+
+ +
+
+ + +
+
+

Choose the correct answer

+
+
+
+ + + + + + + + + + + + + + +
+

I am a feline

+
+ +
+

I am a descendant of the wolf

+
+ +

I produce milk

+ +
+
+
+
+ + +
+
+

+ Put the three steps needed in a general sense for a computer program + to solve the problem in the correct order +

+
+
+
+ + + + + + + + + + + + + + +
+

Understand the problem

+
+ +
+

Carry out the plan and write the actual code

+
+ +
+

Create a step-by-step plan for how you'll solve it

+
+ +
+
+
+
+ + +
+
+

Solve those equations:

+
+
+
+ + + + + + + + + + + + + + +
+

1. 5*5

+
+ +
+

2. 20 - 10

+
+ +

3. 10+10

+ +
+
+
+
+ + +
+
+

Give me five diferences between a dog and a cat

+
+
+ +
+
+ + +
+
+

+ Gives a "reverseWorld" function in javascript which takes as a + parameter a word and flips it in the opposite direction +

+
+
+
+
+
+ + diff --git a/reset-moodle-inputs/reset.js b/test/reset-moodle-inputs/reset.js similarity index 90% rename from reset-moodle-inputs/reset.js rename to test/reset-moodle-inputs/reset.js index 63aef3a..2ba4d86 100644 --- a/reset-moodle-inputs/reset.js +++ b/test/reset-moodle-inputs/reset.js @@ -1,22 +1,21 @@ -//to try in real moodle env - -for (const option of document.querySelectorAll("option")) { - option.selected = false; - option.disabled = false; - option.closest("select").disabled = false; -} - -for (const input of document.querySelectorAll( - 'input[type="radio"], input[type="checkbox"]' -)) { - input.checked = false; - input.disabled = false; -} - -for (const icon of document.querySelectorAll(".text-danger, .text-success")) { - icon.remove(); -} - -for (const feedback of document.querySelectorAll(".specificfeedback")) { - feedback.remove(); -} +/* Reset real moodle inputs to try in real env */ +for (const option of document.querySelectorAll("option")) { + option.selected = false; + option.disabled = false; + option.closest("select").disabled = false; +} + +for (const input of document.querySelectorAll( + 'input[type="radio"], input[type="checkbox"]' +)) { + input.checked = false; + input.disabled = false; +} + +for (const icon of document.querySelectorAll(".text-danger, .text-success")) { + icon.remove(); +} + +for (const feedback of document.querySelectorAll(".specificfeedback")) { + feedback.remove(); +} diff --git a/extension/banner.png b/webstore-assets/banner1.png similarity index 100% rename from extension/banner.png rename to webstore-assets/banner1.png diff --git a/extension/128x128.png b/webstore-assets/icon-128x128.png similarity index 100% rename from extension/128x128.png rename to webstore-assets/icon-128x128.png From 9dfe7acc58c0fb28665ade96f4207ff46f3fde8d Mon Sep 17 00:00:00 2001 From: yoannchb-pro <71560747+yoannchb-pro@users.noreply.github.com> Date: Mon, 19 Jun 2023 23:08:04 -0400 Subject: [PATCH 02/35] v1.0.3 --- TODO.md | 4 ++-- extension/MoodleGPT.js | 11 +++++++---- extension/MoodleGPT.js.map | 2 +- src/core/code-listener.ts | 3 ++- src/core/create-question.ts | 2 +- src/core/reply.ts | 11 +++++++++-- 6 files changed, 22 insertions(+), 11 deletions(-) diff --git a/TODO.md b/TODO.md index 0a69238..4bdccbf 100644 --- a/TODO.md +++ b/TODO.md @@ -2,12 +2,12 @@ ## Priority: 1 -- [ ] Fixe `normalizeText` (line break are sometimes removed for nothing e.g: checkbox) -- [ ] Support math equation from image stocked in the `data-mathml` attribute - [ ] Increment question when there is statement +- [ ] Allow click back on question if timeout ## Priority: 3 (because hard to make) +- [ ] Support math equation from image stocked in the `data-mathml` attribute - [ ] Try something to understand images like (image -> ascii or may be using other AI ?) - [ ] Support multiple input type in a question - [ ] Support drag and drop quiz diff --git a/extension/MoodleGPT.js b/extension/MoodleGPT.js index 1ab2d3f..ae22952 100644 --- a/extension/MoodleGPT.js +++ b/extension/MoodleGPT.js @@ -145,7 +145,7 @@ for (const table of tables) { question = question.replace(table.innerText, "\n" + htmlTableToString(table) + "\n"); } - const finalQuestion = `Give a short response as possible for this question, reply in the following question langage and only show the result: + const finalQuestion = `Give a short response as possible for this question, reply in the following question langage and only show the result: ${question} (If you have to choose between multiple results only show the corrects one, separate them with new line and take the same text as the question)`; return normalizeText(finalQuestion); @@ -368,9 +368,12 @@ const response = yield getChatGPTResponse(config, question).catch((error) => ({ error, })); + const haveError = typeof response === "object" && "error" in response; + const isAbortError = haveError && response.error.name === "AbortError"; if (config.cursor) - hiddenButton.style.cursor = config.infinite ? "pointer" : "initial"; - if (typeof response === "object" && "error" in response) { + hiddenButton.style.cursor = + config.infinite || isAbortError ? "pointer" : "initial"; + if (haveError) { console.error(response.error); return; } @@ -449,7 +452,7 @@ .map((e) => `input[type="${e}"]`) .join(","); const query = inputQuery + ", textarea, select, [contenteditable]"; - const forms = Array.from(document.querySelectorAll(".formulation")); + const forms = document.querySelectorAll(".formulation"); for (const form of forms) { const hiddenButton = form.querySelector(".qtext"); if (config.cursor) diff --git a/extension/MoodleGPT.js.map b/extension/MoodleGPT.js.map index 1d03499..2716d7d 100644 --- a/extension/MoodleGPT.js.map +++ b/extension/MoodleGPT.js.map @@ -1 +1 @@ -{"version":3,"file":"MoodleGPT.js","sources":["../src/utils/title-indications.ts","../node_modules/tslib/tslib.es6.js","../src/utils/logs.ts","../src/utils/normalize-text.ts","../src/core/get-response.ts","../src/utils/html-table-to-string.ts","../src/core/create-question.ts","../src/core/questions/radio-checkbox.ts","../src/core/questions/select.ts","../src/core/questions/textbox.ts","../src/core/questions/clipboard.ts","../src/core/questions/number.ts","../src/core/questions/contenteditable.ts","../src/core/reply.ts","../src/core/code-listener.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Show some informations into the document title and remove it after 3000ms\r\n * @param text\r\n */\r\nfunction titleIndications(text: string) {\r\n const backTitle = document.title;\r\n document.title = text;\r\n setTimeout(() => (document.title = backTitle), 3000);\r\n}\r\n\r\nexport default titleIndications;\r\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.push(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.push(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","class Logs {\r\n static question(text: string) {\r\n const css = \"color: cyan\";\r\n console.log(\"%c[QUESTION]: %s\", css, text);\r\n }\r\n\r\n static responseTry(text: string, valide: boolean) {\r\n const css = \"color: \" + (valide ? \"green\" : \"red\");\r\n console.log(\"%c[CHECKING]: %s\", css, text);\r\n }\r\n\r\n static array(arr: unknown[]) {\r\n console.log(\"[CORRECTS] \", arr);\r\n }\r\n\r\n static response(text: string) {\r\n console.log(text);\r\n }\r\n}\r\n\r\nexport default Logs;\r\n","/**\r\n * Normlize text\r\n * @param text\r\n */\r\nfunction normalizeText(text: string) {\r\n return text\r\n .replace(/\\n+/gi, \"\\n\")\r\n .replace(/(\\n\\s*\\n)+/g, \"\\n\") //remove useless white sapce from textcontent\r\n .replace(/[ \\t]+/gi, \" \")\r\n .toLowerCase()\r\n .trim()\r\n .replace(/^[a-z\\d]\\.\\s/gi, \"\") //a. text, b. text, c. text, 1. text, 2. text, 3.text\r\n .replace(/\\n[a-z\\d]\\.\\s/gi, \"\\n\"); //same but with new line\r\n}\r\n\r\nexport default normalizeText;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\n\r\n/**\r\n * Get the response from chatGPT api\r\n * @param config\r\n * @param question\r\n * @returns\r\n */\r\nasync function getChatGPTResponse(\r\n config: Config,\r\n question: string\r\n): Promise {\r\n const controller = new AbortController();\r\n const timeoutControler = setTimeout(() => controller.abort(), 10000);\r\n const req = await fetch(\"https://api.openai.com/v1/chat/completions\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${config.apiKey}`,\r\n },\r\n signal: config.timeout ? controller.signal : null,\r\n body: JSON.stringify({\r\n model: config.model,\r\n messages: [{ role: \"user\", content: question }],\r\n temperature: 0.8,\r\n top_p: 1.0,\r\n presence_penalty: 1.0,\r\n stop: null,\r\n }),\r\n });\r\n clearTimeout(timeoutControler);\r\n const rep = await req.json();\r\n const response = rep.choices[0].message.content;\r\n return normalizeText(response);\r\n}\r\n\r\nexport default getChatGPTResponse;\r\n","/**\r\n * Convert table to representating string table\r\n * @param table\r\n * @returns\r\n */\r\nfunction htmlTableToString(table: HTMLTableElement) {\r\n const tab: string[][] = [];\r\n const lines = Array.from(table.querySelectorAll(\"tr\"));\r\n const maxColumnsLength: number[] = [];\r\n lines.map((line) => {\r\n const cells = Array.from(line.querySelectorAll(\"td, th\"));\r\n const cellsContent = cells.map((cell, index) => {\r\n const content = cell.textContent?.trim();\r\n maxColumnsLength[index] = Math.max(\r\n maxColumnsLength[index] || 0,\r\n content.length || 0\r\n );\r\n return content;\r\n });\r\n tab.push(cellsContent);\r\n });\r\n\r\n const lineSeparationSize =\r\n maxColumnsLength.reduce((a, b) => a + b) + tab[0].length * 3 + 1;\r\n const lineSeparation =\r\n \"\\n\" + Array(lineSeparationSize).fill(\"-\").join(\"\") + \"\\n\";\r\n\r\n const mappedTab = tab.map((line) => {\r\n const mappedLine = line.map((content, index) =>\r\n content.padEnd(\r\n maxColumnsLength[index],\r\n \"\\u00A0\" /* For no matching with \\s */\r\n )\r\n );\r\n return \"| \" + mappedLine.join(\" | \") + \" |\";\r\n });\r\n const head = mappedTab.shift();\r\n return head + lineSeparation + mappedTab.join(\"\\n\");\r\n}\r\n\r\nexport default htmlTableToString;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\nimport htmlTableToString from \"../utils/html-table-to-string\";\r\n\r\n/**\r\n * Normalize the question and add sub informations\r\n * @param langage\r\n * @param question\r\n * @returns\r\n */\r\nfunction createQuestion(config: Config, questionContainer: HTMLElement) {\r\n let question = questionContainer.innerText;\r\n\r\n /* Make tables more readable for chat-gpt */\r\n const tables: NodeListOf =\r\n questionContainer.querySelectorAll(\".qtext table\");\r\n for (const table of tables) {\r\n question = question.replace(\r\n table.innerText,\r\n \"\\n\" + htmlTableToString(table) + \"\\n\"\r\n );\r\n }\r\n\r\n const finalQuestion = `Give a short response as possible for this question, reply in the following question langage and only show the result: \r\n ${question} \r\n (If you have to choose between multiple results only show the corrects one, separate them with new line and take the same text as the question)`;\r\n return normalizeText(finalQuestion);\r\n}\r\n\r\nexport default createQuestion;\r\n","import Config from \"../../types/config\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle checkbox and input elements\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n */\r\nfunction handleRadioAndCheckbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList?.[0] as HTMLInputElement;\r\n\r\n if (!input || (input.type !== \"checkbox\" && input.type !== \"radio\"))\r\n return false;\r\n\r\n for (const input of inputList as NodeListOf) {\r\n const content = normalizeText(input.parentNode.textContent);\r\n const valide = response.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n if (valide) {\r\n if (config.mouseover) {\r\n input.addEventListener(\"mouseover\", () => (input.checked = true), {\r\n once: true,\r\n });\r\n } else {\r\n input.checked = true;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport default handleRadioAndCheckbox;\r\n","import Config from \"../../types/config\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle select elements (and put in order select)\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @returns\r\n */\r\nfunction handleSelect(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n if (inputList.length === 0 || inputList[0].tagName !== \"SELECT\") return false;\r\n\r\n let correct = response.split(\"\\n\");\r\n if (correct.length === 1 && correct.length !== inputList.length)\r\n correct = response.split(\",\");\r\n\r\n if (config.logs) Logs.array(correct);\r\n\r\n for (let j = 0; j < inputList.length; ++j) {\r\n const options = inputList[j].querySelectorAll(\"option\");\r\n\r\n for (const option of options) {\r\n const content = normalizeText(option.textContent);\r\n const valide = correct[j].includes(content);\r\n\r\n /* Handle put in order question */\r\n if (!isNaN(parseInt(content))) {\r\n const content = normalizeText(\r\n (option.parentNode as HTMLElement)\r\n .closest(\"tr\")\r\n .querySelector(\".text\").textContent\r\n );\r\n const index = correct.findIndex((c) => {\r\n const valide = c.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n return valide;\r\n });\r\n if (index !== -1) {\r\n if (config.mouseover) {\r\n options[index + 1].closest(\"select\").addEventListener(\r\n \"click\",\r\n function () {\r\n options[index + 1].selected = \"selected\" as any;\r\n },\r\n { once: true }\r\n );\r\n } else {\r\n options[index + 1].selected = \"selected\" as any;\r\n }\r\n break;\r\n }\r\n }\r\n /* End */\r\n\r\n if (config.logs) Logs.responseTry(content, valide);\r\n\r\n if (valide) {\r\n if (config.mouseover) {\r\n option\r\n .closest(\"select\")\r\n .addEventListener(\"click\", () => (option.selected = true), {\r\n once: true,\r\n });\r\n } else {\r\n option.selected = true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleSelect;\r\n","import Config from \"../../types/config\";\r\n\r\n/**\r\n * Handle textbox\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @returns\r\n */\r\nfunction handleTextbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n (input.tagName !== \"TEXTAREA\" && input.type !== \"text\")\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = response.length + 1;\r\n if (index > response.length) return;\r\n event.preventDefault();\r\n input.value = response.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleTextbox;\r\n","import Config from \"../../types/config\";\r\nimport titleIndications from \"../../utils/title-indications\";\r\n\r\n/**\r\n * Copy the response in the clipboard if we can automaticaly fill the question\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @param force Force the copy to clipboard\r\n * @returns\r\n */\r\nfunction handleClipboard(config: Config, response: string) {\r\n if (config.title) titleIndications(\"Copied to clipboard\");\r\n navigator.clipboard.writeText(response);\r\n}\r\n\r\nexport default handleClipboard;\r\n","import Config from \"../../types/config\";\r\n\r\n/**\r\n * Handle number input\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @returns\r\n */\r\nfunction handleNumber(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (inputList.length !== 1 || input.type !== \"number\") return false;\r\n\r\n const number = response.match(/\\d+([,\\.]\\d+)?/gi)?.[0]?.replace(\",\", \".\");\r\n\r\n if (!number) return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = number.length + 1;\r\n if (index > number.length) return;\r\n event.preventDefault();\r\n if (number.slice(index, index + 1) === \".\") ++index;\r\n input.value = number.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = number;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleNumber;\r\n","import Config from \"../../types/config\";\r\n\r\nfunction handleContentEditable(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList[0];\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n input.getAttribute(\"contenteditable\") !== \"true\"\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = response.length + 1;\r\n if (index > response.length) return;\r\n event.preventDefault();\r\n input.textContent = response.slice(0, ++index);\r\n\r\n /* Put the cursor at the end of the typed text */\r\n input.focus();\r\n const range = document.createRange();\r\n range.selectNodeContents(input);\r\n range.collapse(false);\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n });\r\n } else {\r\n input.textContent = response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleContentEditable;\r\n","import Config from \"../types/config\";\r\nimport Logs from \"../utils/logs\";\r\nimport getChatGPTResponse from \"./get-response\";\r\nimport createQuestion from \"./create-question\";\r\nimport handleRadioAndCheckbox from \"./questions/radio-checkbox\";\r\nimport handleSelect from \"./questions/select\";\r\nimport handleTextbox from \"./questions/textbox\";\r\nimport handleClipboard from \"./questions/clipboard\";\r\nimport handleNumber from \"./questions/number\";\r\nimport handleContentEditable from \"./questions/contenteditable\";\r\n\r\n/**\r\n * Reply to the question\r\n * @param config\r\n * @param hiddenButton\r\n * @param form\r\n * @param query\r\n * @returns\r\n */\r\nasync function reply(\r\n config: Config,\r\n hiddenButton: HTMLElement,\r\n form: HTMLElement,\r\n query: string\r\n) {\r\n if (config.cursor) hiddenButton.style.cursor = \"wait\";\r\n\r\n const question = createQuestion(config, form);\r\n const inputList: NodeListOf = form.querySelectorAll(query);\r\n\r\n const response = await getChatGPTResponse(config, question).catch(\r\n (error) => ({\r\n error,\r\n })\r\n );\r\n\r\n if (config.cursor)\r\n hiddenButton.style.cursor = config.infinite ? \"pointer\" : \"initial\";\r\n\r\n if (typeof response === \"object\" && \"error\" in response) {\r\n console.error(response.error);\r\n return;\r\n }\r\n\r\n if (config.logs) {\r\n Logs.question(question);\r\n Logs.response(response);\r\n }\r\n\r\n if (config.mode === \"clipboard\") {\r\n return handleClipboard(config, response);\r\n }\r\n\r\n if (config.mode === \"question-to-answer\") {\r\n const questionBackup = form.textContent;\r\n const questionContainer = form.querySelector(\".qtext\");\r\n questionContainer.textContent = response;\r\n questionContainer.addEventListener(\"click\", function () {\r\n questionContainer.textContent =\r\n questionContainer.textContent === questionBackup\r\n ? response\r\n : questionBackup;\r\n });\r\n return;\r\n }\r\n\r\n const handlers = [\r\n handleContentEditable,\r\n handleTextbox,\r\n handleNumber,\r\n handleSelect,\r\n handleRadioAndCheckbox,\r\n ];\r\n\r\n for (const handler of handlers) {\r\n if (handler(config, inputList, response)) return;\r\n }\r\n\r\n /** In the case we can't auto complete the question */\r\n handleClipboard(config, response);\r\n}\r\n\r\nexport default reply;\r\n","import Config from \"../types/config\";\r\nimport titleIndications from \"../utils/title-indications\";\r\nimport reply from \"./reply\";\r\n\r\nconst pressedKeys: string[] = [];\r\nconst listeners: {\r\n element: HTMLElement;\r\n fn: (this: HTMLElement, ev: MouseEvent) => any;\r\n}[] = [];\r\n\r\n/**\r\n * Create a listener on the keyboard to inject the code\r\n * @param config\r\n */\r\nfunction codeListener(config: Config) {\r\n document.body.addEventListener(\"keydown\", function (event) {\r\n pressedKeys.push(event.key);\r\n if (pressedKeys.length > config.code.length) pressedKeys.shift();\r\n if (pressedKeys.join(\"\") === config.code) {\r\n pressedKeys.length = 0;\r\n setUpMoodleGpt(config);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Setup moodleGPT into the page (remove/injection)\r\n * @param config\r\n * @returns\r\n */\r\nfunction setUpMoodleGpt(config: Config) {\r\n /* Removing events */\r\n if (listeners.length > 0) {\r\n for (const listener of listeners) {\r\n if (config.cursor) listener.element.style.cursor = \"initial\";\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n if (config.title) titleIndications(\"Removed\");\r\n listeners.length = 0;\r\n return;\r\n }\r\n\r\n /* Code injection */\r\n const inputQuery = [\"checkbox\", \"radio\", \"text\", \"number\"]\r\n .map((e) => `input[type=\"${e}\"]`)\r\n .join(\",\");\r\n const query = inputQuery + \", textarea, select, [contenteditable]\";\r\n const forms = Array.from(document.querySelectorAll(\".formulation\"));\r\n\r\n for (const form of forms) {\r\n const hiddenButton: HTMLElement = form.querySelector(\".qtext\");\r\n\r\n if (config.cursor) hiddenButton.style.cursor = \"pointer\";\r\n const fn = reply.bind(null, config, hiddenButton, form, query);\r\n listeners.push({ element: hiddenButton, fn });\r\n hiddenButton.addEventListener(\"click\", fn, { once: !config.infinite });\r\n }\r\n\r\n if (config.title) titleIndications(\"Injected\");\r\n}\r\n\r\nexport default codeListener;\r\n","import codeListener from \"./core/code-listener\";\r\n\r\nchrome.storage.sync.get([\"moodleGPT\"]).then(function (storage) {\r\n const config = storage.moodleGPT;\r\n\r\n if (!config) throw new Error(\"Please configure MoodleGPT into the extension\");\r\n\r\n codeListener(config);\r\n});\r\n"],"names":[],"mappings":"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","x_google_ignoreList":[1]} \ No newline at end of file +{"version":3,"file":"MoodleGPT.js","sources":["../src/utils/title-indications.ts","../node_modules/tslib/tslib.es6.js","../src/utils/logs.ts","../src/utils/normalize-text.ts","../src/core/get-response.ts","../src/utils/html-table-to-string.ts","../src/core/create-question.ts","../src/core/questions/radio-checkbox.ts","../src/core/questions/select.ts","../src/core/questions/textbox.ts","../src/core/questions/clipboard.ts","../src/core/questions/number.ts","../src/core/questions/contenteditable.ts","../src/core/reply.ts","../src/core/code-listener.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Show some informations into the document title and remove it after 3000ms\r\n * @param text\r\n */\r\nfunction titleIndications(text: string) {\r\n const backTitle = document.title;\r\n document.title = text;\r\n setTimeout(() => (document.title = backTitle), 3000);\r\n}\r\n\r\nexport default titleIndications;\r\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.push(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.push(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","class Logs {\r\n static question(text: string) {\r\n const css = \"color: cyan\";\r\n console.log(\"%c[QUESTION]: %s\", css, text);\r\n }\r\n\r\n static responseTry(text: string, valide: boolean) {\r\n const css = \"color: \" + (valide ? \"green\" : \"red\");\r\n console.log(\"%c[CHECKING]: %s\", css, text);\r\n }\r\n\r\n static array(arr: unknown[]) {\r\n console.log(\"[CORRECTS] \", arr);\r\n }\r\n\r\n static response(text: string) {\r\n console.log(text);\r\n }\r\n}\r\n\r\nexport default Logs;\r\n","/**\r\n * Normlize text\r\n * @param text\r\n */\r\nfunction normalizeText(text: string) {\r\n return text\r\n .replace(/\\n+/gi, \"\\n\")\r\n .replace(/(\\n\\s*\\n)+/g, \"\\n\") //remove useless white sapce from textcontent\r\n .replace(/[ \\t]+/gi, \" \")\r\n .toLowerCase()\r\n .trim()\r\n .replace(/^[a-z\\d]\\.\\s/gi, \"\") //a. text, b. text, c. text, 1. text, 2. text, 3.text\r\n .replace(/\\n[a-z\\d]\\.\\s/gi, \"\\n\"); //same but with new line\r\n}\r\n\r\nexport default normalizeText;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\n\r\n/**\r\n * Get the response from chatGPT api\r\n * @param config\r\n * @param question\r\n * @returns\r\n */\r\nasync function getChatGPTResponse(\r\n config: Config,\r\n question: string\r\n): Promise {\r\n const controller = new AbortController();\r\n const timeoutControler = setTimeout(() => controller.abort(), 10000);\r\n const req = await fetch(\"https://api.openai.com/v1/chat/completions\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${config.apiKey}`,\r\n },\r\n signal: config.timeout ? controller.signal : null,\r\n body: JSON.stringify({\r\n model: config.model,\r\n messages: [{ role: \"user\", content: question }],\r\n temperature: 0.8,\r\n top_p: 1.0,\r\n presence_penalty: 1.0,\r\n stop: null,\r\n }),\r\n });\r\n clearTimeout(timeoutControler);\r\n const rep = await req.json();\r\n const response = rep.choices[0].message.content;\r\n return normalizeText(response);\r\n}\r\n\r\nexport default getChatGPTResponse;\r\n","/**\r\n * Convert table to representating string table\r\n * @param table\r\n * @returns\r\n */\r\nfunction htmlTableToString(table: HTMLTableElement) {\r\n const tab: string[][] = [];\r\n const lines = Array.from(table.querySelectorAll(\"tr\"));\r\n const maxColumnsLength: number[] = [];\r\n lines.map((line) => {\r\n const cells = Array.from(line.querySelectorAll(\"td, th\"));\r\n const cellsContent = cells.map((cell, index) => {\r\n const content = cell.textContent?.trim();\r\n maxColumnsLength[index] = Math.max(\r\n maxColumnsLength[index] || 0,\r\n content.length || 0\r\n );\r\n return content;\r\n });\r\n tab.push(cellsContent);\r\n });\r\n\r\n const lineSeparationSize =\r\n maxColumnsLength.reduce((a, b) => a + b) + tab[0].length * 3 + 1;\r\n const lineSeparation =\r\n \"\\n\" + Array(lineSeparationSize).fill(\"-\").join(\"\") + \"\\n\";\r\n\r\n const mappedTab = tab.map((line) => {\r\n const mappedLine = line.map((content, index) =>\r\n content.padEnd(\r\n maxColumnsLength[index],\r\n \"\\u00A0\" /* For no matching with \\s */\r\n )\r\n );\r\n return \"| \" + mappedLine.join(\" | \") + \" |\";\r\n });\r\n const head = mappedTab.shift();\r\n return head + lineSeparation + mappedTab.join(\"\\n\");\r\n}\r\n\r\nexport default htmlTableToString;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\nimport htmlTableToString from \"../utils/html-table-to-string\";\r\n\r\n/**\r\n * Normalize the question and add sub informations\r\n * @param langage\r\n * @param question\r\n * @returns\r\n */\r\nfunction createQuestion(config: Config, questionContainer: HTMLElement) {\r\n let question = questionContainer.innerText;\r\n\r\n /* Make tables more readable for chat-gpt */\r\n const tables: NodeListOf =\r\n questionContainer.querySelectorAll(\".qtext table\");\r\n for (const table of tables) {\r\n question = question.replace(\r\n table.innerText,\r\n \"\\n\" + htmlTableToString(table) + \"\\n\"\r\n );\r\n }\r\n\r\n const finalQuestion = `Give a short response as possible for this question, reply in the following question langage and only show the result:\r\n ${question} \r\n (If you have to choose between multiple results only show the corrects one, separate them with new line and take the same text as the question)`;\r\n return normalizeText(finalQuestion);\r\n}\r\n\r\nexport default createQuestion;\r\n","import Config from \"../../types/config\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle checkbox and input elements\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n */\r\nfunction handleRadioAndCheckbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList?.[0] as HTMLInputElement;\r\n\r\n if (!input || (input.type !== \"checkbox\" && input.type !== \"radio\"))\r\n return false;\r\n\r\n for (const input of inputList as NodeListOf) {\r\n const content = normalizeText(input.parentNode.textContent);\r\n const valide = response.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n if (valide) {\r\n if (config.mouseover) {\r\n input.addEventListener(\"mouseover\", () => (input.checked = true), {\r\n once: true,\r\n });\r\n } else {\r\n input.checked = true;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport default handleRadioAndCheckbox;\r\n","import Config from \"../../types/config\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle select elements (and put in order select)\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @returns\r\n */\r\nfunction handleSelect(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n if (inputList.length === 0 || inputList[0].tagName !== \"SELECT\") return false;\r\n\r\n let correct = response.split(\"\\n\");\r\n if (correct.length === 1 && correct.length !== inputList.length)\r\n correct = response.split(\",\");\r\n\r\n if (config.logs) Logs.array(correct);\r\n\r\n for (let j = 0; j < inputList.length; ++j) {\r\n const options = inputList[j].querySelectorAll(\"option\");\r\n\r\n for (const option of options) {\r\n const content = normalizeText(option.textContent);\r\n const valide = correct[j].includes(content);\r\n\r\n /* Handle put in order question */\r\n if (!isNaN(parseInt(content))) {\r\n const content = normalizeText(\r\n (option.parentNode as HTMLElement)\r\n .closest(\"tr\")\r\n .querySelector(\".text\").textContent\r\n );\r\n const index = correct.findIndex((c) => {\r\n const valide = c.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n return valide;\r\n });\r\n if (index !== -1) {\r\n if (config.mouseover) {\r\n options[index + 1].closest(\"select\").addEventListener(\r\n \"click\",\r\n function () {\r\n options[index + 1].selected = \"selected\" as any;\r\n },\r\n { once: true }\r\n );\r\n } else {\r\n options[index + 1].selected = \"selected\" as any;\r\n }\r\n break;\r\n }\r\n }\r\n /* End */\r\n\r\n if (config.logs) Logs.responseTry(content, valide);\r\n\r\n if (valide) {\r\n if (config.mouseover) {\r\n option\r\n .closest(\"select\")\r\n .addEventListener(\"click\", () => (option.selected = true), {\r\n once: true,\r\n });\r\n } else {\r\n option.selected = true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleSelect;\r\n","import Config from \"../../types/config\";\r\n\r\n/**\r\n * Handle textbox\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @returns\r\n */\r\nfunction handleTextbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n (input.tagName !== \"TEXTAREA\" && input.type !== \"text\")\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = response.length + 1;\r\n if (index > response.length) return;\r\n event.preventDefault();\r\n input.value = response.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleTextbox;\r\n","import Config from \"../../types/config\";\r\nimport titleIndications from \"../../utils/title-indications\";\r\n\r\n/**\r\n * Copy the response in the clipboard if we can automaticaly fill the question\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @param force Force the copy to clipboard\r\n * @returns\r\n */\r\nfunction handleClipboard(config: Config, response: string) {\r\n if (config.title) titleIndications(\"Copied to clipboard\");\r\n navigator.clipboard.writeText(response);\r\n}\r\n\r\nexport default handleClipboard;\r\n","import Config from \"../../types/config\";\r\n\r\n/**\r\n * Handle number input\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @returns\r\n */\r\nfunction handleNumber(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (inputList.length !== 1 || input.type !== \"number\") return false;\r\n\r\n const number = response.match(/\\d+([,\\.]\\d+)?/gi)?.[0]?.replace(\",\", \".\");\r\n\r\n if (!number) return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = number.length + 1;\r\n if (index > number.length) return;\r\n event.preventDefault();\r\n if (number.slice(index, index + 1) === \".\") ++index;\r\n input.value = number.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = number;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleNumber;\r\n","import Config from \"../../types/config\";\r\n\r\nfunction handleContentEditable(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList[0];\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n input.getAttribute(\"contenteditable\") !== \"true\"\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = response.length + 1;\r\n if (index > response.length) return;\r\n event.preventDefault();\r\n input.textContent = response.slice(0, ++index);\r\n\r\n /* Put the cursor at the end of the typed text */\r\n input.focus();\r\n const range = document.createRange();\r\n range.selectNodeContents(input);\r\n range.collapse(false);\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n });\r\n } else {\r\n input.textContent = response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleContentEditable;\r\n","import Config from \"../types/config\";\r\nimport Logs from \"../utils/logs\";\r\nimport getChatGPTResponse from \"./get-response\";\r\nimport createQuestion from \"./create-question\";\r\nimport handleRadioAndCheckbox from \"./questions/radio-checkbox\";\r\nimport handleSelect from \"./questions/select\";\r\nimport handleTextbox from \"./questions/textbox\";\r\nimport handleClipboard from \"./questions/clipboard\";\r\nimport handleNumber from \"./questions/number\";\r\nimport handleContentEditable from \"./questions/contenteditable\";\r\n\r\n/**\r\n * Reply to the question\r\n * @param config\r\n * @param hiddenButton\r\n * @param form\r\n * @param query\r\n * @returns\r\n */\r\nasync function reply(\r\n config: Config,\r\n hiddenButton: HTMLElement,\r\n form: HTMLElement,\r\n query: string\r\n) {\r\n if (config.cursor) hiddenButton.style.cursor = \"wait\";\r\n\r\n const question = createQuestion(config, form);\r\n const inputList: NodeListOf = form.querySelectorAll(query);\r\n\r\n const response = await getChatGPTResponse(config, question).catch(\r\n (error) => ({\r\n error,\r\n })\r\n );\r\n const haveError = typeof response === \"object\" && \"error\" in response;\r\n const isAbortError = haveError && response.error.name === \"AbortError\";\r\n\r\n if (config.cursor)\r\n hiddenButton.style.cursor =\r\n config.infinite || isAbortError ? \"pointer\" : \"initial\";\r\n\r\n if (haveError) {\r\n if (isAbortError) {\r\n //TODO: We need to inject back the event\r\n }\r\n\r\n console.error(response.error);\r\n return;\r\n }\r\n\r\n if (config.logs) {\r\n Logs.question(question);\r\n Logs.response(response);\r\n }\r\n\r\n if (config.mode === \"clipboard\") {\r\n return handleClipboard(config, response);\r\n }\r\n\r\n if (config.mode === \"question-to-answer\") {\r\n const questionBackup = form.textContent;\r\n const questionContainer = form.querySelector(\".qtext\");\r\n questionContainer.textContent = response;\r\n questionContainer.addEventListener(\"click\", function () {\r\n questionContainer.textContent =\r\n questionContainer.textContent === questionBackup\r\n ? response\r\n : questionBackup;\r\n });\r\n return;\r\n }\r\n\r\n const handlers = [\r\n handleContentEditable,\r\n handleTextbox,\r\n handleNumber,\r\n handleSelect,\r\n handleRadioAndCheckbox,\r\n ];\r\n\r\n for (const handler of handlers) {\r\n if (handler(config, inputList, response)) return;\r\n }\r\n\r\n /** In the case we can't auto complete the question */\r\n handleClipboard(config, response);\r\n}\r\n\r\nexport default reply;\r\n","import Config from \"../types/config\";\r\nimport titleIndications from \"../utils/title-indications\";\r\nimport reply from \"./reply\";\r\n\r\nconst pressedKeys: string[] = [];\r\nconst listeners: {\r\n element: HTMLElement;\r\n fn: (this: HTMLElement, ev: MouseEvent) => any;\r\n}[] = [];\r\n\r\n/**\r\n * Create a listener on the keyboard to inject the code\r\n * @param config\r\n */\r\nfunction codeListener(config: Config) {\r\n document.body.addEventListener(\"keydown\", function (event) {\r\n pressedKeys.push(event.key);\r\n if (pressedKeys.length > config.code.length) pressedKeys.shift();\r\n if (pressedKeys.join(\"\") === config.code) {\r\n pressedKeys.length = 0;\r\n setUpMoodleGpt(config);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Setup moodleGPT into the page (remove/injection)\r\n * @param config\r\n * @returns\r\n */\r\nfunction setUpMoodleGpt(config: Config) {\r\n /* Removing events */\r\n if (listeners.length > 0) {\r\n for (const listener of listeners) {\r\n if (config.cursor) listener.element.style.cursor = \"initial\";\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n if (config.title) titleIndications(\"Removed\");\r\n listeners.length = 0;\r\n return;\r\n }\r\n\r\n /* Code injection */\r\n const inputQuery = [\"checkbox\", \"radio\", \"text\", \"number\"]\r\n .map((e) => `input[type=\"${e}\"]`)\r\n .join(\",\");\r\n const query = inputQuery + \", textarea, select, [contenteditable]\";\r\n const forms = document.querySelectorAll(\".formulation\");\r\n\r\n for (const form of forms) {\r\n const hiddenButton: HTMLElement = form.querySelector(\".qtext\");\r\n\r\n if (config.cursor) hiddenButton.style.cursor = \"pointer\";\r\n\r\n const fn = reply.bind(null, config, hiddenButton, form, query);\r\n listeners.push({ element: hiddenButton, fn });\r\n hiddenButton.addEventListener(\"click\", fn, { once: !config.infinite });\r\n }\r\n\r\n if (config.title) titleIndications(\"Injected\");\r\n}\r\n\r\nexport default codeListener;\r\n","import codeListener from \"./core/code-listener\";\r\n\r\nchrome.storage.sync.get([\"moodleGPT\"]).then(function (storage) {\r\n const config = storage.moodleGPT;\r\n\r\n if (!config) throw new Error(\"Please configure MoodleGPT into the extension\");\r\n\r\n codeListener(config);\r\n});\r\n"],"names":[],"mappings":"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","x_google_ignoreList":[1]} \ No newline at end of file diff --git a/src/core/code-listener.ts b/src/core/code-listener.ts index 196674b..6a6a262 100644 --- a/src/core/code-listener.ts +++ b/src/core/code-listener.ts @@ -45,12 +45,13 @@ function setUpMoodleGpt(config: Config) { .map((e) => `input[type="${e}"]`) .join(","); const query = inputQuery + ", textarea, select, [contenteditable]"; - const forms = Array.from(document.querySelectorAll(".formulation")); + const forms = document.querySelectorAll(".formulation"); for (const form of forms) { const hiddenButton: HTMLElement = form.querySelector(".qtext"); if (config.cursor) hiddenButton.style.cursor = "pointer"; + const fn = reply.bind(null, config, hiddenButton, form, query); listeners.push({ element: hiddenButton, fn }); hiddenButton.addEventListener("click", fn, { once: !config.infinite }); diff --git a/src/core/create-question.ts b/src/core/create-question.ts index bc14b38..7a61b3c 100644 --- a/src/core/create-question.ts +++ b/src/core/create-question.ts @@ -21,7 +21,7 @@ function createQuestion(config: Config, questionContainer: HTMLElement) { ); } - const finalQuestion = `Give a short response as possible for this question, reply in the following question langage and only show the result: + const finalQuestion = `Give a short response as possible for this question, reply in the following question langage and only show the result: ${question} (If you have to choose between multiple results only show the corrects one, separate them with new line and take the same text as the question)`; return normalizeText(finalQuestion); diff --git a/src/core/reply.ts b/src/core/reply.ts index 97b61b2..2766887 100644 --- a/src/core/reply.ts +++ b/src/core/reply.ts @@ -33,11 +33,18 @@ async function reply( error, }) ); + const haveError = typeof response === "object" && "error" in response; + const isAbortError = haveError && response.error.name === "AbortError"; if (config.cursor) - hiddenButton.style.cursor = config.infinite ? "pointer" : "initial"; + hiddenButton.style.cursor = + config.infinite || isAbortError ? "pointer" : "initial"; + + if (haveError) { + if (isAbortError) { + //TODO: We need to inject back the event + } - if (typeof response === "object" && "error" in response) { console.error(response.error); return; } From 8574b730010c72b66baa0599960f886f823115cf Mon Sep 17 00:00:00 2001 From: yoannchb-pro <71560747+yoannchb-pro@users.noreply.github.com> Date: Mon, 19 Jun 2023 23:08:48 -0400 Subject: [PATCH 03/35] v1.0.3 --- src/core/create-question.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/create-question.ts b/src/core/create-question.ts index 7a61b3c..c1188c1 100644 --- a/src/core/create-question.ts +++ b/src/core/create-question.ts @@ -9,7 +9,7 @@ import htmlTableToString from "../utils/html-table-to-string"; * @returns */ function createQuestion(config: Config, questionContainer: HTMLElement) { - let question = questionContainer.innerText; + let question = questionContainer.innerText; //TODO: textContent better for reply ?? /* Make tables more readable for chat-gpt */ const tables: NodeListOf = From 5c4581bf2da11662636d2403f1e32f17a94f8df3 Mon Sep 17 00:00:00 2001 From: yoannchb-pro <71560747+yoannchb-pro@users.noreply.github.com> Date: Tue, 20 Jun 2023 12:40:43 -0400 Subject: [PATCH 04/35] logo and title/version same line --- extension/popup/index.html | 50 ++++++++++++++++++++------------------ extension/popup/style.css | 7 ------ 2 files changed, 26 insertions(+), 31 deletions(-) diff --git a/extension/popup/index.html b/extension/popup/index.html index b602152..bbb74f3 100644 --- a/extension/popup/index.html +++ b/extension/popup/index.html @@ -19,16 +19,18 @@
- icon -
-

MoodleGPT

-

+
+ icon +
+

MoodleGPT

+

+
@@ -70,20 +72,6 @@

MoodleGPT

Settings:

-
-
- - -
-
- - -
-
- - -
-
@@ -102,6 +90,20 @@

MoodleGPT

+
+
+ + +
+
+ + +
+
+ + +
+

Message

diff --git a/extension/popup/style.css b/extension/popup/style.css index a65f7cb..93df10a 100644 --- a/extension/popup/style.css +++ b/extension/popup/style.css @@ -37,12 +37,6 @@ main { img { width: 5rem; - margin-top: 0.75rem; -} - -.title { - margin-top: 0.75rem; - margin-bottom: 0.75rem; } a { @@ -79,7 +73,6 @@ a { .line input[type="checkbox"] { accent-color: var(--btn-color); - margin-right: 0.3rem; } .col { From 00edfb5d298b31e5fa79f5defc2c91e90c0af424 Mon Sep 17 00:00:00 2001 From: yoannchb-pro <71560747+yoannchb-pro@users.noreply.github.com> Date: Tue, 20 Jun 2023 12:44:45 -0400 Subject: [PATCH 05/35] better update checking We now check if the new version is upper --- extension/popup/js/version.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/extension/popup/js/version.js b/extension/popup/js/version.js index 030532c..dd745a7 100644 --- a/extension/popup/js/version.js +++ b/extension/popup/js/version.js @@ -42,11 +42,20 @@ async function notifyUpdate() { console.error(err); return currentVersion; }); - if (currentVersion !== lastVersion) { - setVersion(lastVersion, false); - } else { - setVersion(currentVersion); + + const lastVertionSplitted = lastVersion.split("."); + const currentVersionSplitted = currentVersion.split("."); + const minVersionLength = Math.min( + lastVertionSplitted.length, + currentVersionSplitted.length + ); + + for (let i = 0; i < minVersionLength; ++i) { + if (parseInt(lastVertionSplitted[i]) > parseInt(currentVersionSplitted[i])) + return setVersion(lastVersion, false); } + + setVersion(currentVersion); } notifyUpdate(); From 9c6068df365212d3e629c22495b8a6b821f57601 Mon Sep 17 00:00:00 2001 From: yoannchb-pro <71560747+yoannchb-pro@users.noreply.github.com> Date: Tue, 20 Jun 2023 12:47:20 -0400 Subject: [PATCH 06/35] v1.0.3 assets mode/settings/popup --- assets/mode.png | Bin 10478 -> 9257 bytes assets/popup.png | Bin 67408 -> 52676 bytes assets/settings.png | Bin 17401 -> 10441 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/mode.png b/assets/mode.png index 383c76e3fe053eac707602b1a7c8e2b8e5b58a9c..74050212f75d412a22732dc20972c7cf891d1dab 100644 GIT binary patch literal 9257 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 literal 10478 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 w9j8>_F|X|ZvcNFn7RdrNql`JFv1J#t*fB*mh diff --git a/assets/popup.png b/assets/popup.png index 05517f41769a0720b6cf6e7a7889e8c7783c0c99..673dcab7b09294c0de73b09f24258faf490b5102 100644 GIT binary patch literal 52676 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 KelF{r5}E*qLTW|; literal 67408 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 P2mF1MR0P$0Fbe)(dTJSm diff --git a/assets/settings.png b/assets/settings.png index 2ad2976ff0097fb0afa9cf3558a2b7a43a2e6753..d85e836e6832d780eb5ccb61720a50a53538d71e 100644 GIT binary patch literal 10441 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¨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 bVfx^vBAs-B$u6{1-oD!M Date: Tue, 20 Jun 2023 13:24:19 -0400 Subject: [PATCH 07/35] webstore new assets --- webstore-assets/banner1.jpg | Bin 0 -> 255416 bytes webstore-assets/banner1.png | Bin 170414 -> 0 bytes webstore-assets/banner2.png | Bin 0 -> 49880 bytes webstore-assets/banner3.jpg | Bin 0 -> 192007 bytes webstore-assets/banner4.png | Bin 0 -> 89259 bytes webstore-assets/icon-128x128.jpg | Bin 0 -> 19443 bytes webstore-assets/icon-128x128.png | Bin 11245 -> 0 bytes 7 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 webstore-assets/banner1.jpg delete mode 100644 webstore-assets/banner1.png create mode 100644 webstore-assets/banner2.png create mode 100644 webstore-assets/banner3.jpg create mode 100644 webstore-assets/banner4.png create mode 100644 webstore-assets/icon-128x128.jpg delete mode 100644 webstore-assets/icon-128x128.png diff --git a/webstore-assets/banner1.jpg b/webstore-assets/banner1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8ff3013b82a6e7f72b7dfb63892f7199b53c04b8 GIT binary patch literal 255416 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 N`i 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�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 z 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 b_y73o9~NT2ntl=ZMc@~K|JDS~{+#+>yx?b% literal 0 HcmV?d00001 diff --git a/webstore-assets/banner1.png b/webstore-assets/banner1.png deleted file mode 100644 index 11f52e1117d3368016c69ccda6dffad0437624c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170414 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¨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

guXjQ5o!e@OyvEi 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 z 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 literal 0 HcmV?d00001 diff --git a/webstore-assets/banner4.png b/webstore-assets/banner4.png new file mode 100644 index 0000000000000000000000000000000000000000..d46fba303df73d515d2af03a18880a8b2ec35030 GIT binary patch literal 89259 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 Ta`RIy;Hs!8X)2Z}SYZDTq*ZUz literal 0 HcmV?d00001 diff --git a/webstore-assets/icon-128x128.jpg b/webstore-assets/icon-128x128.jpg new file mode 100644 index 0000000000000000000000000000000000000000..64ba0f6ac607f5faf85633a822111d18a3f016ed GIT binary patch literal 19443 zcmbq)bzB@xx8@+h0)fHZB{+i0Dz6Hv!k+^=Z-?yFG@vZT<&SJmG*k=EdKmH>d{!144M|N|zcYdq$^&i<$Raxv!Hhz;o zn*A5q@W04L_KyG5k9?~mU}Np_Ph0=spB|%{*n(Bwa-_GN7~lj@21o%!|GECR<2Tr4 z0|30&003Ofzsn3$0Dy)d004jK-(}Q40RZ$s0HA*S-(~;4C-w%82LE9W{w;+yH3a}J z3IG5!O#lFE0suhK{tw+-^5680{7pst)-Sua%?w}-FaeMQWB|4RBLK^r#13EsfB@XD z%K)*r$NB$xB zI%-klx06U=0I+Y>-tfPyA|WEfBcQx{D}B=o0{?0AKa9d6!NViIJx7=~^9YClq&KU` z*c3RFxF9?#UJ+Nfx_W#Xc5Yf8B_nDMQ5AJ#hu0+l>RWGNfp9>8Fre_+89K8$`Jb4M zejj#rK}j%H0MdwOp}> z8=Np{5xT3m#aJLzAJ@eMEy>B~Vk+S@4$TdBE(kF^h{d)}UO07Yl26Xa98@g1R1o8_!lN)|EMUl8nv%9d#O zEo#e+OkrHHJpR2Kp&f*jAC*mXw7*|l3QSjw@|ct?vvqv_X>_DTug&<#4D7iA8FWc1 zsXW_JCXsd(oe^>@!0FpDcAHh*xlAgQZ1YT75^e}r+p+$@yuJz1 z!?uq7Vf+fnOIKr95o{=%iq+VBfhP0yWn=rW0klU)k9>7^fzN?1CTVL;3=ezq7{Tv19n! z*iALJj2b5POAwKWeG<(XOI;JeNxy)eft^OF_{fwg1qFO>KWQg`2an31?)oxT)-l1J zy`?6jfv(v(xY?l&MredZn;2@24AL`hyIK&$?XE{E^)80G4==8Nw6s;!`K^R%yS5a~ z7=oJ015$qcEgeO39brJAe$m?8Lp87;4EWw#{{VLT6=z>s13I6t*>06a-~1qo1OBcz zD`C`4CyDwq_!S_W$XC5ordE+)w>^fzAHNmh>}`ds(+LM9yl%)PF5Izdg(^wuQcj*( z`JwFCdowV2<|GYKLbQbyyz`q2G4J#o8AJ)YKPhYkk-qQfa+V?XNJJ14MpLj-KtjjZ zxEt|lqnUcv;`h!#ne09Lq#}kX3a`X6Ja(V#0N-=3FO*6AA~~X7D<)w-XokSwGov0f zdJUE*YdWnk!LM3a;dB-S>FjsQ>&&;0C;rUC;N*x5-xYWIYzTSyCVDd6JLPvr-AGo^TT*QcYyXFSxj)xGeuM`(up7 z{%r%!k7@6Peoz4%J!~vuHAhrX=KHv#?ML@NX$>FtNC+EX>TL8T zwjD_N`M-wn)IS$}Q)h3(+LbMy=KWe?tSPS()EAUsPmHU@)p*8SHi>^w=-zdj?b02vcPtXu-pg;5Ue(;2I2uNklZbUFVspEp!qM$^Km zu}b~=UaL=fq~OLM|B^%aE_&pJs>}~uGP-$L|FG&a>+8lN0lX|Lx1na|{HT<=2O$;} z^!}X>dPmCSz!_^Y#6~Fr%uN^d%TrXe`dJesCj$%4D+^mD#YQr8$dzV<>XaD~W(8M4 zJY=O9B{3?485by8Pm|o&5p!gW3I+z5X>!w-?6~~U^QnaCtG8u+`QZ~-yT3(!3?%Uf z)l;Uyh(3=!OE;1woDKIr*93?pk83PRd_bdM3;^t}bRy)t7@;ETylt)W>9T!)%2s?w2aU@EtBF z2vE8SEq7KdYOJcaAGKk0+mY7-?1`(ZNC5SBD-=YVT;yl5P*dxsQK<~lW$FUe>3g1= z|0W^!ne#S4E;TiUk+%s?Kx9TmNrW=7BH80}E4bZqpD0tx+&72oIHeCdqu5|6AQ0)g zmavA^wB0!i>odY=11Z!zYtN2&BPGtsBMNpd9ixx4qaOYkCUiCN(O&7hs%`mEwQW)V zi3|a=w2L*uEjRr2iT*eaD~w>cLczW0hWnG8pPa5^l>P-0wm2E)C<+7DX551B@3<$iIjq9^`nh?;qR?{S@QuKuaOU* z30Yo*W%qtLQ)bd0_%?Kc9Tg=%T88rDbJMj!{IDw1VzuPaV(pwMr`5{%>uBo zrO%9R7!qoR+0obTaP&tJC;4FO1y+^e;8{x~VRC%|33@%zYE)N->~_bt6yAM?Av4BP zk?De8rtucwo&wv(^Cx>1T9Vt=1_{%GAt7LfYdXekSc?2AHL@rV%R zbaHn1qd78{o~kWv`QXe4`?j@%fv8KsF5Hp3fR}~{uPkv;ng0clfSLU zonMFhQ7zXL3#p4!pFIqPfPZuc3jCX5IKav$Et+1(`|u;Rx^yaUsIhTkX`I+0pRC@S zIk-k!h=5Z(m}~N2He3-Ry(gfVKA_h(;4Bd{2Lc8dFAtVlFP6f8`|PjUxg!v}cNvTn z)r$QnN)Pvb%G8ur-;}DOt*1vE23vX_{hK&^eP`RYm)uEBbhB{|8dU7P?l3O-rC&<| zu(u=-izF;vOSuGG-Aa;tvRl`KWPMo!=sEsZ&JKiYqdERa_os?8&5(!3lLP|%* zS~X6E6nEeGwyH@`#B8L!j_nP60J|Kfch53Bb9*3U2oZI2}dqf z*4^h#W_Fb&GlC*QbZGlx+L5q40rDsfBw@63!v?9f3gVzLZ4Il%#X#TF|v+bz-LO zFy90A>hZ-~qe5TAM`301SQRw`YWUB3g5N_;X+4MftgD|w;>T?r)W6nx2`>=b|N)FkVY309b zh5h=ovAsT(>m{~f-6$rauavpVa<3iJy=+DhJJv6p+6Ga~4NxH2Piow$OI~oOne@ln z%P>Lb5Qr>+XiSFusXI#-6-hseJh@q%w zHyjX=45Hj)z|=JL!aJ=wBq3now=Vm2wX(A8+Z)Y+Q5?#RrrI+yo|_cvRnT$o6$~Fr zDG0JU9ad-{ay@-A$B1^*kV(S&vh#;qNE!9 zRc~OE3$0v~Qlj*}weM|20)?oJZ>$WMluMm^^SD4^Tkw-NK#r%bBHsH$Os{>g z^WQUz1@yMw(DLPXrlUDev~5N%DCoB zqgi3<92r~hU{E= z=lW`=b3Hb#`Htlt3{d(<@lvwByU+5e#2q-r25!C0^VSY$i;G?XBRDUjgMZ+A>v$lo$7hw>DH^nfY0SoLng=@|xU) zbmL*EkNlZ^O* zrf!+xkkk!Tyap?Doc~5Fl1DoUw7BxL$d+DyQy)7M@TG?!8P2^rF&jeu%L6EbNwuSJ zWkEbJF48`qM761t6P7M{!__3ij-hbyy(WFjKr^t+6GvfYt6Q`rlQVgvrRgu4j|p;g zRypQbf5XeBc;|Ttm5SDyw<2|&saWz3IDH}_V~ zz1P`S&i{r>KAE`gD8xI%clwk~Zv`xD1&K(6|IpcJ3TMT%Vfkak{76@KR-u`@Y*}qK zmkCdb8o=lHuzgc3K)X!8nutqwIO`o`L_{;l{CzjFl8>~$rH1_h>YlmHwp4m8Kj5^g ztBZn4q!VhrFB|7p=7BWz*R;xPet1C9Z$Ngk&BSaV^pEE>4iP)$9VVAHu2QNRy{u@A zQzk7Jbh8dK)$OvLW65^k&cXBe+h&`3V{dX7Wun8Xn1!l1k?mUjpH1#Kw|9wWwaogy za<#~ex_SNT23O~2{$91GX72{oVuPqWzQnQ-=XchXo(~Xw79)P-sl`d)+H|c?wZYva zSMBq$;k`P^MGe5MJ&JK7Hx&-N#yW_qr_+g#5_mm?&^o zC()W=^fYqFeF#dUI}zGpKzBgGe}|e6~-{jbVnZkgY|9YbC7Yuy&0=rrd@I8Kw4_@B)T_jFG@!xYW)YswBzF-j zNDLtGIZui{R5QUDrKGdJHm1-R60|e4;|>>LWZ!`1uutIsONJowL`f%+FM?8_j4NQ! zrZ^41Kr+Q}baK2l0T^xNi&b-^>Q%(KjV(pr|cMN*r5kNC)lxVZet$X#gY)5ys97A4hf zW_x&HXmN39Xn1jP8xSbWP+W2+F8)+padB{X+yCe`c)P%X9l@Sd>$N(A3nsv4xKPq7 z4P2=<4M{6u`-)90ZAsvRdcKReuUPmBuxVlEOPEdN+Vydll#CGUHx0AULjDp>aUQ#G zm?yu2-|mVlT4iF~ynNK3l1uA8YLzx~8+_Uwdt-|lhGP|9;FVfYJ;gQ=bxr{YdSq}h zT#{kv=g1ZJ=tQa4?>Wy)PA_a#xc8~w@D^>lx)*F(Ld1eWUoo^Y#oB5u;!+!?O3>m* zqWV~1e@#HAL8PkIk&+78v3&)2^_&IY{no=TY3mco%=gwwLhEd(T_OFgoP+OJb`!JR zEQ(#>q(MLDF=R73$sw$8w`Wp)-KqH@{>RjY&gg{F~0I8zm<2 z5sN92G4rDjS789ivCTP7n`G=!c z!I(&17=ij&&W|v%fR`BWjPe*Xbo(@@X_x z{GO@^D%)Hcl)>vsYPJ9cDVtSO$GX6Zjv1l9IfO{uiIiNrF$xCbu{zTh(?izd^%0IMgW@T0$OQ^FQ*R##7Woe98Ln_) zC=CcyaC&e%xY4iI?J69#rSYtnOF4n_f_!RSv1__34lQ2etvM}803$(_$6PslwNY)x zp#@k#JQ5#q{^3*o&rD=oGizt$>fY!nF?;TKI7ADxyK%H~J2R(weYTM$#<@-uS{D8_ z#l++Q7mR)a$noNYeKhU`Do*pDOxPDqq_-vQFpI{Ng{&H?p`>&nfzW`T-8loUpwrQp z0uNp0KkUuD?t3JWXNZ`I8pPE*e3TLt1>ezH$=kh*g}u_=Ll{h(>Lf?!pKC6PM+1Ml zSaX|FuHT^_SuG>-u;b`v<~&d>Wds;F>BPIoUsu!A3rNY>kWQjDdf|_y(fnoTHsKDD zvivKMGYV5~<*9xnK+rPSl8@tej-!n;W)g%Y^RX1Ovz83~S`^iA!^1-h-w+-iv5SLu5gwiuB%!#|D(2&J{P@oj zX!^KbXZE@23=wOu5VxB5rHN@-7EiaHX=edJX*o}e+5NLdJH+;xx^~bpQ3E$X^&1n; ze)ES9AuG|g-mP8L+9Wim=a)HViY)S>Q1Vj-X`&~t^ywa}9cq--ATaeY3|io0AvqKy z;A7Nz^S7ZjES~JbX0nD*ECjJS2+@GFi4?58WYBZyWf#-;s-ZG9zJr^_C`&$0_2ZfV zI{g3#+pYaMy5()H_RgzQRS9L-?UwJ_o=qahdRikNA$8##m< z%hdAc1FrQ_;TN*qKxX7BnZ%y~=RT)v;d5xr@`~xD089l4bXyEIc?VxK zkV7?}3ZBzxZLZ>%x{8$tFOG9vJ?@Qi!XaT>IdRx!?#I3@C=4d~kYiy_f5IyOfAxS{ z@a*qgan2=PL(>u}+yvL|>`gSAUOh`arB%A~ZO3$-Qn}jn zyT!S=Lot4rPu!mx7AsuriQn76Lu;Wcd!CXU#mAbI{9^&J7I7xxG2HbE91A5gae57K z8@Y*#46lHm@2b7k;~69#vAUDsz2n*KaEJz!zrFAW-((fFdTN6fqP6-(n45hX1XhsopUW%mh6#e*M08qQX? z`{URWzE&&&V>rt68Xozi_hh3M?Y985aXJLjv4#V2D*EcGQgpq{qt}XPt(ku+ z6@q5`eKbXkv9p(;YNf=~N>2*jY5I-o{I;n`Y%uqY$Q81=~CDx`UUiMSJvy9I8Q0BnqY zhOwn3RrWPqOiud`5*fLRbJIfHZK^p~!wFhRj1Gf%)KH2g!Hnf#sfSRGGa6X-kFigZ_J*Ul>b;YZ-hQW&2Bm;P4gOE#>(qOf9CO*xAnwTSjS$UwY-% zVV~p#=fQ!yQmxAn{4g(|mWKG3TQh)U26-DK`7I7U`OoEK+L5 ztHx*Wc%yHR;bb=Ndz*y+@4Sf}5txHao%d)sts3kAMu9u9X=tbCE8rsXOFMri;;xoR z`reRC20qQ*#LUIdWsHOJYYP}y?ARsVw+Ttf@CIna@}3cKQ;Eo>%rOeR8cpQn+@~kc z>`2UxiYUHa?V%UkF&qi$ut9sr~g{Lo5a~FpcX14KWC;sjz z?{3$;$UH3mg>u@ZU?P?VGTyOh(hW-#4^2o()3Ml`*|b2r&Q$GHVm4UxK;SamagG6Nx_lD zxllc+s3uK$FqZl$EYjCw}hQbm=_wfkKoJvc3XE^3S}AKwgN0&ectb=qDAonhx^nLX%| zl=8({9GWZ?k5pBML`|4p!<)rwc{9u!necIW3y&CbhDKM!S#QP!CFt!IPQ!Icz0Z}6 zR6-G-^e+a$-(c)_7$t2-?Sl2$cz7P<_ZE7F)7fWj4N}F$IS1n6+QG)dk=LAB-lhi( zWhSahOC=t7b~=>~`pC%o4Qg&3WSX|POVuP~0%j+_y(Dw+Bl1d#Pu<8AdAEBFKJ5Bq zr?xCIF_AHzS{bYA&&_pV44RaCC7el9X)n)374^oY#FL<6JEcQqbNsDwOGXN34WwgC zIVsGc``F3*F=mZ$T77i_v!}$X#9s9rE|-5yEL3BNG#|iBUt2X&^IDAzGxCbNki#s~ zVP^wllTkyVpp*uk{BF9I?4Y9V!^>sj(WKD_*AQkW-JiJ`H~Z8U$e45a^1s<}1!5BU zCg?l^x5%X-fYFbiD}oi_sg#?T8i>gXXM zp^vAHr_pLPW-xiiGtv8FvedyaxrCu+tl@$QL#{N!3~U6=6s>$Bi*-xpiXR-X6{Mm35!9~lJEsp3mO1V;OdCKDkO z!{5BczsrydWF&4Jc^~m+@qIm?S(650BiawyS$qi}{2qi-e&KK))b}=3XBhp=Gnq6n zSxNkA43?+|oid)H3`xUEE(C%k(56q_(s}nI56f$o?k+6NR&+m&-{lKxjl+$XaQs)L{qU= z4w1%CZ2Ee4{SCRa=Sc;wMkj1JcrW`n&iykcI;>7@#poren5Yi;B-!e3{0Y3rmHjo_ z7I4%HQ!pWjDa)Z{D;W_&e4e?@Je0B+!!8ggQvI1S7Mw_UR_TedA@fox#t0$o0@LSm zl^exOQfh>0h(OMVx+rN(T?<&46(9=yO+apqSAhSwCM)+(TH<&qd!q%_(!IeCb05=) zsZB^DX}Xi@9x9xuOM7vR!vDInP?4B$Y7MGb88nFhgrb!psnaVNePHq8ll^$|jcQ7< zaH@?1zb||ge_cY);!(IyvNpr2bn?KJCGMMtVU$~*wme7UIHk@oOzxuQn1^&8(_Kxm zub~&;dAnzUY*FUemioo`?(yuE_A6kCXqeJ$E9-RoThS~z((^AI0kG@_k~znR!81W9S|ql&^W0z;a=NA&mFoyc<>3(ky^#+RpSpHS`4UZSZhtJUvW zul&DJaS4-UJ;|A%DqOt+7GZ^70S@a4a=NG6*mx!c9-c`ls)8S10bj~}O&WvHbKi%J zHLJDA5ACERFe4+!lp7pL9PYHml8hefewen&-5%k$rr~V>p4Q@~`lxb4kG7?qJyD7l zAL$j<8K1GfaZ)At$}oY!$9>Ib-H;M(S{fX^ABTovi15&jp5nsTGD}ZTUdl&T5FqP{ zF+;Z8Ea)08ZF|`E&kXKUsu>+3X>1_D?fXfaRY_0~)p@M0=I^Z-q}u>EvB6j|HcNjf zcQ?V6{x-h8V@ue`W2;!!;SHqk>x6+eS$~k13G;Fza9U~j&MM%+vragb;YFFE>FiRD zru!L=N=jo~onmUu`mq7J9xe55;uY}OT&XbPWQtv?x|o5lFcWV*?wV?#1aw)^?@+74 zh*a9Lzt(TLh^bE@c%x`diXapNXqwG)q*b;F0HSw0Txo2-C#%={v{$wU*2vW?TbwYv zg+Nd5jSQKo?hYrQC7Zm^tp0qpbE1N(T}J{3-PCVeMWG=xdF?B9 z{_{=zftQl~q2}?x_;cUf--4S3>TXn4Oyw*%*(Q3K<%0AH@wFPe8hQy!y`aBgjOe?@ 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 VBTk$Cqt1?wj*gCwj*gDM|Jk9a0&D;P literal 0 HcmV?d00001 diff --git a/webstore-assets/icon-128x128.png b/webstore-assets/icon-128x128.png deleted file mode 100644 index 36673070904d957d85c7a829d39f938e785d9658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11245 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 Tp{D-N-vtz9)ntB2nTGr?mTW_* From 706dc315f86385b35e7e304fcc461b5bc7331555 Mon Sep 17 00:00:00 2001 From: yoannchb-pro <71560747+yoannchb-pro@users.noreply.github.com> Date: Tue, 20 Jun 2023 13:27:25 -0400 Subject: [PATCH 08/35] webstore description text --- webstore-assets/description.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 webstore-assets/description.txt diff --git a/webstore-assets/description.txt b/webstore-assets/description.txt new file mode 100644 index 0000000..4bfdd5f --- /dev/null +++ b/webstore-assets/description.txt @@ -0,0 +1,11 @@ +MoodleGPT is a Chrome extension that allows you to enhance your Moodle quiz experience. With this extension, you can hide the CHAT-GPT feature and effortlessly solve quiz questions. Simply enter the code provided by the extension and click on the question you want to solve, and CHAT-GPT will automatically provide the answer. + +This extension supports various question types, including Select, Put in Order, Resolve Equation, One Response (radio button), Multiple Responses (checkbox), True or False, Number, and Text. It also provides different modes, such as Autocomplete, Clipboard, and Question to Answer, giving you flexibility in how you interact with the answers. + +To use MoodleGPT, you need to set it up by loading the unpacked extension in your browser's extension management page. Enter the API key obtained from OpenAI and a unique code to activate the extension on your Moodle page. You can customize the settings, including the GPT model, cursor indication, title indication, and more. + +MoodleGPT v1.0.2 simplifies and accelerates the process of completing Moodle quizzes, making it easier for users to obtain accurate answers. Download the extension now and enhance your Moodle quiz experience! + +Github: https://github.com/yoannchb-pro/MoodleGPT +Donation: https://www.buymeacoffee.com/yoannchbpro +Icon credits: Mortarboard icons created by itim2101 - Flaticon \ No newline at end of file From 7e521a50c24181dd846db0c1288996f2f287461c Mon Sep 17 00:00:00 2001 From: yoannchb-pro <71560747+yoannchb-pro@users.noreply.github.com> Date: Tue, 20 Jun 2023 13:30:59 -0400 Subject: [PATCH 09/35] buymeacoffee icon --- README.md | 3 ++- assets/bmc-button.png | Bin 0 -> 24415 bytes 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 assets/bmc-button.png diff --git a/README.md b/README.md index 8d28051..c3af7c3 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,8 @@ I hereby declare that I am not responsible for any misuse or illegal activities ## Donation -Will be a pleasure if you want to support this project :) -> Just right [here](https://www.buymeacoffee.com/yoannchbpro) +Will be a pleasure if you want to support this project :) +Mortarboard icons created by itim2101 - Flaticon ## Update diff --git a/assets/bmc-button.png b/assets/bmc-button.png new file mode 100644 index 0000000000000000000000000000000000000000..464bfd969dc1265095cc53628f71f97146d325ed GIT binary patch literal 24415 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 literal 0 HcmV?d00001 From 9ad9d87c383754b858df2c5d288a3c8776287bf0 Mon Sep 17 00:00:00 2001 From: yoannchb-pro <71560747+yoannchb-pro@users.noreply.github.com> Date: Tue, 20 Jun 2023 13:33:08 -0400 Subject: [PATCH 10/35] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index c3af7c3..06df153 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,7 @@ I hereby declare that I am not responsible for any misuse or illegal activities ## Donation Will be a pleasure if you want to support this project :) +
Mortarboard icons created by itim2101 - Flaticon ## Update From 0e3ddf566bb574820ec06711e5d3f3226f3054fc Mon Sep 17 00:00:00 2001 From: yoannchb-pro <71560747+yoannchb-pro@users.noreply.github.com> Date: Tue, 20 Jun 2023 13:38:48 -0400 Subject: [PATCH 11/35] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 06df153..88dd851 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ I'm actually waiting for a review of my extension. It should be available in som - [Chrome Webstore](#chrome-webstore) - [Summary](#summary) - [Disclaimer !](#disclaimer-) - - [Donation](#donation) + - [Donate](#donate) - [Update](#update) - [MoodleGPT don't complete my quiz ?](#moodlegpt-dont-complete-my-quiz-) - [Set up](#set-up) @@ -42,7 +42,7 @@ I'm actually waiting for a review of my extension. It should be available in som I hereby declare that I am not responsible for any misuse or illegal activities carried out using my program. The code is provided for educational and research purposes only, and any use of it outside of these purposes is at the user's own risk. -## Donation +## Donate Will be a pleasure if you want to support this project :)
From 5b1608c5e8565d82e5b432b206dfbc9272ad42eb Mon Sep 17 00:00:00 2001 From: yoannchb-pro <71560747+yoannchb-pro@users.noreply.github.com> Date: Tue, 20 Jun 2023 13:39:00 -0400 Subject: [PATCH 12/35] added donate and need help link --- extension/popup/index.html | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/extension/popup/index.html b/extension/popup/index.html index bbb74f3..caa943c 100644 --- a/extension/popup/index.html +++ b/extension/popup/index.html @@ -109,13 +109,30 @@

MoodleGPT

- - See the documentation - +
From 68e7c07d4fda6bc4b0019390369f495b953b797b Mon Sep 17 00:00:00 2001 From: yoannchb-pro <71560747+yoannchb-pro@users.noreply.github.com> Date: Tue, 20 Jun 2023 13:54:34 -0400 Subject: [PATCH 13/35] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 88dd851..1852ace 100644 --- a/README.md +++ b/README.md @@ -99,7 +99,7 @@ Type back the code on the keyboard and the code will be removed from the
![Injected](./assets/title-injected.png) - Console logs: show logs into the console.
Logs -- Request timeout: if the request is too long it will be abort after 10seconds. +- Request timeout: if the request is too long it will be abort after 15seconds. - Typing effect: create a typing effect for text. Type any text and it will be replaced by the correct one. If you want to stop it press Backspace key.
![Typing](./assets/typing.gif) - Mouseover effect: you will need to hover (or click for select) the question response to complete it automaticaly. From 6f40acd45f4c4aba5691d29d3efe4740a9a09a91 Mon Sep 17 00:00:00 2001 From: yoannchb-pro <71560747+yoannchb-pro@users.noreply.github.com> Date: Tue, 20 Jun 2023 13:57:36 -0400 Subject: [PATCH 14/35] adjusted the abort to 15s and fixed can't click back after error --- extension/MoodleGPT.js | 19 +++++++++++-------- extension/MoodleGPT.js.map | 2 +- src/core/code-listener.ts | 9 +++++---- src/core/get-response.ts | 2 +- src/core/reply.ts | 15 ++++++++------- src/index.ts | 2 +- 6 files changed, 27 insertions(+), 22 deletions(-) diff --git a/extension/MoodleGPT.js b/extension/MoodleGPT.js index ae22952..03a0422 100644 --- a/extension/MoodleGPT.js +++ b/extension/MoodleGPT.js @@ -79,7 +79,7 @@ function getChatGPTResponse(config, question) { return __awaiter(this, void 0, void 0, function* () { const controller = new AbortController(); - const timeoutControler = setTimeout(() => controller.abort(), 10000); + const timeoutControler = setTimeout(() => controller.abort(), 15000); const req = yield fetch("https://api.openai.com/v1/chat/completions", { method: "POST", headers: { @@ -139,7 +139,7 @@ * @returns */ function createQuestion(config, questionContainer) { - let question = questionContainer.innerText; + let question = questionContainer.innerText; //TODO: textContent better for reply ?? /* Make tables more readable for chat-gpt */ const tables = questionContainer.querySelectorAll(".qtext table"); for (const table of tables) { @@ -369,10 +369,9 @@ error, })); const haveError = typeof response === "object" && "error" in response; - const isAbortError = haveError && response.error.name === "AbortError"; if (config.cursor) hiddenButton.style.cursor = - config.infinite || isAbortError ? "pointer" : "initial"; + config.infinite || haveError ? "pointer" : "initial"; if (haveError) { console.error(response.error); return; @@ -407,11 +406,15 @@ if (handler(config, inputList, response)) return; } - /** In the case we can't auto complete the question */ + /* In the case we can't auto complete the question */ handleClipboard(config, response); + /* Better then set once on the event because if there is an error the user can click an other time on the question */ + if (!config.infinite) + hiddenButton.removeEventListener("click", injectionFunction); }); } + let injectionFunction = null; const pressedKeys = []; const listeners = []; /** @@ -457,9 +460,9 @@ const hiddenButton = form.querySelector(".qtext"); if (config.cursor) hiddenButton.style.cursor = "pointer"; - const fn = reply.bind(null, config, hiddenButton, form, query); - listeners.push({ element: hiddenButton, fn }); - hiddenButton.addEventListener("click", fn, { once: !config.infinite }); + injectionFunction = reply.bind(null, config, hiddenButton, form, query); + listeners.push({ element: hiddenButton, fn: injectionFunction }); + hiddenButton.addEventListener("click", injectionFunction); } if (config.title) titleIndications("Injected"); diff --git a/extension/MoodleGPT.js.map b/extension/MoodleGPT.js.map index 2716d7d..ccb220c 100644 --- a/extension/MoodleGPT.js.map +++ b/extension/MoodleGPT.js.map @@ -1 +1 @@ -{"version":3,"file":"MoodleGPT.js","sources":["../src/utils/title-indications.ts","../node_modules/tslib/tslib.es6.js","../src/utils/logs.ts","../src/utils/normalize-text.ts","../src/core/get-response.ts","../src/utils/html-table-to-string.ts","../src/core/create-question.ts","../src/core/questions/radio-checkbox.ts","../src/core/questions/select.ts","../src/core/questions/textbox.ts","../src/core/questions/clipboard.ts","../src/core/questions/number.ts","../src/core/questions/contenteditable.ts","../src/core/reply.ts","../src/core/code-listener.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Show some informations into the document title and remove it after 3000ms\r\n * @param text\r\n */\r\nfunction titleIndications(text: string) {\r\n const backTitle = document.title;\r\n document.title = text;\r\n setTimeout(() => (document.title = backTitle), 3000);\r\n}\r\n\r\nexport default titleIndications;\r\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.push(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.push(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","class Logs {\r\n static question(text: string) {\r\n const css = \"color: cyan\";\r\n console.log(\"%c[QUESTION]: %s\", css, text);\r\n }\r\n\r\n static responseTry(text: string, valide: boolean) {\r\n const css = \"color: \" + (valide ? \"green\" : \"red\");\r\n console.log(\"%c[CHECKING]: %s\", css, text);\r\n }\r\n\r\n static array(arr: unknown[]) {\r\n console.log(\"[CORRECTS] \", arr);\r\n }\r\n\r\n static response(text: string) {\r\n console.log(text);\r\n }\r\n}\r\n\r\nexport default Logs;\r\n","/**\r\n * Normlize text\r\n * @param text\r\n */\r\nfunction normalizeText(text: string) {\r\n return text\r\n .replace(/\\n+/gi, \"\\n\")\r\n .replace(/(\\n\\s*\\n)+/g, \"\\n\") //remove useless white sapce from textcontent\r\n .replace(/[ \\t]+/gi, \" \")\r\n .toLowerCase()\r\n .trim()\r\n .replace(/^[a-z\\d]\\.\\s/gi, \"\") //a. text, b. text, c. text, 1. text, 2. text, 3.text\r\n .replace(/\\n[a-z\\d]\\.\\s/gi, \"\\n\"); //same but with new line\r\n}\r\n\r\nexport default normalizeText;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\n\r\n/**\r\n * Get the response from chatGPT api\r\n * @param config\r\n * @param question\r\n * @returns\r\n */\r\nasync function getChatGPTResponse(\r\n config: Config,\r\n question: string\r\n): Promise {\r\n const controller = new AbortController();\r\n const timeoutControler = setTimeout(() => controller.abort(), 10000);\r\n const req = await fetch(\"https://api.openai.com/v1/chat/completions\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${config.apiKey}`,\r\n },\r\n signal: config.timeout ? controller.signal : null,\r\n body: JSON.stringify({\r\n model: config.model,\r\n messages: [{ role: \"user\", content: question }],\r\n temperature: 0.8,\r\n top_p: 1.0,\r\n presence_penalty: 1.0,\r\n stop: null,\r\n }),\r\n });\r\n clearTimeout(timeoutControler);\r\n const rep = await req.json();\r\n const response = rep.choices[0].message.content;\r\n return normalizeText(response);\r\n}\r\n\r\nexport default getChatGPTResponse;\r\n","/**\r\n * Convert table to representating string table\r\n * @param table\r\n * @returns\r\n */\r\nfunction htmlTableToString(table: HTMLTableElement) {\r\n const tab: string[][] = [];\r\n const lines = Array.from(table.querySelectorAll(\"tr\"));\r\n const maxColumnsLength: number[] = [];\r\n lines.map((line) => {\r\n const cells = Array.from(line.querySelectorAll(\"td, th\"));\r\n const cellsContent = cells.map((cell, index) => {\r\n const content = cell.textContent?.trim();\r\n maxColumnsLength[index] = Math.max(\r\n maxColumnsLength[index] || 0,\r\n content.length || 0\r\n );\r\n return content;\r\n });\r\n tab.push(cellsContent);\r\n });\r\n\r\n const lineSeparationSize =\r\n maxColumnsLength.reduce((a, b) => a + b) + tab[0].length * 3 + 1;\r\n const lineSeparation =\r\n \"\\n\" + Array(lineSeparationSize).fill(\"-\").join(\"\") + \"\\n\";\r\n\r\n const mappedTab = tab.map((line) => {\r\n const mappedLine = line.map((content, index) =>\r\n content.padEnd(\r\n maxColumnsLength[index],\r\n \"\\u00A0\" /* For no matching with \\s */\r\n )\r\n );\r\n return \"| \" + mappedLine.join(\" | \") + \" |\";\r\n });\r\n const head = mappedTab.shift();\r\n return head + lineSeparation + mappedTab.join(\"\\n\");\r\n}\r\n\r\nexport default htmlTableToString;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\nimport htmlTableToString from \"../utils/html-table-to-string\";\r\n\r\n/**\r\n * Normalize the question and add sub informations\r\n * @param langage\r\n * @param question\r\n * @returns\r\n */\r\nfunction createQuestion(config: Config, questionContainer: HTMLElement) {\r\n let question = questionContainer.innerText;\r\n\r\n /* Make tables more readable for chat-gpt */\r\n const tables: NodeListOf =\r\n questionContainer.querySelectorAll(\".qtext table\");\r\n for (const table of tables) {\r\n question = question.replace(\r\n table.innerText,\r\n \"\\n\" + htmlTableToString(table) + \"\\n\"\r\n );\r\n }\r\n\r\n const finalQuestion = `Give a short response as possible for this question, reply in the following question langage and only show the result:\r\n ${question} \r\n (If you have to choose between multiple results only show the corrects one, separate them with new line and take the same text as the question)`;\r\n return normalizeText(finalQuestion);\r\n}\r\n\r\nexport default createQuestion;\r\n","import Config from \"../../types/config\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle checkbox and input elements\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n */\r\nfunction handleRadioAndCheckbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList?.[0] as HTMLInputElement;\r\n\r\n if (!input || (input.type !== \"checkbox\" && input.type !== \"radio\"))\r\n return false;\r\n\r\n for (const input of inputList as NodeListOf) {\r\n const content = normalizeText(input.parentNode.textContent);\r\n const valide = response.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n if (valide) {\r\n if (config.mouseover) {\r\n input.addEventListener(\"mouseover\", () => (input.checked = true), {\r\n once: true,\r\n });\r\n } else {\r\n input.checked = true;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport default handleRadioAndCheckbox;\r\n","import Config from \"../../types/config\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle select elements (and put in order select)\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @returns\r\n */\r\nfunction handleSelect(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n if (inputList.length === 0 || inputList[0].tagName !== \"SELECT\") return false;\r\n\r\n let correct = response.split(\"\\n\");\r\n if (correct.length === 1 && correct.length !== inputList.length)\r\n correct = response.split(\",\");\r\n\r\n if (config.logs) Logs.array(correct);\r\n\r\n for (let j = 0; j < inputList.length; ++j) {\r\n const options = inputList[j].querySelectorAll(\"option\");\r\n\r\n for (const option of options) {\r\n const content = normalizeText(option.textContent);\r\n const valide = correct[j].includes(content);\r\n\r\n /* Handle put in order question */\r\n if (!isNaN(parseInt(content))) {\r\n const content = normalizeText(\r\n (option.parentNode as HTMLElement)\r\n .closest(\"tr\")\r\n .querySelector(\".text\").textContent\r\n );\r\n const index = correct.findIndex((c) => {\r\n const valide = c.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n return valide;\r\n });\r\n if (index !== -1) {\r\n if (config.mouseover) {\r\n options[index + 1].closest(\"select\").addEventListener(\r\n \"click\",\r\n function () {\r\n options[index + 1].selected = \"selected\" as any;\r\n },\r\n { once: true }\r\n );\r\n } else {\r\n options[index + 1].selected = \"selected\" as any;\r\n }\r\n break;\r\n }\r\n }\r\n /* End */\r\n\r\n if (config.logs) Logs.responseTry(content, valide);\r\n\r\n if (valide) {\r\n if (config.mouseover) {\r\n option\r\n .closest(\"select\")\r\n .addEventListener(\"click\", () => (option.selected = true), {\r\n once: true,\r\n });\r\n } else {\r\n option.selected = true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleSelect;\r\n","import Config from \"../../types/config\";\r\n\r\n/**\r\n * Handle textbox\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @returns\r\n */\r\nfunction handleTextbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n (input.tagName !== \"TEXTAREA\" && input.type !== \"text\")\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = response.length + 1;\r\n if (index > response.length) return;\r\n event.preventDefault();\r\n input.value = response.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleTextbox;\r\n","import Config from \"../../types/config\";\r\nimport titleIndications from \"../../utils/title-indications\";\r\n\r\n/**\r\n * Copy the response in the clipboard if we can automaticaly fill the question\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @param force Force the copy to clipboard\r\n * @returns\r\n */\r\nfunction handleClipboard(config: Config, response: string) {\r\n if (config.title) titleIndications(\"Copied to clipboard\");\r\n navigator.clipboard.writeText(response);\r\n}\r\n\r\nexport default handleClipboard;\r\n","import Config from \"../../types/config\";\r\n\r\n/**\r\n * Handle number input\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @returns\r\n */\r\nfunction handleNumber(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (inputList.length !== 1 || input.type !== \"number\") return false;\r\n\r\n const number = response.match(/\\d+([,\\.]\\d+)?/gi)?.[0]?.replace(\",\", \".\");\r\n\r\n if (!number) return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = number.length + 1;\r\n if (index > number.length) return;\r\n event.preventDefault();\r\n if (number.slice(index, index + 1) === \".\") ++index;\r\n input.value = number.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = number;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleNumber;\r\n","import Config from \"../../types/config\";\r\n\r\nfunction handleContentEditable(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList[0];\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n input.getAttribute(\"contenteditable\") !== \"true\"\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = response.length + 1;\r\n if (index > response.length) return;\r\n event.preventDefault();\r\n input.textContent = response.slice(0, ++index);\r\n\r\n /* Put the cursor at the end of the typed text */\r\n input.focus();\r\n const range = document.createRange();\r\n range.selectNodeContents(input);\r\n range.collapse(false);\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n });\r\n } else {\r\n input.textContent = response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleContentEditable;\r\n","import Config from \"../types/config\";\r\nimport Logs from \"../utils/logs\";\r\nimport getChatGPTResponse from \"./get-response\";\r\nimport createQuestion from \"./create-question\";\r\nimport handleRadioAndCheckbox from \"./questions/radio-checkbox\";\r\nimport handleSelect from \"./questions/select\";\r\nimport handleTextbox from \"./questions/textbox\";\r\nimport handleClipboard from \"./questions/clipboard\";\r\nimport handleNumber from \"./questions/number\";\r\nimport handleContentEditable from \"./questions/contenteditable\";\r\n\r\n/**\r\n * Reply to the question\r\n * @param config\r\n * @param hiddenButton\r\n * @param form\r\n * @param query\r\n * @returns\r\n */\r\nasync function reply(\r\n config: Config,\r\n hiddenButton: HTMLElement,\r\n form: HTMLElement,\r\n query: string\r\n) {\r\n if (config.cursor) hiddenButton.style.cursor = \"wait\";\r\n\r\n const question = createQuestion(config, form);\r\n const inputList: NodeListOf = form.querySelectorAll(query);\r\n\r\n const response = await getChatGPTResponse(config, question).catch(\r\n (error) => ({\r\n error,\r\n })\r\n );\r\n const haveError = typeof response === \"object\" && \"error\" in response;\r\n const isAbortError = haveError && response.error.name === \"AbortError\";\r\n\r\n if (config.cursor)\r\n hiddenButton.style.cursor =\r\n config.infinite || isAbortError ? \"pointer\" : \"initial\";\r\n\r\n if (haveError) {\r\n if (isAbortError) {\r\n //TODO: We need to inject back the event\r\n }\r\n\r\n console.error(response.error);\r\n return;\r\n }\r\n\r\n if (config.logs) {\r\n Logs.question(question);\r\n Logs.response(response);\r\n }\r\n\r\n if (config.mode === \"clipboard\") {\r\n return handleClipboard(config, response);\r\n }\r\n\r\n if (config.mode === \"question-to-answer\") {\r\n const questionBackup = form.textContent;\r\n const questionContainer = form.querySelector(\".qtext\");\r\n questionContainer.textContent = response;\r\n questionContainer.addEventListener(\"click\", function () {\r\n questionContainer.textContent =\r\n questionContainer.textContent === questionBackup\r\n ? response\r\n : questionBackup;\r\n });\r\n return;\r\n }\r\n\r\n const handlers = [\r\n handleContentEditable,\r\n handleTextbox,\r\n handleNumber,\r\n handleSelect,\r\n handleRadioAndCheckbox,\r\n ];\r\n\r\n for (const handler of handlers) {\r\n if (handler(config, inputList, response)) return;\r\n }\r\n\r\n /** In the case we can't auto complete the question */\r\n handleClipboard(config, response);\r\n}\r\n\r\nexport default reply;\r\n","import Config from \"../types/config\";\r\nimport titleIndications from \"../utils/title-indications\";\r\nimport reply from \"./reply\";\r\n\r\nconst pressedKeys: string[] = [];\r\nconst listeners: {\r\n element: HTMLElement;\r\n fn: (this: HTMLElement, ev: MouseEvent) => any;\r\n}[] = [];\r\n\r\n/**\r\n * Create a listener on the keyboard to inject the code\r\n * @param config\r\n */\r\nfunction codeListener(config: Config) {\r\n document.body.addEventListener(\"keydown\", function (event) {\r\n pressedKeys.push(event.key);\r\n if (pressedKeys.length > config.code.length) pressedKeys.shift();\r\n if (pressedKeys.join(\"\") === config.code) {\r\n pressedKeys.length = 0;\r\n setUpMoodleGpt(config);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Setup moodleGPT into the page (remove/injection)\r\n * @param config\r\n * @returns\r\n */\r\nfunction setUpMoodleGpt(config: Config) {\r\n /* Removing events */\r\n if (listeners.length > 0) {\r\n for (const listener of listeners) {\r\n if (config.cursor) listener.element.style.cursor = \"initial\";\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n if (config.title) titleIndications(\"Removed\");\r\n listeners.length = 0;\r\n return;\r\n }\r\n\r\n /* Code injection */\r\n const inputQuery = [\"checkbox\", \"radio\", \"text\", \"number\"]\r\n .map((e) => `input[type=\"${e}\"]`)\r\n .join(\",\");\r\n const query = inputQuery + \", textarea, select, [contenteditable]\";\r\n const forms = document.querySelectorAll(\".formulation\");\r\n\r\n for (const form of forms) {\r\n const hiddenButton: HTMLElement = form.querySelector(\".qtext\");\r\n\r\n if (config.cursor) hiddenButton.style.cursor = \"pointer\";\r\n\r\n const fn = reply.bind(null, config, hiddenButton, form, query);\r\n listeners.push({ element: hiddenButton, fn });\r\n hiddenButton.addEventListener(\"click\", fn, { once: !config.infinite });\r\n }\r\n\r\n if (config.title) titleIndications(\"Injected\");\r\n}\r\n\r\nexport default codeListener;\r\n","import codeListener from \"./core/code-listener\";\r\n\r\nchrome.storage.sync.get([\"moodleGPT\"]).then(function (storage) {\r\n const config = storage.moodleGPT;\r\n\r\n if (!config) throw new Error(\"Please configure MoodleGPT into the extension\");\r\n\r\n codeListener(config);\r\n});\r\n"],"names":[],"mappings":"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","x_google_ignoreList":[1]} \ No newline at end of file +{"version":3,"file":"MoodleGPT.js","sources":["../src/utils/title-indications.ts","../node_modules/tslib/tslib.es6.js","../src/utils/logs.ts","../src/utils/normalize-text.ts","../src/core/get-response.ts","../src/utils/html-table-to-string.ts","../src/core/create-question.ts","../src/core/questions/radio-checkbox.ts","../src/core/questions/select.ts","../src/core/questions/textbox.ts","../src/core/questions/clipboard.ts","../src/core/questions/number.ts","../src/core/questions/contenteditable.ts","../src/core/reply.ts","../src/core/code-listener.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Show some informations into the document title and remove it after 3000ms\r\n * @param text\r\n */\r\nfunction titleIndications(text: string) {\r\n const backTitle = document.title;\r\n document.title = text;\r\n setTimeout(() => (document.title = backTitle), 3000);\r\n}\r\n\r\nexport default titleIndications;\r\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.push(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.push(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","class Logs {\r\n static question(text: string) {\r\n const css = \"color: cyan\";\r\n console.log(\"%c[QUESTION]: %s\", css, text);\r\n }\r\n\r\n static responseTry(text: string, valide: boolean) {\r\n const css = \"color: \" + (valide ? \"green\" : \"red\");\r\n console.log(\"%c[CHECKING]: %s\", css, text);\r\n }\r\n\r\n static array(arr: unknown[]) {\r\n console.log(\"[CORRECTS] \", arr);\r\n }\r\n\r\n static response(text: string) {\r\n console.log(text);\r\n }\r\n}\r\n\r\nexport default Logs;\r\n","/**\r\n * Normlize text\r\n * @param text\r\n */\r\nfunction normalizeText(text: string) {\r\n return text\r\n .replace(/\\n+/gi, \"\\n\")\r\n .replace(/(\\n\\s*\\n)+/g, \"\\n\") //remove useless white sapce from textcontent\r\n .replace(/[ \\t]+/gi, \" \")\r\n .toLowerCase()\r\n .trim()\r\n .replace(/^[a-z\\d]\\.\\s/gi, \"\") //a. text, b. text, c. text, 1. text, 2. text, 3.text\r\n .replace(/\\n[a-z\\d]\\.\\s/gi, \"\\n\"); //same but with new line\r\n}\r\n\r\nexport default normalizeText;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\n\r\n/**\r\n * Get the response from chatGPT api\r\n * @param config\r\n * @param question\r\n * @returns\r\n */\r\nasync function getChatGPTResponse(\r\n config: Config,\r\n question: string\r\n): Promise {\r\n const controller = new AbortController();\r\n const timeoutControler = setTimeout(() => controller.abort(), 15000);\r\n const req = await fetch(\"https://api.openai.com/v1/chat/completions\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${config.apiKey}`,\r\n },\r\n signal: config.timeout ? controller.signal : null,\r\n body: JSON.stringify({\r\n model: config.model,\r\n messages: [{ role: \"user\", content: question }],\r\n temperature: 0.8,\r\n top_p: 1.0,\r\n presence_penalty: 1.0,\r\n stop: null,\r\n }),\r\n });\r\n clearTimeout(timeoutControler);\r\n const rep = await req.json();\r\n const response = rep.choices[0].message.content;\r\n return normalizeText(response);\r\n}\r\n\r\nexport default getChatGPTResponse;\r\n","/**\r\n * Convert table to representating string table\r\n * @param table\r\n * @returns\r\n */\r\nfunction htmlTableToString(table: HTMLTableElement) {\r\n const tab: string[][] = [];\r\n const lines = Array.from(table.querySelectorAll(\"tr\"));\r\n const maxColumnsLength: number[] = [];\r\n lines.map((line) => {\r\n const cells = Array.from(line.querySelectorAll(\"td, th\"));\r\n const cellsContent = cells.map((cell, index) => {\r\n const content = cell.textContent?.trim();\r\n maxColumnsLength[index] = Math.max(\r\n maxColumnsLength[index] || 0,\r\n content.length || 0\r\n );\r\n return content;\r\n });\r\n tab.push(cellsContent);\r\n });\r\n\r\n const lineSeparationSize =\r\n maxColumnsLength.reduce((a, b) => a + b) + tab[0].length * 3 + 1;\r\n const lineSeparation =\r\n \"\\n\" + Array(lineSeparationSize).fill(\"-\").join(\"\") + \"\\n\";\r\n\r\n const mappedTab = tab.map((line) => {\r\n const mappedLine = line.map((content, index) =>\r\n content.padEnd(\r\n maxColumnsLength[index],\r\n \"\\u00A0\" /* For no matching with \\s */\r\n )\r\n );\r\n return \"| \" + mappedLine.join(\" | \") + \" |\";\r\n });\r\n const head = mappedTab.shift();\r\n return head + lineSeparation + mappedTab.join(\"\\n\");\r\n}\r\n\r\nexport default htmlTableToString;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\nimport htmlTableToString from \"../utils/html-table-to-string\";\r\n\r\n/**\r\n * Normalize the question and add sub informations\r\n * @param langage\r\n * @param question\r\n * @returns\r\n */\r\nfunction createQuestion(config: Config, questionContainer: HTMLElement) {\r\n let question = questionContainer.innerText; //TODO: textContent better for reply ??\r\n\r\n /* Make tables more readable for chat-gpt */\r\n const tables: NodeListOf =\r\n questionContainer.querySelectorAll(\".qtext table\");\r\n for (const table of tables) {\r\n question = question.replace(\r\n table.innerText,\r\n \"\\n\" + htmlTableToString(table) + \"\\n\"\r\n );\r\n }\r\n\r\n const finalQuestion = `Give a short response as possible for this question, reply in the following question langage and only show the result:\r\n ${question} \r\n (If you have to choose between multiple results only show the corrects one, separate them with new line and take the same text as the question)`;\r\n return normalizeText(finalQuestion);\r\n}\r\n\r\nexport default createQuestion;\r\n","import Config from \"../../types/config\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle checkbox and input elements\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n */\r\nfunction handleRadioAndCheckbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList?.[0] as HTMLInputElement;\r\n\r\n if (!input || (input.type !== \"checkbox\" && input.type !== \"radio\"))\r\n return false;\r\n\r\n for (const input of inputList as NodeListOf) {\r\n const content = normalizeText(input.parentNode.textContent);\r\n const valide = response.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n if (valide) {\r\n if (config.mouseover) {\r\n input.addEventListener(\"mouseover\", () => (input.checked = true), {\r\n once: true,\r\n });\r\n } else {\r\n input.checked = true;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport default handleRadioAndCheckbox;\r\n","import Config from \"../../types/config\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle select elements (and put in order select)\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @returns\r\n */\r\nfunction handleSelect(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n if (inputList.length === 0 || inputList[0].tagName !== \"SELECT\") return false;\r\n\r\n let correct = response.split(\"\\n\");\r\n if (correct.length === 1 && correct.length !== inputList.length)\r\n correct = response.split(\",\");\r\n\r\n if (config.logs) Logs.array(correct);\r\n\r\n for (let j = 0; j < inputList.length; ++j) {\r\n const options = inputList[j].querySelectorAll(\"option\");\r\n\r\n for (const option of options) {\r\n const content = normalizeText(option.textContent);\r\n const valide = correct[j].includes(content);\r\n\r\n /* Handle put in order question */\r\n if (!isNaN(parseInt(content))) {\r\n const content = normalizeText(\r\n (option.parentNode as HTMLElement)\r\n .closest(\"tr\")\r\n .querySelector(\".text\").textContent\r\n );\r\n const index = correct.findIndex((c) => {\r\n const valide = c.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n return valide;\r\n });\r\n if (index !== -1) {\r\n if (config.mouseover) {\r\n options[index + 1].closest(\"select\").addEventListener(\r\n \"click\",\r\n function () {\r\n options[index + 1].selected = \"selected\" as any;\r\n },\r\n { once: true }\r\n );\r\n } else {\r\n options[index + 1].selected = \"selected\" as any;\r\n }\r\n break;\r\n }\r\n }\r\n /* End */\r\n\r\n if (config.logs) Logs.responseTry(content, valide);\r\n\r\n if (valide) {\r\n if (config.mouseover) {\r\n option\r\n .closest(\"select\")\r\n .addEventListener(\"click\", () => (option.selected = true), {\r\n once: true,\r\n });\r\n } else {\r\n option.selected = true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleSelect;\r\n","import Config from \"../../types/config\";\r\n\r\n/**\r\n * Handle textbox\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @returns\r\n */\r\nfunction handleTextbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n (input.tagName !== \"TEXTAREA\" && input.type !== \"text\")\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = response.length + 1;\r\n if (index > response.length) return;\r\n event.preventDefault();\r\n input.value = response.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleTextbox;\r\n","import Config from \"../../types/config\";\r\nimport titleIndications from \"../../utils/title-indications\";\r\n\r\n/**\r\n * Copy the response in the clipboard if we can automaticaly fill the question\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @param force Force the copy to clipboard\r\n * @returns\r\n */\r\nfunction handleClipboard(config: Config, response: string) {\r\n if (config.title) titleIndications(\"Copied to clipboard\");\r\n navigator.clipboard.writeText(response);\r\n}\r\n\r\nexport default handleClipboard;\r\n","import Config from \"../../types/config\";\r\n\r\n/**\r\n * Handle number input\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @returns\r\n */\r\nfunction handleNumber(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (inputList.length !== 1 || input.type !== \"number\") return false;\r\n\r\n const number = response.match(/\\d+([,\\.]\\d+)?/gi)?.[0]?.replace(\",\", \".\");\r\n\r\n if (!number) return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = number.length + 1;\r\n if (index > number.length) return;\r\n event.preventDefault();\r\n if (number.slice(index, index + 1) === \".\") ++index;\r\n input.value = number.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = number;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleNumber;\r\n","import Config from \"../../types/config\";\r\n\r\nfunction handleContentEditable(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList[0];\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n input.getAttribute(\"contenteditable\") !== \"true\"\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = response.length + 1;\r\n if (index > response.length) return;\r\n event.preventDefault();\r\n input.textContent = response.slice(0, ++index);\r\n\r\n /* Put the cursor at the end of the typed text */\r\n input.focus();\r\n const range = document.createRange();\r\n range.selectNodeContents(input);\r\n range.collapse(false);\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n });\r\n } else {\r\n input.textContent = response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleContentEditable;\r\n","import Config from \"../types/config\";\r\nimport Logs from \"../utils/logs\";\r\nimport getChatGPTResponse from \"./get-response\";\r\nimport createQuestion from \"./create-question\";\r\nimport handleRadioAndCheckbox from \"./questions/radio-checkbox\";\r\nimport handleSelect from \"./questions/select\";\r\nimport handleTextbox from \"./questions/textbox\";\r\nimport handleClipboard from \"./questions/clipboard\";\r\nimport handleNumber from \"./questions/number\";\r\nimport handleContentEditable from \"./questions/contenteditable\";\r\nimport { injectionFunction } from \"./code-listener\";\r\n\r\n/**\r\n * Reply to the question\r\n * @param config\r\n * @param hiddenButton\r\n * @param form\r\n * @param query\r\n * @returns\r\n */\r\nasync function reply(\r\n config: Config,\r\n hiddenButton: HTMLElement,\r\n form: HTMLElement,\r\n query: string\r\n) {\r\n if (config.cursor) hiddenButton.style.cursor = \"wait\";\r\n\r\n const question = createQuestion(config, form);\r\n const inputList: NodeListOf = form.querySelectorAll(query);\r\n\r\n const response = await getChatGPTResponse(config, question).catch(\r\n (error) => ({\r\n error,\r\n })\r\n );\r\n\r\n const haveError = typeof response === \"object\" && \"error\" in response;\r\n\r\n if (config.cursor)\r\n hiddenButton.style.cursor =\r\n config.infinite || haveError ? \"pointer\" : \"initial\";\r\n\r\n if (haveError) {\r\n console.error(response.error);\r\n return;\r\n }\r\n\r\n if (config.logs) {\r\n Logs.question(question);\r\n Logs.response(response);\r\n }\r\n\r\n if (config.mode === \"clipboard\") {\r\n return handleClipboard(config, response);\r\n }\r\n\r\n if (config.mode === \"question-to-answer\") {\r\n const questionBackup = form.textContent;\r\n const questionContainer = form.querySelector(\".qtext\");\r\n questionContainer.textContent = response;\r\n questionContainer.addEventListener(\"click\", function () {\r\n questionContainer.textContent =\r\n questionContainer.textContent === questionBackup\r\n ? response\r\n : questionBackup;\r\n });\r\n return;\r\n }\r\n\r\n const handlers = [\r\n handleContentEditable,\r\n handleTextbox,\r\n handleNumber,\r\n handleSelect,\r\n handleRadioAndCheckbox,\r\n ];\r\n\r\n for (const handler of handlers) {\r\n if (handler(config, inputList, response)) return;\r\n }\r\n\r\n /* In the case we can't auto complete the question */\r\n handleClipboard(config, response);\r\n\r\n /* Better then set once on the event because if there is an error the user can click an other time on the question */\r\n if (!config.infinite)\r\n hiddenButton.removeEventListener(\"click\", injectionFunction);\r\n}\r\n\r\nexport default reply;\r\n","import Config from \"../types/config\";\r\nimport titleIndications from \"../utils/title-indications\";\r\nimport reply from \"./reply\";\r\n\r\nlet injectionFunction: (this: HTMLElement, ev: MouseEvent) => any = null;\r\nconst pressedKeys: string[] = [];\r\nconst listeners: {\r\n element: HTMLElement;\r\n fn: (this: HTMLElement, ev: MouseEvent) => any;\r\n}[] = [];\r\n\r\n/**\r\n * Create a listener on the keyboard to inject the code\r\n * @param config\r\n */\r\nfunction codeListener(config: Config) {\r\n document.body.addEventListener(\"keydown\", function (event) {\r\n pressedKeys.push(event.key);\r\n if (pressedKeys.length > config.code.length) pressedKeys.shift();\r\n if (pressedKeys.join(\"\") === config.code) {\r\n pressedKeys.length = 0;\r\n setUpMoodleGpt(config);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Setup moodleGPT into the page (remove/injection)\r\n * @param config\r\n * @returns\r\n */\r\nfunction setUpMoodleGpt(config: Config) {\r\n /* Removing events */\r\n if (listeners.length > 0) {\r\n for (const listener of listeners) {\r\n if (config.cursor) listener.element.style.cursor = \"initial\";\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n if (config.title) titleIndications(\"Removed\");\r\n listeners.length = 0;\r\n return;\r\n }\r\n\r\n /* Code injection */\r\n const inputQuery = [\"checkbox\", \"radio\", \"text\", \"number\"]\r\n .map((e) => `input[type=\"${e}\"]`)\r\n .join(\",\");\r\n const query = inputQuery + \", textarea, select, [contenteditable]\";\r\n const forms = document.querySelectorAll(\".formulation\");\r\n\r\n for (const form of forms) {\r\n const hiddenButton: HTMLElement = form.querySelector(\".qtext\");\r\n\r\n if (config.cursor) hiddenButton.style.cursor = \"pointer\";\r\n\r\n injectionFunction = reply.bind(null, config, hiddenButton, form, query);\r\n listeners.push({ element: hiddenButton, fn: injectionFunction });\r\n hiddenButton.addEventListener(\"click\", injectionFunction);\r\n }\r\n\r\n if (config.title) titleIndications(\"Injected\");\r\n}\r\n\r\nexport { injectionFunction, codeListener };\r\n","import { codeListener } from \"./core/code-listener\";\r\n\r\nchrome.storage.sync.get([\"moodleGPT\"]).then(function (storage) {\r\n const config = storage.moodleGPT;\r\n\r\n if (!config) throw new Error(\"Please configure MoodleGPT into the extension\");\r\n\r\n codeListener(config);\r\n});\r\n"],"names":[],"mappings":"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","x_google_ignoreList":[1]} \ No newline at end of file diff --git a/src/core/code-listener.ts b/src/core/code-listener.ts index 6a6a262..319361f 100644 --- a/src/core/code-listener.ts +++ b/src/core/code-listener.ts @@ -2,6 +2,7 @@ import Config from "../types/config"; import titleIndications from "../utils/title-indications"; import reply from "./reply"; +let injectionFunction: (this: HTMLElement, ev: MouseEvent) => any = null; const pressedKeys: string[] = []; const listeners: { element: HTMLElement; @@ -52,12 +53,12 @@ function setUpMoodleGpt(config: Config) { if (config.cursor) hiddenButton.style.cursor = "pointer"; - const fn = reply.bind(null, config, hiddenButton, form, query); - listeners.push({ element: hiddenButton, fn }); - hiddenButton.addEventListener("click", fn, { once: !config.infinite }); + injectionFunction = reply.bind(null, config, hiddenButton, form, query); + listeners.push({ element: hiddenButton, fn: injectionFunction }); + hiddenButton.addEventListener("click", injectionFunction); } if (config.title) titleIndications("Injected"); } -export default codeListener; +export { injectionFunction, codeListener }; diff --git a/src/core/get-response.ts b/src/core/get-response.ts index 56275d3..0c25bb7 100644 --- a/src/core/get-response.ts +++ b/src/core/get-response.ts @@ -12,7 +12,7 @@ async function getChatGPTResponse( question: string ): Promise { const controller = new AbortController(); - const timeoutControler = setTimeout(() => controller.abort(), 10000); + const timeoutControler = setTimeout(() => controller.abort(), 15000); const req = await fetch("https://api.openai.com/v1/chat/completions", { method: "POST", headers: { diff --git a/src/core/reply.ts b/src/core/reply.ts index 2766887..f18800e 100644 --- a/src/core/reply.ts +++ b/src/core/reply.ts @@ -8,6 +8,7 @@ import handleTextbox from "./questions/textbox"; import handleClipboard from "./questions/clipboard"; import handleNumber from "./questions/number"; import handleContentEditable from "./questions/contenteditable"; +import { injectionFunction } from "./code-listener"; /** * Reply to the question @@ -33,18 +34,14 @@ async function reply( error, }) ); + const haveError = typeof response === "object" && "error" in response; - const isAbortError = haveError && response.error.name === "AbortError"; if (config.cursor) hiddenButton.style.cursor = - config.infinite || isAbortError ? "pointer" : "initial"; + config.infinite || haveError ? "pointer" : "initial"; if (haveError) { - if (isAbortError) { - //TODO: We need to inject back the event - } - console.error(response.error); return; } @@ -83,8 +80,12 @@ async function reply( if (handler(config, inputList, response)) return; } - /** In the case we can't auto complete the question */ + /* In the case we can't auto complete the question */ handleClipboard(config, response); + + /* Better then set once on the event because if there is an error the user can click an other time on the question */ + if (!config.infinite) + hiddenButton.removeEventListener("click", injectionFunction); } export default reply; diff --git a/src/index.ts b/src/index.ts index 10e0694..fe3c403 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,4 @@ -import codeListener from "./core/code-listener"; +import { codeListener } from "./core/code-listener"; chrome.storage.sync.get(["moodleGPT"]).then(function (storage) { const config = storage.moodleGPT; From 305f3e452dcdd92fbd9c25db744099271d04b119 Mon Sep 17 00:00:00 2001 From: yoannchb-pro <71560747+yoannchb-pro@users.noreply.github.com> Date: Tue, 20 Jun 2023 14:29:29 -0400 Subject: [PATCH 15/35] Textbox, question to answser mode and clipboard mode is not formatted anymore --- CHANGELOG.md | 3 + TODO.md | 2 +- extension/MoodleGPT.js | 108 ++++++++++++++++---------- extension/MoodleGPT.js.map | 2 +- src/core/code-listener.ts | 19 ++++- src/core/get-response.ts | 8 +- src/core/questions/clipboard.ts | 10 +-- src/core/questions/contenteditable.ts | 18 +++-- src/core/questions/number.ts | 9 ++- src/core/questions/radio-checkbox.ts | 7 +- src/core/questions/select.ts | 9 ++- src/core/questions/textbox.ts | 13 ++-- src/core/reply.ts | 41 ++++++---- src/types/{config.d.ts => config.ts} | 30 +++---- src/types/gptAnswer.ts | 6 ++ 15 files changed, 177 insertions(+), 108 deletions(-) rename src/types/{config.d.ts => config.ts} (95%) create mode 100644 src/types/gptAnswer.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index ac5d083..79db2fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,9 @@ ## v1.0.3 - Removed the option `table formating` because it will now set to true by default +- Adjusted the abort timeout to 15seconds +- If an error occur the user can now click back on the question +- `Textbox, question to answser mode and clipboard mode` is not formatted anymore ## v1.0.2 diff --git a/TODO.md b/TODO.md index 4bdccbf..01bfb7b 100644 --- a/TODO.md +++ b/TODO.md @@ -3,7 +3,7 @@ ## Priority: 1 - [ ] Increment question when there is statement -- [ ] Allow click back on question if timeout +- [ ] Original answer for text, clipboard and text to answer ## Priority: 3 (because hard to make) diff --git a/extension/MoodleGPT.js b/extension/MoodleGPT.js index 03a0422..129becf 100644 --- a/extension/MoodleGPT.js +++ b/extension/MoodleGPT.js @@ -99,7 +99,10 @@ clearTimeout(timeoutControler); const rep = yield req.json(); const response = rep.choices[0].message.content; - return normalizeText(response); + return { + response, + normalizedResponse: normalizeText(response), + }; }); } @@ -155,15 +158,15 @@ * Handle checkbox and input elements * @param config * @param inputList - * @param response + * @param gptAnswer */ - function handleRadioAndCheckbox(config, inputList, response) { + function handleRadioAndCheckbox(config, inputList, gptAnswer) { const input = inputList === null || inputList === void 0 ? void 0 : inputList[0]; if (!input || (input.type !== "checkbox" && input.type !== "radio")) return false; for (const input of inputList) { const content = normalizeText(input.parentNode.textContent); - const valide = response.includes(content); + const valide = gptAnswer.normalizedResponse.includes(content); if (config.logs) Logs.responseTry(content, valide); if (valide) { @@ -184,15 +187,15 @@ * Handle select elements (and put in order select) * @param config * @param inputList - * @param response + * @param gptAnswer * @returns */ - function handleSelect(config, inputList, response) { + function handleSelect(config, inputList, gptAnswer) { if (inputList.length === 0 || inputList[0].tagName !== "SELECT") return false; - let correct = response.split("\n"); + let correct = gptAnswer.normalizedResponse.split("\n"); if (correct.length === 1 && correct.length !== inputList.length) - correct = response.split(","); + correct = gptAnswer.normalizedResponse.split(","); if (config.logs) Logs.array(correct); for (let j = 0; j < inputList.length; ++j) { @@ -248,10 +251,10 @@ * Handle textbox * @param config * @param inputList - * @param response + * @param gptAnswer * @returns */ - function handleTextbox(config, inputList, response) { + function handleTextbox(config, inputList, gptAnswer) { const input = inputList[0]; if (inputList.length !== 1 || (input.tagName !== "TEXTAREA" && input.type !== "text")) @@ -260,15 +263,15 @@ let index = 0; input.addEventListener("keydown", function (event) { if (event.key === "Backspace") - index = response.length + 1; - if (index > response.length) + index = gptAnswer.response.length + 1; + if (index > gptAnswer.response.length) return; event.preventDefault(); - input.value = response.slice(0, ++index); + input.value = gptAnswer.response.slice(0, ++index); }); } else { - input.value = response; + input.value = gptAnswer.response; } return true; } @@ -276,30 +279,28 @@ /** * Copy the response in the clipboard if we can automaticaly fill the question * @param config - * @param inputList - * @param response - * @param force Force the copy to clipboard - * @returns + * @param gptAnswer */ - function handleClipboard(config, response) { + function handleClipboard(config, gptAnswer) { if (config.title) titleIndications("Copied to clipboard"); - navigator.clipboard.writeText(response); + navigator.clipboard.writeText(gptAnswer.response); } /** * Handle number input * @param config * @param inputList - * @param response + * @param gptAnswer * @returns */ - function handleNumber(config, inputList, response) { + function handleNumber(config, inputList, gptAnswer) { var _a, _b; const input = inputList[0]; if (inputList.length !== 1 || input.type !== "number") return false; - const number = (_b = (_a = response.match(/\d+([,\.]\d+)?/gi)) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.replace(",", "."); + const number = (_b = (_a = gptAnswer.normalizedResponse + .match(/\d+([,\.]\d+)?/gi)) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.replace(",", "."); if (!number) return false; if (config.typing) { @@ -321,7 +322,14 @@ return true; } - function handleContentEditable(config, inputList, response) { + /** + * Hanlde contenteditable elements + * @param config + * @param inputList + * @param gptAnswer + * @returns + */ + function handleContentEditable(config, inputList, gptAnswer) { const input = inputList[0]; if (inputList.length !== 1 || input.getAttribute("contenteditable") !== "true") @@ -330,11 +338,11 @@ let index = 0; input.addEventListener("keydown", function (event) { if (event.key === "Backspace") - index = response.length + 1; - if (index > response.length) + index = gptAnswer.response.length + 1; + if (index > gptAnswer.response.length) return; event.preventDefault(); - input.textContent = response.slice(0, ++index); + input.textContent = gptAnswer.response.slice(0, ++index); /* Put the cursor at the end of the typed text */ input.focus(); const range = document.createRange(); @@ -346,7 +354,7 @@ }); } else { - input.textContent = response; + input.textContent = gptAnswer.response; } return true; } @@ -365,33 +373,41 @@ hiddenButton.style.cursor = "wait"; const question = createQuestion(config, form); const inputList = form.querySelectorAll(query); - const response = yield getChatGPTResponse(config, question).catch((error) => ({ + const gptAnswer = yield getChatGPTResponse(config, question).catch((error) => ({ error, })); - const haveError = typeof response === "object" && "error" in response; + const haveError = typeof gptAnswer === "object" && "error" in gptAnswer; if (config.cursor) hiddenButton.style.cursor = config.infinite || haveError ? "pointer" : "initial"; if (haveError) { - console.error(response.error); + console.error(gptAnswer.error); return; } if (config.logs) { Logs.question(question); - Logs.response(response); + Logs.response("Original: " + gptAnswer.response); + Logs.response("Normalized: " + gptAnswer.normalizedResponse); } + /* Handle clipboard mode */ if (config.mode === "clipboard") { - return handleClipboard(config, response); + if (!config.infinite) + removeListener(hiddenButton); + return handleClipboard(config, gptAnswer); } + /* Handle question to answer mode */ if (config.mode === "question-to-answer") { + removeListener(hiddenButton); const questionBackup = form.textContent; const questionContainer = form.querySelector(".qtext"); - questionContainer.textContent = response; + questionContainer.textContent = gptAnswer.response; + questionContainer.style.whiteSpace = "pre-wrap"; questionContainer.addEventListener("click", function () { - questionContainer.textContent = - questionContainer.textContent === questionBackup - ? response - : questionBackup; + const isNotResponse = questionContainer.textContent === questionBackup; + questionContainer.style.whiteSpace = isNotResponse ? "pre-wrap" : null; + questionContainer.textContent = isNotResponse + ? gptAnswer.response + : questionBackup; }); return; } @@ -403,18 +419,17 @@ handleRadioAndCheckbox, ]; for (const handler of handlers) { - if (handler(config, inputList, response)) + if (handler(config, inputList, gptAnswer)) return; } /* In the case we can't auto complete the question */ - handleClipboard(config, response); + handleClipboard(config, gptAnswer); /* Better then set once on the event because if there is an error the user can click an other time on the question */ if (!config.infinite) - hiddenButton.removeEventListener("click", injectionFunction); + removeListener(hiddenButton); }); } - let injectionFunction = null; const pressedKeys = []; const listeners = []; /** @@ -460,13 +475,20 @@ const hiddenButton = form.querySelector(".qtext"); if (config.cursor) hiddenButton.style.cursor = "pointer"; - injectionFunction = reply.bind(null, config, hiddenButton, form, query); + const injectionFunction = reply.bind(null, config, hiddenButton, form, query); listeners.push({ element: hiddenButton, fn: injectionFunction }); hiddenButton.addEventListener("click", injectionFunction); } if (config.title) titleIndications("Injected"); } + function removeListener(element) { + const index = listeners.findIndex((listener) => listener.element === element); + if (index !== -1) { + const listener = listeners.splice(index, 1)[0]; + listener.element.removeEventListener("click", listener.fn); + } + } chrome.storage.sync.get(["moodleGPT"]).then(function (storage) { const config = storage.moodleGPT; diff --git a/extension/MoodleGPT.js.map b/extension/MoodleGPT.js.map index ccb220c..7faa6c2 100644 --- a/extension/MoodleGPT.js.map +++ b/extension/MoodleGPT.js.map @@ -1 +1 @@ -{"version":3,"file":"MoodleGPT.js","sources":["../src/utils/title-indications.ts","../node_modules/tslib/tslib.es6.js","../src/utils/logs.ts","../src/utils/normalize-text.ts","../src/core/get-response.ts","../src/utils/html-table-to-string.ts","../src/core/create-question.ts","../src/core/questions/radio-checkbox.ts","../src/core/questions/select.ts","../src/core/questions/textbox.ts","../src/core/questions/clipboard.ts","../src/core/questions/number.ts","../src/core/questions/contenteditable.ts","../src/core/reply.ts","../src/core/code-listener.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Show some informations into the document title and remove it after 3000ms\r\n * @param text\r\n */\r\nfunction titleIndications(text: string) {\r\n const backTitle = document.title;\r\n document.title = text;\r\n setTimeout(() => (document.title = backTitle), 3000);\r\n}\r\n\r\nexport default titleIndications;\r\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.push(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.push(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","class Logs {\r\n static question(text: string) {\r\n const css = \"color: cyan\";\r\n console.log(\"%c[QUESTION]: %s\", css, text);\r\n }\r\n\r\n static responseTry(text: string, valide: boolean) {\r\n const css = \"color: \" + (valide ? \"green\" : \"red\");\r\n console.log(\"%c[CHECKING]: %s\", css, text);\r\n }\r\n\r\n static array(arr: unknown[]) {\r\n console.log(\"[CORRECTS] \", arr);\r\n }\r\n\r\n static response(text: string) {\r\n console.log(text);\r\n }\r\n}\r\n\r\nexport default Logs;\r\n","/**\r\n * Normlize text\r\n * @param text\r\n */\r\nfunction normalizeText(text: string) {\r\n return text\r\n .replace(/\\n+/gi, \"\\n\")\r\n .replace(/(\\n\\s*\\n)+/g, \"\\n\") //remove useless white sapce from textcontent\r\n .replace(/[ \\t]+/gi, \" \")\r\n .toLowerCase()\r\n .trim()\r\n .replace(/^[a-z\\d]\\.\\s/gi, \"\") //a. text, b. text, c. text, 1. text, 2. text, 3.text\r\n .replace(/\\n[a-z\\d]\\.\\s/gi, \"\\n\"); //same but with new line\r\n}\r\n\r\nexport default normalizeText;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\n\r\n/**\r\n * Get the response from chatGPT api\r\n * @param config\r\n * @param question\r\n * @returns\r\n */\r\nasync function getChatGPTResponse(\r\n config: Config,\r\n question: string\r\n): Promise {\r\n const controller = new AbortController();\r\n const timeoutControler = setTimeout(() => controller.abort(), 15000);\r\n const req = await fetch(\"https://api.openai.com/v1/chat/completions\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${config.apiKey}`,\r\n },\r\n signal: config.timeout ? controller.signal : null,\r\n body: JSON.stringify({\r\n model: config.model,\r\n messages: [{ role: \"user\", content: question }],\r\n temperature: 0.8,\r\n top_p: 1.0,\r\n presence_penalty: 1.0,\r\n stop: null,\r\n }),\r\n });\r\n clearTimeout(timeoutControler);\r\n const rep = await req.json();\r\n const response = rep.choices[0].message.content;\r\n return normalizeText(response);\r\n}\r\n\r\nexport default getChatGPTResponse;\r\n","/**\r\n * Convert table to representating string table\r\n * @param table\r\n * @returns\r\n */\r\nfunction htmlTableToString(table: HTMLTableElement) {\r\n const tab: string[][] = [];\r\n const lines = Array.from(table.querySelectorAll(\"tr\"));\r\n const maxColumnsLength: number[] = [];\r\n lines.map((line) => {\r\n const cells = Array.from(line.querySelectorAll(\"td, th\"));\r\n const cellsContent = cells.map((cell, index) => {\r\n const content = cell.textContent?.trim();\r\n maxColumnsLength[index] = Math.max(\r\n maxColumnsLength[index] || 0,\r\n content.length || 0\r\n );\r\n return content;\r\n });\r\n tab.push(cellsContent);\r\n });\r\n\r\n const lineSeparationSize =\r\n maxColumnsLength.reduce((a, b) => a + b) + tab[0].length * 3 + 1;\r\n const lineSeparation =\r\n \"\\n\" + Array(lineSeparationSize).fill(\"-\").join(\"\") + \"\\n\";\r\n\r\n const mappedTab = tab.map((line) => {\r\n const mappedLine = line.map((content, index) =>\r\n content.padEnd(\r\n maxColumnsLength[index],\r\n \"\\u00A0\" /* For no matching with \\s */\r\n )\r\n );\r\n return \"| \" + mappedLine.join(\" | \") + \" |\";\r\n });\r\n const head = mappedTab.shift();\r\n return head + lineSeparation + mappedTab.join(\"\\n\");\r\n}\r\n\r\nexport default htmlTableToString;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\nimport htmlTableToString from \"../utils/html-table-to-string\";\r\n\r\n/**\r\n * Normalize the question and add sub informations\r\n * @param langage\r\n * @param question\r\n * @returns\r\n */\r\nfunction createQuestion(config: Config, questionContainer: HTMLElement) {\r\n let question = questionContainer.innerText; //TODO: textContent better for reply ??\r\n\r\n /* Make tables more readable for chat-gpt */\r\n const tables: NodeListOf =\r\n questionContainer.querySelectorAll(\".qtext table\");\r\n for (const table of tables) {\r\n question = question.replace(\r\n table.innerText,\r\n \"\\n\" + htmlTableToString(table) + \"\\n\"\r\n );\r\n }\r\n\r\n const finalQuestion = `Give a short response as possible for this question, reply in the following question langage and only show the result:\r\n ${question} \r\n (If you have to choose between multiple results only show the corrects one, separate them with new line and take the same text as the question)`;\r\n return normalizeText(finalQuestion);\r\n}\r\n\r\nexport default createQuestion;\r\n","import Config from \"../../types/config\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle checkbox and input elements\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n */\r\nfunction handleRadioAndCheckbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList?.[0] as HTMLInputElement;\r\n\r\n if (!input || (input.type !== \"checkbox\" && input.type !== \"radio\"))\r\n return false;\r\n\r\n for (const input of inputList as NodeListOf) {\r\n const content = normalizeText(input.parentNode.textContent);\r\n const valide = response.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n if (valide) {\r\n if (config.mouseover) {\r\n input.addEventListener(\"mouseover\", () => (input.checked = true), {\r\n once: true,\r\n });\r\n } else {\r\n input.checked = true;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport default handleRadioAndCheckbox;\r\n","import Config from \"../../types/config\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle select elements (and put in order select)\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @returns\r\n */\r\nfunction handleSelect(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n if (inputList.length === 0 || inputList[0].tagName !== \"SELECT\") return false;\r\n\r\n let correct = response.split(\"\\n\");\r\n if (correct.length === 1 && correct.length !== inputList.length)\r\n correct = response.split(\",\");\r\n\r\n if (config.logs) Logs.array(correct);\r\n\r\n for (let j = 0; j < inputList.length; ++j) {\r\n const options = inputList[j].querySelectorAll(\"option\");\r\n\r\n for (const option of options) {\r\n const content = normalizeText(option.textContent);\r\n const valide = correct[j].includes(content);\r\n\r\n /* Handle put in order question */\r\n if (!isNaN(parseInt(content))) {\r\n const content = normalizeText(\r\n (option.parentNode as HTMLElement)\r\n .closest(\"tr\")\r\n .querySelector(\".text\").textContent\r\n );\r\n const index = correct.findIndex((c) => {\r\n const valide = c.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n return valide;\r\n });\r\n if (index !== -1) {\r\n if (config.mouseover) {\r\n options[index + 1].closest(\"select\").addEventListener(\r\n \"click\",\r\n function () {\r\n options[index + 1].selected = \"selected\" as any;\r\n },\r\n { once: true }\r\n );\r\n } else {\r\n options[index + 1].selected = \"selected\" as any;\r\n }\r\n break;\r\n }\r\n }\r\n /* End */\r\n\r\n if (config.logs) Logs.responseTry(content, valide);\r\n\r\n if (valide) {\r\n if (config.mouseover) {\r\n option\r\n .closest(\"select\")\r\n .addEventListener(\"click\", () => (option.selected = true), {\r\n once: true,\r\n });\r\n } else {\r\n option.selected = true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleSelect;\r\n","import Config from \"../../types/config\";\r\n\r\n/**\r\n * Handle textbox\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @returns\r\n */\r\nfunction handleTextbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n (input.tagName !== \"TEXTAREA\" && input.type !== \"text\")\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = response.length + 1;\r\n if (index > response.length) return;\r\n event.preventDefault();\r\n input.value = response.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleTextbox;\r\n","import Config from \"../../types/config\";\r\nimport titleIndications from \"../../utils/title-indications\";\r\n\r\n/**\r\n * Copy the response in the clipboard if we can automaticaly fill the question\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @param force Force the copy to clipboard\r\n * @returns\r\n */\r\nfunction handleClipboard(config: Config, response: string) {\r\n if (config.title) titleIndications(\"Copied to clipboard\");\r\n navigator.clipboard.writeText(response);\r\n}\r\n\r\nexport default handleClipboard;\r\n","import Config from \"../../types/config\";\r\n\r\n/**\r\n * Handle number input\r\n * @param config\r\n * @param inputList\r\n * @param response\r\n * @returns\r\n */\r\nfunction handleNumber(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (inputList.length !== 1 || input.type !== \"number\") return false;\r\n\r\n const number = response.match(/\\d+([,\\.]\\d+)?/gi)?.[0]?.replace(\",\", \".\");\r\n\r\n if (!number) return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = number.length + 1;\r\n if (index > number.length) return;\r\n event.preventDefault();\r\n if (number.slice(index, index + 1) === \".\") ++index;\r\n input.value = number.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = number;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleNumber;\r\n","import Config from \"../../types/config\";\r\n\r\nfunction handleContentEditable(\r\n config: Config,\r\n inputList: NodeListOf,\r\n response: string\r\n): boolean {\r\n const input = inputList[0];\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n input.getAttribute(\"contenteditable\") !== \"true\"\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = response.length + 1;\r\n if (index > response.length) return;\r\n event.preventDefault();\r\n input.textContent = response.slice(0, ++index);\r\n\r\n /* Put the cursor at the end of the typed text */\r\n input.focus();\r\n const range = document.createRange();\r\n range.selectNodeContents(input);\r\n range.collapse(false);\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n });\r\n } else {\r\n input.textContent = response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleContentEditable;\r\n","import Config from \"../types/config\";\r\nimport Logs from \"../utils/logs\";\r\nimport getChatGPTResponse from \"./get-response\";\r\nimport createQuestion from \"./create-question\";\r\nimport handleRadioAndCheckbox from \"./questions/radio-checkbox\";\r\nimport handleSelect from \"./questions/select\";\r\nimport handleTextbox from \"./questions/textbox\";\r\nimport handleClipboard from \"./questions/clipboard\";\r\nimport handleNumber from \"./questions/number\";\r\nimport handleContentEditable from \"./questions/contenteditable\";\r\nimport { injectionFunction } from \"./code-listener\";\r\n\r\n/**\r\n * Reply to the question\r\n * @param config\r\n * @param hiddenButton\r\n * @param form\r\n * @param query\r\n * @returns\r\n */\r\nasync function reply(\r\n config: Config,\r\n hiddenButton: HTMLElement,\r\n form: HTMLElement,\r\n query: string\r\n) {\r\n if (config.cursor) hiddenButton.style.cursor = \"wait\";\r\n\r\n const question = createQuestion(config, form);\r\n const inputList: NodeListOf = form.querySelectorAll(query);\r\n\r\n const response = await getChatGPTResponse(config, question).catch(\r\n (error) => ({\r\n error,\r\n })\r\n );\r\n\r\n const haveError = typeof response === \"object\" && \"error\" in response;\r\n\r\n if (config.cursor)\r\n hiddenButton.style.cursor =\r\n config.infinite || haveError ? \"pointer\" : \"initial\";\r\n\r\n if (haveError) {\r\n console.error(response.error);\r\n return;\r\n }\r\n\r\n if (config.logs) {\r\n Logs.question(question);\r\n Logs.response(response);\r\n }\r\n\r\n if (config.mode === \"clipboard\") {\r\n return handleClipboard(config, response);\r\n }\r\n\r\n if (config.mode === \"question-to-answer\") {\r\n const questionBackup = form.textContent;\r\n const questionContainer = form.querySelector(\".qtext\");\r\n questionContainer.textContent = response;\r\n questionContainer.addEventListener(\"click\", function () {\r\n questionContainer.textContent =\r\n questionContainer.textContent === questionBackup\r\n ? response\r\n : questionBackup;\r\n });\r\n return;\r\n }\r\n\r\n const handlers = [\r\n handleContentEditable,\r\n handleTextbox,\r\n handleNumber,\r\n handleSelect,\r\n handleRadioAndCheckbox,\r\n ];\r\n\r\n for (const handler of handlers) {\r\n if (handler(config, inputList, response)) return;\r\n }\r\n\r\n /* In the case we can't auto complete the question */\r\n handleClipboard(config, response);\r\n\r\n /* Better then set once on the event because if there is an error the user can click an other time on the question */\r\n if (!config.infinite)\r\n hiddenButton.removeEventListener(\"click\", injectionFunction);\r\n}\r\n\r\nexport default reply;\r\n","import Config from \"../types/config\";\r\nimport titleIndications from \"../utils/title-indications\";\r\nimport reply from \"./reply\";\r\n\r\nlet injectionFunction: (this: HTMLElement, ev: MouseEvent) => any = null;\r\nconst pressedKeys: string[] = [];\r\nconst listeners: {\r\n element: HTMLElement;\r\n fn: (this: HTMLElement, ev: MouseEvent) => any;\r\n}[] = [];\r\n\r\n/**\r\n * Create a listener on the keyboard to inject the code\r\n * @param config\r\n */\r\nfunction codeListener(config: Config) {\r\n document.body.addEventListener(\"keydown\", function (event) {\r\n pressedKeys.push(event.key);\r\n if (pressedKeys.length > config.code.length) pressedKeys.shift();\r\n if (pressedKeys.join(\"\") === config.code) {\r\n pressedKeys.length = 0;\r\n setUpMoodleGpt(config);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Setup moodleGPT into the page (remove/injection)\r\n * @param config\r\n * @returns\r\n */\r\nfunction setUpMoodleGpt(config: Config) {\r\n /* Removing events */\r\n if (listeners.length > 0) {\r\n for (const listener of listeners) {\r\n if (config.cursor) listener.element.style.cursor = \"initial\";\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n if (config.title) titleIndications(\"Removed\");\r\n listeners.length = 0;\r\n return;\r\n }\r\n\r\n /* Code injection */\r\n const inputQuery = [\"checkbox\", \"radio\", \"text\", \"number\"]\r\n .map((e) => `input[type=\"${e}\"]`)\r\n .join(\",\");\r\n const query = inputQuery + \", textarea, select, [contenteditable]\";\r\n const forms = document.querySelectorAll(\".formulation\");\r\n\r\n for (const form of forms) {\r\n const hiddenButton: HTMLElement = form.querySelector(\".qtext\");\r\n\r\n if (config.cursor) hiddenButton.style.cursor = \"pointer\";\r\n\r\n injectionFunction = reply.bind(null, config, hiddenButton, form, query);\r\n listeners.push({ element: hiddenButton, fn: injectionFunction });\r\n hiddenButton.addEventListener(\"click\", injectionFunction);\r\n }\r\n\r\n if (config.title) titleIndications(\"Injected\");\r\n}\r\n\r\nexport { injectionFunction, codeListener };\r\n","import { codeListener } from \"./core/code-listener\";\r\n\r\nchrome.storage.sync.get([\"moodleGPT\"]).then(function (storage) {\r\n const config = storage.moodleGPT;\r\n\r\n if (!config) throw new Error(\"Please configure MoodleGPT into the extension\");\r\n\r\n codeListener(config);\r\n});\r\n"],"names":[],"mappings":"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","x_google_ignoreList":[1]} \ No newline at end of file +{"version":3,"file":"MoodleGPT.js","sources":["../src/utils/title-indications.ts","../node_modules/tslib/tslib.es6.js","../src/utils/logs.ts","../src/utils/normalize-text.ts","../src/core/get-response.ts","../src/utils/html-table-to-string.ts","../src/core/create-question.ts","../src/core/questions/radio-checkbox.ts","../src/core/questions/select.ts","../src/core/questions/textbox.ts","../src/core/questions/clipboard.ts","../src/core/questions/number.ts","../src/core/questions/contenteditable.ts","../src/core/reply.ts","../src/core/code-listener.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Show some informations into the document title and remove it after 3000ms\r\n * @param text\r\n */\r\nfunction titleIndications(text: string) {\r\n const backTitle = document.title;\r\n document.title = text;\r\n setTimeout(() => (document.title = backTitle), 3000);\r\n}\r\n\r\nexport default titleIndications;\r\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.push(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.push(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","class Logs {\r\n static question(text: string) {\r\n const css = \"color: cyan\";\r\n console.log(\"%c[QUESTION]: %s\", css, text);\r\n }\r\n\r\n static responseTry(text: string, valide: boolean) {\r\n const css = \"color: \" + (valide ? \"green\" : \"red\");\r\n console.log(\"%c[CHECKING]: %s\", css, text);\r\n }\r\n\r\n static array(arr: unknown[]) {\r\n console.log(\"[CORRECTS] \", arr);\r\n }\r\n\r\n static response(text: string) {\r\n console.log(text);\r\n }\r\n}\r\n\r\nexport default Logs;\r\n","/**\r\n * Normlize text\r\n * @param text\r\n */\r\nfunction normalizeText(text: string) {\r\n return text\r\n .replace(/\\n+/gi, \"\\n\")\r\n .replace(/(\\n\\s*\\n)+/g, \"\\n\") //remove useless white sapce from textcontent\r\n .replace(/[ \\t]+/gi, \" \")\r\n .toLowerCase()\r\n .trim()\r\n .replace(/^[a-z\\d]\\.\\s/gi, \"\") //a. text, b. text, c. text, 1. text, 2. text, 3.text\r\n .replace(/\\n[a-z\\d]\\.\\s/gi, \"\\n\"); //same but with new line\r\n}\r\n\r\nexport default normalizeText;\r\n","import Config from \"../types/config\";\r\nimport GPTAnswer from \"../types/gptAnswer\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\n\r\n/**\r\n * Get the response from chatGPT api\r\n * @param config\r\n * @param question\r\n * @returns\r\n */\r\nasync function getChatGPTResponse(\r\n config: Config,\r\n question: string\r\n): Promise {\r\n const controller = new AbortController();\r\n const timeoutControler = setTimeout(() => controller.abort(), 15000);\r\n const req = await fetch(\"https://api.openai.com/v1/chat/completions\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${config.apiKey}`,\r\n },\r\n signal: config.timeout ? controller.signal : null,\r\n body: JSON.stringify({\r\n model: config.model,\r\n messages: [{ role: \"user\", content: question }],\r\n temperature: 0.8,\r\n top_p: 1.0,\r\n presence_penalty: 1.0,\r\n stop: null,\r\n }),\r\n });\r\n clearTimeout(timeoutControler);\r\n const rep = await req.json();\r\n const response = rep.choices[0].message.content;\r\n return {\r\n response,\r\n normalizedResponse: normalizeText(response),\r\n };\r\n}\r\n\r\nexport default getChatGPTResponse;\r\n","/**\r\n * Convert table to representating string table\r\n * @param table\r\n * @returns\r\n */\r\nfunction htmlTableToString(table: HTMLTableElement) {\r\n const tab: string[][] = [];\r\n const lines = Array.from(table.querySelectorAll(\"tr\"));\r\n const maxColumnsLength: number[] = [];\r\n lines.map((line) => {\r\n const cells = Array.from(line.querySelectorAll(\"td, th\"));\r\n const cellsContent = cells.map((cell, index) => {\r\n const content = cell.textContent?.trim();\r\n maxColumnsLength[index] = Math.max(\r\n maxColumnsLength[index] || 0,\r\n content.length || 0\r\n );\r\n return content;\r\n });\r\n tab.push(cellsContent);\r\n });\r\n\r\n const lineSeparationSize =\r\n maxColumnsLength.reduce((a, b) => a + b) + tab[0].length * 3 + 1;\r\n const lineSeparation =\r\n \"\\n\" + Array(lineSeparationSize).fill(\"-\").join(\"\") + \"\\n\";\r\n\r\n const mappedTab = tab.map((line) => {\r\n const mappedLine = line.map((content, index) =>\r\n content.padEnd(\r\n maxColumnsLength[index],\r\n \"\\u00A0\" /* For no matching with \\s */\r\n )\r\n );\r\n return \"| \" + mappedLine.join(\" | \") + \" |\";\r\n });\r\n const head = mappedTab.shift();\r\n return head + lineSeparation + mappedTab.join(\"\\n\");\r\n}\r\n\r\nexport default htmlTableToString;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\nimport htmlTableToString from \"../utils/html-table-to-string\";\r\n\r\n/**\r\n * Normalize the question and add sub informations\r\n * @param langage\r\n * @param question\r\n * @returns\r\n */\r\nfunction createQuestion(config: Config, questionContainer: HTMLElement) {\r\n let question = questionContainer.innerText; //TODO: textContent better for reply ??\r\n\r\n /* Make tables more readable for chat-gpt */\r\n const tables: NodeListOf =\r\n questionContainer.querySelectorAll(\".qtext table\");\r\n for (const table of tables) {\r\n question = question.replace(\r\n table.innerText,\r\n \"\\n\" + htmlTableToString(table) + \"\\n\"\r\n );\r\n }\r\n\r\n const finalQuestion = `Give a short response as possible for this question, reply in the following question langage and only show the result:\r\n ${question} \r\n (If you have to choose between multiple results only show the corrects one, separate them with new line and take the same text as the question)`;\r\n return normalizeText(finalQuestion);\r\n}\r\n\r\nexport default createQuestion;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle checkbox and input elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n */\r\nfunction handleRadioAndCheckbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList?.[0] as HTMLInputElement;\r\n\r\n if (!input || (input.type !== \"checkbox\" && input.type !== \"radio\"))\r\n return false;\r\n\r\n for (const input of inputList as NodeListOf) {\r\n const content = normalizeText(input.parentNode.textContent);\r\n const valide = gptAnswer.normalizedResponse.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n if (valide) {\r\n if (config.mouseover) {\r\n input.addEventListener(\"mouseover\", () => (input.checked = true), {\r\n once: true,\r\n });\r\n } else {\r\n input.checked = true;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport default handleRadioAndCheckbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle select elements (and put in order select)\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleSelect(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n if (inputList.length === 0 || inputList[0].tagName !== \"SELECT\") return false;\r\n\r\n let correct = gptAnswer.normalizedResponse.split(\"\\n\");\r\n if (correct.length === 1 && correct.length !== inputList.length)\r\n correct = gptAnswer.normalizedResponse.split(\",\");\r\n\r\n if (config.logs) Logs.array(correct);\r\n\r\n for (let j = 0; j < inputList.length; ++j) {\r\n const options = inputList[j].querySelectorAll(\"option\");\r\n\r\n for (const option of options) {\r\n const content = normalizeText(option.textContent);\r\n const valide = correct[j].includes(content);\r\n\r\n /* Handle put in order question */\r\n if (!isNaN(parseInt(content))) {\r\n const content = normalizeText(\r\n (option.parentNode as HTMLElement)\r\n .closest(\"tr\")\r\n .querySelector(\".text\").textContent\r\n );\r\n const index = correct.findIndex((c) => {\r\n const valide = c.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n return valide;\r\n });\r\n if (index !== -1) {\r\n if (config.mouseover) {\r\n options[index + 1].closest(\"select\").addEventListener(\r\n \"click\",\r\n function () {\r\n options[index + 1].selected = \"selected\" as any;\r\n },\r\n { once: true }\r\n );\r\n } else {\r\n options[index + 1].selected = \"selected\" as any;\r\n }\r\n break;\r\n }\r\n }\r\n /* End */\r\n\r\n if (config.logs) Logs.responseTry(content, valide);\r\n\r\n if (valide) {\r\n if (config.mouseover) {\r\n option\r\n .closest(\"select\")\r\n .addEventListener(\"click\", () => (option.selected = true), {\r\n once: true,\r\n });\r\n } else {\r\n option.selected = true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleSelect;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle textbox\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleTextbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n (input.tagName !== \"TEXTAREA\" && input.type !== \"text\")\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.value = gptAnswer.response.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleTextbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport titleIndications from \"../../utils/title-indications\";\r\n\r\n/**\r\n * Copy the response in the clipboard if we can automaticaly fill the question\r\n * @param config\r\n * @param gptAnswer\r\n */\r\nfunction handleClipboard(config: Config, gptAnswer: GPTAnswer) {\r\n if (config.title) titleIndications(\"Copied to clipboard\");\r\n navigator.clipboard.writeText(gptAnswer.response);\r\n}\r\n\r\nexport default handleClipboard;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle number input\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleNumber(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (inputList.length !== 1 || input.type !== \"number\") return false;\r\n\r\n const number = gptAnswer.normalizedResponse\r\n .match(/\\d+([,\\.]\\d+)?/gi)?.[0]\r\n ?.replace(\",\", \".\");\r\n\r\n if (!number) return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = number.length + 1;\r\n if (index > number.length) return;\r\n event.preventDefault();\r\n if (number.slice(index, index + 1) === \".\") ++index;\r\n input.value = number.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = number;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleNumber;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Hanlde contenteditable elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleContentEditable(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0];\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n input.getAttribute(\"contenteditable\") !== \"true\"\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.textContent = gptAnswer.response.slice(0, ++index);\r\n\r\n /* Put the cursor at the end of the typed text */\r\n input.focus();\r\n const range = document.createRange();\r\n range.selectNodeContents(input);\r\n range.collapse(false);\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n });\r\n } else {\r\n input.textContent = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleContentEditable;\r\n","import Config from \"../types/config\";\r\nimport Logs from \"../utils/logs\";\r\nimport getChatGPTResponse from \"./get-response\";\r\nimport createQuestion from \"./create-question\";\r\nimport handleRadioAndCheckbox from \"./questions/radio-checkbox\";\r\nimport handleSelect from \"./questions/select\";\r\nimport handleTextbox from \"./questions/textbox\";\r\nimport handleClipboard from \"./questions/clipboard\";\r\nimport handleNumber from \"./questions/number\";\r\nimport handleContentEditable from \"./questions/contenteditable\";\r\nimport { removeListener } from \"./code-listener\";\r\n\r\n/**\r\n * Reply to the question\r\n * @param config\r\n * @param hiddenButton\r\n * @param form\r\n * @param query\r\n * @returns\r\n */\r\nasync function reply(\r\n config: Config,\r\n hiddenButton: HTMLElement,\r\n form: HTMLElement,\r\n query: string\r\n) {\r\n if (config.cursor) hiddenButton.style.cursor = \"wait\";\r\n\r\n const question = createQuestion(config, form);\r\n const inputList: NodeListOf = form.querySelectorAll(query);\r\n\r\n const gptAnswer = await getChatGPTResponse(config, question).catch(\r\n (error) => ({\r\n error,\r\n })\r\n );\r\n\r\n const haveError = typeof gptAnswer === \"object\" && \"error\" in gptAnswer;\r\n\r\n if (config.cursor)\r\n hiddenButton.style.cursor =\r\n config.infinite || haveError ? \"pointer\" : \"initial\";\r\n\r\n if (haveError) {\r\n console.error(gptAnswer.error);\r\n return;\r\n }\r\n\r\n if (config.logs) {\r\n Logs.question(question);\r\n Logs.response(\"Original: \" + gptAnswer.response);\r\n Logs.response(\"Normalized: \" + gptAnswer.normalizedResponse);\r\n }\r\n\r\n /* Handle clipboard mode */\r\n if (config.mode === \"clipboard\") {\r\n if (!config.infinite) removeListener(hiddenButton);\r\n return handleClipboard(config, gptAnswer);\r\n }\r\n\r\n /* Handle question to answer mode */\r\n if (config.mode === \"question-to-answer\") {\r\n removeListener(hiddenButton);\r\n\r\n const questionBackup = form.textContent;\r\n const questionContainer = form.querySelector(\".qtext\");\r\n\r\n questionContainer.textContent = gptAnswer.response;\r\n questionContainer.style.whiteSpace = \"pre-wrap\";\r\n\r\n questionContainer.addEventListener(\"click\", function () {\r\n const isNotResponse = questionContainer.textContent === questionBackup;\r\n questionContainer.style.whiteSpace = isNotResponse ? \"pre-wrap\" : null;\r\n questionContainer.textContent = isNotResponse\r\n ? gptAnswer.response\r\n : questionBackup;\r\n });\r\n return;\r\n }\r\n\r\n const handlers = [\r\n handleContentEditable,\r\n handleTextbox,\r\n handleNumber,\r\n handleSelect,\r\n handleRadioAndCheckbox,\r\n ];\r\n\r\n for (const handler of handlers) {\r\n if (handler(config, inputList, gptAnswer)) return;\r\n }\r\n\r\n /* In the case we can't auto complete the question */\r\n handleClipboard(config, gptAnswer);\r\n\r\n /* Better then set once on the event because if there is an error the user can click an other time on the question */\r\n if (!config.infinite) removeListener(hiddenButton);\r\n}\r\n\r\nexport default reply;\r\n","import Config from \"../types/config\";\r\nimport titleIndications from \"../utils/title-indications\";\r\nimport reply from \"./reply\";\r\n\r\nconst pressedKeys: string[] = [];\r\nconst listeners: {\r\n element: HTMLElement;\r\n fn: (this: HTMLElement, ev: MouseEvent) => any;\r\n}[] = [];\r\n\r\n/**\r\n * Create a listener on the keyboard to inject the code\r\n * @param config\r\n */\r\nfunction codeListener(config: Config) {\r\n document.body.addEventListener(\"keydown\", function (event) {\r\n pressedKeys.push(event.key);\r\n if (pressedKeys.length > config.code.length) pressedKeys.shift();\r\n if (pressedKeys.join(\"\") === config.code) {\r\n pressedKeys.length = 0;\r\n setUpMoodleGpt(config);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Setup moodleGPT into the page (remove/injection)\r\n * @param config\r\n * @returns\r\n */\r\nfunction setUpMoodleGpt(config: Config) {\r\n /* Removing events */\r\n if (listeners.length > 0) {\r\n for (const listener of listeners) {\r\n if (config.cursor) listener.element.style.cursor = \"initial\";\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n if (config.title) titleIndications(\"Removed\");\r\n listeners.length = 0;\r\n return;\r\n }\r\n\r\n /* Code injection */\r\n const inputQuery = [\"checkbox\", \"radio\", \"text\", \"number\"]\r\n .map((e) => `input[type=\"${e}\"]`)\r\n .join(\",\");\r\n const query = inputQuery + \", textarea, select, [contenteditable]\";\r\n const forms = document.querySelectorAll(\".formulation\");\r\n\r\n for (const form of forms) {\r\n const hiddenButton: HTMLElement = form.querySelector(\".qtext\");\r\n\r\n if (config.cursor) hiddenButton.style.cursor = \"pointer\";\r\n\r\n const injectionFunction = reply.bind(\r\n null,\r\n config,\r\n hiddenButton,\r\n form,\r\n query\r\n );\r\n listeners.push({ element: hiddenButton, fn: injectionFunction });\r\n hiddenButton.addEventListener(\"click\", injectionFunction);\r\n }\r\n\r\n if (config.title) titleIndications(\"Injected\");\r\n}\r\n\r\nfunction removeListener(element: HTMLElement) {\r\n const index = listeners.findIndex((listener) => listener.element === element);\r\n if (index !== -1) {\r\n const listener = listeners.splice(index, 1)[0];\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n}\r\n\r\nexport { codeListener, removeListener };\r\n","import { codeListener } from \"./core/code-listener\";\r\n\r\nchrome.storage.sync.get([\"moodleGPT\"]).then(function (storage) {\r\n const config = storage.moodleGPT;\r\n\r\n if (!config) throw new Error(\"Please configure MoodleGPT into the extension\");\r\n\r\n codeListener(config);\r\n});\r\n"],"names":[],"mappings":"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","x_google_ignoreList":[1]} \ No newline at end of file diff --git a/src/core/code-listener.ts b/src/core/code-listener.ts index 319361f..6b72874 100644 --- a/src/core/code-listener.ts +++ b/src/core/code-listener.ts @@ -2,7 +2,6 @@ import Config from "../types/config"; import titleIndications from "../utils/title-indications"; import reply from "./reply"; -let injectionFunction: (this: HTMLElement, ev: MouseEvent) => any = null; const pressedKeys: string[] = []; const listeners: { element: HTMLElement; @@ -53,7 +52,13 @@ function setUpMoodleGpt(config: Config) { if (config.cursor) hiddenButton.style.cursor = "pointer"; - injectionFunction = reply.bind(null, config, hiddenButton, form, query); + const injectionFunction = reply.bind( + null, + config, + hiddenButton, + form, + query + ); listeners.push({ element: hiddenButton, fn: injectionFunction }); hiddenButton.addEventListener("click", injectionFunction); } @@ -61,4 +66,12 @@ function setUpMoodleGpt(config: Config) { if (config.title) titleIndications("Injected"); } -export { injectionFunction, codeListener }; +function removeListener(element: HTMLElement) { + const index = listeners.findIndex((listener) => listener.element === element); + if (index !== -1) { + const listener = listeners.splice(index, 1)[0]; + listener.element.removeEventListener("click", listener.fn); + } +} + +export { codeListener, removeListener }; diff --git a/src/core/get-response.ts b/src/core/get-response.ts index 0c25bb7..4569954 100644 --- a/src/core/get-response.ts +++ b/src/core/get-response.ts @@ -1,4 +1,5 @@ import Config from "../types/config"; +import GPTAnswer from "../types/gptAnswer"; import normalizeText from "../utils/normalize-text"; /** @@ -10,7 +11,7 @@ import normalizeText from "../utils/normalize-text"; async function getChatGPTResponse( config: Config, question: string -): Promise { +): Promise { const controller = new AbortController(); const timeoutControler = setTimeout(() => controller.abort(), 15000); const req = await fetch("https://api.openai.com/v1/chat/completions", { @@ -32,7 +33,10 @@ async function getChatGPTResponse( clearTimeout(timeoutControler); const rep = await req.json(); const response = rep.choices[0].message.content; - return normalizeText(response); + return { + response, + normalizedResponse: normalizeText(response), + }; } export default getChatGPTResponse; diff --git a/src/core/questions/clipboard.ts b/src/core/questions/clipboard.ts index ba42572..563bbe5 100644 --- a/src/core/questions/clipboard.ts +++ b/src/core/questions/clipboard.ts @@ -1,17 +1,15 @@ import Config from "../../types/config"; +import GPTAnswer from "../../types/gptAnswer"; import titleIndications from "../../utils/title-indications"; /** * Copy the response in the clipboard if we can automaticaly fill the question * @param config - * @param inputList - * @param response - * @param force Force the copy to clipboard - * @returns + * @param gptAnswer */ -function handleClipboard(config: Config, response: string) { +function handleClipboard(config: Config, gptAnswer: GPTAnswer) { if (config.title) titleIndications("Copied to clipboard"); - navigator.clipboard.writeText(response); + navigator.clipboard.writeText(gptAnswer.response); } export default handleClipboard; diff --git a/src/core/questions/contenteditable.ts b/src/core/questions/contenteditable.ts index fbe9508..ea8b661 100644 --- a/src/core/questions/contenteditable.ts +++ b/src/core/questions/contenteditable.ts @@ -1,9 +1,17 @@ import Config from "../../types/config"; +import GPTAnswer from "../../types/gptAnswer"; +/** + * Hanlde contenteditable elements + * @param config + * @param inputList + * @param gptAnswer + * @returns + */ function handleContentEditable( config: Config, inputList: NodeListOf, - response: string + gptAnswer: GPTAnswer ): boolean { const input = inputList[0]; @@ -16,10 +24,10 @@ function handleContentEditable( if (config.typing) { let index = 0; input.addEventListener("keydown", function (event: KeyboardEvent) { - if (event.key === "Backspace") index = response.length + 1; - if (index > response.length) return; + if (event.key === "Backspace") index = gptAnswer.response.length + 1; + if (index > gptAnswer.response.length) return; event.preventDefault(); - input.textContent = response.slice(0, ++index); + input.textContent = gptAnswer.response.slice(0, ++index); /* Put the cursor at the end of the typed text */ input.focus(); @@ -31,7 +39,7 @@ function handleContentEditable( selection.addRange(range); }); } else { - input.textContent = response; + input.textContent = gptAnswer.response; } return true; diff --git a/src/core/questions/number.ts b/src/core/questions/number.ts index 117fac6..3171928 100644 --- a/src/core/questions/number.ts +++ b/src/core/questions/number.ts @@ -1,22 +1,25 @@ import Config from "../../types/config"; +import GPTAnswer from "../../types/gptAnswer"; /** * Handle number input * @param config * @param inputList - * @param response + * @param gptAnswer * @returns */ function handleNumber( config: Config, inputList: NodeListOf, - response: string + gptAnswer: GPTAnswer ): boolean { const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement; if (inputList.length !== 1 || input.type !== "number") return false; - const number = response.match(/\d+([,\.]\d+)?/gi)?.[0]?.replace(",", "."); + const number = gptAnswer.normalizedResponse + .match(/\d+([,\.]\d+)?/gi)?.[0] + ?.replace(",", "."); if (!number) return false; diff --git a/src/core/questions/radio-checkbox.ts b/src/core/questions/radio-checkbox.ts index 65c9a79..ea9de1f 100644 --- a/src/core/questions/radio-checkbox.ts +++ b/src/core/questions/radio-checkbox.ts @@ -1,4 +1,5 @@ import Config from "../../types/config"; +import GPTAnswer from "../../types/gptAnswer"; import Logs from "../../utils/logs"; import normalizeText from "../../utils/normalize-text"; @@ -6,12 +7,12 @@ import normalizeText from "../../utils/normalize-text"; * Handle checkbox and input elements * @param config * @param inputList - * @param response + * @param gptAnswer */ function handleRadioAndCheckbox( config: Config, inputList: NodeListOf, - response: string + gptAnswer: GPTAnswer ): boolean { const input = inputList?.[0] as HTMLInputElement; @@ -20,7 +21,7 @@ function handleRadioAndCheckbox( for (const input of inputList as NodeListOf) { const content = normalizeText(input.parentNode.textContent); - const valide = response.includes(content); + const valide = gptAnswer.normalizedResponse.includes(content); if (config.logs) Logs.responseTry(content, valide); if (valide) { if (config.mouseover) { diff --git a/src/core/questions/select.ts b/src/core/questions/select.ts index e310fb9..0b78d0b 100644 --- a/src/core/questions/select.ts +++ b/src/core/questions/select.ts @@ -1,4 +1,5 @@ import Config from "../../types/config"; +import GPTAnswer from "../../types/gptAnswer"; import Logs from "../../utils/logs"; import normalizeText from "../../utils/normalize-text"; @@ -6,19 +7,19 @@ import normalizeText from "../../utils/normalize-text"; * Handle select elements (and put in order select) * @param config * @param inputList - * @param response + * @param gptAnswer * @returns */ function handleSelect( config: Config, inputList: NodeListOf, - response: string + gptAnswer: GPTAnswer ): boolean { if (inputList.length === 0 || inputList[0].tagName !== "SELECT") return false; - let correct = response.split("\n"); + let correct = gptAnswer.normalizedResponse.split("\n"); if (correct.length === 1 && correct.length !== inputList.length) - correct = response.split(","); + correct = gptAnswer.normalizedResponse.split(","); if (config.logs) Logs.array(correct); diff --git a/src/core/questions/textbox.ts b/src/core/questions/textbox.ts index 8b226d1..8712b45 100644 --- a/src/core/questions/textbox.ts +++ b/src/core/questions/textbox.ts @@ -1,16 +1,17 @@ import Config from "../../types/config"; +import GPTAnswer from "../../types/gptAnswer"; /** * Handle textbox * @param config * @param inputList - * @param response + * @param gptAnswer * @returns */ function handleTextbox( config: Config, inputList: NodeListOf, - response: string + gptAnswer: GPTAnswer ): boolean { const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement; @@ -23,13 +24,13 @@ function handleTextbox( if (config.typing) { let index = 0; input.addEventListener("keydown", function (event: KeyboardEvent) { - if (event.key === "Backspace") index = response.length + 1; - if (index > response.length) return; + if (event.key === "Backspace") index = gptAnswer.response.length + 1; + if (index > gptAnswer.response.length) return; event.preventDefault(); - input.value = response.slice(0, ++index); + input.value = gptAnswer.response.slice(0, ++index); }); } else { - input.value = response; + input.value = gptAnswer.response; } return true; diff --git a/src/core/reply.ts b/src/core/reply.ts index f18800e..8613b9b 100644 --- a/src/core/reply.ts +++ b/src/core/reply.ts @@ -8,7 +8,7 @@ import handleTextbox from "./questions/textbox"; import handleClipboard from "./questions/clipboard"; import handleNumber from "./questions/number"; import handleContentEditable from "./questions/contenteditable"; -import { injectionFunction } from "./code-listener"; +import { removeListener } from "./code-listener"; /** * Reply to the question @@ -29,41 +29,51 @@ async function reply( const question = createQuestion(config, form); const inputList: NodeListOf = form.querySelectorAll(query); - const response = await getChatGPTResponse(config, question).catch( + const gptAnswer = await getChatGPTResponse(config, question).catch( (error) => ({ error, }) ); - const haveError = typeof response === "object" && "error" in response; + const haveError = typeof gptAnswer === "object" && "error" in gptAnswer; if (config.cursor) hiddenButton.style.cursor = config.infinite || haveError ? "pointer" : "initial"; if (haveError) { - console.error(response.error); + console.error(gptAnswer.error); return; } if (config.logs) { Logs.question(question); - Logs.response(response); + Logs.response("Original: " + gptAnswer.response); + Logs.response("Normalized: " + gptAnswer.normalizedResponse); } + /* Handle clipboard mode */ if (config.mode === "clipboard") { - return handleClipboard(config, response); + if (!config.infinite) removeListener(hiddenButton); + return handleClipboard(config, gptAnswer); } + /* Handle question to answer mode */ if (config.mode === "question-to-answer") { + removeListener(hiddenButton); + const questionBackup = form.textContent; - const questionContainer = form.querySelector(".qtext"); - questionContainer.textContent = response; + const questionContainer = form.querySelector(".qtext"); + + questionContainer.textContent = gptAnswer.response; + questionContainer.style.whiteSpace = "pre-wrap"; + questionContainer.addEventListener("click", function () { - questionContainer.textContent = - questionContainer.textContent === questionBackup - ? response - : questionBackup; + const isNotResponse = questionContainer.textContent === questionBackup; + questionContainer.style.whiteSpace = isNotResponse ? "pre-wrap" : null; + questionContainer.textContent = isNotResponse + ? gptAnswer.response + : questionBackup; }); return; } @@ -77,15 +87,14 @@ async function reply( ]; for (const handler of handlers) { - if (handler(config, inputList, response)) return; + if (handler(config, inputList, gptAnswer)) return; } /* In the case we can't auto complete the question */ - handleClipboard(config, response); + handleClipboard(config, gptAnswer); /* Better then set once on the event because if there is an error the user can click an other time on the question */ - if (!config.infinite) - hiddenButton.removeEventListener("click", injectionFunction); + if (!config.infinite) removeListener(hiddenButton); } export default reply; diff --git a/src/types/config.d.ts b/src/types/config.ts similarity index 95% rename from src/types/config.d.ts rename to src/types/config.ts index dc5392a..c2d101f 100644 --- a/src/types/config.d.ts +++ b/src/types/config.ts @@ -1,15 +1,15 @@ -type Config = { - apiKey: string; - code: string; - model?: string; - infinite?: boolean; - typing?: boolean; - mouseover?: boolean; - cursor?: boolean; - logs?: boolean; - title?: boolean; - timeout?: boolean; - mode?: "autocomplete" | "question-to-answer" | "clipboard"; -}; - -export default Config; +type Config = { + apiKey: string; + code: string; + model?: string; + infinite?: boolean; + typing?: boolean; + mouseover?: boolean; + cursor?: boolean; + logs?: boolean; + title?: boolean; + timeout?: boolean; + mode?: "autocomplete" | "question-to-answer" | "clipboard"; +}; + +export default Config; diff --git a/src/types/gptAnswer.ts b/src/types/gptAnswer.ts new file mode 100644 index 0000000..4742310 --- /dev/null +++ b/src/types/gptAnswer.ts @@ -0,0 +1,6 @@ +type GPTAnswer = { + response: string; + normalizedResponse: string; +}; + +export default GPTAnswer; From a290733bf7529785db1a4ebcec325eb5137b33cb Mon Sep 17 00:00:00 2001 From: yoannchb-pro <71560747+yoannchb-pro@users.noreply.github.com> Date: Tue, 20 Jun 2023 14:34:27 -0400 Subject: [PATCH 16/35] doc update --- README.md | 2 +- TODO.md | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 1852ace..8426a5f 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,7 @@ Go to "Manage my extensions" on your browser, then click on "Load unpa ## Inject the code into the moodle -You just need to enter on the keyboard the code you have set into the extension and clique on the question you want to solve. +You just need to enter on the keyboard the code you have set into the extension and click on the question you want to solve. ## Remove injection diff --git a/TODO.md b/TODO.md index 01bfb7b..f478ac0 100644 --- a/TODO.md +++ b/TODO.md @@ -3,7 +3,6 @@ ## Priority: 1 - [ ] Increment question when there is statement -- [ ] Original answer for text, clipboard and text to answer ## Priority: 3 (because hard to make) From e26422a4a3ee254ae5ed10a21353dcbae79cbab4 Mon Sep 17 00:00:00 2001 From: yoannchb-pro <71560747+yoannchb-pro@users.noreply.github.com> Date: Tue, 20 Jun 2023 14:40:25 -0400 Subject: [PATCH 17/35] jsDoc for removeListener --- extension/MoodleGPT.js | 4 ++++ extension/MoodleGPT.js.map | 2 +- src/core/code-listener.ts | 4 ++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/extension/MoodleGPT.js b/extension/MoodleGPT.js index 129becf..46aad8f 100644 --- a/extension/MoodleGPT.js +++ b/extension/MoodleGPT.js @@ -482,6 +482,10 @@ if (config.title) titleIndications("Injected"); } + /** + * Remove the event listener on a specific question + * @param element + */ function removeListener(element) { const index = listeners.findIndex((listener) => listener.element === element); if (index !== -1) { diff --git a/extension/MoodleGPT.js.map b/extension/MoodleGPT.js.map index 7faa6c2..03c1d0d 100644 --- a/extension/MoodleGPT.js.map +++ b/extension/MoodleGPT.js.map @@ -1 +1 @@ -{"version":3,"file":"MoodleGPT.js","sources":["../src/utils/title-indications.ts","../node_modules/tslib/tslib.es6.js","../src/utils/logs.ts","../src/utils/normalize-text.ts","../src/core/get-response.ts","../src/utils/html-table-to-string.ts","../src/core/create-question.ts","../src/core/questions/radio-checkbox.ts","../src/core/questions/select.ts","../src/core/questions/textbox.ts","../src/core/questions/clipboard.ts","../src/core/questions/number.ts","../src/core/questions/contenteditable.ts","../src/core/reply.ts","../src/core/code-listener.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Show some informations into the document title and remove it after 3000ms\r\n * @param text\r\n */\r\nfunction titleIndications(text: string) {\r\n const backTitle = document.title;\r\n document.title = text;\r\n setTimeout(() => (document.title = backTitle), 3000);\r\n}\r\n\r\nexport default titleIndications;\r\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.push(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.push(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","class Logs {\r\n static question(text: string) {\r\n const css = \"color: cyan\";\r\n console.log(\"%c[QUESTION]: %s\", css, text);\r\n }\r\n\r\n static responseTry(text: string, valide: boolean) {\r\n const css = \"color: \" + (valide ? \"green\" : \"red\");\r\n console.log(\"%c[CHECKING]: %s\", css, text);\r\n }\r\n\r\n static array(arr: unknown[]) {\r\n console.log(\"[CORRECTS] \", arr);\r\n }\r\n\r\n static response(text: string) {\r\n console.log(text);\r\n }\r\n}\r\n\r\nexport default Logs;\r\n","/**\r\n * Normlize text\r\n * @param text\r\n */\r\nfunction normalizeText(text: string) {\r\n return text\r\n .replace(/\\n+/gi, \"\\n\")\r\n .replace(/(\\n\\s*\\n)+/g, \"\\n\") //remove useless white sapce from textcontent\r\n .replace(/[ \\t]+/gi, \" \")\r\n .toLowerCase()\r\n .trim()\r\n .replace(/^[a-z\\d]\\.\\s/gi, \"\") //a. text, b. text, c. text, 1. text, 2. text, 3.text\r\n .replace(/\\n[a-z\\d]\\.\\s/gi, \"\\n\"); //same but with new line\r\n}\r\n\r\nexport default normalizeText;\r\n","import Config from \"../types/config\";\r\nimport GPTAnswer from \"../types/gptAnswer\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\n\r\n/**\r\n * Get the response from chatGPT api\r\n * @param config\r\n * @param question\r\n * @returns\r\n */\r\nasync function getChatGPTResponse(\r\n config: Config,\r\n question: string\r\n): Promise {\r\n const controller = new AbortController();\r\n const timeoutControler = setTimeout(() => controller.abort(), 15000);\r\n const req = await fetch(\"https://api.openai.com/v1/chat/completions\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${config.apiKey}`,\r\n },\r\n signal: config.timeout ? controller.signal : null,\r\n body: JSON.stringify({\r\n model: config.model,\r\n messages: [{ role: \"user\", content: question }],\r\n temperature: 0.8,\r\n top_p: 1.0,\r\n presence_penalty: 1.0,\r\n stop: null,\r\n }),\r\n });\r\n clearTimeout(timeoutControler);\r\n const rep = await req.json();\r\n const response = rep.choices[0].message.content;\r\n return {\r\n response,\r\n normalizedResponse: normalizeText(response),\r\n };\r\n}\r\n\r\nexport default getChatGPTResponse;\r\n","/**\r\n * Convert table to representating string table\r\n * @param table\r\n * @returns\r\n */\r\nfunction htmlTableToString(table: HTMLTableElement) {\r\n const tab: string[][] = [];\r\n const lines = Array.from(table.querySelectorAll(\"tr\"));\r\n const maxColumnsLength: number[] = [];\r\n lines.map((line) => {\r\n const cells = Array.from(line.querySelectorAll(\"td, th\"));\r\n const cellsContent = cells.map((cell, index) => {\r\n const content = cell.textContent?.trim();\r\n maxColumnsLength[index] = Math.max(\r\n maxColumnsLength[index] || 0,\r\n content.length || 0\r\n );\r\n return content;\r\n });\r\n tab.push(cellsContent);\r\n });\r\n\r\n const lineSeparationSize =\r\n maxColumnsLength.reduce((a, b) => a + b) + tab[0].length * 3 + 1;\r\n const lineSeparation =\r\n \"\\n\" + Array(lineSeparationSize).fill(\"-\").join(\"\") + \"\\n\";\r\n\r\n const mappedTab = tab.map((line) => {\r\n const mappedLine = line.map((content, index) =>\r\n content.padEnd(\r\n maxColumnsLength[index],\r\n \"\\u00A0\" /* For no matching with \\s */\r\n )\r\n );\r\n return \"| \" + mappedLine.join(\" | \") + \" |\";\r\n });\r\n const head = mappedTab.shift();\r\n return head + lineSeparation + mappedTab.join(\"\\n\");\r\n}\r\n\r\nexport default htmlTableToString;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\nimport htmlTableToString from \"../utils/html-table-to-string\";\r\n\r\n/**\r\n * Normalize the question and add sub informations\r\n * @param langage\r\n * @param question\r\n * @returns\r\n */\r\nfunction createQuestion(config: Config, questionContainer: HTMLElement) {\r\n let question = questionContainer.innerText; //TODO: textContent better for reply ??\r\n\r\n /* Make tables more readable for chat-gpt */\r\n const tables: NodeListOf =\r\n questionContainer.querySelectorAll(\".qtext table\");\r\n for (const table of tables) {\r\n question = question.replace(\r\n table.innerText,\r\n \"\\n\" + htmlTableToString(table) + \"\\n\"\r\n );\r\n }\r\n\r\n const finalQuestion = `Give a short response as possible for this question, reply in the following question langage and only show the result:\r\n ${question} \r\n (If you have to choose between multiple results only show the corrects one, separate them with new line and take the same text as the question)`;\r\n return normalizeText(finalQuestion);\r\n}\r\n\r\nexport default createQuestion;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle checkbox and input elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n */\r\nfunction handleRadioAndCheckbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList?.[0] as HTMLInputElement;\r\n\r\n if (!input || (input.type !== \"checkbox\" && input.type !== \"radio\"))\r\n return false;\r\n\r\n for (const input of inputList as NodeListOf) {\r\n const content = normalizeText(input.parentNode.textContent);\r\n const valide = gptAnswer.normalizedResponse.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n if (valide) {\r\n if (config.mouseover) {\r\n input.addEventListener(\"mouseover\", () => (input.checked = true), {\r\n once: true,\r\n });\r\n } else {\r\n input.checked = true;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport default handleRadioAndCheckbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle select elements (and put in order select)\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleSelect(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n if (inputList.length === 0 || inputList[0].tagName !== \"SELECT\") return false;\r\n\r\n let correct = gptAnswer.normalizedResponse.split(\"\\n\");\r\n if (correct.length === 1 && correct.length !== inputList.length)\r\n correct = gptAnswer.normalizedResponse.split(\",\");\r\n\r\n if (config.logs) Logs.array(correct);\r\n\r\n for (let j = 0; j < inputList.length; ++j) {\r\n const options = inputList[j].querySelectorAll(\"option\");\r\n\r\n for (const option of options) {\r\n const content = normalizeText(option.textContent);\r\n const valide = correct[j].includes(content);\r\n\r\n /* Handle put in order question */\r\n if (!isNaN(parseInt(content))) {\r\n const content = normalizeText(\r\n (option.parentNode as HTMLElement)\r\n .closest(\"tr\")\r\n .querySelector(\".text\").textContent\r\n );\r\n const index = correct.findIndex((c) => {\r\n const valide = c.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n return valide;\r\n });\r\n if (index !== -1) {\r\n if (config.mouseover) {\r\n options[index + 1].closest(\"select\").addEventListener(\r\n \"click\",\r\n function () {\r\n options[index + 1].selected = \"selected\" as any;\r\n },\r\n { once: true }\r\n );\r\n } else {\r\n options[index + 1].selected = \"selected\" as any;\r\n }\r\n break;\r\n }\r\n }\r\n /* End */\r\n\r\n if (config.logs) Logs.responseTry(content, valide);\r\n\r\n if (valide) {\r\n if (config.mouseover) {\r\n option\r\n .closest(\"select\")\r\n .addEventListener(\"click\", () => (option.selected = true), {\r\n once: true,\r\n });\r\n } else {\r\n option.selected = true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleSelect;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle textbox\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleTextbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n (input.tagName !== \"TEXTAREA\" && input.type !== \"text\")\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.value = gptAnswer.response.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleTextbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport titleIndications from \"../../utils/title-indications\";\r\n\r\n/**\r\n * Copy the response in the clipboard if we can automaticaly fill the question\r\n * @param config\r\n * @param gptAnswer\r\n */\r\nfunction handleClipboard(config: Config, gptAnswer: GPTAnswer) {\r\n if (config.title) titleIndications(\"Copied to clipboard\");\r\n navigator.clipboard.writeText(gptAnswer.response);\r\n}\r\n\r\nexport default handleClipboard;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle number input\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleNumber(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (inputList.length !== 1 || input.type !== \"number\") return false;\r\n\r\n const number = gptAnswer.normalizedResponse\r\n .match(/\\d+([,\\.]\\d+)?/gi)?.[0]\r\n ?.replace(\",\", \".\");\r\n\r\n if (!number) return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = number.length + 1;\r\n if (index > number.length) return;\r\n event.preventDefault();\r\n if (number.slice(index, index + 1) === \".\") ++index;\r\n input.value = number.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = number;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleNumber;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Hanlde contenteditable elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleContentEditable(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0];\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n input.getAttribute(\"contenteditable\") !== \"true\"\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.textContent = gptAnswer.response.slice(0, ++index);\r\n\r\n /* Put the cursor at the end of the typed text */\r\n input.focus();\r\n const range = document.createRange();\r\n range.selectNodeContents(input);\r\n range.collapse(false);\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n });\r\n } else {\r\n input.textContent = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleContentEditable;\r\n","import Config from \"../types/config\";\r\nimport Logs from \"../utils/logs\";\r\nimport getChatGPTResponse from \"./get-response\";\r\nimport createQuestion from \"./create-question\";\r\nimport handleRadioAndCheckbox from \"./questions/radio-checkbox\";\r\nimport handleSelect from \"./questions/select\";\r\nimport handleTextbox from \"./questions/textbox\";\r\nimport handleClipboard from \"./questions/clipboard\";\r\nimport handleNumber from \"./questions/number\";\r\nimport handleContentEditable from \"./questions/contenteditable\";\r\nimport { removeListener } from \"./code-listener\";\r\n\r\n/**\r\n * Reply to the question\r\n * @param config\r\n * @param hiddenButton\r\n * @param form\r\n * @param query\r\n * @returns\r\n */\r\nasync function reply(\r\n config: Config,\r\n hiddenButton: HTMLElement,\r\n form: HTMLElement,\r\n query: string\r\n) {\r\n if (config.cursor) hiddenButton.style.cursor = \"wait\";\r\n\r\n const question = createQuestion(config, form);\r\n const inputList: NodeListOf = form.querySelectorAll(query);\r\n\r\n const gptAnswer = await getChatGPTResponse(config, question).catch(\r\n (error) => ({\r\n error,\r\n })\r\n );\r\n\r\n const haveError = typeof gptAnswer === \"object\" && \"error\" in gptAnswer;\r\n\r\n if (config.cursor)\r\n hiddenButton.style.cursor =\r\n config.infinite || haveError ? \"pointer\" : \"initial\";\r\n\r\n if (haveError) {\r\n console.error(gptAnswer.error);\r\n return;\r\n }\r\n\r\n if (config.logs) {\r\n Logs.question(question);\r\n Logs.response(\"Original: \" + gptAnswer.response);\r\n Logs.response(\"Normalized: \" + gptAnswer.normalizedResponse);\r\n }\r\n\r\n /* Handle clipboard mode */\r\n if (config.mode === \"clipboard\") {\r\n if (!config.infinite) removeListener(hiddenButton);\r\n return handleClipboard(config, gptAnswer);\r\n }\r\n\r\n /* Handle question to answer mode */\r\n if (config.mode === \"question-to-answer\") {\r\n removeListener(hiddenButton);\r\n\r\n const questionBackup = form.textContent;\r\n const questionContainer = form.querySelector(\".qtext\");\r\n\r\n questionContainer.textContent = gptAnswer.response;\r\n questionContainer.style.whiteSpace = \"pre-wrap\";\r\n\r\n questionContainer.addEventListener(\"click\", function () {\r\n const isNotResponse = questionContainer.textContent === questionBackup;\r\n questionContainer.style.whiteSpace = isNotResponse ? \"pre-wrap\" : null;\r\n questionContainer.textContent = isNotResponse\r\n ? gptAnswer.response\r\n : questionBackup;\r\n });\r\n return;\r\n }\r\n\r\n const handlers = [\r\n handleContentEditable,\r\n handleTextbox,\r\n handleNumber,\r\n handleSelect,\r\n handleRadioAndCheckbox,\r\n ];\r\n\r\n for (const handler of handlers) {\r\n if (handler(config, inputList, gptAnswer)) return;\r\n }\r\n\r\n /* In the case we can't auto complete the question */\r\n handleClipboard(config, gptAnswer);\r\n\r\n /* Better then set once on the event because if there is an error the user can click an other time on the question */\r\n if (!config.infinite) removeListener(hiddenButton);\r\n}\r\n\r\nexport default reply;\r\n","import Config from \"../types/config\";\r\nimport titleIndications from \"../utils/title-indications\";\r\nimport reply from \"./reply\";\r\n\r\nconst pressedKeys: string[] = [];\r\nconst listeners: {\r\n element: HTMLElement;\r\n fn: (this: HTMLElement, ev: MouseEvent) => any;\r\n}[] = [];\r\n\r\n/**\r\n * Create a listener on the keyboard to inject the code\r\n * @param config\r\n */\r\nfunction codeListener(config: Config) {\r\n document.body.addEventListener(\"keydown\", function (event) {\r\n pressedKeys.push(event.key);\r\n if (pressedKeys.length > config.code.length) pressedKeys.shift();\r\n if (pressedKeys.join(\"\") === config.code) {\r\n pressedKeys.length = 0;\r\n setUpMoodleGpt(config);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Setup moodleGPT into the page (remove/injection)\r\n * @param config\r\n * @returns\r\n */\r\nfunction setUpMoodleGpt(config: Config) {\r\n /* Removing events */\r\n if (listeners.length > 0) {\r\n for (const listener of listeners) {\r\n if (config.cursor) listener.element.style.cursor = \"initial\";\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n if (config.title) titleIndications(\"Removed\");\r\n listeners.length = 0;\r\n return;\r\n }\r\n\r\n /* Code injection */\r\n const inputQuery = [\"checkbox\", \"radio\", \"text\", \"number\"]\r\n .map((e) => `input[type=\"${e}\"]`)\r\n .join(\",\");\r\n const query = inputQuery + \", textarea, select, [contenteditable]\";\r\n const forms = document.querySelectorAll(\".formulation\");\r\n\r\n for (const form of forms) {\r\n const hiddenButton: HTMLElement = form.querySelector(\".qtext\");\r\n\r\n if (config.cursor) hiddenButton.style.cursor = \"pointer\";\r\n\r\n const injectionFunction = reply.bind(\r\n null,\r\n config,\r\n hiddenButton,\r\n form,\r\n query\r\n );\r\n listeners.push({ element: hiddenButton, fn: injectionFunction });\r\n hiddenButton.addEventListener(\"click\", injectionFunction);\r\n }\r\n\r\n if (config.title) titleIndications(\"Injected\");\r\n}\r\n\r\nfunction removeListener(element: HTMLElement) {\r\n const index = listeners.findIndex((listener) => listener.element === element);\r\n if (index !== -1) {\r\n const listener = listeners.splice(index, 1)[0];\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n}\r\n\r\nexport { codeListener, removeListener };\r\n","import { codeListener } from \"./core/code-listener\";\r\n\r\nchrome.storage.sync.get([\"moodleGPT\"]).then(function (storage) {\r\n const config = storage.moodleGPT;\r\n\r\n if (!config) throw new Error(\"Please configure MoodleGPT into the extension\");\r\n\r\n codeListener(config);\r\n});\r\n"],"names":[],"mappings":"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","x_google_ignoreList":[1]} \ No newline at end of file +{"version":3,"file":"MoodleGPT.js","sources":["../src/utils/title-indications.ts","../node_modules/tslib/tslib.es6.js","../src/utils/logs.ts","../src/utils/normalize-text.ts","../src/core/get-response.ts","../src/utils/html-table-to-string.ts","../src/core/create-question.ts","../src/core/questions/radio-checkbox.ts","../src/core/questions/select.ts","../src/core/questions/textbox.ts","../src/core/questions/clipboard.ts","../src/core/questions/number.ts","../src/core/questions/contenteditable.ts","../src/core/reply.ts","../src/core/code-listener.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Show some informations into the document title and remove it after 3000ms\r\n * @param text\r\n */\r\nfunction titleIndications(text: string) {\r\n const backTitle = document.title;\r\n document.title = text;\r\n setTimeout(() => (document.title = backTitle), 3000);\r\n}\r\n\r\nexport default titleIndications;\r\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.push(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.push(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","class Logs {\r\n static question(text: string) {\r\n const css = \"color: cyan\";\r\n console.log(\"%c[QUESTION]: %s\", css, text);\r\n }\r\n\r\n static responseTry(text: string, valide: boolean) {\r\n const css = \"color: \" + (valide ? \"green\" : \"red\");\r\n console.log(\"%c[CHECKING]: %s\", css, text);\r\n }\r\n\r\n static array(arr: unknown[]) {\r\n console.log(\"[CORRECTS] \", arr);\r\n }\r\n\r\n static response(text: string) {\r\n console.log(text);\r\n }\r\n}\r\n\r\nexport default Logs;\r\n","/**\r\n * Normlize text\r\n * @param text\r\n */\r\nfunction normalizeText(text: string) {\r\n return text\r\n .replace(/\\n+/gi, \"\\n\")\r\n .replace(/(\\n\\s*\\n)+/g, \"\\n\") //remove useless white sapce from textcontent\r\n .replace(/[ \\t]+/gi, \" \")\r\n .toLowerCase()\r\n .trim()\r\n .replace(/^[a-z\\d]\\.\\s/gi, \"\") //a. text, b. text, c. text, 1. text, 2. text, 3.text\r\n .replace(/\\n[a-z\\d]\\.\\s/gi, \"\\n\"); //same but with new line\r\n}\r\n\r\nexport default normalizeText;\r\n","import Config from \"../types/config\";\r\nimport GPTAnswer from \"../types/gptAnswer\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\n\r\n/**\r\n * Get the response from chatGPT api\r\n * @param config\r\n * @param question\r\n * @returns\r\n */\r\nasync function getChatGPTResponse(\r\n config: Config,\r\n question: string\r\n): Promise {\r\n const controller = new AbortController();\r\n const timeoutControler = setTimeout(() => controller.abort(), 15000);\r\n const req = await fetch(\"https://api.openai.com/v1/chat/completions\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${config.apiKey}`,\r\n },\r\n signal: config.timeout ? controller.signal : null,\r\n body: JSON.stringify({\r\n model: config.model,\r\n messages: [{ role: \"user\", content: question }],\r\n temperature: 0.8,\r\n top_p: 1.0,\r\n presence_penalty: 1.0,\r\n stop: null,\r\n }),\r\n });\r\n clearTimeout(timeoutControler);\r\n const rep = await req.json();\r\n const response = rep.choices[0].message.content;\r\n return {\r\n response,\r\n normalizedResponse: normalizeText(response),\r\n };\r\n}\r\n\r\nexport default getChatGPTResponse;\r\n","/**\r\n * Convert table to representating string table\r\n * @param table\r\n * @returns\r\n */\r\nfunction htmlTableToString(table: HTMLTableElement) {\r\n const tab: string[][] = [];\r\n const lines = Array.from(table.querySelectorAll(\"tr\"));\r\n const maxColumnsLength: number[] = [];\r\n lines.map((line) => {\r\n const cells = Array.from(line.querySelectorAll(\"td, th\"));\r\n const cellsContent = cells.map((cell, index) => {\r\n const content = cell.textContent?.trim();\r\n maxColumnsLength[index] = Math.max(\r\n maxColumnsLength[index] || 0,\r\n content.length || 0\r\n );\r\n return content;\r\n });\r\n tab.push(cellsContent);\r\n });\r\n\r\n const lineSeparationSize =\r\n maxColumnsLength.reduce((a, b) => a + b) + tab[0].length * 3 + 1;\r\n const lineSeparation =\r\n \"\\n\" + Array(lineSeparationSize).fill(\"-\").join(\"\") + \"\\n\";\r\n\r\n const mappedTab = tab.map((line) => {\r\n const mappedLine = line.map((content, index) =>\r\n content.padEnd(\r\n maxColumnsLength[index],\r\n \"\\u00A0\" /* For no matching with \\s */\r\n )\r\n );\r\n return \"| \" + mappedLine.join(\" | \") + \" |\";\r\n });\r\n const head = mappedTab.shift();\r\n return head + lineSeparation + mappedTab.join(\"\\n\");\r\n}\r\n\r\nexport default htmlTableToString;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\nimport htmlTableToString from \"../utils/html-table-to-string\";\r\n\r\n/**\r\n * Normalize the question and add sub informations\r\n * @param langage\r\n * @param question\r\n * @returns\r\n */\r\nfunction createQuestion(config: Config, questionContainer: HTMLElement) {\r\n let question = questionContainer.innerText; //TODO: textContent better for reply ??\r\n\r\n /* Make tables more readable for chat-gpt */\r\n const tables: NodeListOf =\r\n questionContainer.querySelectorAll(\".qtext table\");\r\n for (const table of tables) {\r\n question = question.replace(\r\n table.innerText,\r\n \"\\n\" + htmlTableToString(table) + \"\\n\"\r\n );\r\n }\r\n\r\n const finalQuestion = `Give a short response as possible for this question, reply in the following question langage and only show the result:\r\n ${question} \r\n (If you have to choose between multiple results only show the corrects one, separate them with new line and take the same text as the question)`;\r\n return normalizeText(finalQuestion);\r\n}\r\n\r\nexport default createQuestion;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle checkbox and input elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n */\r\nfunction handleRadioAndCheckbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList?.[0] as HTMLInputElement;\r\n\r\n if (!input || (input.type !== \"checkbox\" && input.type !== \"radio\"))\r\n return false;\r\n\r\n for (const input of inputList as NodeListOf) {\r\n const content = normalizeText(input.parentNode.textContent);\r\n const valide = gptAnswer.normalizedResponse.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n if (valide) {\r\n if (config.mouseover) {\r\n input.addEventListener(\"mouseover\", () => (input.checked = true), {\r\n once: true,\r\n });\r\n } else {\r\n input.checked = true;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport default handleRadioAndCheckbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle select elements (and put in order select)\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleSelect(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n if (inputList.length === 0 || inputList[0].tagName !== \"SELECT\") return false;\r\n\r\n let correct = gptAnswer.normalizedResponse.split(\"\\n\");\r\n if (correct.length === 1 && correct.length !== inputList.length)\r\n correct = gptAnswer.normalizedResponse.split(\",\");\r\n\r\n if (config.logs) Logs.array(correct);\r\n\r\n for (let j = 0; j < inputList.length; ++j) {\r\n const options = inputList[j].querySelectorAll(\"option\");\r\n\r\n for (const option of options) {\r\n const content = normalizeText(option.textContent);\r\n const valide = correct[j].includes(content);\r\n\r\n /* Handle put in order question */\r\n if (!isNaN(parseInt(content))) {\r\n const content = normalizeText(\r\n (option.parentNode as HTMLElement)\r\n .closest(\"tr\")\r\n .querySelector(\".text\").textContent\r\n );\r\n const index = correct.findIndex((c) => {\r\n const valide = c.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n return valide;\r\n });\r\n if (index !== -1) {\r\n if (config.mouseover) {\r\n options[index + 1].closest(\"select\").addEventListener(\r\n \"click\",\r\n function () {\r\n options[index + 1].selected = \"selected\" as any;\r\n },\r\n { once: true }\r\n );\r\n } else {\r\n options[index + 1].selected = \"selected\" as any;\r\n }\r\n break;\r\n }\r\n }\r\n /* End */\r\n\r\n if (config.logs) Logs.responseTry(content, valide);\r\n\r\n if (valide) {\r\n if (config.mouseover) {\r\n option\r\n .closest(\"select\")\r\n .addEventListener(\"click\", () => (option.selected = true), {\r\n once: true,\r\n });\r\n } else {\r\n option.selected = true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleSelect;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle textbox\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleTextbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n (input.tagName !== \"TEXTAREA\" && input.type !== \"text\")\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.value = gptAnswer.response.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleTextbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport titleIndications from \"../../utils/title-indications\";\r\n\r\n/**\r\n * Copy the response in the clipboard if we can automaticaly fill the question\r\n * @param config\r\n * @param gptAnswer\r\n */\r\nfunction handleClipboard(config: Config, gptAnswer: GPTAnswer) {\r\n if (config.title) titleIndications(\"Copied to clipboard\");\r\n navigator.clipboard.writeText(gptAnswer.response);\r\n}\r\n\r\nexport default handleClipboard;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle number input\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleNumber(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (inputList.length !== 1 || input.type !== \"number\") return false;\r\n\r\n const number = gptAnswer.normalizedResponse\r\n .match(/\\d+([,\\.]\\d+)?/gi)?.[0]\r\n ?.replace(\",\", \".\");\r\n\r\n if (!number) return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = number.length + 1;\r\n if (index > number.length) return;\r\n event.preventDefault();\r\n if (number.slice(index, index + 1) === \".\") ++index;\r\n input.value = number.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = number;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleNumber;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Hanlde contenteditable elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleContentEditable(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0];\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n input.getAttribute(\"contenteditable\") !== \"true\"\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.textContent = gptAnswer.response.slice(0, ++index);\r\n\r\n /* Put the cursor at the end of the typed text */\r\n input.focus();\r\n const range = document.createRange();\r\n range.selectNodeContents(input);\r\n range.collapse(false);\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n });\r\n } else {\r\n input.textContent = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleContentEditable;\r\n","import Config from \"../types/config\";\r\nimport Logs from \"../utils/logs\";\r\nimport getChatGPTResponse from \"./get-response\";\r\nimport createQuestion from \"./create-question\";\r\nimport handleRadioAndCheckbox from \"./questions/radio-checkbox\";\r\nimport handleSelect from \"./questions/select\";\r\nimport handleTextbox from \"./questions/textbox\";\r\nimport handleClipboard from \"./questions/clipboard\";\r\nimport handleNumber from \"./questions/number\";\r\nimport handleContentEditable from \"./questions/contenteditable\";\r\nimport { removeListener } from \"./code-listener\";\r\n\r\n/**\r\n * Reply to the question\r\n * @param config\r\n * @param hiddenButton\r\n * @param form\r\n * @param query\r\n * @returns\r\n */\r\nasync function reply(\r\n config: Config,\r\n hiddenButton: HTMLElement,\r\n form: HTMLElement,\r\n query: string\r\n) {\r\n if (config.cursor) hiddenButton.style.cursor = \"wait\";\r\n\r\n const question = createQuestion(config, form);\r\n const inputList: NodeListOf = form.querySelectorAll(query);\r\n\r\n const gptAnswer = await getChatGPTResponse(config, question).catch(\r\n (error) => ({\r\n error,\r\n })\r\n );\r\n\r\n const haveError = typeof gptAnswer === \"object\" && \"error\" in gptAnswer;\r\n\r\n if (config.cursor)\r\n hiddenButton.style.cursor =\r\n config.infinite || haveError ? \"pointer\" : \"initial\";\r\n\r\n if (haveError) {\r\n console.error(gptAnswer.error);\r\n return;\r\n }\r\n\r\n if (config.logs) {\r\n Logs.question(question);\r\n Logs.response(\"Original: \" + gptAnswer.response);\r\n Logs.response(\"Normalized: \" + gptAnswer.normalizedResponse);\r\n }\r\n\r\n /* Handle clipboard mode */\r\n if (config.mode === \"clipboard\") {\r\n if (!config.infinite) removeListener(hiddenButton);\r\n return handleClipboard(config, gptAnswer);\r\n }\r\n\r\n /* Handle question to answer mode */\r\n if (config.mode === \"question-to-answer\") {\r\n removeListener(hiddenButton);\r\n\r\n const questionBackup = form.textContent;\r\n const questionContainer = form.querySelector(\".qtext\");\r\n\r\n questionContainer.textContent = gptAnswer.response;\r\n questionContainer.style.whiteSpace = \"pre-wrap\";\r\n\r\n questionContainer.addEventListener(\"click\", function () {\r\n const isNotResponse = questionContainer.textContent === questionBackup;\r\n questionContainer.style.whiteSpace = isNotResponse ? \"pre-wrap\" : null;\r\n questionContainer.textContent = isNotResponse\r\n ? gptAnswer.response\r\n : questionBackup;\r\n });\r\n return;\r\n }\r\n\r\n const handlers = [\r\n handleContentEditable,\r\n handleTextbox,\r\n handleNumber,\r\n handleSelect,\r\n handleRadioAndCheckbox,\r\n ];\r\n\r\n for (const handler of handlers) {\r\n if (handler(config, inputList, gptAnswer)) return;\r\n }\r\n\r\n /* In the case we can't auto complete the question */\r\n handleClipboard(config, gptAnswer);\r\n\r\n /* Better then set once on the event because if there is an error the user can click an other time on the question */\r\n if (!config.infinite) removeListener(hiddenButton);\r\n}\r\n\r\nexport default reply;\r\n","import Config from \"../types/config\";\r\nimport titleIndications from \"../utils/title-indications\";\r\nimport reply from \"./reply\";\r\n\r\nconst pressedKeys: string[] = [];\r\nconst listeners: {\r\n element: HTMLElement;\r\n fn: (this: HTMLElement, ev: MouseEvent) => any;\r\n}[] = [];\r\n\r\n/**\r\n * Create a listener on the keyboard to inject the code\r\n * @param config\r\n */\r\nfunction codeListener(config: Config) {\r\n document.body.addEventListener(\"keydown\", function (event) {\r\n pressedKeys.push(event.key);\r\n if (pressedKeys.length > config.code.length) pressedKeys.shift();\r\n if (pressedKeys.join(\"\") === config.code) {\r\n pressedKeys.length = 0;\r\n setUpMoodleGpt(config);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Setup moodleGPT into the page (remove/injection)\r\n * @param config\r\n * @returns\r\n */\r\nfunction setUpMoodleGpt(config: Config) {\r\n /* Removing events */\r\n if (listeners.length > 0) {\r\n for (const listener of listeners) {\r\n if (config.cursor) listener.element.style.cursor = \"initial\";\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n if (config.title) titleIndications(\"Removed\");\r\n listeners.length = 0;\r\n return;\r\n }\r\n\r\n /* Code injection */\r\n const inputQuery = [\"checkbox\", \"radio\", \"text\", \"number\"]\r\n .map((e) => `input[type=\"${e}\"]`)\r\n .join(\",\");\r\n const query = inputQuery + \", textarea, select, [contenteditable]\";\r\n const forms = document.querySelectorAll(\".formulation\");\r\n\r\n for (const form of forms) {\r\n const hiddenButton: HTMLElement = form.querySelector(\".qtext\");\r\n\r\n if (config.cursor) hiddenButton.style.cursor = \"pointer\";\r\n\r\n const injectionFunction = reply.bind(\r\n null,\r\n config,\r\n hiddenButton,\r\n form,\r\n query\r\n );\r\n listeners.push({ element: hiddenButton, fn: injectionFunction });\r\n hiddenButton.addEventListener(\"click\", injectionFunction);\r\n }\r\n\r\n if (config.title) titleIndications(\"Injected\");\r\n}\r\n\r\n/**\r\n * Remove the event listener on a specific question\r\n * @param element\r\n */\r\nfunction removeListener(element: HTMLElement) {\r\n const index = listeners.findIndex((listener) => listener.element === element);\r\n if (index !== -1) {\r\n const listener = listeners.splice(index, 1)[0];\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n}\r\n\r\nexport { codeListener, removeListener };\r\n","import { codeListener } from \"./core/code-listener\";\r\n\r\nchrome.storage.sync.get([\"moodleGPT\"]).then(function (storage) {\r\n const config = storage.moodleGPT;\r\n\r\n if (!config) throw new Error(\"Please configure MoodleGPT into the extension\");\r\n\r\n codeListener(config);\r\n});\r\n"],"names":[],"mappings":"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","x_google_ignoreList":[1]} \ No newline at end of file diff --git a/src/core/code-listener.ts b/src/core/code-listener.ts index 6b72874..eb96584 100644 --- a/src/core/code-listener.ts +++ b/src/core/code-listener.ts @@ -66,6 +66,10 @@ function setUpMoodleGpt(config: Config) { if (config.title) titleIndications("Injected"); } +/** + * Remove the event listener on a specific question + * @param element + */ function removeListener(element: HTMLElement) { const index = listeners.findIndex((listener) => listener.element === element); if (index !== -1) { From e48e5e678530fbbda85f942c91ea4e4c290f6f29 Mon Sep 17 00:00:00 2001 From: yoannchb-pro <71560747+yoannchb-pro@users.noreply.github.com> Date: Tue, 20 Jun 2023 14:45:49 -0400 Subject: [PATCH 18/35] fixed question infinite click --- extension/MoodleGPT.js | 6 +++--- extension/MoodleGPT.js.map | 2 +- src/core/reply.ts | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/extension/MoodleGPT.js b/extension/MoodleGPT.js index 46aad8f..2da211b 100644 --- a/extension/MoodleGPT.js +++ b/extension/MoodleGPT.js @@ -411,6 +411,9 @@ }); return; } + /* Better then set once on the event because if there is an error the user can click an other time on the question */ + if (!config.infinite) + removeListener(hiddenButton); const handlers = [ handleContentEditable, handleTextbox, @@ -424,9 +427,6 @@ } /* In the case we can't auto complete the question */ handleClipboard(config, gptAnswer); - /* Better then set once on the event because if there is an error the user can click an other time on the question */ - if (!config.infinite) - removeListener(hiddenButton); }); } diff --git a/extension/MoodleGPT.js.map b/extension/MoodleGPT.js.map index 03c1d0d..99a2246 100644 --- a/extension/MoodleGPT.js.map +++ b/extension/MoodleGPT.js.map @@ -1 +1 @@ -{"version":3,"file":"MoodleGPT.js","sources":["../src/utils/title-indications.ts","../node_modules/tslib/tslib.es6.js","../src/utils/logs.ts","../src/utils/normalize-text.ts","../src/core/get-response.ts","../src/utils/html-table-to-string.ts","../src/core/create-question.ts","../src/core/questions/radio-checkbox.ts","../src/core/questions/select.ts","../src/core/questions/textbox.ts","../src/core/questions/clipboard.ts","../src/core/questions/number.ts","../src/core/questions/contenteditable.ts","../src/core/reply.ts","../src/core/code-listener.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Show some informations into the document title and remove it after 3000ms\r\n * @param text\r\n */\r\nfunction titleIndications(text: string) {\r\n const backTitle = document.title;\r\n document.title = text;\r\n setTimeout(() => (document.title = backTitle), 3000);\r\n}\r\n\r\nexport default titleIndications;\r\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.push(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.push(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","class Logs {\r\n static question(text: string) {\r\n const css = \"color: cyan\";\r\n console.log(\"%c[QUESTION]: %s\", css, text);\r\n }\r\n\r\n static responseTry(text: string, valide: boolean) {\r\n const css = \"color: \" + (valide ? \"green\" : \"red\");\r\n console.log(\"%c[CHECKING]: %s\", css, text);\r\n }\r\n\r\n static array(arr: unknown[]) {\r\n console.log(\"[CORRECTS] \", arr);\r\n }\r\n\r\n static response(text: string) {\r\n console.log(text);\r\n }\r\n}\r\n\r\nexport default Logs;\r\n","/**\r\n * Normlize text\r\n * @param text\r\n */\r\nfunction normalizeText(text: string) {\r\n return text\r\n .replace(/\\n+/gi, \"\\n\")\r\n .replace(/(\\n\\s*\\n)+/g, \"\\n\") //remove useless white sapce from textcontent\r\n .replace(/[ \\t]+/gi, \" \")\r\n .toLowerCase()\r\n .trim()\r\n .replace(/^[a-z\\d]\\.\\s/gi, \"\") //a. text, b. text, c. text, 1. text, 2. text, 3.text\r\n .replace(/\\n[a-z\\d]\\.\\s/gi, \"\\n\"); //same but with new line\r\n}\r\n\r\nexport default normalizeText;\r\n","import Config from \"../types/config\";\r\nimport GPTAnswer from \"../types/gptAnswer\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\n\r\n/**\r\n * Get the response from chatGPT api\r\n * @param config\r\n * @param question\r\n * @returns\r\n */\r\nasync function getChatGPTResponse(\r\n config: Config,\r\n question: string\r\n): Promise {\r\n const controller = new AbortController();\r\n const timeoutControler = setTimeout(() => controller.abort(), 15000);\r\n const req = await fetch(\"https://api.openai.com/v1/chat/completions\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${config.apiKey}`,\r\n },\r\n signal: config.timeout ? controller.signal : null,\r\n body: JSON.stringify({\r\n model: config.model,\r\n messages: [{ role: \"user\", content: question }],\r\n temperature: 0.8,\r\n top_p: 1.0,\r\n presence_penalty: 1.0,\r\n stop: null,\r\n }),\r\n });\r\n clearTimeout(timeoutControler);\r\n const rep = await req.json();\r\n const response = rep.choices[0].message.content;\r\n return {\r\n response,\r\n normalizedResponse: normalizeText(response),\r\n };\r\n}\r\n\r\nexport default getChatGPTResponse;\r\n","/**\r\n * Convert table to representating string table\r\n * @param table\r\n * @returns\r\n */\r\nfunction htmlTableToString(table: HTMLTableElement) {\r\n const tab: string[][] = [];\r\n const lines = Array.from(table.querySelectorAll(\"tr\"));\r\n const maxColumnsLength: number[] = [];\r\n lines.map((line) => {\r\n const cells = Array.from(line.querySelectorAll(\"td, th\"));\r\n const cellsContent = cells.map((cell, index) => {\r\n const content = cell.textContent?.trim();\r\n maxColumnsLength[index] = Math.max(\r\n maxColumnsLength[index] || 0,\r\n content.length || 0\r\n );\r\n return content;\r\n });\r\n tab.push(cellsContent);\r\n });\r\n\r\n const lineSeparationSize =\r\n maxColumnsLength.reduce((a, b) => a + b) + tab[0].length * 3 + 1;\r\n const lineSeparation =\r\n \"\\n\" + Array(lineSeparationSize).fill(\"-\").join(\"\") + \"\\n\";\r\n\r\n const mappedTab = tab.map((line) => {\r\n const mappedLine = line.map((content, index) =>\r\n content.padEnd(\r\n maxColumnsLength[index],\r\n \"\\u00A0\" /* For no matching with \\s */\r\n )\r\n );\r\n return \"| \" + mappedLine.join(\" | \") + \" |\";\r\n });\r\n const head = mappedTab.shift();\r\n return head + lineSeparation + mappedTab.join(\"\\n\");\r\n}\r\n\r\nexport default htmlTableToString;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\nimport htmlTableToString from \"../utils/html-table-to-string\";\r\n\r\n/**\r\n * Normalize the question and add sub informations\r\n * @param langage\r\n * @param question\r\n * @returns\r\n */\r\nfunction createQuestion(config: Config, questionContainer: HTMLElement) {\r\n let question = questionContainer.innerText; //TODO: textContent better for reply ??\r\n\r\n /* Make tables more readable for chat-gpt */\r\n const tables: NodeListOf =\r\n questionContainer.querySelectorAll(\".qtext table\");\r\n for (const table of tables) {\r\n question = question.replace(\r\n table.innerText,\r\n \"\\n\" + htmlTableToString(table) + \"\\n\"\r\n );\r\n }\r\n\r\n const finalQuestion = `Give a short response as possible for this question, reply in the following question langage and only show the result:\r\n ${question} \r\n (If you have to choose between multiple results only show the corrects one, separate them with new line and take the same text as the question)`;\r\n return normalizeText(finalQuestion);\r\n}\r\n\r\nexport default createQuestion;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle checkbox and input elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n */\r\nfunction handleRadioAndCheckbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList?.[0] as HTMLInputElement;\r\n\r\n if (!input || (input.type !== \"checkbox\" && input.type !== \"radio\"))\r\n return false;\r\n\r\n for (const input of inputList as NodeListOf) {\r\n const content = normalizeText(input.parentNode.textContent);\r\n const valide = gptAnswer.normalizedResponse.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n if (valide) {\r\n if (config.mouseover) {\r\n input.addEventListener(\"mouseover\", () => (input.checked = true), {\r\n once: true,\r\n });\r\n } else {\r\n input.checked = true;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport default handleRadioAndCheckbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle select elements (and put in order select)\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleSelect(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n if (inputList.length === 0 || inputList[0].tagName !== \"SELECT\") return false;\r\n\r\n let correct = gptAnswer.normalizedResponse.split(\"\\n\");\r\n if (correct.length === 1 && correct.length !== inputList.length)\r\n correct = gptAnswer.normalizedResponse.split(\",\");\r\n\r\n if (config.logs) Logs.array(correct);\r\n\r\n for (let j = 0; j < inputList.length; ++j) {\r\n const options = inputList[j].querySelectorAll(\"option\");\r\n\r\n for (const option of options) {\r\n const content = normalizeText(option.textContent);\r\n const valide = correct[j].includes(content);\r\n\r\n /* Handle put in order question */\r\n if (!isNaN(parseInt(content))) {\r\n const content = normalizeText(\r\n (option.parentNode as HTMLElement)\r\n .closest(\"tr\")\r\n .querySelector(\".text\").textContent\r\n );\r\n const index = correct.findIndex((c) => {\r\n const valide = c.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n return valide;\r\n });\r\n if (index !== -1) {\r\n if (config.mouseover) {\r\n options[index + 1].closest(\"select\").addEventListener(\r\n \"click\",\r\n function () {\r\n options[index + 1].selected = \"selected\" as any;\r\n },\r\n { once: true }\r\n );\r\n } else {\r\n options[index + 1].selected = \"selected\" as any;\r\n }\r\n break;\r\n }\r\n }\r\n /* End */\r\n\r\n if (config.logs) Logs.responseTry(content, valide);\r\n\r\n if (valide) {\r\n if (config.mouseover) {\r\n option\r\n .closest(\"select\")\r\n .addEventListener(\"click\", () => (option.selected = true), {\r\n once: true,\r\n });\r\n } else {\r\n option.selected = true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleSelect;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle textbox\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleTextbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n (input.tagName !== \"TEXTAREA\" && input.type !== \"text\")\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.value = gptAnswer.response.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleTextbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport titleIndications from \"../../utils/title-indications\";\r\n\r\n/**\r\n * Copy the response in the clipboard if we can automaticaly fill the question\r\n * @param config\r\n * @param gptAnswer\r\n */\r\nfunction handleClipboard(config: Config, gptAnswer: GPTAnswer) {\r\n if (config.title) titleIndications(\"Copied to clipboard\");\r\n navigator.clipboard.writeText(gptAnswer.response);\r\n}\r\n\r\nexport default handleClipboard;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle number input\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleNumber(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (inputList.length !== 1 || input.type !== \"number\") return false;\r\n\r\n const number = gptAnswer.normalizedResponse\r\n .match(/\\d+([,\\.]\\d+)?/gi)?.[0]\r\n ?.replace(\",\", \".\");\r\n\r\n if (!number) return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = number.length + 1;\r\n if (index > number.length) return;\r\n event.preventDefault();\r\n if (number.slice(index, index + 1) === \".\") ++index;\r\n input.value = number.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = number;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleNumber;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Hanlde contenteditable elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleContentEditable(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0];\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n input.getAttribute(\"contenteditable\") !== \"true\"\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.textContent = gptAnswer.response.slice(0, ++index);\r\n\r\n /* Put the cursor at the end of the typed text */\r\n input.focus();\r\n const range = document.createRange();\r\n range.selectNodeContents(input);\r\n range.collapse(false);\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n });\r\n } else {\r\n input.textContent = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleContentEditable;\r\n","import Config from \"../types/config\";\r\nimport Logs from \"../utils/logs\";\r\nimport getChatGPTResponse from \"./get-response\";\r\nimport createQuestion from \"./create-question\";\r\nimport handleRadioAndCheckbox from \"./questions/radio-checkbox\";\r\nimport handleSelect from \"./questions/select\";\r\nimport handleTextbox from \"./questions/textbox\";\r\nimport handleClipboard from \"./questions/clipboard\";\r\nimport handleNumber from \"./questions/number\";\r\nimport handleContentEditable from \"./questions/contenteditable\";\r\nimport { removeListener } from \"./code-listener\";\r\n\r\n/**\r\n * Reply to the question\r\n * @param config\r\n * @param hiddenButton\r\n * @param form\r\n * @param query\r\n * @returns\r\n */\r\nasync function reply(\r\n config: Config,\r\n hiddenButton: HTMLElement,\r\n form: HTMLElement,\r\n query: string\r\n) {\r\n if (config.cursor) hiddenButton.style.cursor = \"wait\";\r\n\r\n const question = createQuestion(config, form);\r\n const inputList: NodeListOf = form.querySelectorAll(query);\r\n\r\n const gptAnswer = await getChatGPTResponse(config, question).catch(\r\n (error) => ({\r\n error,\r\n })\r\n );\r\n\r\n const haveError = typeof gptAnswer === \"object\" && \"error\" in gptAnswer;\r\n\r\n if (config.cursor)\r\n hiddenButton.style.cursor =\r\n config.infinite || haveError ? \"pointer\" : \"initial\";\r\n\r\n if (haveError) {\r\n console.error(gptAnswer.error);\r\n return;\r\n }\r\n\r\n if (config.logs) {\r\n Logs.question(question);\r\n Logs.response(\"Original: \" + gptAnswer.response);\r\n Logs.response(\"Normalized: \" + gptAnswer.normalizedResponse);\r\n }\r\n\r\n /* Handle clipboard mode */\r\n if (config.mode === \"clipboard\") {\r\n if (!config.infinite) removeListener(hiddenButton);\r\n return handleClipboard(config, gptAnswer);\r\n }\r\n\r\n /* Handle question to answer mode */\r\n if (config.mode === \"question-to-answer\") {\r\n removeListener(hiddenButton);\r\n\r\n const questionBackup = form.textContent;\r\n const questionContainer = form.querySelector(\".qtext\");\r\n\r\n questionContainer.textContent = gptAnswer.response;\r\n questionContainer.style.whiteSpace = \"pre-wrap\";\r\n\r\n questionContainer.addEventListener(\"click\", function () {\r\n const isNotResponse = questionContainer.textContent === questionBackup;\r\n questionContainer.style.whiteSpace = isNotResponse ? \"pre-wrap\" : null;\r\n questionContainer.textContent = isNotResponse\r\n ? gptAnswer.response\r\n : questionBackup;\r\n });\r\n return;\r\n }\r\n\r\n const handlers = [\r\n handleContentEditable,\r\n handleTextbox,\r\n handleNumber,\r\n handleSelect,\r\n handleRadioAndCheckbox,\r\n ];\r\n\r\n for (const handler of handlers) {\r\n if (handler(config, inputList, gptAnswer)) return;\r\n }\r\n\r\n /* In the case we can't auto complete the question */\r\n handleClipboard(config, gptAnswer);\r\n\r\n /* Better then set once on the event because if there is an error the user can click an other time on the question */\r\n if (!config.infinite) removeListener(hiddenButton);\r\n}\r\n\r\nexport default reply;\r\n","import Config from \"../types/config\";\r\nimport titleIndications from \"../utils/title-indications\";\r\nimport reply from \"./reply\";\r\n\r\nconst pressedKeys: string[] = [];\r\nconst listeners: {\r\n element: HTMLElement;\r\n fn: (this: HTMLElement, ev: MouseEvent) => any;\r\n}[] = [];\r\n\r\n/**\r\n * Create a listener on the keyboard to inject the code\r\n * @param config\r\n */\r\nfunction codeListener(config: Config) {\r\n document.body.addEventListener(\"keydown\", function (event) {\r\n pressedKeys.push(event.key);\r\n if (pressedKeys.length > config.code.length) pressedKeys.shift();\r\n if (pressedKeys.join(\"\") === config.code) {\r\n pressedKeys.length = 0;\r\n setUpMoodleGpt(config);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Setup moodleGPT into the page (remove/injection)\r\n * @param config\r\n * @returns\r\n */\r\nfunction setUpMoodleGpt(config: Config) {\r\n /* Removing events */\r\n if (listeners.length > 0) {\r\n for (const listener of listeners) {\r\n if (config.cursor) listener.element.style.cursor = \"initial\";\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n if (config.title) titleIndications(\"Removed\");\r\n listeners.length = 0;\r\n return;\r\n }\r\n\r\n /* Code injection */\r\n const inputQuery = [\"checkbox\", \"radio\", \"text\", \"number\"]\r\n .map((e) => `input[type=\"${e}\"]`)\r\n .join(\",\");\r\n const query = inputQuery + \", textarea, select, [contenteditable]\";\r\n const forms = document.querySelectorAll(\".formulation\");\r\n\r\n for (const form of forms) {\r\n const hiddenButton: HTMLElement = form.querySelector(\".qtext\");\r\n\r\n if (config.cursor) hiddenButton.style.cursor = \"pointer\";\r\n\r\n const injectionFunction = reply.bind(\r\n null,\r\n config,\r\n hiddenButton,\r\n form,\r\n query\r\n );\r\n listeners.push({ element: hiddenButton, fn: injectionFunction });\r\n hiddenButton.addEventListener(\"click\", injectionFunction);\r\n }\r\n\r\n if (config.title) titleIndications(\"Injected\");\r\n}\r\n\r\n/**\r\n * Remove the event listener on a specific question\r\n * @param element\r\n */\r\nfunction removeListener(element: HTMLElement) {\r\n const index = listeners.findIndex((listener) => listener.element === element);\r\n if (index !== -1) {\r\n const listener = listeners.splice(index, 1)[0];\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n}\r\n\r\nexport { codeListener, removeListener };\r\n","import { codeListener } from \"./core/code-listener\";\r\n\r\nchrome.storage.sync.get([\"moodleGPT\"]).then(function (storage) {\r\n const config = storage.moodleGPT;\r\n\r\n if (!config) throw new Error(\"Please configure MoodleGPT into the extension\");\r\n\r\n codeListener(config);\r\n});\r\n"],"names":[],"mappings":"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","x_google_ignoreList":[1]} \ No newline at end of file +{"version":3,"file":"MoodleGPT.js","sources":["../src/utils/title-indications.ts","../node_modules/tslib/tslib.es6.js","../src/utils/logs.ts","../src/utils/normalize-text.ts","../src/core/get-response.ts","../src/utils/html-table-to-string.ts","../src/core/create-question.ts","../src/core/questions/radio-checkbox.ts","../src/core/questions/select.ts","../src/core/questions/textbox.ts","../src/core/questions/clipboard.ts","../src/core/questions/number.ts","../src/core/questions/contenteditable.ts","../src/core/reply.ts","../src/core/code-listener.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Show some informations into the document title and remove it after 3000ms\r\n * @param text\r\n */\r\nfunction titleIndications(text: string) {\r\n const backTitle = document.title;\r\n document.title = text;\r\n setTimeout(() => (document.title = backTitle), 3000);\r\n}\r\n\r\nexport default titleIndications;\r\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.push(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.push(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","class Logs {\r\n static question(text: string) {\r\n const css = \"color: cyan\";\r\n console.log(\"%c[QUESTION]: %s\", css, text);\r\n }\r\n\r\n static responseTry(text: string, valide: boolean) {\r\n const css = \"color: \" + (valide ? \"green\" : \"red\");\r\n console.log(\"%c[CHECKING]: %s\", css, text);\r\n }\r\n\r\n static array(arr: unknown[]) {\r\n console.log(\"[CORRECTS] \", arr);\r\n }\r\n\r\n static response(text: string) {\r\n console.log(text);\r\n }\r\n}\r\n\r\nexport default Logs;\r\n","/**\r\n * Normlize text\r\n * @param text\r\n */\r\nfunction normalizeText(text: string) {\r\n return text\r\n .replace(/\\n+/gi, \"\\n\")\r\n .replace(/(\\n\\s*\\n)+/g, \"\\n\") //remove useless white sapce from textcontent\r\n .replace(/[ \\t]+/gi, \" \")\r\n .toLowerCase()\r\n .trim()\r\n .replace(/^[a-z\\d]\\.\\s/gi, \"\") //a. text, b. text, c. text, 1. text, 2. text, 3.text\r\n .replace(/\\n[a-z\\d]\\.\\s/gi, \"\\n\"); //same but with new line\r\n}\r\n\r\nexport default normalizeText;\r\n","import Config from \"../types/config\";\r\nimport GPTAnswer from \"../types/gptAnswer\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\n\r\n/**\r\n * Get the response from chatGPT api\r\n * @param config\r\n * @param question\r\n * @returns\r\n */\r\nasync function getChatGPTResponse(\r\n config: Config,\r\n question: string\r\n): Promise {\r\n const controller = new AbortController();\r\n const timeoutControler = setTimeout(() => controller.abort(), 15000);\r\n const req = await fetch(\"https://api.openai.com/v1/chat/completions\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${config.apiKey}`,\r\n },\r\n signal: config.timeout ? controller.signal : null,\r\n body: JSON.stringify({\r\n model: config.model,\r\n messages: [{ role: \"user\", content: question }],\r\n temperature: 0.8,\r\n top_p: 1.0,\r\n presence_penalty: 1.0,\r\n stop: null,\r\n }),\r\n });\r\n clearTimeout(timeoutControler);\r\n const rep = await req.json();\r\n const response = rep.choices[0].message.content;\r\n return {\r\n response,\r\n normalizedResponse: normalizeText(response),\r\n };\r\n}\r\n\r\nexport default getChatGPTResponse;\r\n","/**\r\n * Convert table to representating string table\r\n * @param table\r\n * @returns\r\n */\r\nfunction htmlTableToString(table: HTMLTableElement) {\r\n const tab: string[][] = [];\r\n const lines = Array.from(table.querySelectorAll(\"tr\"));\r\n const maxColumnsLength: number[] = [];\r\n lines.map((line) => {\r\n const cells = Array.from(line.querySelectorAll(\"td, th\"));\r\n const cellsContent = cells.map((cell, index) => {\r\n const content = cell.textContent?.trim();\r\n maxColumnsLength[index] = Math.max(\r\n maxColumnsLength[index] || 0,\r\n content.length || 0\r\n );\r\n return content;\r\n });\r\n tab.push(cellsContent);\r\n });\r\n\r\n const lineSeparationSize =\r\n maxColumnsLength.reduce((a, b) => a + b) + tab[0].length * 3 + 1;\r\n const lineSeparation =\r\n \"\\n\" + Array(lineSeparationSize).fill(\"-\").join(\"\") + \"\\n\";\r\n\r\n const mappedTab = tab.map((line) => {\r\n const mappedLine = line.map((content, index) =>\r\n content.padEnd(\r\n maxColumnsLength[index],\r\n \"\\u00A0\" /* For no matching with \\s */\r\n )\r\n );\r\n return \"| \" + mappedLine.join(\" | \") + \" |\";\r\n });\r\n const head = mappedTab.shift();\r\n return head + lineSeparation + mappedTab.join(\"\\n\");\r\n}\r\n\r\nexport default htmlTableToString;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\nimport htmlTableToString from \"../utils/html-table-to-string\";\r\n\r\n/**\r\n * Normalize the question and add sub informations\r\n * @param langage\r\n * @param question\r\n * @returns\r\n */\r\nfunction createQuestion(config: Config, questionContainer: HTMLElement) {\r\n let question = questionContainer.innerText; //TODO: textContent better for reply ??\r\n\r\n /* Make tables more readable for chat-gpt */\r\n const tables: NodeListOf =\r\n questionContainer.querySelectorAll(\".qtext table\");\r\n for (const table of tables) {\r\n question = question.replace(\r\n table.innerText,\r\n \"\\n\" + htmlTableToString(table) + \"\\n\"\r\n );\r\n }\r\n\r\n const finalQuestion = `Give a short response as possible for this question, reply in the following question langage and only show the result:\r\n ${question} \r\n (If you have to choose between multiple results only show the corrects one, separate them with new line and take the same text as the question)`;\r\n return normalizeText(finalQuestion);\r\n}\r\n\r\nexport default createQuestion;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle checkbox and input elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n */\r\nfunction handleRadioAndCheckbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList?.[0] as HTMLInputElement;\r\n\r\n if (!input || (input.type !== \"checkbox\" && input.type !== \"radio\"))\r\n return false;\r\n\r\n for (const input of inputList as NodeListOf) {\r\n const content = normalizeText(input.parentNode.textContent);\r\n const valide = gptAnswer.normalizedResponse.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n if (valide) {\r\n if (config.mouseover) {\r\n input.addEventListener(\"mouseover\", () => (input.checked = true), {\r\n once: true,\r\n });\r\n } else {\r\n input.checked = true;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport default handleRadioAndCheckbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle select elements (and put in order select)\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleSelect(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n if (inputList.length === 0 || inputList[0].tagName !== \"SELECT\") return false;\r\n\r\n let correct = gptAnswer.normalizedResponse.split(\"\\n\");\r\n if (correct.length === 1 && correct.length !== inputList.length)\r\n correct = gptAnswer.normalizedResponse.split(\",\");\r\n\r\n if (config.logs) Logs.array(correct);\r\n\r\n for (let j = 0; j < inputList.length; ++j) {\r\n const options = inputList[j].querySelectorAll(\"option\");\r\n\r\n for (const option of options) {\r\n const content = normalizeText(option.textContent);\r\n const valide = correct[j].includes(content);\r\n\r\n /* Handle put in order question */\r\n if (!isNaN(parseInt(content))) {\r\n const content = normalizeText(\r\n (option.parentNode as HTMLElement)\r\n .closest(\"tr\")\r\n .querySelector(\".text\").textContent\r\n );\r\n const index = correct.findIndex((c) => {\r\n const valide = c.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n return valide;\r\n });\r\n if (index !== -1) {\r\n if (config.mouseover) {\r\n options[index + 1].closest(\"select\").addEventListener(\r\n \"click\",\r\n function () {\r\n options[index + 1].selected = \"selected\" as any;\r\n },\r\n { once: true }\r\n );\r\n } else {\r\n options[index + 1].selected = \"selected\" as any;\r\n }\r\n break;\r\n }\r\n }\r\n /* End */\r\n\r\n if (config.logs) Logs.responseTry(content, valide);\r\n\r\n if (valide) {\r\n if (config.mouseover) {\r\n option\r\n .closest(\"select\")\r\n .addEventListener(\"click\", () => (option.selected = true), {\r\n once: true,\r\n });\r\n } else {\r\n option.selected = true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleSelect;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle textbox\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleTextbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n (input.tagName !== \"TEXTAREA\" && input.type !== \"text\")\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.value = gptAnswer.response.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleTextbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport titleIndications from \"../../utils/title-indications\";\r\n\r\n/**\r\n * Copy the response in the clipboard if we can automaticaly fill the question\r\n * @param config\r\n * @param gptAnswer\r\n */\r\nfunction handleClipboard(config: Config, gptAnswer: GPTAnswer) {\r\n if (config.title) titleIndications(\"Copied to clipboard\");\r\n navigator.clipboard.writeText(gptAnswer.response);\r\n}\r\n\r\nexport default handleClipboard;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle number input\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleNumber(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (inputList.length !== 1 || input.type !== \"number\") return false;\r\n\r\n const number = gptAnswer.normalizedResponse\r\n .match(/\\d+([,\\.]\\d+)?/gi)?.[0]\r\n ?.replace(\",\", \".\");\r\n\r\n if (!number) return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = number.length + 1;\r\n if (index > number.length) return;\r\n event.preventDefault();\r\n if (number.slice(index, index + 1) === \".\") ++index;\r\n input.value = number.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = number;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleNumber;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Hanlde contenteditable elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleContentEditable(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0];\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n input.getAttribute(\"contenteditable\") !== \"true\"\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.textContent = gptAnswer.response.slice(0, ++index);\r\n\r\n /* Put the cursor at the end of the typed text */\r\n input.focus();\r\n const range = document.createRange();\r\n range.selectNodeContents(input);\r\n range.collapse(false);\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n });\r\n } else {\r\n input.textContent = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleContentEditable;\r\n","import Config from \"../types/config\";\r\nimport Logs from \"../utils/logs\";\r\nimport getChatGPTResponse from \"./get-response\";\r\nimport createQuestion from \"./create-question\";\r\nimport handleRadioAndCheckbox from \"./questions/radio-checkbox\";\r\nimport handleSelect from \"./questions/select\";\r\nimport handleTextbox from \"./questions/textbox\";\r\nimport handleClipboard from \"./questions/clipboard\";\r\nimport handleNumber from \"./questions/number\";\r\nimport handleContentEditable from \"./questions/contenteditable\";\r\nimport { removeListener } from \"./code-listener\";\r\n\r\n/**\r\n * Reply to the question\r\n * @param config\r\n * @param hiddenButton\r\n * @param form\r\n * @param query\r\n * @returns\r\n */\r\nasync function reply(\r\n config: Config,\r\n hiddenButton: HTMLElement,\r\n form: HTMLElement,\r\n query: string\r\n) {\r\n if (config.cursor) hiddenButton.style.cursor = \"wait\";\r\n\r\n const question = createQuestion(config, form);\r\n const inputList: NodeListOf = form.querySelectorAll(query);\r\n\r\n const gptAnswer = await getChatGPTResponse(config, question).catch(\r\n (error) => ({\r\n error,\r\n })\r\n );\r\n\r\n const haveError = typeof gptAnswer === \"object\" && \"error\" in gptAnswer;\r\n\r\n if (config.cursor)\r\n hiddenButton.style.cursor =\r\n config.infinite || haveError ? \"pointer\" : \"initial\";\r\n\r\n if (haveError) {\r\n console.error(gptAnswer.error);\r\n return;\r\n }\r\n\r\n if (config.logs) {\r\n Logs.question(question);\r\n Logs.response(\"Original: \" + gptAnswer.response);\r\n Logs.response(\"Normalized: \" + gptAnswer.normalizedResponse);\r\n }\r\n\r\n /* Handle clipboard mode */\r\n if (config.mode === \"clipboard\") {\r\n if (!config.infinite) removeListener(hiddenButton);\r\n return handleClipboard(config, gptAnswer);\r\n }\r\n\r\n /* Handle question to answer mode */\r\n if (config.mode === \"question-to-answer\") {\r\n removeListener(hiddenButton);\r\n\r\n const questionBackup = form.textContent;\r\n const questionContainer = form.querySelector(\".qtext\");\r\n\r\n questionContainer.textContent = gptAnswer.response;\r\n questionContainer.style.whiteSpace = \"pre-wrap\";\r\n\r\n questionContainer.addEventListener(\"click\", function () {\r\n const isNotResponse = questionContainer.textContent === questionBackup;\r\n questionContainer.style.whiteSpace = isNotResponse ? \"pre-wrap\" : null;\r\n questionContainer.textContent = isNotResponse\r\n ? gptAnswer.response\r\n : questionBackup;\r\n });\r\n return;\r\n }\r\n\r\n /* Better then set once on the event because if there is an error the user can click an other time on the question */\r\n if (!config.infinite) removeListener(hiddenButton);\r\n\r\n const handlers = [\r\n handleContentEditable,\r\n handleTextbox,\r\n handleNumber,\r\n handleSelect,\r\n handleRadioAndCheckbox,\r\n ];\r\n\r\n for (const handler of handlers) {\r\n if (handler(config, inputList, gptAnswer)) return;\r\n }\r\n\r\n /* In the case we can't auto complete the question */\r\n handleClipboard(config, gptAnswer);\r\n}\r\n\r\nexport default reply;\r\n","import Config from \"../types/config\";\r\nimport titleIndications from \"../utils/title-indications\";\r\nimport reply from \"./reply\";\r\n\r\nconst pressedKeys: string[] = [];\r\nconst listeners: {\r\n element: HTMLElement;\r\n fn: (this: HTMLElement, ev: MouseEvent) => any;\r\n}[] = [];\r\n\r\n/**\r\n * Create a listener on the keyboard to inject the code\r\n * @param config\r\n */\r\nfunction codeListener(config: Config) {\r\n document.body.addEventListener(\"keydown\", function (event) {\r\n pressedKeys.push(event.key);\r\n if (pressedKeys.length > config.code.length) pressedKeys.shift();\r\n if (pressedKeys.join(\"\") === config.code) {\r\n pressedKeys.length = 0;\r\n setUpMoodleGpt(config);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Setup moodleGPT into the page (remove/injection)\r\n * @param config\r\n * @returns\r\n */\r\nfunction setUpMoodleGpt(config: Config) {\r\n /* Removing events */\r\n if (listeners.length > 0) {\r\n for (const listener of listeners) {\r\n if (config.cursor) listener.element.style.cursor = \"initial\";\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n if (config.title) titleIndications(\"Removed\");\r\n listeners.length = 0;\r\n return;\r\n }\r\n\r\n /* Code injection */\r\n const inputQuery = [\"checkbox\", \"radio\", \"text\", \"number\"]\r\n .map((e) => `input[type=\"${e}\"]`)\r\n .join(\",\");\r\n const query = inputQuery + \", textarea, select, [contenteditable]\";\r\n const forms = document.querySelectorAll(\".formulation\");\r\n\r\n for (const form of forms) {\r\n const hiddenButton: HTMLElement = form.querySelector(\".qtext\");\r\n\r\n if (config.cursor) hiddenButton.style.cursor = \"pointer\";\r\n\r\n const injectionFunction = reply.bind(\r\n null,\r\n config,\r\n hiddenButton,\r\n form,\r\n query\r\n );\r\n listeners.push({ element: hiddenButton, fn: injectionFunction });\r\n hiddenButton.addEventListener(\"click\", injectionFunction);\r\n }\r\n\r\n if (config.title) titleIndications(\"Injected\");\r\n}\r\n\r\n/**\r\n * Remove the event listener on a specific question\r\n * @param element\r\n */\r\nfunction removeListener(element: HTMLElement) {\r\n const index = listeners.findIndex((listener) => listener.element === element);\r\n if (index !== -1) {\r\n const listener = listeners.splice(index, 1)[0];\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n}\r\n\r\nexport { codeListener, removeListener };\r\n","import { codeListener } from \"./core/code-listener\";\r\n\r\nchrome.storage.sync.get([\"moodleGPT\"]).then(function (storage) {\r\n const config = storage.moodleGPT;\r\n\r\n if (!config) throw new Error(\"Please configure MoodleGPT into the extension\");\r\n\r\n codeListener(config);\r\n});\r\n"],"names":[],"mappings":"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","x_google_ignoreList":[1]} \ No newline at end of file diff --git a/src/core/reply.ts b/src/core/reply.ts index 8613b9b..1784834 100644 --- a/src/core/reply.ts +++ b/src/core/reply.ts @@ -78,6 +78,9 @@ async function reply( return; } + /* Better then set once on the event because if there is an error the user can click an other time on the question */ + if (!config.infinite) removeListener(hiddenButton); + const handlers = [ handleContentEditable, handleTextbox, @@ -92,9 +95,6 @@ async function reply( /* In the case we can't auto complete the question */ handleClipboard(config, gptAnswer); - - /* Better then set once on the event because if there is an error the user can click an other time on the question */ - if (!config.infinite) removeListener(hiddenButton); } export default reply; From b67727a4ff939212da6392f27f2f2c27ec06d554 Mon Sep 17 00:00:00 2001 From: yoannchb-pro <71560747+yoannchb-pro@users.noreply.github.com> Date: Tue, 20 Jun 2023 14:45:53 -0400 Subject: [PATCH 19/35] Update TODO.md --- TODO.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/TODO.md b/TODO.md index f478ac0..8dc55b9 100644 --- a/TODO.md +++ b/TODO.md @@ -4,6 +4,8 @@ - [ ] Increment question when there is statement +## Priority: 2 + ## Priority: 3 (because hard to make) - [ ] Support math equation from image stocked in the `data-mathml` attribute From 0eac796a5b56e68ad4904a42f106dfe6bb962f0a Mon Sep 17 00:00:00 2001 From: yoannchb-pro <71560747+yoannchb-pro@users.noreply.github.com> Date: Tue, 20 Jun 2023 15:02:38 -0400 Subject: [PATCH 20/35] Better logs for response --- extension/MoodleGPT.js | 8 ++++---- extension/MoodleGPT.js.map | 2 +- src/core/reply.ts | 3 +-- src/utils/logs.ts | 6 ++++-- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/extension/MoodleGPT.js b/extension/MoodleGPT.js index 2da211b..ba84106 100644 --- a/extension/MoodleGPT.js +++ b/extension/MoodleGPT.js @@ -50,8 +50,9 @@ static array(arr) { console.log("[CORRECTS] ", arr); } - static response(text) { - console.log(text); + static response(gptAnswer) { + console.log("Original:\n" + gptAnswer.response); + console.log("Normalized:\n" + gptAnswer.normalizedResponse); } } @@ -386,8 +387,7 @@ } if (config.logs) { Logs.question(question); - Logs.response("Original: " + gptAnswer.response); - Logs.response("Normalized: " + gptAnswer.normalizedResponse); + Logs.response(gptAnswer); } /* Handle clipboard mode */ if (config.mode === "clipboard") { diff --git a/extension/MoodleGPT.js.map b/extension/MoodleGPT.js.map index 99a2246..01cd1ac 100644 --- a/extension/MoodleGPT.js.map +++ b/extension/MoodleGPT.js.map @@ -1 +1 @@ -{"version":3,"file":"MoodleGPT.js","sources":["../src/utils/title-indications.ts","../node_modules/tslib/tslib.es6.js","../src/utils/logs.ts","../src/utils/normalize-text.ts","../src/core/get-response.ts","../src/utils/html-table-to-string.ts","../src/core/create-question.ts","../src/core/questions/radio-checkbox.ts","../src/core/questions/select.ts","../src/core/questions/textbox.ts","../src/core/questions/clipboard.ts","../src/core/questions/number.ts","../src/core/questions/contenteditable.ts","../src/core/reply.ts","../src/core/code-listener.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Show some informations into the document title and remove it after 3000ms\r\n * @param text\r\n */\r\nfunction titleIndications(text: string) {\r\n const backTitle = document.title;\r\n document.title = text;\r\n setTimeout(() => (document.title = backTitle), 3000);\r\n}\r\n\r\nexport default titleIndications;\r\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.push(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.push(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","class Logs {\r\n static question(text: string) {\r\n const css = \"color: cyan\";\r\n console.log(\"%c[QUESTION]: %s\", css, text);\r\n }\r\n\r\n static responseTry(text: string, valide: boolean) {\r\n const css = \"color: \" + (valide ? \"green\" : \"red\");\r\n console.log(\"%c[CHECKING]: %s\", css, text);\r\n }\r\n\r\n static array(arr: unknown[]) {\r\n console.log(\"[CORRECTS] \", arr);\r\n }\r\n\r\n static response(text: string) {\r\n console.log(text);\r\n }\r\n}\r\n\r\nexport default Logs;\r\n","/**\r\n * Normlize text\r\n * @param text\r\n */\r\nfunction normalizeText(text: string) {\r\n return text\r\n .replace(/\\n+/gi, \"\\n\")\r\n .replace(/(\\n\\s*\\n)+/g, \"\\n\") //remove useless white sapce from textcontent\r\n .replace(/[ \\t]+/gi, \" \")\r\n .toLowerCase()\r\n .trim()\r\n .replace(/^[a-z\\d]\\.\\s/gi, \"\") //a. text, b. text, c. text, 1. text, 2. text, 3.text\r\n .replace(/\\n[a-z\\d]\\.\\s/gi, \"\\n\"); //same but with new line\r\n}\r\n\r\nexport default normalizeText;\r\n","import Config from \"../types/config\";\r\nimport GPTAnswer from \"../types/gptAnswer\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\n\r\n/**\r\n * Get the response from chatGPT api\r\n * @param config\r\n * @param question\r\n * @returns\r\n */\r\nasync function getChatGPTResponse(\r\n config: Config,\r\n question: string\r\n): Promise {\r\n const controller = new AbortController();\r\n const timeoutControler = setTimeout(() => controller.abort(), 15000);\r\n const req = await fetch(\"https://api.openai.com/v1/chat/completions\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${config.apiKey}`,\r\n },\r\n signal: config.timeout ? controller.signal : null,\r\n body: JSON.stringify({\r\n model: config.model,\r\n messages: [{ role: \"user\", content: question }],\r\n temperature: 0.8,\r\n top_p: 1.0,\r\n presence_penalty: 1.0,\r\n stop: null,\r\n }),\r\n });\r\n clearTimeout(timeoutControler);\r\n const rep = await req.json();\r\n const response = rep.choices[0].message.content;\r\n return {\r\n response,\r\n normalizedResponse: normalizeText(response),\r\n };\r\n}\r\n\r\nexport default getChatGPTResponse;\r\n","/**\r\n * Convert table to representating string table\r\n * @param table\r\n * @returns\r\n */\r\nfunction htmlTableToString(table: HTMLTableElement) {\r\n const tab: string[][] = [];\r\n const lines = Array.from(table.querySelectorAll(\"tr\"));\r\n const maxColumnsLength: number[] = [];\r\n lines.map((line) => {\r\n const cells = Array.from(line.querySelectorAll(\"td, th\"));\r\n const cellsContent = cells.map((cell, index) => {\r\n const content = cell.textContent?.trim();\r\n maxColumnsLength[index] = Math.max(\r\n maxColumnsLength[index] || 0,\r\n content.length || 0\r\n );\r\n return content;\r\n });\r\n tab.push(cellsContent);\r\n });\r\n\r\n const lineSeparationSize =\r\n maxColumnsLength.reduce((a, b) => a + b) + tab[0].length * 3 + 1;\r\n const lineSeparation =\r\n \"\\n\" + Array(lineSeparationSize).fill(\"-\").join(\"\") + \"\\n\";\r\n\r\n const mappedTab = tab.map((line) => {\r\n const mappedLine = line.map((content, index) =>\r\n content.padEnd(\r\n maxColumnsLength[index],\r\n \"\\u00A0\" /* For no matching with \\s */\r\n )\r\n );\r\n return \"| \" + mappedLine.join(\" | \") + \" |\";\r\n });\r\n const head = mappedTab.shift();\r\n return head + lineSeparation + mappedTab.join(\"\\n\");\r\n}\r\n\r\nexport default htmlTableToString;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\nimport htmlTableToString from \"../utils/html-table-to-string\";\r\n\r\n/**\r\n * Normalize the question and add sub informations\r\n * @param langage\r\n * @param question\r\n * @returns\r\n */\r\nfunction createQuestion(config: Config, questionContainer: HTMLElement) {\r\n let question = questionContainer.innerText; //TODO: textContent better for reply ??\r\n\r\n /* Make tables more readable for chat-gpt */\r\n const tables: NodeListOf =\r\n questionContainer.querySelectorAll(\".qtext table\");\r\n for (const table of tables) {\r\n question = question.replace(\r\n table.innerText,\r\n \"\\n\" + htmlTableToString(table) + \"\\n\"\r\n );\r\n }\r\n\r\n const finalQuestion = `Give a short response as possible for this question, reply in the following question langage and only show the result:\r\n ${question} \r\n (If you have to choose between multiple results only show the corrects one, separate them with new line and take the same text as the question)`;\r\n return normalizeText(finalQuestion);\r\n}\r\n\r\nexport default createQuestion;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle checkbox and input elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n */\r\nfunction handleRadioAndCheckbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList?.[0] as HTMLInputElement;\r\n\r\n if (!input || (input.type !== \"checkbox\" && input.type !== \"radio\"))\r\n return false;\r\n\r\n for (const input of inputList as NodeListOf) {\r\n const content = normalizeText(input.parentNode.textContent);\r\n const valide = gptAnswer.normalizedResponse.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n if (valide) {\r\n if (config.mouseover) {\r\n input.addEventListener(\"mouseover\", () => (input.checked = true), {\r\n once: true,\r\n });\r\n } else {\r\n input.checked = true;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport default handleRadioAndCheckbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle select elements (and put in order select)\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleSelect(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n if (inputList.length === 0 || inputList[0].tagName !== \"SELECT\") return false;\r\n\r\n let correct = gptAnswer.normalizedResponse.split(\"\\n\");\r\n if (correct.length === 1 && correct.length !== inputList.length)\r\n correct = gptAnswer.normalizedResponse.split(\",\");\r\n\r\n if (config.logs) Logs.array(correct);\r\n\r\n for (let j = 0; j < inputList.length; ++j) {\r\n const options = inputList[j].querySelectorAll(\"option\");\r\n\r\n for (const option of options) {\r\n const content = normalizeText(option.textContent);\r\n const valide = correct[j].includes(content);\r\n\r\n /* Handle put in order question */\r\n if (!isNaN(parseInt(content))) {\r\n const content = normalizeText(\r\n (option.parentNode as HTMLElement)\r\n .closest(\"tr\")\r\n .querySelector(\".text\").textContent\r\n );\r\n const index = correct.findIndex((c) => {\r\n const valide = c.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n return valide;\r\n });\r\n if (index !== -1) {\r\n if (config.mouseover) {\r\n options[index + 1].closest(\"select\").addEventListener(\r\n \"click\",\r\n function () {\r\n options[index + 1].selected = \"selected\" as any;\r\n },\r\n { once: true }\r\n );\r\n } else {\r\n options[index + 1].selected = \"selected\" as any;\r\n }\r\n break;\r\n }\r\n }\r\n /* End */\r\n\r\n if (config.logs) Logs.responseTry(content, valide);\r\n\r\n if (valide) {\r\n if (config.mouseover) {\r\n option\r\n .closest(\"select\")\r\n .addEventListener(\"click\", () => (option.selected = true), {\r\n once: true,\r\n });\r\n } else {\r\n option.selected = true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleSelect;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle textbox\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleTextbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n (input.tagName !== \"TEXTAREA\" && input.type !== \"text\")\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.value = gptAnswer.response.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleTextbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport titleIndications from \"../../utils/title-indications\";\r\n\r\n/**\r\n * Copy the response in the clipboard if we can automaticaly fill the question\r\n * @param config\r\n * @param gptAnswer\r\n */\r\nfunction handleClipboard(config: Config, gptAnswer: GPTAnswer) {\r\n if (config.title) titleIndications(\"Copied to clipboard\");\r\n navigator.clipboard.writeText(gptAnswer.response);\r\n}\r\n\r\nexport default handleClipboard;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle number input\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleNumber(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (inputList.length !== 1 || input.type !== \"number\") return false;\r\n\r\n const number = gptAnswer.normalizedResponse\r\n .match(/\\d+([,\\.]\\d+)?/gi)?.[0]\r\n ?.replace(\",\", \".\");\r\n\r\n if (!number) return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = number.length + 1;\r\n if (index > number.length) return;\r\n event.preventDefault();\r\n if (number.slice(index, index + 1) === \".\") ++index;\r\n input.value = number.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = number;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleNumber;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Hanlde contenteditable elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleContentEditable(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0];\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n input.getAttribute(\"contenteditable\") !== \"true\"\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.textContent = gptAnswer.response.slice(0, ++index);\r\n\r\n /* Put the cursor at the end of the typed text */\r\n input.focus();\r\n const range = document.createRange();\r\n range.selectNodeContents(input);\r\n range.collapse(false);\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n });\r\n } else {\r\n input.textContent = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleContentEditable;\r\n","import Config from \"../types/config\";\r\nimport Logs from \"../utils/logs\";\r\nimport getChatGPTResponse from \"./get-response\";\r\nimport createQuestion from \"./create-question\";\r\nimport handleRadioAndCheckbox from \"./questions/radio-checkbox\";\r\nimport handleSelect from \"./questions/select\";\r\nimport handleTextbox from \"./questions/textbox\";\r\nimport handleClipboard from \"./questions/clipboard\";\r\nimport handleNumber from \"./questions/number\";\r\nimport handleContentEditable from \"./questions/contenteditable\";\r\nimport { removeListener } from \"./code-listener\";\r\n\r\n/**\r\n * Reply to the question\r\n * @param config\r\n * @param hiddenButton\r\n * @param form\r\n * @param query\r\n * @returns\r\n */\r\nasync function reply(\r\n config: Config,\r\n hiddenButton: HTMLElement,\r\n form: HTMLElement,\r\n query: string\r\n) {\r\n if (config.cursor) hiddenButton.style.cursor = \"wait\";\r\n\r\n const question = createQuestion(config, form);\r\n const inputList: NodeListOf = form.querySelectorAll(query);\r\n\r\n const gptAnswer = await getChatGPTResponse(config, question).catch(\r\n (error) => ({\r\n error,\r\n })\r\n );\r\n\r\n const haveError = typeof gptAnswer === \"object\" && \"error\" in gptAnswer;\r\n\r\n if (config.cursor)\r\n hiddenButton.style.cursor =\r\n config.infinite || haveError ? \"pointer\" : \"initial\";\r\n\r\n if (haveError) {\r\n console.error(gptAnswer.error);\r\n return;\r\n }\r\n\r\n if (config.logs) {\r\n Logs.question(question);\r\n Logs.response(\"Original: \" + gptAnswer.response);\r\n Logs.response(\"Normalized: \" + gptAnswer.normalizedResponse);\r\n }\r\n\r\n /* Handle clipboard mode */\r\n if (config.mode === \"clipboard\") {\r\n if (!config.infinite) removeListener(hiddenButton);\r\n return handleClipboard(config, gptAnswer);\r\n }\r\n\r\n /* Handle question to answer mode */\r\n if (config.mode === \"question-to-answer\") {\r\n removeListener(hiddenButton);\r\n\r\n const questionBackup = form.textContent;\r\n const questionContainer = form.querySelector(\".qtext\");\r\n\r\n questionContainer.textContent = gptAnswer.response;\r\n questionContainer.style.whiteSpace = \"pre-wrap\";\r\n\r\n questionContainer.addEventListener(\"click\", function () {\r\n const isNotResponse = questionContainer.textContent === questionBackup;\r\n questionContainer.style.whiteSpace = isNotResponse ? \"pre-wrap\" : null;\r\n questionContainer.textContent = isNotResponse\r\n ? gptAnswer.response\r\n : questionBackup;\r\n });\r\n return;\r\n }\r\n\r\n /* Better then set once on the event because if there is an error the user can click an other time on the question */\r\n if (!config.infinite) removeListener(hiddenButton);\r\n\r\n const handlers = [\r\n handleContentEditable,\r\n handleTextbox,\r\n handleNumber,\r\n handleSelect,\r\n handleRadioAndCheckbox,\r\n ];\r\n\r\n for (const handler of handlers) {\r\n if (handler(config, inputList, gptAnswer)) return;\r\n }\r\n\r\n /* In the case we can't auto complete the question */\r\n handleClipboard(config, gptAnswer);\r\n}\r\n\r\nexport default reply;\r\n","import Config from \"../types/config\";\r\nimport titleIndications from \"../utils/title-indications\";\r\nimport reply from \"./reply\";\r\n\r\nconst pressedKeys: string[] = [];\r\nconst listeners: {\r\n element: HTMLElement;\r\n fn: (this: HTMLElement, ev: MouseEvent) => any;\r\n}[] = [];\r\n\r\n/**\r\n * Create a listener on the keyboard to inject the code\r\n * @param config\r\n */\r\nfunction codeListener(config: Config) {\r\n document.body.addEventListener(\"keydown\", function (event) {\r\n pressedKeys.push(event.key);\r\n if (pressedKeys.length > config.code.length) pressedKeys.shift();\r\n if (pressedKeys.join(\"\") === config.code) {\r\n pressedKeys.length = 0;\r\n setUpMoodleGpt(config);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Setup moodleGPT into the page (remove/injection)\r\n * @param config\r\n * @returns\r\n */\r\nfunction setUpMoodleGpt(config: Config) {\r\n /* Removing events */\r\n if (listeners.length > 0) {\r\n for (const listener of listeners) {\r\n if (config.cursor) listener.element.style.cursor = \"initial\";\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n if (config.title) titleIndications(\"Removed\");\r\n listeners.length = 0;\r\n return;\r\n }\r\n\r\n /* Code injection */\r\n const inputQuery = [\"checkbox\", \"radio\", \"text\", \"number\"]\r\n .map((e) => `input[type=\"${e}\"]`)\r\n .join(\",\");\r\n const query = inputQuery + \", textarea, select, [contenteditable]\";\r\n const forms = document.querySelectorAll(\".formulation\");\r\n\r\n for (const form of forms) {\r\n const hiddenButton: HTMLElement = form.querySelector(\".qtext\");\r\n\r\n if (config.cursor) hiddenButton.style.cursor = \"pointer\";\r\n\r\n const injectionFunction = reply.bind(\r\n null,\r\n config,\r\n hiddenButton,\r\n form,\r\n query\r\n );\r\n listeners.push({ element: hiddenButton, fn: injectionFunction });\r\n hiddenButton.addEventListener(\"click\", injectionFunction);\r\n }\r\n\r\n if (config.title) titleIndications(\"Injected\");\r\n}\r\n\r\n/**\r\n * Remove the event listener on a specific question\r\n * @param element\r\n */\r\nfunction removeListener(element: HTMLElement) {\r\n const index = listeners.findIndex((listener) => listener.element === element);\r\n if (index !== -1) {\r\n const listener = listeners.splice(index, 1)[0];\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n}\r\n\r\nexport { codeListener, removeListener };\r\n","import { codeListener } from \"./core/code-listener\";\r\n\r\nchrome.storage.sync.get([\"moodleGPT\"]).then(function (storage) {\r\n const config = storage.moodleGPT;\r\n\r\n if (!config) throw new Error(\"Please configure MoodleGPT into the extension\");\r\n\r\n codeListener(config);\r\n});\r\n"],"names":[],"mappings":"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","x_google_ignoreList":[1]} \ No newline at end of file +{"version":3,"file":"MoodleGPT.js","sources":["../src/utils/title-indications.ts","../node_modules/tslib/tslib.es6.js","../src/utils/logs.ts","../src/utils/normalize-text.ts","../src/core/get-response.ts","../src/utils/html-table-to-string.ts","../src/core/create-question.ts","../src/core/questions/radio-checkbox.ts","../src/core/questions/select.ts","../src/core/questions/textbox.ts","../src/core/questions/clipboard.ts","../src/core/questions/number.ts","../src/core/questions/contenteditable.ts","../src/core/reply.ts","../src/core/code-listener.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Show some informations into the document title and remove it after 3000ms\r\n * @param text\r\n */\r\nfunction titleIndications(text: string) {\r\n const backTitle = document.title;\r\n document.title = text;\r\n setTimeout(() => (document.title = backTitle), 3000);\r\n}\r\n\r\nexport default titleIndications;\r\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.push(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.push(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","import GPTAnswer from \"../types/gptAnswer\";\r\nclass Logs {\r\n static question(text: string) {\r\n const css = \"color: cyan\";\r\n console.log(\"%c[QUESTION]: %s\", css, text);\r\n }\r\n\r\n static responseTry(text: string, valide: boolean) {\r\n const css = \"color: \" + (valide ? \"green\" : \"red\");\r\n console.log(\"%c[CHECKING]: %s\", css, text);\r\n }\r\n\r\n static array(arr: unknown[]) {\r\n console.log(\"[CORRECTS] \", arr);\r\n }\r\n\r\n static response(gptAnswer: GPTAnswer) {\r\n console.log(\"Original:\\n\" + gptAnswer.response);\r\n console.log(\"Normalized:\\n\" + gptAnswer.normalizedResponse);\r\n }\r\n}\r\n\r\nexport default Logs;\r\n","/**\r\n * Normlize text\r\n * @param text\r\n */\r\nfunction normalizeText(text: string) {\r\n return text\r\n .replace(/\\n+/gi, \"\\n\")\r\n .replace(/(\\n\\s*\\n)+/g, \"\\n\") //remove useless white sapce from textcontent\r\n .replace(/[ \\t]+/gi, \" \")\r\n .toLowerCase()\r\n .trim()\r\n .replace(/^[a-z\\d]\\.\\s/gi, \"\") //a. text, b. text, c. text, 1. text, 2. text, 3.text\r\n .replace(/\\n[a-z\\d]\\.\\s/gi, \"\\n\"); //same but with new line\r\n}\r\n\r\nexport default normalizeText;\r\n","import Config from \"../types/config\";\r\nimport GPTAnswer from \"../types/gptAnswer\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\n\r\n/**\r\n * Get the response from chatGPT api\r\n * @param config\r\n * @param question\r\n * @returns\r\n */\r\nasync function getChatGPTResponse(\r\n config: Config,\r\n question: string\r\n): Promise {\r\n const controller = new AbortController();\r\n const timeoutControler = setTimeout(() => controller.abort(), 15000);\r\n const req = await fetch(\"https://api.openai.com/v1/chat/completions\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${config.apiKey}`,\r\n },\r\n signal: config.timeout ? controller.signal : null,\r\n body: JSON.stringify({\r\n model: config.model,\r\n messages: [{ role: \"user\", content: question }],\r\n temperature: 0.8,\r\n top_p: 1.0,\r\n presence_penalty: 1.0,\r\n stop: null,\r\n }),\r\n });\r\n clearTimeout(timeoutControler);\r\n const rep = await req.json();\r\n const response = rep.choices[0].message.content;\r\n return {\r\n response,\r\n normalizedResponse: normalizeText(response),\r\n };\r\n}\r\n\r\nexport default getChatGPTResponse;\r\n","/**\r\n * Convert table to representating string table\r\n * @param table\r\n * @returns\r\n */\r\nfunction htmlTableToString(table: HTMLTableElement) {\r\n const tab: string[][] = [];\r\n const lines = Array.from(table.querySelectorAll(\"tr\"));\r\n const maxColumnsLength: number[] = [];\r\n lines.map((line) => {\r\n const cells = Array.from(line.querySelectorAll(\"td, th\"));\r\n const cellsContent = cells.map((cell, index) => {\r\n const content = cell.textContent?.trim();\r\n maxColumnsLength[index] = Math.max(\r\n maxColumnsLength[index] || 0,\r\n content.length || 0\r\n );\r\n return content;\r\n });\r\n tab.push(cellsContent);\r\n });\r\n\r\n const lineSeparationSize =\r\n maxColumnsLength.reduce((a, b) => a + b) + tab[0].length * 3 + 1;\r\n const lineSeparation =\r\n \"\\n\" + Array(lineSeparationSize).fill(\"-\").join(\"\") + \"\\n\";\r\n\r\n const mappedTab = tab.map((line) => {\r\n const mappedLine = line.map((content, index) =>\r\n content.padEnd(\r\n maxColumnsLength[index],\r\n \"\\u00A0\" /* For no matching with \\s */\r\n )\r\n );\r\n return \"| \" + mappedLine.join(\" | \") + \" |\";\r\n });\r\n const head = mappedTab.shift();\r\n return head + lineSeparation + mappedTab.join(\"\\n\");\r\n}\r\n\r\nexport default htmlTableToString;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\nimport htmlTableToString from \"../utils/html-table-to-string\";\r\n\r\n/**\r\n * Normalize the question and add sub informations\r\n * @param langage\r\n * @param question\r\n * @returns\r\n */\r\nfunction createQuestion(config: Config, questionContainer: HTMLElement) {\r\n let question = questionContainer.innerText; //TODO: textContent better for reply ??\r\n\r\n /* Make tables more readable for chat-gpt */\r\n const tables: NodeListOf =\r\n questionContainer.querySelectorAll(\".qtext table\");\r\n for (const table of tables) {\r\n question = question.replace(\r\n table.innerText,\r\n \"\\n\" + htmlTableToString(table) + \"\\n\"\r\n );\r\n }\r\n\r\n const finalQuestion = `Give a short response as possible for this question, reply in the following question langage and only show the result:\r\n ${question} \r\n (If you have to choose between multiple results only show the corrects one, separate them with new line and take the same text as the question)`;\r\n return normalizeText(finalQuestion);\r\n}\r\n\r\nexport default createQuestion;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle checkbox and input elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n */\r\nfunction handleRadioAndCheckbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList?.[0] as HTMLInputElement;\r\n\r\n if (!input || (input.type !== \"checkbox\" && input.type !== \"radio\"))\r\n return false;\r\n\r\n for (const input of inputList as NodeListOf) {\r\n const content = normalizeText(input.parentNode.textContent);\r\n const valide = gptAnswer.normalizedResponse.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n if (valide) {\r\n if (config.mouseover) {\r\n input.addEventListener(\"mouseover\", () => (input.checked = true), {\r\n once: true,\r\n });\r\n } else {\r\n input.checked = true;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport default handleRadioAndCheckbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle select elements (and put in order select)\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleSelect(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n if (inputList.length === 0 || inputList[0].tagName !== \"SELECT\") return false;\r\n\r\n let correct = gptAnswer.normalizedResponse.split(\"\\n\");\r\n if (correct.length === 1 && correct.length !== inputList.length)\r\n correct = gptAnswer.normalizedResponse.split(\",\");\r\n\r\n if (config.logs) Logs.array(correct);\r\n\r\n for (let j = 0; j < inputList.length; ++j) {\r\n const options = inputList[j].querySelectorAll(\"option\");\r\n\r\n for (const option of options) {\r\n const content = normalizeText(option.textContent);\r\n const valide = correct[j].includes(content);\r\n\r\n /* Handle put in order question */\r\n if (!isNaN(parseInt(content))) {\r\n const content = normalizeText(\r\n (option.parentNode as HTMLElement)\r\n .closest(\"tr\")\r\n .querySelector(\".text\").textContent\r\n );\r\n const index = correct.findIndex((c) => {\r\n const valide = c.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n return valide;\r\n });\r\n if (index !== -1) {\r\n if (config.mouseover) {\r\n options[index + 1].closest(\"select\").addEventListener(\r\n \"click\",\r\n function () {\r\n options[index + 1].selected = \"selected\" as any;\r\n },\r\n { once: true }\r\n );\r\n } else {\r\n options[index + 1].selected = \"selected\" as any;\r\n }\r\n break;\r\n }\r\n }\r\n /* End */\r\n\r\n if (config.logs) Logs.responseTry(content, valide);\r\n\r\n if (valide) {\r\n if (config.mouseover) {\r\n option\r\n .closest(\"select\")\r\n .addEventListener(\"click\", () => (option.selected = true), {\r\n once: true,\r\n });\r\n } else {\r\n option.selected = true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleSelect;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle textbox\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleTextbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n (input.tagName !== \"TEXTAREA\" && input.type !== \"text\")\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.value = gptAnswer.response.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleTextbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport titleIndications from \"../../utils/title-indications\";\r\n\r\n/**\r\n * Copy the response in the clipboard if we can automaticaly fill the question\r\n * @param config\r\n * @param gptAnswer\r\n */\r\nfunction handleClipboard(config: Config, gptAnswer: GPTAnswer) {\r\n if (config.title) titleIndications(\"Copied to clipboard\");\r\n navigator.clipboard.writeText(gptAnswer.response);\r\n}\r\n\r\nexport default handleClipboard;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle number input\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleNumber(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (inputList.length !== 1 || input.type !== \"number\") return false;\r\n\r\n const number = gptAnswer.normalizedResponse\r\n .match(/\\d+([,\\.]\\d+)?/gi)?.[0]\r\n ?.replace(\",\", \".\");\r\n\r\n if (!number) return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = number.length + 1;\r\n if (index > number.length) return;\r\n event.preventDefault();\r\n if (number.slice(index, index + 1) === \".\") ++index;\r\n input.value = number.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = number;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleNumber;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Hanlde contenteditable elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleContentEditable(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0];\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n input.getAttribute(\"contenteditable\") !== \"true\"\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.textContent = gptAnswer.response.slice(0, ++index);\r\n\r\n /* Put the cursor at the end of the typed text */\r\n input.focus();\r\n const range = document.createRange();\r\n range.selectNodeContents(input);\r\n range.collapse(false);\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n });\r\n } else {\r\n input.textContent = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleContentEditable;\r\n","import Config from \"../types/config\";\r\nimport Logs from \"../utils/logs\";\r\nimport getChatGPTResponse from \"./get-response\";\r\nimport createQuestion from \"./create-question\";\r\nimport handleRadioAndCheckbox from \"./questions/radio-checkbox\";\r\nimport handleSelect from \"./questions/select\";\r\nimport handleTextbox from \"./questions/textbox\";\r\nimport handleClipboard from \"./questions/clipboard\";\r\nimport handleNumber from \"./questions/number\";\r\nimport handleContentEditable from \"./questions/contenteditable\";\r\nimport { removeListener } from \"./code-listener\";\r\n\r\n/**\r\n * Reply to the question\r\n * @param config\r\n * @param hiddenButton\r\n * @param form\r\n * @param query\r\n * @returns\r\n */\r\nasync function reply(\r\n config: Config,\r\n hiddenButton: HTMLElement,\r\n form: HTMLElement,\r\n query: string\r\n) {\r\n if (config.cursor) hiddenButton.style.cursor = \"wait\";\r\n\r\n const question = createQuestion(config, form);\r\n const inputList: NodeListOf = form.querySelectorAll(query);\r\n\r\n const gptAnswer = await getChatGPTResponse(config, question).catch(\r\n (error) => ({\r\n error,\r\n })\r\n );\r\n\r\n const haveError = typeof gptAnswer === \"object\" && \"error\" in gptAnswer;\r\n\r\n if (config.cursor)\r\n hiddenButton.style.cursor =\r\n config.infinite || haveError ? \"pointer\" : \"initial\";\r\n\r\n if (haveError) {\r\n console.error(gptAnswer.error);\r\n return;\r\n }\r\n\r\n if (config.logs) {\r\n Logs.question(question);\r\n Logs.response(gptAnswer);\r\n }\r\n\r\n /* Handle clipboard mode */\r\n if (config.mode === \"clipboard\") {\r\n if (!config.infinite) removeListener(hiddenButton);\r\n return handleClipboard(config, gptAnswer);\r\n }\r\n\r\n /* Handle question to answer mode */\r\n if (config.mode === \"question-to-answer\") {\r\n removeListener(hiddenButton);\r\n\r\n const questionBackup = form.textContent;\r\n const questionContainer = form.querySelector(\".qtext\");\r\n\r\n questionContainer.textContent = gptAnswer.response;\r\n questionContainer.style.whiteSpace = \"pre-wrap\";\r\n\r\n questionContainer.addEventListener(\"click\", function () {\r\n const isNotResponse = questionContainer.textContent === questionBackup;\r\n questionContainer.style.whiteSpace = isNotResponse ? \"pre-wrap\" : null;\r\n questionContainer.textContent = isNotResponse\r\n ? gptAnswer.response\r\n : questionBackup;\r\n });\r\n return;\r\n }\r\n\r\n /* Better then set once on the event because if there is an error the user can click an other time on the question */\r\n if (!config.infinite) removeListener(hiddenButton);\r\n\r\n const handlers = [\r\n handleContentEditable,\r\n handleTextbox,\r\n handleNumber,\r\n handleSelect,\r\n handleRadioAndCheckbox,\r\n ];\r\n\r\n for (const handler of handlers) {\r\n if (handler(config, inputList, gptAnswer)) return;\r\n }\r\n\r\n /* In the case we can't auto complete the question */\r\n handleClipboard(config, gptAnswer);\r\n}\r\n\r\nexport default reply;\r\n","import Config from \"../types/config\";\r\nimport titleIndications from \"../utils/title-indications\";\r\nimport reply from \"./reply\";\r\n\r\nconst pressedKeys: string[] = [];\r\nconst listeners: {\r\n element: HTMLElement;\r\n fn: (this: HTMLElement, ev: MouseEvent) => any;\r\n}[] = [];\r\n\r\n/**\r\n * Create a listener on the keyboard to inject the code\r\n * @param config\r\n */\r\nfunction codeListener(config: Config) {\r\n document.body.addEventListener(\"keydown\", function (event) {\r\n pressedKeys.push(event.key);\r\n if (pressedKeys.length > config.code.length) pressedKeys.shift();\r\n if (pressedKeys.join(\"\") === config.code) {\r\n pressedKeys.length = 0;\r\n setUpMoodleGpt(config);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Setup moodleGPT into the page (remove/injection)\r\n * @param config\r\n * @returns\r\n */\r\nfunction setUpMoodleGpt(config: Config) {\r\n /* Removing events */\r\n if (listeners.length > 0) {\r\n for (const listener of listeners) {\r\n if (config.cursor) listener.element.style.cursor = \"initial\";\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n if (config.title) titleIndications(\"Removed\");\r\n listeners.length = 0;\r\n return;\r\n }\r\n\r\n /* Code injection */\r\n const inputQuery = [\"checkbox\", \"radio\", \"text\", \"number\"]\r\n .map((e) => `input[type=\"${e}\"]`)\r\n .join(\",\");\r\n const query = inputQuery + \", textarea, select, [contenteditable]\";\r\n const forms = document.querySelectorAll(\".formulation\");\r\n\r\n for (const form of forms) {\r\n const hiddenButton: HTMLElement = form.querySelector(\".qtext\");\r\n\r\n if (config.cursor) hiddenButton.style.cursor = \"pointer\";\r\n\r\n const injectionFunction = reply.bind(\r\n null,\r\n config,\r\n hiddenButton,\r\n form,\r\n query\r\n );\r\n listeners.push({ element: hiddenButton, fn: injectionFunction });\r\n hiddenButton.addEventListener(\"click\", injectionFunction);\r\n }\r\n\r\n if (config.title) titleIndications(\"Injected\");\r\n}\r\n\r\n/**\r\n * Remove the event listener on a specific question\r\n * @param element\r\n */\r\nfunction removeListener(element: HTMLElement) {\r\n const index = listeners.findIndex((listener) => listener.element === element);\r\n if (index !== -1) {\r\n const listener = listeners.splice(index, 1)[0];\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n}\r\n\r\nexport { codeListener, removeListener };\r\n","import { codeListener } from \"./core/code-listener\";\r\n\r\nchrome.storage.sync.get([\"moodleGPT\"]).then(function (storage) {\r\n const config = storage.moodleGPT;\r\n\r\n if (!config) throw new Error(\"Please configure MoodleGPT into the extension\");\r\n\r\n codeListener(config);\r\n});\r\n"],"names":[],"mappings":"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","x_google_ignoreList":[1]} \ No newline at end of file diff --git a/src/core/reply.ts b/src/core/reply.ts index 1784834..c3d58f7 100644 --- a/src/core/reply.ts +++ b/src/core/reply.ts @@ -48,8 +48,7 @@ async function reply( if (config.logs) { Logs.question(question); - Logs.response("Original: " + gptAnswer.response); - Logs.response("Normalized: " + gptAnswer.normalizedResponse); + Logs.response(gptAnswer); } /* Handle clipboard mode */ diff --git a/src/utils/logs.ts b/src/utils/logs.ts index d9069dd..41cacde 100644 --- a/src/utils/logs.ts +++ b/src/utils/logs.ts @@ -1,3 +1,4 @@ +import GPTAnswer from "../types/gptAnswer"; class Logs { static question(text: string) { const css = "color: cyan"; @@ -13,8 +14,9 @@ class Logs { console.log("[CORRECTS] ", arr); } - static response(text: string) { - console.log(text); + static response(gptAnswer: GPTAnswer) { + console.log("Original:\n" + gptAnswer.response); + console.log("Normalized:\n" + gptAnswer.normalizedResponse); } } From 9745301815e9e83ab629319deb45cc443882e505 Mon Sep 17 00:00:00 2001 From: yoannchb-pro <71560747+yoannchb-pro@users.noreply.github.com> Date: Tue, 20 Jun 2023 16:07:38 -0400 Subject: [PATCH 21/35] Update TODO.md --- TODO.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/TODO.md b/TODO.md index 8dc55b9..5575b85 100644 --- a/TODO.md +++ b/TODO.md @@ -2,12 +2,11 @@ ## Priority: 1 -- [ ] Increment question when there is statement - ## Priority: 2 ## Priority: 3 (because hard to make) +- [ ] Increment question when there is statement (hard because it is often on another page) - [ ] Support math equation from image stocked in the `data-mathml` attribute - [ ] Try something to understand images like (image -> ascii or may be using other AI ?) - [ ] Support multiple input type in a question From b24a40aa65f3d463661a07027454ac00f11b552c Mon Sep 17 00:00:00 2001 From: yoannchb-pro <71560747+yoannchb-pro@users.noreply.github.com> Date: Tue, 20 Jun 2023 16:14:58 -0400 Subject: [PATCH 22/35] description: version removed --- webstore-assets/description.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webstore-assets/description.txt b/webstore-assets/description.txt index 4bfdd5f..33b37e9 100644 --- a/webstore-assets/description.txt +++ b/webstore-assets/description.txt @@ -4,7 +4,7 @@ This extension supports various question types, including Select, Put in Order, To use MoodleGPT, you need to set it up by loading the unpacked extension in your browser's extension management page. Enter the API key obtained from OpenAI and a unique code to activate the extension on your Moodle page. You can customize the settings, including the GPT model, cursor indication, title indication, and more. -MoodleGPT v1.0.2 simplifies and accelerates the process of completing Moodle quizzes, making it easier for users to obtain accurate answers. Download the extension now and enhance your Moodle quiz experience! +MoodleGPT simplifies and accelerates the process of completing Moodle quizzes, making it easier for users to obtain accurate answers. Download the extension now and enhance your Moodle quiz experience! Github: https://github.com/yoannchb-pro/MoodleGPT Donation: https://www.buymeacoffee.com/yoannchbpro From b0faf4c92f786a4c5618e82fcd0759f192d4e32f Mon Sep 17 00:00:00 2001 From: yoannchb-pro <71560747+yoannchb-pro@users.noreply.github.com> Date: Tue, 20 Jun 2023 18:16:54 -0400 Subject: [PATCH 23/35] AI system instructions --- extension/MoodleGPT.js | 66 ++++++++++++++++++++++++++++-------- extension/MoodleGPT.js.map | 2 +- src/core/create-question.ts | 14 +++++--- src/core/get-response.ts | 18 +++++++++- src/core/questions/select.ts | 21 ++++++++++-- src/utils/normalize-text.ts | 22 +++++++----- 6 files changed, 112 insertions(+), 31 deletions(-) diff --git a/extension/MoodleGPT.js b/extension/MoodleGPT.js index ba84106..289ade6 100644 --- a/extension/MoodleGPT.js +++ b/extension/MoodleGPT.js @@ -60,15 +60,19 @@ * Normlize text * @param text */ - function normalizeText(text) { - return text - .replace(/\n+/gi, "\n") + function normalizeText(text, toLowerCase = true) { + let normalizedText = text + .replace(/\n+/gi, "\n") //remove duplicate new lines .replace(/(\n\s*\n)+/g, "\n") //remove useless white sapce from textcontent - .replace(/[ \t]+/gi, " ") - .toLowerCase() + .replace(/[ \t]+/gi, " "); //replace multiples space or tabs by a space + if (toLowerCase) + normalizedText = normalizedText.toLowerCase(); + return (normalizedText .trim() + /* We remove that because sometimes ChatGPT will reply: "answer d" */ .replace(/^[a-z\d]\.\s/gi, "") //a. text, b. text, c. text, 1. text, 2. text, 3.text - .replace(/\n[a-z\d]\.\s/gi, "\n"); //same but with new line + .replace(/\n[a-z\d]\.\s/gi, "\n") //same but with new line + ); } /** @@ -90,7 +94,23 @@ signal: config.timeout ? controller.signal : null, body: JSON.stringify({ model: config.model, - messages: [{ role: "user", content: question }], + messages: [ + { + role: "system", + content: ` +Follow those rules: +- Sometimes there won't be a question, so just answer the statement as you normally would without following the other rules and give the most detailled and complete answer with explication. +- Your goal is to understand the statement and to reply to each question by giving only the answer. +- You will keep the same order for the answers as the questions event if it's a put in order question. +- You will separate all the answer with new lines and only show the correctes one. +- You should answer in the same order as it is ine the question even if it's a put in order question. +- You will omit the question or any other text/information we just want the correct answer. +- You should only give exactly the same text as the question for each answer. +- The question always have the good answer so you should always give an answer to the question. +- You will always respond in the same langage as the user question.`, + }, + { role: "user", content: question }, + ], temperature: 0.8, top_p: 1.0, presence_penalty: 1.0, @@ -143,16 +163,18 @@ * @returns */ function createQuestion(config, questionContainer) { - let question = questionContainer.innerText; //TODO: textContent better for reply ?? + let question = questionContainer.innerText; + /* We remove unnecessary information */ + const accesshideElements = questionContainer.querySelectorAll(".accesshide"); + for (const useless of accesshideElements) { + question = question.replace(useless.innerText, ""); + } /* Make tables more readable for chat-gpt */ const tables = questionContainer.querySelectorAll(".qtext table"); for (const table of tables) { question = question.replace(table.innerText, "\n" + htmlTableToString(table) + "\n"); } - const finalQuestion = `Give a short response as possible for this question, reply in the following question langage and only show the result: - ${question} - (If you have to choose between multiple results only show the corrects one, separate them with new line and take the same text as the question)`; - return normalizeText(finalQuestion); + return normalizeText(question, false); } /** @@ -195,10 +217,26 @@ if (inputList.length === 0 || inputList[0].tagName !== "SELECT") return false; let correct = gptAnswer.normalizedResponse.split("\n"); - if (correct.length === 1 && correct.length !== inputList.length) - correct = gptAnswer.normalizedResponse.split(","); if (config.logs) Logs.array(correct); + /** + * Sometimes ChatGPT give the question so we should remove them + * Example: + * 5*5 + * 25 + * 10+10 + * 20 + * 20-10 + * 10 + * + * And we only want to keep answers + * 25 + * 20 + * 10 + */ + if (correct.length === inputList.length * 2) { + correct = correct.filter((answer, index) => index % 2 === 1); + } for (let j = 0; j < inputList.length; ++j) { const options = inputList[j].querySelectorAll("option"); for (const option of options) { diff --git a/extension/MoodleGPT.js.map b/extension/MoodleGPT.js.map index 01cd1ac..85bc410 100644 --- a/extension/MoodleGPT.js.map +++ b/extension/MoodleGPT.js.map @@ -1 +1 @@ -{"version":3,"file":"MoodleGPT.js","sources":["../src/utils/title-indications.ts","../node_modules/tslib/tslib.es6.js","../src/utils/logs.ts","../src/utils/normalize-text.ts","../src/core/get-response.ts","../src/utils/html-table-to-string.ts","../src/core/create-question.ts","../src/core/questions/radio-checkbox.ts","../src/core/questions/select.ts","../src/core/questions/textbox.ts","../src/core/questions/clipboard.ts","../src/core/questions/number.ts","../src/core/questions/contenteditable.ts","../src/core/reply.ts","../src/core/code-listener.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Show some informations into the document title and remove it after 3000ms\r\n * @param text\r\n */\r\nfunction titleIndications(text: string) {\r\n const backTitle = document.title;\r\n document.title = text;\r\n setTimeout(() => (document.title = backTitle), 3000);\r\n}\r\n\r\nexport default titleIndications;\r\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.push(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.push(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","import GPTAnswer from \"../types/gptAnswer\";\r\nclass Logs {\r\n static question(text: string) {\r\n const css = \"color: cyan\";\r\n console.log(\"%c[QUESTION]: %s\", css, text);\r\n }\r\n\r\n static responseTry(text: string, valide: boolean) {\r\n const css = \"color: \" + (valide ? \"green\" : \"red\");\r\n console.log(\"%c[CHECKING]: %s\", css, text);\r\n }\r\n\r\n static array(arr: unknown[]) {\r\n console.log(\"[CORRECTS] \", arr);\r\n }\r\n\r\n static response(gptAnswer: GPTAnswer) {\r\n console.log(\"Original:\\n\" + gptAnswer.response);\r\n console.log(\"Normalized:\\n\" + gptAnswer.normalizedResponse);\r\n }\r\n}\r\n\r\nexport default Logs;\r\n","/**\r\n * Normlize text\r\n * @param text\r\n */\r\nfunction normalizeText(text: string) {\r\n return text\r\n .replace(/\\n+/gi, \"\\n\")\r\n .replace(/(\\n\\s*\\n)+/g, \"\\n\") //remove useless white sapce from textcontent\r\n .replace(/[ \\t]+/gi, \" \")\r\n .toLowerCase()\r\n .trim()\r\n .replace(/^[a-z\\d]\\.\\s/gi, \"\") //a. text, b. text, c. text, 1. text, 2. text, 3.text\r\n .replace(/\\n[a-z\\d]\\.\\s/gi, \"\\n\"); //same but with new line\r\n}\r\n\r\nexport default normalizeText;\r\n","import Config from \"../types/config\";\r\nimport GPTAnswer from \"../types/gptAnswer\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\n\r\n/**\r\n * Get the response from chatGPT api\r\n * @param config\r\n * @param question\r\n * @returns\r\n */\r\nasync function getChatGPTResponse(\r\n config: Config,\r\n question: string\r\n): Promise {\r\n const controller = new AbortController();\r\n const timeoutControler = setTimeout(() => controller.abort(), 15000);\r\n const req = await fetch(\"https://api.openai.com/v1/chat/completions\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${config.apiKey}`,\r\n },\r\n signal: config.timeout ? controller.signal : null,\r\n body: JSON.stringify({\r\n model: config.model,\r\n messages: [{ role: \"user\", content: question }],\r\n temperature: 0.8,\r\n top_p: 1.0,\r\n presence_penalty: 1.0,\r\n stop: null,\r\n }),\r\n });\r\n clearTimeout(timeoutControler);\r\n const rep = await req.json();\r\n const response = rep.choices[0].message.content;\r\n return {\r\n response,\r\n normalizedResponse: normalizeText(response),\r\n };\r\n}\r\n\r\nexport default getChatGPTResponse;\r\n","/**\r\n * Convert table to representating string table\r\n * @param table\r\n * @returns\r\n */\r\nfunction htmlTableToString(table: HTMLTableElement) {\r\n const tab: string[][] = [];\r\n const lines = Array.from(table.querySelectorAll(\"tr\"));\r\n const maxColumnsLength: number[] = [];\r\n lines.map((line) => {\r\n const cells = Array.from(line.querySelectorAll(\"td, th\"));\r\n const cellsContent = cells.map((cell, index) => {\r\n const content = cell.textContent?.trim();\r\n maxColumnsLength[index] = Math.max(\r\n maxColumnsLength[index] || 0,\r\n content.length || 0\r\n );\r\n return content;\r\n });\r\n tab.push(cellsContent);\r\n });\r\n\r\n const lineSeparationSize =\r\n maxColumnsLength.reduce((a, b) => a + b) + tab[0].length * 3 + 1;\r\n const lineSeparation =\r\n \"\\n\" + Array(lineSeparationSize).fill(\"-\").join(\"\") + \"\\n\";\r\n\r\n const mappedTab = tab.map((line) => {\r\n const mappedLine = line.map((content, index) =>\r\n content.padEnd(\r\n maxColumnsLength[index],\r\n \"\\u00A0\" /* For no matching with \\s */\r\n )\r\n );\r\n return \"| \" + mappedLine.join(\" | \") + \" |\";\r\n });\r\n const head = mappedTab.shift();\r\n return head + lineSeparation + mappedTab.join(\"\\n\");\r\n}\r\n\r\nexport default htmlTableToString;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\nimport htmlTableToString from \"../utils/html-table-to-string\";\r\n\r\n/**\r\n * Normalize the question and add sub informations\r\n * @param langage\r\n * @param question\r\n * @returns\r\n */\r\nfunction createQuestion(config: Config, questionContainer: HTMLElement) {\r\n let question = questionContainer.innerText; //TODO: textContent better for reply ??\r\n\r\n /* Make tables more readable for chat-gpt */\r\n const tables: NodeListOf =\r\n questionContainer.querySelectorAll(\".qtext table\");\r\n for (const table of tables) {\r\n question = question.replace(\r\n table.innerText,\r\n \"\\n\" + htmlTableToString(table) + \"\\n\"\r\n );\r\n }\r\n\r\n const finalQuestion = `Give a short response as possible for this question, reply in the following question langage and only show the result:\r\n ${question} \r\n (If you have to choose between multiple results only show the corrects one, separate them with new line and take the same text as the question)`;\r\n return normalizeText(finalQuestion);\r\n}\r\n\r\nexport default createQuestion;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle checkbox and input elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n */\r\nfunction handleRadioAndCheckbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList?.[0] as HTMLInputElement;\r\n\r\n if (!input || (input.type !== \"checkbox\" && input.type !== \"radio\"))\r\n return false;\r\n\r\n for (const input of inputList as NodeListOf) {\r\n const content = normalizeText(input.parentNode.textContent);\r\n const valide = gptAnswer.normalizedResponse.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n if (valide) {\r\n if (config.mouseover) {\r\n input.addEventListener(\"mouseover\", () => (input.checked = true), {\r\n once: true,\r\n });\r\n } else {\r\n input.checked = true;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport default handleRadioAndCheckbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle select elements (and put in order select)\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleSelect(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n if (inputList.length === 0 || inputList[0].tagName !== \"SELECT\") return false;\r\n\r\n let correct = gptAnswer.normalizedResponse.split(\"\\n\");\r\n if (correct.length === 1 && correct.length !== inputList.length)\r\n correct = gptAnswer.normalizedResponse.split(\",\");\r\n\r\n if (config.logs) Logs.array(correct);\r\n\r\n for (let j = 0; j < inputList.length; ++j) {\r\n const options = inputList[j].querySelectorAll(\"option\");\r\n\r\n for (const option of options) {\r\n const content = normalizeText(option.textContent);\r\n const valide = correct[j].includes(content);\r\n\r\n /* Handle put in order question */\r\n if (!isNaN(parseInt(content))) {\r\n const content = normalizeText(\r\n (option.parentNode as HTMLElement)\r\n .closest(\"tr\")\r\n .querySelector(\".text\").textContent\r\n );\r\n const index = correct.findIndex((c) => {\r\n const valide = c.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n return valide;\r\n });\r\n if (index !== -1) {\r\n if (config.mouseover) {\r\n options[index + 1].closest(\"select\").addEventListener(\r\n \"click\",\r\n function () {\r\n options[index + 1].selected = \"selected\" as any;\r\n },\r\n { once: true }\r\n );\r\n } else {\r\n options[index + 1].selected = \"selected\" as any;\r\n }\r\n break;\r\n }\r\n }\r\n /* End */\r\n\r\n if (config.logs) Logs.responseTry(content, valide);\r\n\r\n if (valide) {\r\n if (config.mouseover) {\r\n option\r\n .closest(\"select\")\r\n .addEventListener(\"click\", () => (option.selected = true), {\r\n once: true,\r\n });\r\n } else {\r\n option.selected = true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleSelect;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle textbox\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleTextbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n (input.tagName !== \"TEXTAREA\" && input.type !== \"text\")\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.value = gptAnswer.response.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleTextbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport titleIndications from \"../../utils/title-indications\";\r\n\r\n/**\r\n * Copy the response in the clipboard if we can automaticaly fill the question\r\n * @param config\r\n * @param gptAnswer\r\n */\r\nfunction handleClipboard(config: Config, gptAnswer: GPTAnswer) {\r\n if (config.title) titleIndications(\"Copied to clipboard\");\r\n navigator.clipboard.writeText(gptAnswer.response);\r\n}\r\n\r\nexport default handleClipboard;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle number input\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleNumber(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (inputList.length !== 1 || input.type !== \"number\") return false;\r\n\r\n const number = gptAnswer.normalizedResponse\r\n .match(/\\d+([,\\.]\\d+)?/gi)?.[0]\r\n ?.replace(\",\", \".\");\r\n\r\n if (!number) return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = number.length + 1;\r\n if (index > number.length) return;\r\n event.preventDefault();\r\n if (number.slice(index, index + 1) === \".\") ++index;\r\n input.value = number.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = number;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleNumber;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Hanlde contenteditable elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleContentEditable(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0];\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n input.getAttribute(\"contenteditable\") !== \"true\"\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.textContent = gptAnswer.response.slice(0, ++index);\r\n\r\n /* Put the cursor at the end of the typed text */\r\n input.focus();\r\n const range = document.createRange();\r\n range.selectNodeContents(input);\r\n range.collapse(false);\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n });\r\n } else {\r\n input.textContent = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleContentEditable;\r\n","import Config from \"../types/config\";\r\nimport Logs from \"../utils/logs\";\r\nimport getChatGPTResponse from \"./get-response\";\r\nimport createQuestion from \"./create-question\";\r\nimport handleRadioAndCheckbox from \"./questions/radio-checkbox\";\r\nimport handleSelect from \"./questions/select\";\r\nimport handleTextbox from \"./questions/textbox\";\r\nimport handleClipboard from \"./questions/clipboard\";\r\nimport handleNumber from \"./questions/number\";\r\nimport handleContentEditable from \"./questions/contenteditable\";\r\nimport { removeListener } from \"./code-listener\";\r\n\r\n/**\r\n * Reply to the question\r\n * @param config\r\n * @param hiddenButton\r\n * @param form\r\n * @param query\r\n * @returns\r\n */\r\nasync function reply(\r\n config: Config,\r\n hiddenButton: HTMLElement,\r\n form: HTMLElement,\r\n query: string\r\n) {\r\n if (config.cursor) hiddenButton.style.cursor = \"wait\";\r\n\r\n const question = createQuestion(config, form);\r\n const inputList: NodeListOf = form.querySelectorAll(query);\r\n\r\n const gptAnswer = await getChatGPTResponse(config, question).catch(\r\n (error) => ({\r\n error,\r\n })\r\n );\r\n\r\n const haveError = typeof gptAnswer === \"object\" && \"error\" in gptAnswer;\r\n\r\n if (config.cursor)\r\n hiddenButton.style.cursor =\r\n config.infinite || haveError ? \"pointer\" : \"initial\";\r\n\r\n if (haveError) {\r\n console.error(gptAnswer.error);\r\n return;\r\n }\r\n\r\n if (config.logs) {\r\n Logs.question(question);\r\n Logs.response(gptAnswer);\r\n }\r\n\r\n /* Handle clipboard mode */\r\n if (config.mode === \"clipboard\") {\r\n if (!config.infinite) removeListener(hiddenButton);\r\n return handleClipboard(config, gptAnswer);\r\n }\r\n\r\n /* Handle question to answer mode */\r\n if (config.mode === \"question-to-answer\") {\r\n removeListener(hiddenButton);\r\n\r\n const questionBackup = form.textContent;\r\n const questionContainer = form.querySelector(\".qtext\");\r\n\r\n questionContainer.textContent = gptAnswer.response;\r\n questionContainer.style.whiteSpace = \"pre-wrap\";\r\n\r\n questionContainer.addEventListener(\"click\", function () {\r\n const isNotResponse = questionContainer.textContent === questionBackup;\r\n questionContainer.style.whiteSpace = isNotResponse ? \"pre-wrap\" : null;\r\n questionContainer.textContent = isNotResponse\r\n ? gptAnswer.response\r\n : questionBackup;\r\n });\r\n return;\r\n }\r\n\r\n /* Better then set once on the event because if there is an error the user can click an other time on the question */\r\n if (!config.infinite) removeListener(hiddenButton);\r\n\r\n const handlers = [\r\n handleContentEditable,\r\n handleTextbox,\r\n handleNumber,\r\n handleSelect,\r\n handleRadioAndCheckbox,\r\n ];\r\n\r\n for (const handler of handlers) {\r\n if (handler(config, inputList, gptAnswer)) return;\r\n }\r\n\r\n /* In the case we can't auto complete the question */\r\n handleClipboard(config, gptAnswer);\r\n}\r\n\r\nexport default reply;\r\n","import Config from \"../types/config\";\r\nimport titleIndications from \"../utils/title-indications\";\r\nimport reply from \"./reply\";\r\n\r\nconst pressedKeys: string[] = [];\r\nconst listeners: {\r\n element: HTMLElement;\r\n fn: (this: HTMLElement, ev: MouseEvent) => any;\r\n}[] = [];\r\n\r\n/**\r\n * Create a listener on the keyboard to inject the code\r\n * @param config\r\n */\r\nfunction codeListener(config: Config) {\r\n document.body.addEventListener(\"keydown\", function (event) {\r\n pressedKeys.push(event.key);\r\n if (pressedKeys.length > config.code.length) pressedKeys.shift();\r\n if (pressedKeys.join(\"\") === config.code) {\r\n pressedKeys.length = 0;\r\n setUpMoodleGpt(config);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Setup moodleGPT into the page (remove/injection)\r\n * @param config\r\n * @returns\r\n */\r\nfunction setUpMoodleGpt(config: Config) {\r\n /* Removing events */\r\n if (listeners.length > 0) {\r\n for (const listener of listeners) {\r\n if (config.cursor) listener.element.style.cursor = \"initial\";\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n if (config.title) titleIndications(\"Removed\");\r\n listeners.length = 0;\r\n return;\r\n }\r\n\r\n /* Code injection */\r\n const inputQuery = [\"checkbox\", \"radio\", \"text\", \"number\"]\r\n .map((e) => `input[type=\"${e}\"]`)\r\n .join(\",\");\r\n const query = inputQuery + \", textarea, select, [contenteditable]\";\r\n const forms = document.querySelectorAll(\".formulation\");\r\n\r\n for (const form of forms) {\r\n const hiddenButton: HTMLElement = form.querySelector(\".qtext\");\r\n\r\n if (config.cursor) hiddenButton.style.cursor = \"pointer\";\r\n\r\n const injectionFunction = reply.bind(\r\n null,\r\n config,\r\n hiddenButton,\r\n form,\r\n query\r\n );\r\n listeners.push({ element: hiddenButton, fn: injectionFunction });\r\n hiddenButton.addEventListener(\"click\", injectionFunction);\r\n }\r\n\r\n if (config.title) titleIndications(\"Injected\");\r\n}\r\n\r\n/**\r\n * Remove the event listener on a specific question\r\n * @param element\r\n */\r\nfunction removeListener(element: HTMLElement) {\r\n const index = listeners.findIndex((listener) => listener.element === element);\r\n if (index !== -1) {\r\n const listener = listeners.splice(index, 1)[0];\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n}\r\n\r\nexport { codeListener, removeListener };\r\n","import { codeListener } from \"./core/code-listener\";\r\n\r\nchrome.storage.sync.get([\"moodleGPT\"]).then(function (storage) {\r\n const config = storage.moodleGPT;\r\n\r\n if (!config) throw new Error(\"Please configure MoodleGPT into the extension\");\r\n\r\n codeListener(config);\r\n});\r\n"],"names":[],"mappings":";;;;;EAAA;;;EAGG;EACH,SAAS,gBAAgB,CAAC,IAAY,EAAA;EACpC,IAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC;EACjC,IAAA,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC;EACtB,IAAA,UAAU,CAAC,OAAO,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;EACvD;;ECRA;EACA;AACA;EACA;EACA;AACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAoGA;EACO,SAAS,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE;EAC7D,IAAI,SAAS,KAAK,CAAC,KAAK,EAAE,EAAE,OAAO,KAAK,YAAY,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,UAAU,OAAO,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;EAChH,IAAI,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,EAAE,UAAU,OAAO,EAAE,MAAM,EAAE;EAC/D,QAAQ,SAAS,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;EACnG,QAAQ,SAAS,QAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;EACtG,QAAQ,SAAS,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,EAAE;EACtH,QAAQ,IAAI,CAAC,CAAC,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;EAC9E,KAAK,CAAC,CAAC;EACP;;ECzHA,MAAM,IAAI,CAAA;MACR,OAAO,QAAQ,CAAC,IAAY,EAAA;UAC1B,MAAM,GAAG,GAAG,aAAa,CAAC;UAC1B,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;OAC5C;EAED,IAAA,OAAO,WAAW,CAAC,IAAY,EAAE,MAAe,EAAA;EAC9C,QAAA,MAAM,GAAG,GAAG,SAAS,IAAI,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC,CAAC;UACnD,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;OAC5C;MAED,OAAO,KAAK,CAAC,GAAc,EAAA;EACzB,QAAA,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;OACjC;MAED,OAAO,QAAQ,CAAC,SAAoB,EAAA;UAClC,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;UAChD,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,SAAS,CAAC,kBAAkB,CAAC,CAAC;OAC7D;EACF;;ECpBD;;;EAGG;EACH,SAAS,aAAa,CAAC,IAAY,EAAA;EACjC,IAAA,OAAO,IAAI;EACR,SAAA,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;EACtB,SAAA,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC;EAC5B,SAAA,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;EACxB,SAAA,WAAW,EAAE;EACb,SAAA,IAAI,EAAE;EACN,SAAA,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC;EAC7B,SAAA,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;EACtC;;ECTA;;;;;EAKG;EACH,SAAe,kBAAkB,CAC/B,MAAc,EACd,QAAgB,EAAA;;EAEhB,QAAA,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;EACzC,QAAA,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;EACrE,QAAA,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,4CAA4C,EAAE;EACpE,YAAA,MAAM,EAAE,MAAM;EACd,YAAA,OAAO,EAAE;EACP,gBAAA,cAAc,EAAE,kBAAkB;EAClC,gBAAA,aAAa,EAAE,CAAA,OAAA,EAAU,MAAM,CAAC,MAAM,CAAE,CAAA;EACzC,aAAA;EACD,YAAA,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,UAAU,CAAC,MAAM,GAAG,IAAI;EACjD,YAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;kBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;kBACnB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;EAC/C,gBAAA,WAAW,EAAE,GAAG;EAChB,gBAAA,KAAK,EAAE,GAAG;EACV,gBAAA,gBAAgB,EAAE,GAAG;EACrB,gBAAA,IAAI,EAAE,IAAI;eACX,CAAC;EACH,SAAA,CAAC,CAAC;UACH,YAAY,CAAC,gBAAgB,CAAC,CAAC;EAC/B,QAAA,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;EAC7B,QAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;UAChD,OAAO;cACL,QAAQ;EACR,YAAA,kBAAkB,EAAE,aAAa,CAAC,QAAQ,CAAC;WAC5C,CAAC;OACH,CAAA,CAAA;EAAA;;ECvCD;;;;EAIG;EACH,SAAS,iBAAiB,CAAC,KAAuB,EAAA;MAChD,MAAM,GAAG,GAAe,EAAE,CAAC;EAC3B,IAAA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;MACvD,MAAM,gBAAgB,GAAa,EAAE,CAAC;EACtC,IAAA,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;EACjB,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;UAC1D,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;;cAC7C,MAAM,OAAO,GAAG,CAAA,EAAA,GAAA,IAAI,CAAC,WAAW,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,IAAI,EAAE,CAAC;cACzC,gBAAgB,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAChC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,EAC5B,OAAO,CAAC,MAAM,IAAI,CAAC,CACpB,CAAC;EACF,YAAA,OAAO,OAAO,CAAC;EACjB,SAAC,CAAC,CAAC;EACH,QAAA,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;EACzB,KAAC,CAAC,CAAC;EAEH,IAAA,MAAM,kBAAkB,GACtB,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;MACnE,MAAM,cAAc,GAClB,IAAI,GAAG,KAAK,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;MAE7D,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;UACjC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,KACzC,OAAO,CAAC,MAAM,CACZ,gBAAgB,CAAC,KAAK,CAAC,EACvB,QAAQ,+BACT,CACF,CAAC;UACF,OAAO,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;EAC9C,KAAC,CAAC,CAAC;EACH,IAAA,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;MAC/B,OAAO,IAAI,GAAG,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;EACtD;;EClCA;;;;;EAKG;EACH,SAAS,cAAc,CAAC,MAAc,EAAE,iBAA8B,EAAA;EACpE,IAAA,IAAI,QAAQ,GAAG,iBAAiB,CAAC,SAAS,CAAC;;MAG3C,MAAM,MAAM,GACV,iBAAiB,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;EACrD,IAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;EAC1B,QAAA,QAAQ,GAAG,QAAQ,CAAC,OAAO,CACzB,KAAK,CAAC,SAAS,EACf,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC,GAAG,IAAI,CACvC,CAAC;EACH,KAAA;EAED,IAAA,MAAM,aAAa,GAAG,CAAA;QAChB,QAAQ,CAAA;sJACsI,CAAC;EACrJ,IAAA,OAAO,aAAa,CAAC,aAAa,CAAC,CAAC;EACtC;;ECtBA;;;;;EAKG;EACH,SAAS,sBAAsB,CAC7B,MAAc,EACd,SAAkC,EAClC,SAAoB,EAAA;MAEpB,MAAM,KAAK,GAAG,SAAS,KAAT,IAAA,IAAA,SAAS,uBAAT,SAAS,CAAG,CAAC,CAAqB,CAAC;EAEjD,IAAA,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;EACjE,QAAA,OAAO,KAAK,CAAC;EAEf,IAAA,KAAK,MAAM,KAAK,IAAI,SAAyC,EAAE;UAC7D,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;UAC5D,MAAM,MAAM,GAAG,SAAS,CAAC,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;UAC9D,IAAI,MAAM,CAAC,IAAI;EAAE,YAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EACnD,QAAA,IAAI,MAAM,EAAE;cACV,IAAI,MAAM,CAAC,SAAS,EAAE;EACpB,gBAAA,KAAK,CAAC,gBAAgB,CAAC,WAAW,EAAE,OAAO,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE;EAChE,oBAAA,IAAI,EAAE,IAAI;EACX,iBAAA,CAAC,CAAC;EACJ,aAAA;EAAM,iBAAA;EACL,gBAAA,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;EACtB,aAAA;EACF,SAAA;EACF,KAAA;EACD,IAAA,OAAO,IAAI,CAAC;EACd;;EC/BA;;;;;;EAMG;EACH,SAAS,YAAY,CACnB,MAAc,EACd,SAAkC,EAClC,SAAoB,EAAA;EAEpB,IAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ;EAAE,QAAA,OAAO,KAAK,CAAC;MAE9E,IAAI,OAAO,GAAG,SAAS,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;EACvD,IAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM;UAC7D,OAAO,GAAG,SAAS,CAAC,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;MAEpD,IAAI,MAAM,CAAC,IAAI;EAAE,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;EAErC,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;UACzC,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;EAExD,QAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;cAC5B,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;cAClD,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;;cAG5C,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE;EAC7B,gBAAA,MAAM,OAAO,GAAG,aAAa,CAC1B,MAAM,CAAC,UAA0B;uBAC/B,OAAO,CAAC,IAAI,CAAC;EACb,qBAAA,aAAa,CAAC,OAAO,CAAC,CAAC,WAAW,CACtC,CAAC;kBACF,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,KAAI;sBACpC,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;sBACnC,IAAI,MAAM,CAAC,IAAI;EAAE,wBAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EACnD,oBAAA,OAAO,MAAM,CAAC;EAChB,iBAAC,CAAC,CAAC;EACH,gBAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;sBAChB,IAAI,MAAM,CAAC,SAAS,EAAE;EACpB,wBAAA,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,gBAAgB,CACnD,OAAO,EACP,YAAA;8BACE,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,UAAiB,CAAC;EAClD,yBAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;EACH,qBAAA;EAAM,yBAAA;0BACL,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,UAAiB,CAAC;EACjD,qBAAA;sBACD,MAAM;EACP,iBAAA;EACF,aAAA;;cAGD,IAAI,MAAM,CAAC,IAAI;EAAE,gBAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EAEnD,YAAA,IAAI,MAAM,EAAE;kBACV,IAAI,MAAM,CAAC,SAAS,EAAE;sBACpB,MAAM;2BACH,OAAO,CAAC,QAAQ,CAAC;EACjB,yBAAA,gBAAgB,CAAC,OAAO,EAAE,OAAO,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE;EACzD,wBAAA,IAAI,EAAE,IAAI;EACX,qBAAA,CAAC,CAAC;EACN,iBAAA;EAAM,qBAAA;EACL,oBAAA,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;EACxB,iBAAA;kBACD,MAAM;EACP,aAAA;EACF,SAAA;EACF,KAAA;EAED,IAAA,OAAO,IAAI,CAAC;EACd;;EC5EA;;;;;;EAMG;EACH,SAAS,aAAa,CACpB,MAAc,EACd,SAAkC,EAClC,SAAoB,EAAA;EAEpB,IAAA,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAA2C,CAAC;EAErE,IAAA,IACE,SAAS,CAAC,MAAM,KAAK,CAAC;WACrB,KAAK,CAAC,OAAO,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;EAEvD,QAAA,OAAO,KAAK,CAAC;MAEf,IAAI,MAAM,CAAC,MAAM,EAAE;UACjB,IAAI,KAAK,GAAG,CAAC,CAAC;EACd,QAAA,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,KAAoB,EAAA;EAC9D,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW;kBAAE,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;EACrE,YAAA,IAAI,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM;kBAAE,OAAO;cAC9C,KAAK,CAAC,cAAc,EAAE,CAAC;EACvB,YAAA,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;EACrD,SAAC,CAAC,CAAC;EACJ,KAAA;EAAM,SAAA;EACL,QAAA,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC;EAClC,KAAA;EAED,IAAA,OAAO,IAAI,CAAC;EACd;;EChCA;;;;EAIG;EACH,SAAS,eAAe,CAAC,MAAc,EAAE,SAAoB,EAAA;MAC3D,IAAI,MAAM,CAAC,KAAK;UAAE,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;MAC1D,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;EACpD;;ECTA;;;;;;EAMG;EACH,SAAS,YAAY,CACnB,MAAc,EACd,SAAkC,EAClC,SAAoB,EAAA;;EAEpB,IAAA,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAA2C,CAAC;MAErE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;EAAE,QAAA,OAAO,KAAK,CAAC;EAEpE,IAAA,MAAM,MAAM,GAAG,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,SAAS,CAAC,kBAAkB;EACxC,SAAA,KAAK,CAAC,kBAAkB,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAG,CAAC,CAAC,MAC7B,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;EAEtB,IAAA,IAAI,CAAC,MAAM;EAAE,QAAA,OAAO,KAAK,CAAC;MAE1B,IAAI,MAAM,CAAC,MAAM,EAAE;UACjB,IAAI,KAAK,GAAG,CAAC,CAAC;EACd,QAAA,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,KAAoB,EAAA;EAC9D,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW;EAAE,gBAAA,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;EACzD,YAAA,IAAI,KAAK,GAAG,MAAM,CAAC,MAAM;kBAAE,OAAO;cAClC,KAAK,CAAC,cAAc,EAAE,CAAC;cACvB,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG;EAAE,gBAAA,EAAE,KAAK,CAAC;EACpD,YAAA,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;EACzC,SAAC,CAAC,CAAC;EACJ,KAAA;EAAM,SAAA;EACL,QAAA,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;EACtB,KAAA;EAED,IAAA,OAAO,IAAI,CAAC;EACd;;ECpCA;;;;;;EAMG;EACH,SAAS,qBAAqB,CAC5B,MAAc,EACd,SAAkC,EAClC,SAAoB,EAAA;EAEpB,IAAA,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;EAE3B,IAAA,IACE,SAAS,CAAC,MAAM,KAAK,CAAC;EACtB,QAAA,KAAK,CAAC,YAAY,CAAC,iBAAiB,CAAC,KAAK,MAAM;EAEhD,QAAA,OAAO,KAAK,CAAC;MAEf,IAAI,MAAM,CAAC,MAAM,EAAE;UACjB,IAAI,KAAK,GAAG,CAAC,CAAC;EACd,QAAA,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,KAAoB,EAAA;EAC9D,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW;kBAAE,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;EACrE,YAAA,IAAI,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM;kBAAE,OAAO;cAC9C,KAAK,CAAC,cAAc,EAAE,CAAC;EACvB,YAAA,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;;cAGzD,KAAK,CAAC,KAAK,EAAE,CAAC;EACd,YAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;EACrC,YAAA,KAAK,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;EAChC,YAAA,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;EACtB,YAAA,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;cACxC,SAAS,CAAC,eAAe,EAAE,CAAC;EAC5B,YAAA,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;EAC5B,SAAC,CAAC,CAAC;EACJ,KAAA;EAAM,SAAA;EACL,QAAA,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC,QAAQ,CAAC;EACxC,KAAA;EAED,IAAA,OAAO,IAAI,CAAC;EACd;;ECjCA;;;;;;;EAOG;EACH,SAAe,KAAK,CAClB,MAAc,EACd,YAAyB,EACzB,IAAiB,EACjB,KAAa,EAAA;;UAEb,IAAI,MAAM,CAAC,MAAM;EAAE,YAAA,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;UAEtD,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;UAC9C,MAAM,SAAS,GAA4B,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;EAExE,QAAA,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,CAChE,CAAC,KAAK,MAAM;cACV,KAAK;EACN,SAAA,CAAC,CACH,CAAC;UAEF,MAAM,SAAS,GAAG,OAAO,SAAS,KAAK,QAAQ,IAAI,OAAO,IAAI,SAAS,CAAC;UAExE,IAAI,MAAM,CAAC,MAAM;cACf,YAAY,CAAC,KAAK,CAAC,MAAM;EACvB,gBAAA,MAAM,CAAC,QAAQ,IAAI,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;EAEzD,QAAA,IAAI,SAAS,EAAE;EACb,YAAA,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;cAC/B,OAAO;EACR,SAAA;UAED,IAAI,MAAM,CAAC,IAAI,EAAE;EACf,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;EACxB,YAAA,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;EAC1B,SAAA;;EAGD,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE;cAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ;kBAAE,cAAc,CAAC,YAAY,CAAC,CAAC;EACnD,YAAA,OAAO,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;EAC3C,SAAA;;EAGD,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,oBAAoB,EAAE;cACxC,cAAc,CAAC,YAAY,CAAC,CAAC;EAE7B,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC;cACxC,MAAM,iBAAiB,GAAG,IAAI,CAAC,aAAa,CAAc,QAAQ,CAAC,CAAC;EAEpE,YAAA,iBAAiB,CAAC,WAAW,GAAG,SAAS,CAAC,QAAQ,CAAC;EACnD,YAAA,iBAAiB,CAAC,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;EAEhD,YAAA,iBAAiB,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAA;EAC1C,gBAAA,MAAM,aAAa,GAAG,iBAAiB,CAAC,WAAW,KAAK,cAAc,CAAC;EACvE,gBAAA,iBAAiB,CAAC,KAAK,CAAC,UAAU,GAAG,aAAa,GAAG,UAAU,GAAG,IAAI,CAAC;kBACvE,iBAAiB,CAAC,WAAW,GAAG,aAAa;wBACzC,SAAS,CAAC,QAAQ;wBAClB,cAAc,CAAC;EACrB,aAAC,CAAC,CAAC;cACH,OAAO;EACR,SAAA;;UAGD,IAAI,CAAC,MAAM,CAAC,QAAQ;cAAE,cAAc,CAAC,YAAY,CAAC,CAAC;EAEnD,QAAA,MAAM,QAAQ,GAAG;cACf,qBAAqB;cACrB,aAAa;cACb,YAAY;cACZ,YAAY;cACZ,sBAAsB;WACvB,CAAC;EAEF,QAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;EAC9B,YAAA,IAAI,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC;kBAAE,OAAO;EACnD,SAAA;;EAGD,QAAA,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;OACpC,CAAA,CAAA;EAAA;;EC5FD,MAAM,WAAW,GAAa,EAAE,CAAC;EACjC,MAAM,SAAS,GAGT,EAAE,CAAC;EAET;;;EAGG;EACH,SAAS,YAAY,CAAC,MAAc,EAAA;MAClC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,KAAK,EAAA;EACvD,QAAA,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;UAC5B,IAAI,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM;cAAE,WAAW,CAAC,KAAK,EAAE,CAAC;UACjE,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,IAAI,EAAE;EACxC,YAAA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;cACvB,cAAc,CAAC,MAAM,CAAC,CAAC;EACxB,SAAA;EACH,KAAC,CAAC,CAAC;EACL,CAAC;EAED;;;;EAIG;EACH,SAAS,cAAc,CAAC,MAAc,EAAA;;EAEpC,IAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;EACxB,QAAA,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;cAChC,IAAI,MAAM,CAAC,MAAM;kBAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;cAC7D,QAAQ,CAAC,OAAO,CAAC,mBAAmB,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;EAC5D,SAAA;UACD,IAAI,MAAM,CAAC,KAAK;cAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;EAC9C,QAAA,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;UACrB,OAAO;EACR,KAAA;;MAGD,MAAM,UAAU,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC;WACvD,GAAG,CAAC,CAAC,CAAC,KAAK,CAAA,YAAA,EAAe,CAAC,CAAA,EAAA,CAAI,CAAC;WAChC,IAAI,CAAC,GAAG,CAAC,CAAC;EACb,IAAA,MAAM,KAAK,GAAG,UAAU,GAAG,uCAAuC,CAAC;MACnE,MAAM,KAAK,GAAG,QAAQ,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;EAExD,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;UACxB,MAAM,YAAY,GAAgB,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;UAE/D,IAAI,MAAM,CAAC,MAAM;EAAE,YAAA,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;EAEzD,QAAA,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAClC,IAAI,EACJ,MAAM,EACN,YAAY,EACZ,IAAI,EACJ,KAAK,CACN,CAAC;EACF,QAAA,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,iBAAiB,EAAE,CAAC,CAAC;EACjE,QAAA,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;EAC3D,KAAA;MAED,IAAI,MAAM,CAAC,KAAK;UAAE,gBAAgB,CAAC,UAAU,CAAC,CAAC;EACjD,CAAC;EAED;;;EAGG;EACH,SAAS,cAAc,CAAC,OAAoB,EAAA;EAC1C,IAAA,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;EAC9E,IAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;EAChB,QAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;UAC/C,QAAQ,CAAC,OAAO,CAAC,mBAAmB,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;EAC5D,KAAA;EACH;;EC5EA,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,OAAO,EAAA;EAC3D,IAAA,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;EAEjC,IAAA,IAAI,CAAC,MAAM;EAAE,QAAA,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;MAE9E,YAAY,CAAC,MAAM,CAAC,CAAC;EACvB,CAAC,CAAC;;;;;;","x_google_ignoreList":[1]} \ No newline at end of file +{"version":3,"file":"MoodleGPT.js","sources":["../src/utils/title-indications.ts","../node_modules/tslib/tslib.es6.js","../src/utils/logs.ts","../src/utils/normalize-text.ts","../src/core/get-response.ts","../src/utils/html-table-to-string.ts","../src/core/create-question.ts","../src/core/questions/radio-checkbox.ts","../src/core/questions/select.ts","../src/core/questions/textbox.ts","../src/core/questions/clipboard.ts","../src/core/questions/number.ts","../src/core/questions/contenteditable.ts","../src/core/reply.ts","../src/core/code-listener.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Show some informations into the document title and remove it after 3000ms\r\n * @param text\r\n */\r\nfunction titleIndications(text: string) {\r\n const backTitle = document.title;\r\n document.title = text;\r\n setTimeout(() => (document.title = backTitle), 3000);\r\n}\r\n\r\nexport default titleIndications;\r\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.push(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.push(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","import GPTAnswer from \"../types/gptAnswer\";\r\nclass Logs {\r\n static question(text: string) {\r\n const css = \"color: cyan\";\r\n console.log(\"%c[QUESTION]: %s\", css, text);\r\n }\r\n\r\n static responseTry(text: string, valide: boolean) {\r\n const css = \"color: \" + (valide ? \"green\" : \"red\");\r\n console.log(\"%c[CHECKING]: %s\", css, text);\r\n }\r\n\r\n static array(arr: unknown[]) {\r\n console.log(\"[CORRECTS] \", arr);\r\n }\r\n\r\n static response(gptAnswer: GPTAnswer) {\r\n console.log(\"Original:\\n\" + gptAnswer.response);\r\n console.log(\"Normalized:\\n\" + gptAnswer.normalizedResponse);\r\n }\r\n}\r\n\r\nexport default Logs;\r\n","/**\r\n * Normlize text\r\n * @param text\r\n */\r\nfunction normalizeText(text: string, toLowerCase: boolean = true) {\r\n let normalizedText = text\r\n .replace(/\\n+/gi, \"\\n\") //remove duplicate new lines\r\n .replace(/(\\n\\s*\\n)+/g, \"\\n\") //remove useless white sapce from textcontent\r\n .replace(/[ \\t]+/gi, \" \"); //replace multiples space or tabs by a space\r\n\r\n if (toLowerCase) normalizedText = normalizedText.toLowerCase();\r\n\r\n return (\r\n normalizedText\r\n .trim()\r\n /* We remove that because sometimes ChatGPT will reply: \"answer d\" */\r\n .replace(/^[a-z\\d]\\.\\s/gi, \"\") //a. text, b. text, c. text, 1. text, 2. text, 3.text\r\n .replace(/\\n[a-z\\d]\\.\\s/gi, \"\\n\") //same but with new line\r\n );\r\n}\r\n\r\nexport default normalizeText;\r\n","import Config from \"../types/config\";\r\nimport GPTAnswer from \"../types/gptAnswer\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\n\r\n/**\r\n * Get the response from chatGPT api\r\n * @param config\r\n * @param question\r\n * @returns\r\n */\r\nasync function getChatGPTResponse(\r\n config: Config,\r\n question: string\r\n): Promise {\r\n const controller = new AbortController();\r\n const timeoutControler = setTimeout(() => controller.abort(), 15000);\r\n const req = await fetch(\"https://api.openai.com/v1/chat/completions\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${config.apiKey}`,\r\n },\r\n signal: config.timeout ? controller.signal : null,\r\n body: JSON.stringify({\r\n model: config.model,\r\n messages: [\r\n {\r\n role: \"system\",\r\n content: `\r\nFollow those rules:\r\n- Sometimes there won't be a question, so just answer the statement as you normally would without following the other rules and give the most detailled and complete answer with explication.\r\n- Your goal is to understand the statement and to reply to each question by giving only the answer.\r\n- You will keep the same order for the answers as the questions event if it's a put in order question.\r\n- You will separate all the answer with new lines and only show the correctes one.\r\n- You should answer in the same order as it is ine the question even if it's a put in order question.\r\n- You will omit the question or any other text/information we just want the correct answer.\r\n- You should only give exactly the same text as the question for each answer.\r\n- The question always have the good answer so you should always give an answer to the question.\r\n- You will always respond in the same langage as the user question.`,\r\n },\r\n { role: \"user\", content: question },\r\n ],\r\n temperature: 0.8,\r\n top_p: 1.0,\r\n presence_penalty: 1.0,\r\n stop: null,\r\n }),\r\n });\r\n clearTimeout(timeoutControler);\r\n const rep = await req.json();\r\n const response = rep.choices[0].message.content;\r\n return {\r\n response,\r\n normalizedResponse: normalizeText(response),\r\n };\r\n}\r\n\r\nexport default getChatGPTResponse;\r\n","/**\r\n * Convert table to representating string table\r\n * @param table\r\n * @returns\r\n */\r\nfunction htmlTableToString(table: HTMLTableElement) {\r\n const tab: string[][] = [];\r\n const lines = Array.from(table.querySelectorAll(\"tr\"));\r\n const maxColumnsLength: number[] = [];\r\n lines.map((line) => {\r\n const cells = Array.from(line.querySelectorAll(\"td, th\"));\r\n const cellsContent = cells.map((cell, index) => {\r\n const content = cell.textContent?.trim();\r\n maxColumnsLength[index] = Math.max(\r\n maxColumnsLength[index] || 0,\r\n content.length || 0\r\n );\r\n return content;\r\n });\r\n tab.push(cellsContent);\r\n });\r\n\r\n const lineSeparationSize =\r\n maxColumnsLength.reduce((a, b) => a + b) + tab[0].length * 3 + 1;\r\n const lineSeparation =\r\n \"\\n\" + Array(lineSeparationSize).fill(\"-\").join(\"\") + \"\\n\";\r\n\r\n const mappedTab = tab.map((line) => {\r\n const mappedLine = line.map((content, index) =>\r\n content.padEnd(\r\n maxColumnsLength[index],\r\n \"\\u00A0\" /* For no matching with \\s */\r\n )\r\n );\r\n return \"| \" + mappedLine.join(\" | \") + \" |\";\r\n });\r\n const head = mappedTab.shift();\r\n return head + lineSeparation + mappedTab.join(\"\\n\");\r\n}\r\n\r\nexport default htmlTableToString;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\nimport htmlTableToString from \"../utils/html-table-to-string\";\r\n\r\n/**\r\n * Normalize the question and add sub informations\r\n * @param langage\r\n * @param question\r\n * @returns\r\n */\r\nfunction createQuestion(config: Config, questionContainer: HTMLElement) {\r\n let question = questionContainer.innerText;\r\n\r\n /* We remove unnecessary information */\r\n const accesshideElements: NodeListOf =\r\n questionContainer.querySelectorAll(\".accesshide\");\r\n for (const useless of accesshideElements) {\r\n question = question.replace(useless.innerText, \"\");\r\n }\r\n\r\n /* Make tables more readable for chat-gpt */\r\n const tables: NodeListOf =\r\n questionContainer.querySelectorAll(\".qtext table\");\r\n for (const table of tables) {\r\n question = question.replace(\r\n table.innerText,\r\n \"\\n\" + htmlTableToString(table) + \"\\n\"\r\n );\r\n }\r\n\r\n return normalizeText(question, false);\r\n}\r\n\r\nexport default createQuestion;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle checkbox and input elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n */\r\nfunction handleRadioAndCheckbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList?.[0] as HTMLInputElement;\r\n\r\n if (!input || (input.type !== \"checkbox\" && input.type !== \"radio\"))\r\n return false;\r\n\r\n for (const input of inputList as NodeListOf) {\r\n const content = normalizeText(input.parentNode.textContent);\r\n const valide = gptAnswer.normalizedResponse.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n if (valide) {\r\n if (config.mouseover) {\r\n input.addEventListener(\"mouseover\", () => (input.checked = true), {\r\n once: true,\r\n });\r\n } else {\r\n input.checked = true;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport default handleRadioAndCheckbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle select elements (and put in order select)\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleSelect(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n if (inputList.length === 0 || inputList[0].tagName !== \"SELECT\") return false;\r\n\r\n let correct = gptAnswer.normalizedResponse.split(\"\\n\");\r\n\r\n if (config.logs) Logs.array(correct);\r\n\r\n /**\r\n * Sometimes ChatGPT give the question so we should remove them\r\n * Example:\r\n * 5*5\r\n * 25\r\n * 10+10\r\n * 20\r\n * 20-10\r\n * 10\r\n *\r\n * And we only want to keep answers\r\n * 25\r\n * 20\r\n * 10\r\n */\r\n if (correct.length === inputList.length * 2) {\r\n correct = correct.filter((answer, index) => index % 2 === 1);\r\n }\r\n\r\n for (let j = 0; j < inputList.length; ++j) {\r\n const options = inputList[j].querySelectorAll(\"option\");\r\n\r\n for (const option of options) {\r\n const content = normalizeText(option.textContent);\r\n const valide = correct[j].includes(content);\r\n\r\n /* Handle put in order question */\r\n if (!isNaN(parseInt(content))) {\r\n const content = normalizeText(\r\n (option.parentNode as HTMLElement)\r\n .closest(\"tr\")\r\n .querySelector(\".text\").textContent\r\n );\r\n const index = correct.findIndex((c) => {\r\n const valide = c.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n return valide;\r\n });\r\n if (index !== -1) {\r\n if (config.mouseover) {\r\n options[index + 1].closest(\"select\").addEventListener(\r\n \"click\",\r\n function () {\r\n options[index + 1].selected = \"selected\" as any;\r\n },\r\n { once: true }\r\n );\r\n } else {\r\n options[index + 1].selected = \"selected\" as any;\r\n }\r\n break;\r\n }\r\n }\r\n /* End */\r\n\r\n if (config.logs) Logs.responseTry(content, valide);\r\n\r\n if (valide) {\r\n if (config.mouseover) {\r\n option\r\n .closest(\"select\")\r\n .addEventListener(\"click\", () => (option.selected = true), {\r\n once: true,\r\n });\r\n } else {\r\n option.selected = true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleSelect;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle textbox\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleTextbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n (input.tagName !== \"TEXTAREA\" && input.type !== \"text\")\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.value = gptAnswer.response.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleTextbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport titleIndications from \"../../utils/title-indications\";\r\n\r\n/**\r\n * Copy the response in the clipboard if we can automaticaly fill the question\r\n * @param config\r\n * @param gptAnswer\r\n */\r\nfunction handleClipboard(config: Config, gptAnswer: GPTAnswer) {\r\n if (config.title) titleIndications(\"Copied to clipboard\");\r\n navigator.clipboard.writeText(gptAnswer.response);\r\n}\r\n\r\nexport default handleClipboard;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle number input\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleNumber(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (inputList.length !== 1 || input.type !== \"number\") return false;\r\n\r\n const number = gptAnswer.normalizedResponse\r\n .match(/\\d+([,\\.]\\d+)?/gi)?.[0]\r\n ?.replace(\",\", \".\");\r\n\r\n if (!number) return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = number.length + 1;\r\n if (index > number.length) return;\r\n event.preventDefault();\r\n if (number.slice(index, index + 1) === \".\") ++index;\r\n input.value = number.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = number;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleNumber;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Hanlde contenteditable elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleContentEditable(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0];\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n input.getAttribute(\"contenteditable\") !== \"true\"\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.textContent = gptAnswer.response.slice(0, ++index);\r\n\r\n /* Put the cursor at the end of the typed text */\r\n input.focus();\r\n const range = document.createRange();\r\n range.selectNodeContents(input);\r\n range.collapse(false);\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n });\r\n } else {\r\n input.textContent = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleContentEditable;\r\n","import Config from \"../types/config\";\r\nimport Logs from \"../utils/logs\";\r\nimport getChatGPTResponse from \"./get-response\";\r\nimport createQuestion from \"./create-question\";\r\nimport handleRadioAndCheckbox from \"./questions/radio-checkbox\";\r\nimport handleSelect from \"./questions/select\";\r\nimport handleTextbox from \"./questions/textbox\";\r\nimport handleClipboard from \"./questions/clipboard\";\r\nimport handleNumber from \"./questions/number\";\r\nimport handleContentEditable from \"./questions/contenteditable\";\r\nimport { removeListener } from \"./code-listener\";\r\n\r\n/**\r\n * Reply to the question\r\n * @param config\r\n * @param hiddenButton\r\n * @param form\r\n * @param query\r\n * @returns\r\n */\r\nasync function reply(\r\n config: Config,\r\n hiddenButton: HTMLElement,\r\n form: HTMLElement,\r\n query: string\r\n) {\r\n if (config.cursor) hiddenButton.style.cursor = \"wait\";\r\n\r\n const question = createQuestion(config, form);\r\n const inputList: NodeListOf = form.querySelectorAll(query);\r\n\r\n const gptAnswer = await getChatGPTResponse(config, question).catch(\r\n (error) => ({\r\n error,\r\n })\r\n );\r\n\r\n const haveError = typeof gptAnswer === \"object\" && \"error\" in gptAnswer;\r\n\r\n if (config.cursor)\r\n hiddenButton.style.cursor =\r\n config.infinite || haveError ? \"pointer\" : \"initial\";\r\n\r\n if (haveError) {\r\n console.error(gptAnswer.error);\r\n return;\r\n }\r\n\r\n if (config.logs) {\r\n Logs.question(question);\r\n Logs.response(gptAnswer);\r\n }\r\n\r\n /* Handle clipboard mode */\r\n if (config.mode === \"clipboard\") {\r\n if (!config.infinite) removeListener(hiddenButton);\r\n return handleClipboard(config, gptAnswer);\r\n }\r\n\r\n /* Handle question to answer mode */\r\n if (config.mode === \"question-to-answer\") {\r\n removeListener(hiddenButton);\r\n\r\n const questionBackup = form.textContent;\r\n const questionContainer = form.querySelector(\".qtext\");\r\n\r\n questionContainer.textContent = gptAnswer.response;\r\n questionContainer.style.whiteSpace = \"pre-wrap\";\r\n\r\n questionContainer.addEventListener(\"click\", function () {\r\n const isNotResponse = questionContainer.textContent === questionBackup;\r\n questionContainer.style.whiteSpace = isNotResponse ? \"pre-wrap\" : null;\r\n questionContainer.textContent = isNotResponse\r\n ? gptAnswer.response\r\n : questionBackup;\r\n });\r\n return;\r\n }\r\n\r\n /* Better then set once on the event because if there is an error the user can click an other time on the question */\r\n if (!config.infinite) removeListener(hiddenButton);\r\n\r\n const handlers = [\r\n handleContentEditable,\r\n handleTextbox,\r\n handleNumber,\r\n handleSelect,\r\n handleRadioAndCheckbox,\r\n ];\r\n\r\n for (const handler of handlers) {\r\n if (handler(config, inputList, gptAnswer)) return;\r\n }\r\n\r\n /* In the case we can't auto complete the question */\r\n handleClipboard(config, gptAnswer);\r\n}\r\n\r\nexport default reply;\r\n","import Config from \"../types/config\";\r\nimport titleIndications from \"../utils/title-indications\";\r\nimport reply from \"./reply\";\r\n\r\nconst pressedKeys: string[] = [];\r\nconst listeners: {\r\n element: HTMLElement;\r\n fn: (this: HTMLElement, ev: MouseEvent) => any;\r\n}[] = [];\r\n\r\n/**\r\n * Create a listener on the keyboard to inject the code\r\n * @param config\r\n */\r\nfunction codeListener(config: Config) {\r\n document.body.addEventListener(\"keydown\", function (event) {\r\n pressedKeys.push(event.key);\r\n if (pressedKeys.length > config.code.length) pressedKeys.shift();\r\n if (pressedKeys.join(\"\") === config.code) {\r\n pressedKeys.length = 0;\r\n setUpMoodleGpt(config);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Setup moodleGPT into the page (remove/injection)\r\n * @param config\r\n * @returns\r\n */\r\nfunction setUpMoodleGpt(config: Config) {\r\n /* Removing events */\r\n if (listeners.length > 0) {\r\n for (const listener of listeners) {\r\n if (config.cursor) listener.element.style.cursor = \"initial\";\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n if (config.title) titleIndications(\"Removed\");\r\n listeners.length = 0;\r\n return;\r\n }\r\n\r\n /* Code injection */\r\n const inputQuery = [\"checkbox\", \"radio\", \"text\", \"number\"]\r\n .map((e) => `input[type=\"${e}\"]`)\r\n .join(\",\");\r\n const query = inputQuery + \", textarea, select, [contenteditable]\";\r\n const forms = document.querySelectorAll(\".formulation\");\r\n\r\n for (const form of forms) {\r\n const hiddenButton: HTMLElement = form.querySelector(\".qtext\");\r\n\r\n if (config.cursor) hiddenButton.style.cursor = \"pointer\";\r\n\r\n const injectionFunction = reply.bind(\r\n null,\r\n config,\r\n hiddenButton,\r\n form,\r\n query\r\n );\r\n listeners.push({ element: hiddenButton, fn: injectionFunction });\r\n hiddenButton.addEventListener(\"click\", injectionFunction);\r\n }\r\n\r\n if (config.title) titleIndications(\"Injected\");\r\n}\r\n\r\n/**\r\n * Remove the event listener on a specific question\r\n * @param element\r\n */\r\nfunction removeListener(element: HTMLElement) {\r\n const index = listeners.findIndex((listener) => listener.element === element);\r\n if (index !== -1) {\r\n const listener = listeners.splice(index, 1)[0];\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n}\r\n\r\nexport { codeListener, removeListener };\r\n","import { codeListener } from \"./core/code-listener\";\r\n\r\nchrome.storage.sync.get([\"moodleGPT\"]).then(function (storage) {\r\n const config = storage.moodleGPT;\r\n\r\n if (!config) throw new Error(\"Please configure MoodleGPT into the extension\");\r\n\r\n codeListener(config);\r\n});\r\n"],"names":[],"mappings":"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","x_google_ignoreList":[1]} \ No newline at end of file diff --git a/src/core/create-question.ts b/src/core/create-question.ts index c1188c1..d94abf0 100644 --- a/src/core/create-question.ts +++ b/src/core/create-question.ts @@ -9,7 +9,14 @@ import htmlTableToString from "../utils/html-table-to-string"; * @returns */ function createQuestion(config: Config, questionContainer: HTMLElement) { - let question = questionContainer.innerText; //TODO: textContent better for reply ?? + let question = questionContainer.innerText; + + /* We remove unnecessary information */ + const accesshideElements: NodeListOf = + questionContainer.querySelectorAll(".accesshide"); + for (const useless of accesshideElements) { + question = question.replace(useless.innerText, ""); + } /* Make tables more readable for chat-gpt */ const tables: NodeListOf = @@ -21,10 +28,7 @@ function createQuestion(config: Config, questionContainer: HTMLElement) { ); } - const finalQuestion = `Give a short response as possible for this question, reply in the following question langage and only show the result: - ${question} - (If you have to choose between multiple results only show the corrects one, separate them with new line and take the same text as the question)`; - return normalizeText(finalQuestion); + return normalizeText(question, false); } export default createQuestion; diff --git a/src/core/get-response.ts b/src/core/get-response.ts index 4569954..9d844d9 100644 --- a/src/core/get-response.ts +++ b/src/core/get-response.ts @@ -23,7 +23,23 @@ async function getChatGPTResponse( signal: config.timeout ? controller.signal : null, body: JSON.stringify({ model: config.model, - messages: [{ role: "user", content: question }], + messages: [ + { + role: "system", + content: ` +Follow those rules: +- Sometimes there won't be a question, so just answer the statement as you normally would without following the other rules and give the most detailled and complete answer with explication. +- Your goal is to understand the statement and to reply to each question by giving only the answer. +- You will keep the same order for the answers as the questions event if it's a put in order question. +- You will separate all the answer with new lines and only show the correctes one. +- You should answer in the same order as it is ine the question even if it's a put in order question. +- You will omit the question or any other text/information we just want the correct answer. +- You should only give exactly the same text as the question for each answer. +- The question always have the good answer so you should always give an answer to the question. +- You will always respond in the same langage as the user question.`, + }, + { role: "user", content: question }, + ], temperature: 0.8, top_p: 1.0, presence_penalty: 1.0, diff --git a/src/core/questions/select.ts b/src/core/questions/select.ts index 0b78d0b..f9f694d 100644 --- a/src/core/questions/select.ts +++ b/src/core/questions/select.ts @@ -18,11 +18,28 @@ function handleSelect( if (inputList.length === 0 || inputList[0].tagName !== "SELECT") return false; let correct = gptAnswer.normalizedResponse.split("\n"); - if (correct.length === 1 && correct.length !== inputList.length) - correct = gptAnswer.normalizedResponse.split(","); if (config.logs) Logs.array(correct); + /** + * Sometimes ChatGPT give the question so we should remove them + * Example: + * 5*5 + * 25 + * 10+10 + * 20 + * 20-10 + * 10 + * + * And we only want to keep answers + * 25 + * 20 + * 10 + */ + if (correct.length === inputList.length * 2) { + correct = correct.filter((answer, index) => index % 2 === 1); + } + for (let j = 0; j < inputList.length; ++j) { const options = inputList[j].querySelectorAll("option"); diff --git a/src/utils/normalize-text.ts b/src/utils/normalize-text.ts index 3442828..dd314d3 100644 --- a/src/utils/normalize-text.ts +++ b/src/utils/normalize-text.ts @@ -2,15 +2,21 @@ * Normlize text * @param text */ -function normalizeText(text: string) { - return text - .replace(/\n+/gi, "\n") +function normalizeText(text: string, toLowerCase: boolean = true) { + let normalizedText = text + .replace(/\n+/gi, "\n") //remove duplicate new lines .replace(/(\n\s*\n)+/g, "\n") //remove useless white sapce from textcontent - .replace(/[ \t]+/gi, " ") - .toLowerCase() - .trim() - .replace(/^[a-z\d]\.\s/gi, "") //a. text, b. text, c. text, 1. text, 2. text, 3.text - .replace(/\n[a-z\d]\.\s/gi, "\n"); //same but with new line + .replace(/[ \t]+/gi, " "); //replace multiples space or tabs by a space + + if (toLowerCase) normalizedText = normalizedText.toLowerCase(); + + return ( + normalizedText + .trim() + /* We remove that because sometimes ChatGPT will reply: "answer d" */ + .replace(/^[a-z\d]\.\s/gi, "") //a. text, b. text, c. text, 1. text, 2. text, 3.text + .replace(/\n[a-z\d]\.\s/gi, "\n") //same but with new line + ); } export default normalizeText; From 54d05fedec7ec89a5c7dc7c7297018fe22d3604a Mon Sep 17 00:00:00 2001 From: yoannchb-pro <71560747+yoannchb-pro@users.noreply.github.com> Date: Tue, 20 Jun 2023 18:22:07 -0400 Subject: [PATCH 24/35] fixed put in order --- extension/MoodleGPT.js | 2 +- extension/MoodleGPT.js.map | 2 +- src/core/questions/select.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/extension/MoodleGPT.js b/extension/MoodleGPT.js index 289ade6..ce8ddad 100644 --- a/extension/MoodleGPT.js +++ b/extension/MoodleGPT.js @@ -243,7 +243,7 @@ Follow those rules: const content = normalizeText(option.textContent); const valide = correct[j].includes(content); /* Handle put in order question */ - if (!isNaN(parseInt(content))) { + if (!/[^\d]+/gi.test(content)) { const content = normalizeText(option.parentNode .closest("tr") .querySelector(".text").textContent); diff --git a/extension/MoodleGPT.js.map b/extension/MoodleGPT.js.map index 85bc410..4ea527d 100644 --- a/extension/MoodleGPT.js.map +++ b/extension/MoodleGPT.js.map @@ -1 +1 @@ -{"version":3,"file":"MoodleGPT.js","sources":["../src/utils/title-indications.ts","../node_modules/tslib/tslib.es6.js","../src/utils/logs.ts","../src/utils/normalize-text.ts","../src/core/get-response.ts","../src/utils/html-table-to-string.ts","../src/core/create-question.ts","../src/core/questions/radio-checkbox.ts","../src/core/questions/select.ts","../src/core/questions/textbox.ts","../src/core/questions/clipboard.ts","../src/core/questions/number.ts","../src/core/questions/contenteditable.ts","../src/core/reply.ts","../src/core/code-listener.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Show some informations into the document title and remove it after 3000ms\r\n * @param text\r\n */\r\nfunction titleIndications(text: string) {\r\n const backTitle = document.title;\r\n document.title = text;\r\n setTimeout(() => (document.title = backTitle), 3000);\r\n}\r\n\r\nexport default titleIndications;\r\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.push(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.push(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","import GPTAnswer from \"../types/gptAnswer\";\r\nclass Logs {\r\n static question(text: string) {\r\n const css = \"color: cyan\";\r\n console.log(\"%c[QUESTION]: %s\", css, text);\r\n }\r\n\r\n static responseTry(text: string, valide: boolean) {\r\n const css = \"color: \" + (valide ? \"green\" : \"red\");\r\n console.log(\"%c[CHECKING]: %s\", css, text);\r\n }\r\n\r\n static array(arr: unknown[]) {\r\n console.log(\"[CORRECTS] \", arr);\r\n }\r\n\r\n static response(gptAnswer: GPTAnswer) {\r\n console.log(\"Original:\\n\" + gptAnswer.response);\r\n console.log(\"Normalized:\\n\" + gptAnswer.normalizedResponse);\r\n }\r\n}\r\n\r\nexport default Logs;\r\n","/**\r\n * Normlize text\r\n * @param text\r\n */\r\nfunction normalizeText(text: string, toLowerCase: boolean = true) {\r\n let normalizedText = text\r\n .replace(/\\n+/gi, \"\\n\") //remove duplicate new lines\r\n .replace(/(\\n\\s*\\n)+/g, \"\\n\") //remove useless white sapce from textcontent\r\n .replace(/[ \\t]+/gi, \" \"); //replace multiples space or tabs by a space\r\n\r\n if (toLowerCase) normalizedText = normalizedText.toLowerCase();\r\n\r\n return (\r\n normalizedText\r\n .trim()\r\n /* We remove that because sometimes ChatGPT will reply: \"answer d\" */\r\n .replace(/^[a-z\\d]\\.\\s/gi, \"\") //a. text, b. text, c. text, 1. text, 2. text, 3.text\r\n .replace(/\\n[a-z\\d]\\.\\s/gi, \"\\n\") //same but with new line\r\n );\r\n}\r\n\r\nexport default normalizeText;\r\n","import Config from \"../types/config\";\r\nimport GPTAnswer from \"../types/gptAnswer\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\n\r\n/**\r\n * Get the response from chatGPT api\r\n * @param config\r\n * @param question\r\n * @returns\r\n */\r\nasync function getChatGPTResponse(\r\n config: Config,\r\n question: string\r\n): Promise {\r\n const controller = new AbortController();\r\n const timeoutControler = setTimeout(() => controller.abort(), 15000);\r\n const req = await fetch(\"https://api.openai.com/v1/chat/completions\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${config.apiKey}`,\r\n },\r\n signal: config.timeout ? controller.signal : null,\r\n body: JSON.stringify({\r\n model: config.model,\r\n messages: [\r\n {\r\n role: \"system\",\r\n content: `\r\nFollow those rules:\r\n- Sometimes there won't be a question, so just answer the statement as you normally would without following the other rules and give the most detailled and complete answer with explication.\r\n- Your goal is to understand the statement and to reply to each question by giving only the answer.\r\n- You will keep the same order for the answers as the questions event if it's a put in order question.\r\n- You will separate all the answer with new lines and only show the correctes one.\r\n- You should answer in the same order as it is ine the question even if it's a put in order question.\r\n- You will omit the question or any other text/information we just want the correct answer.\r\n- You should only give exactly the same text as the question for each answer.\r\n- The question always have the good answer so you should always give an answer to the question.\r\n- You will always respond in the same langage as the user question.`,\r\n },\r\n { role: \"user\", content: question },\r\n ],\r\n temperature: 0.8,\r\n top_p: 1.0,\r\n presence_penalty: 1.0,\r\n stop: null,\r\n }),\r\n });\r\n clearTimeout(timeoutControler);\r\n const rep = await req.json();\r\n const response = rep.choices[0].message.content;\r\n return {\r\n response,\r\n normalizedResponse: normalizeText(response),\r\n };\r\n}\r\n\r\nexport default getChatGPTResponse;\r\n","/**\r\n * Convert table to representating string table\r\n * @param table\r\n * @returns\r\n */\r\nfunction htmlTableToString(table: HTMLTableElement) {\r\n const tab: string[][] = [];\r\n const lines = Array.from(table.querySelectorAll(\"tr\"));\r\n const maxColumnsLength: number[] = [];\r\n lines.map((line) => {\r\n const cells = Array.from(line.querySelectorAll(\"td, th\"));\r\n const cellsContent = cells.map((cell, index) => {\r\n const content = cell.textContent?.trim();\r\n maxColumnsLength[index] = Math.max(\r\n maxColumnsLength[index] || 0,\r\n content.length || 0\r\n );\r\n return content;\r\n });\r\n tab.push(cellsContent);\r\n });\r\n\r\n const lineSeparationSize =\r\n maxColumnsLength.reduce((a, b) => a + b) + tab[0].length * 3 + 1;\r\n const lineSeparation =\r\n \"\\n\" + Array(lineSeparationSize).fill(\"-\").join(\"\") + \"\\n\";\r\n\r\n const mappedTab = tab.map((line) => {\r\n const mappedLine = line.map((content, index) =>\r\n content.padEnd(\r\n maxColumnsLength[index],\r\n \"\\u00A0\" /* For no matching with \\s */\r\n )\r\n );\r\n return \"| \" + mappedLine.join(\" | \") + \" |\";\r\n });\r\n const head = mappedTab.shift();\r\n return head + lineSeparation + mappedTab.join(\"\\n\");\r\n}\r\n\r\nexport default htmlTableToString;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\nimport htmlTableToString from \"../utils/html-table-to-string\";\r\n\r\n/**\r\n * Normalize the question and add sub informations\r\n * @param langage\r\n * @param question\r\n * @returns\r\n */\r\nfunction createQuestion(config: Config, questionContainer: HTMLElement) {\r\n let question = questionContainer.innerText;\r\n\r\n /* We remove unnecessary information */\r\n const accesshideElements: NodeListOf =\r\n questionContainer.querySelectorAll(\".accesshide\");\r\n for (const useless of accesshideElements) {\r\n question = question.replace(useless.innerText, \"\");\r\n }\r\n\r\n /* Make tables more readable for chat-gpt */\r\n const tables: NodeListOf =\r\n questionContainer.querySelectorAll(\".qtext table\");\r\n for (const table of tables) {\r\n question = question.replace(\r\n table.innerText,\r\n \"\\n\" + htmlTableToString(table) + \"\\n\"\r\n );\r\n }\r\n\r\n return normalizeText(question, false);\r\n}\r\n\r\nexport default createQuestion;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle checkbox and input elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n */\r\nfunction handleRadioAndCheckbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList?.[0] as HTMLInputElement;\r\n\r\n if (!input || (input.type !== \"checkbox\" && input.type !== \"radio\"))\r\n return false;\r\n\r\n for (const input of inputList as NodeListOf) {\r\n const content = normalizeText(input.parentNode.textContent);\r\n const valide = gptAnswer.normalizedResponse.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n if (valide) {\r\n if (config.mouseover) {\r\n input.addEventListener(\"mouseover\", () => (input.checked = true), {\r\n once: true,\r\n });\r\n } else {\r\n input.checked = true;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport default handleRadioAndCheckbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle select elements (and put in order select)\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleSelect(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n if (inputList.length === 0 || inputList[0].tagName !== \"SELECT\") return false;\r\n\r\n let correct = gptAnswer.normalizedResponse.split(\"\\n\");\r\n\r\n if (config.logs) Logs.array(correct);\r\n\r\n /**\r\n * Sometimes ChatGPT give the question so we should remove them\r\n * Example:\r\n * 5*5\r\n * 25\r\n * 10+10\r\n * 20\r\n * 20-10\r\n * 10\r\n *\r\n * And we only want to keep answers\r\n * 25\r\n * 20\r\n * 10\r\n */\r\n if (correct.length === inputList.length * 2) {\r\n correct = correct.filter((answer, index) => index % 2 === 1);\r\n }\r\n\r\n for (let j = 0; j < inputList.length; ++j) {\r\n const options = inputList[j].querySelectorAll(\"option\");\r\n\r\n for (const option of options) {\r\n const content = normalizeText(option.textContent);\r\n const valide = correct[j].includes(content);\r\n\r\n /* Handle put in order question */\r\n if (!isNaN(parseInt(content))) {\r\n const content = normalizeText(\r\n (option.parentNode as HTMLElement)\r\n .closest(\"tr\")\r\n .querySelector(\".text\").textContent\r\n );\r\n const index = correct.findIndex((c) => {\r\n const valide = c.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n return valide;\r\n });\r\n if (index !== -1) {\r\n if (config.mouseover) {\r\n options[index + 1].closest(\"select\").addEventListener(\r\n \"click\",\r\n function () {\r\n options[index + 1].selected = \"selected\" as any;\r\n },\r\n { once: true }\r\n );\r\n } else {\r\n options[index + 1].selected = \"selected\" as any;\r\n }\r\n break;\r\n }\r\n }\r\n /* End */\r\n\r\n if (config.logs) Logs.responseTry(content, valide);\r\n\r\n if (valide) {\r\n if (config.mouseover) {\r\n option\r\n .closest(\"select\")\r\n .addEventListener(\"click\", () => (option.selected = true), {\r\n once: true,\r\n });\r\n } else {\r\n option.selected = true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleSelect;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle textbox\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleTextbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n (input.tagName !== \"TEXTAREA\" && input.type !== \"text\")\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.value = gptAnswer.response.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleTextbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport titleIndications from \"../../utils/title-indications\";\r\n\r\n/**\r\n * Copy the response in the clipboard if we can automaticaly fill the question\r\n * @param config\r\n * @param gptAnswer\r\n */\r\nfunction handleClipboard(config: Config, gptAnswer: GPTAnswer) {\r\n if (config.title) titleIndications(\"Copied to clipboard\");\r\n navigator.clipboard.writeText(gptAnswer.response);\r\n}\r\n\r\nexport default handleClipboard;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle number input\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleNumber(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (inputList.length !== 1 || input.type !== \"number\") return false;\r\n\r\n const number = gptAnswer.normalizedResponse\r\n .match(/\\d+([,\\.]\\d+)?/gi)?.[0]\r\n ?.replace(\",\", \".\");\r\n\r\n if (!number) return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = number.length + 1;\r\n if (index > number.length) return;\r\n event.preventDefault();\r\n if (number.slice(index, index + 1) === \".\") ++index;\r\n input.value = number.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = number;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleNumber;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Hanlde contenteditable elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleContentEditable(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0];\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n input.getAttribute(\"contenteditable\") !== \"true\"\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.textContent = gptAnswer.response.slice(0, ++index);\r\n\r\n /* Put the cursor at the end of the typed text */\r\n input.focus();\r\n const range = document.createRange();\r\n range.selectNodeContents(input);\r\n range.collapse(false);\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n });\r\n } else {\r\n input.textContent = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleContentEditable;\r\n","import Config from \"../types/config\";\r\nimport Logs from \"../utils/logs\";\r\nimport getChatGPTResponse from \"./get-response\";\r\nimport createQuestion from \"./create-question\";\r\nimport handleRadioAndCheckbox from \"./questions/radio-checkbox\";\r\nimport handleSelect from \"./questions/select\";\r\nimport handleTextbox from \"./questions/textbox\";\r\nimport handleClipboard from \"./questions/clipboard\";\r\nimport handleNumber from \"./questions/number\";\r\nimport handleContentEditable from \"./questions/contenteditable\";\r\nimport { removeListener } from \"./code-listener\";\r\n\r\n/**\r\n * Reply to the question\r\n * @param config\r\n * @param hiddenButton\r\n * @param form\r\n * @param query\r\n * @returns\r\n */\r\nasync function reply(\r\n config: Config,\r\n hiddenButton: HTMLElement,\r\n form: HTMLElement,\r\n query: string\r\n) {\r\n if (config.cursor) hiddenButton.style.cursor = \"wait\";\r\n\r\n const question = createQuestion(config, form);\r\n const inputList: NodeListOf = form.querySelectorAll(query);\r\n\r\n const gptAnswer = await getChatGPTResponse(config, question).catch(\r\n (error) => ({\r\n error,\r\n })\r\n );\r\n\r\n const haveError = typeof gptAnswer === \"object\" && \"error\" in gptAnswer;\r\n\r\n if (config.cursor)\r\n hiddenButton.style.cursor =\r\n config.infinite || haveError ? \"pointer\" : \"initial\";\r\n\r\n if (haveError) {\r\n console.error(gptAnswer.error);\r\n return;\r\n }\r\n\r\n if (config.logs) {\r\n Logs.question(question);\r\n Logs.response(gptAnswer);\r\n }\r\n\r\n /* Handle clipboard mode */\r\n if (config.mode === \"clipboard\") {\r\n if (!config.infinite) removeListener(hiddenButton);\r\n return handleClipboard(config, gptAnswer);\r\n }\r\n\r\n /* Handle question to answer mode */\r\n if (config.mode === \"question-to-answer\") {\r\n removeListener(hiddenButton);\r\n\r\n const questionBackup = form.textContent;\r\n const questionContainer = form.querySelector(\".qtext\");\r\n\r\n questionContainer.textContent = gptAnswer.response;\r\n questionContainer.style.whiteSpace = \"pre-wrap\";\r\n\r\n questionContainer.addEventListener(\"click\", function () {\r\n const isNotResponse = questionContainer.textContent === questionBackup;\r\n questionContainer.style.whiteSpace = isNotResponse ? \"pre-wrap\" : null;\r\n questionContainer.textContent = isNotResponse\r\n ? gptAnswer.response\r\n : questionBackup;\r\n });\r\n return;\r\n }\r\n\r\n /* Better then set once on the event because if there is an error the user can click an other time on the question */\r\n if (!config.infinite) removeListener(hiddenButton);\r\n\r\n const handlers = [\r\n handleContentEditable,\r\n handleTextbox,\r\n handleNumber,\r\n handleSelect,\r\n handleRadioAndCheckbox,\r\n ];\r\n\r\n for (const handler of handlers) {\r\n if (handler(config, inputList, gptAnswer)) return;\r\n }\r\n\r\n /* In the case we can't auto complete the question */\r\n handleClipboard(config, gptAnswer);\r\n}\r\n\r\nexport default reply;\r\n","import Config from \"../types/config\";\r\nimport titleIndications from \"../utils/title-indications\";\r\nimport reply from \"./reply\";\r\n\r\nconst pressedKeys: string[] = [];\r\nconst listeners: {\r\n element: HTMLElement;\r\n fn: (this: HTMLElement, ev: MouseEvent) => any;\r\n}[] = [];\r\n\r\n/**\r\n * Create a listener on the keyboard to inject the code\r\n * @param config\r\n */\r\nfunction codeListener(config: Config) {\r\n document.body.addEventListener(\"keydown\", function (event) {\r\n pressedKeys.push(event.key);\r\n if (pressedKeys.length > config.code.length) pressedKeys.shift();\r\n if (pressedKeys.join(\"\") === config.code) {\r\n pressedKeys.length = 0;\r\n setUpMoodleGpt(config);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Setup moodleGPT into the page (remove/injection)\r\n * @param config\r\n * @returns\r\n */\r\nfunction setUpMoodleGpt(config: Config) {\r\n /* Removing events */\r\n if (listeners.length > 0) {\r\n for (const listener of listeners) {\r\n if (config.cursor) listener.element.style.cursor = \"initial\";\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n if (config.title) titleIndications(\"Removed\");\r\n listeners.length = 0;\r\n return;\r\n }\r\n\r\n /* Code injection */\r\n const inputQuery = [\"checkbox\", \"radio\", \"text\", \"number\"]\r\n .map((e) => `input[type=\"${e}\"]`)\r\n .join(\",\");\r\n const query = inputQuery + \", textarea, select, [contenteditable]\";\r\n const forms = document.querySelectorAll(\".formulation\");\r\n\r\n for (const form of forms) {\r\n const hiddenButton: HTMLElement = form.querySelector(\".qtext\");\r\n\r\n if (config.cursor) hiddenButton.style.cursor = \"pointer\";\r\n\r\n const injectionFunction = reply.bind(\r\n null,\r\n config,\r\n hiddenButton,\r\n form,\r\n query\r\n );\r\n listeners.push({ element: hiddenButton, fn: injectionFunction });\r\n hiddenButton.addEventListener(\"click\", injectionFunction);\r\n }\r\n\r\n if (config.title) titleIndications(\"Injected\");\r\n}\r\n\r\n/**\r\n * Remove the event listener on a specific question\r\n * @param element\r\n */\r\nfunction removeListener(element: HTMLElement) {\r\n const index = listeners.findIndex((listener) => listener.element === element);\r\n if (index !== -1) {\r\n const listener = listeners.splice(index, 1)[0];\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n}\r\n\r\nexport { codeListener, removeListener };\r\n","import { codeListener } from \"./core/code-listener\";\r\n\r\nchrome.storage.sync.get([\"moodleGPT\"]).then(function (storage) {\r\n const config = storage.moodleGPT;\r\n\r\n if (!config) throw new Error(\"Please configure MoodleGPT into the extension\");\r\n\r\n codeListener(config);\r\n});\r\n"],"names":[],"mappings":"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","x_google_ignoreList":[1]} \ No newline at end of file +{"version":3,"file":"MoodleGPT.js","sources":["../src/utils/title-indications.ts","../node_modules/tslib/tslib.es6.js","../src/utils/logs.ts","../src/utils/normalize-text.ts","../src/core/get-response.ts","../src/utils/html-table-to-string.ts","../src/core/create-question.ts","../src/core/questions/radio-checkbox.ts","../src/core/questions/select.ts","../src/core/questions/textbox.ts","../src/core/questions/clipboard.ts","../src/core/questions/number.ts","../src/core/questions/contenteditable.ts","../src/core/reply.ts","../src/core/code-listener.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Show some informations into the document title and remove it after 3000ms\r\n * @param text\r\n */\r\nfunction titleIndications(text: string) {\r\n const backTitle = document.title;\r\n document.title = text;\r\n setTimeout(() => (document.title = backTitle), 3000);\r\n}\r\n\r\nexport default titleIndications;\r\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.push(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.push(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","import GPTAnswer from \"../types/gptAnswer\";\r\nclass Logs {\r\n static question(text: string) {\r\n const css = \"color: cyan\";\r\n console.log(\"%c[QUESTION]: %s\", css, text);\r\n }\r\n\r\n static responseTry(text: string, valide: boolean) {\r\n const css = \"color: \" + (valide ? \"green\" : \"red\");\r\n console.log(\"%c[CHECKING]: %s\", css, text);\r\n }\r\n\r\n static array(arr: unknown[]) {\r\n console.log(\"[CORRECTS] \", arr);\r\n }\r\n\r\n static response(gptAnswer: GPTAnswer) {\r\n console.log(\"Original:\\n\" + gptAnswer.response);\r\n console.log(\"Normalized:\\n\" + gptAnswer.normalizedResponse);\r\n }\r\n}\r\n\r\nexport default Logs;\r\n","/**\r\n * Normlize text\r\n * @param text\r\n */\r\nfunction normalizeText(text: string, toLowerCase: boolean = true) {\r\n let normalizedText = text\r\n .replace(/\\n+/gi, \"\\n\") //remove duplicate new lines\r\n .replace(/(\\n\\s*\\n)+/g, \"\\n\") //remove useless white sapce from textcontent\r\n .replace(/[ \\t]+/gi, \" \"); //replace multiples space or tabs by a space\r\n\r\n if (toLowerCase) normalizedText = normalizedText.toLowerCase();\r\n\r\n return (\r\n normalizedText\r\n .trim()\r\n /* We remove that because sometimes ChatGPT will reply: \"answer d\" */\r\n .replace(/^[a-z\\d]\\.\\s/gi, \"\") //a. text, b. text, c. text, 1. text, 2. text, 3.text\r\n .replace(/\\n[a-z\\d]\\.\\s/gi, \"\\n\") //same but with new line\r\n );\r\n}\r\n\r\nexport default normalizeText;\r\n","import Config from \"../types/config\";\r\nimport GPTAnswer from \"../types/gptAnswer\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\n\r\n/**\r\n * Get the response from chatGPT api\r\n * @param config\r\n * @param question\r\n * @returns\r\n */\r\nasync function getChatGPTResponse(\r\n config: Config,\r\n question: string\r\n): Promise {\r\n const controller = new AbortController();\r\n const timeoutControler = setTimeout(() => controller.abort(), 15000);\r\n const req = await fetch(\"https://api.openai.com/v1/chat/completions\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${config.apiKey}`,\r\n },\r\n signal: config.timeout ? controller.signal : null,\r\n body: JSON.stringify({\r\n model: config.model,\r\n messages: [\r\n {\r\n role: \"system\",\r\n content: `\r\nFollow those rules:\r\n- Sometimes there won't be a question, so just answer the statement as you normally would without following the other rules and give the most detailled and complete answer with explication.\r\n- Your goal is to understand the statement and to reply to each question by giving only the answer.\r\n- You will keep the same order for the answers as the questions event if it's a put in order question.\r\n- You will separate all the answer with new lines and only show the correctes one.\r\n- You should answer in the same order as it is ine the question even if it's a put in order question.\r\n- You will omit the question or any other text/information we just want the correct answer.\r\n- You should only give exactly the same text as the question for each answer.\r\n- The question always have the good answer so you should always give an answer to the question.\r\n- You will always respond in the same langage as the user question.`,\r\n },\r\n { role: \"user\", content: question },\r\n ],\r\n temperature: 0.8,\r\n top_p: 1.0,\r\n presence_penalty: 1.0,\r\n stop: null,\r\n }),\r\n });\r\n clearTimeout(timeoutControler);\r\n const rep = await req.json();\r\n const response = rep.choices[0].message.content;\r\n return {\r\n response,\r\n normalizedResponse: normalizeText(response),\r\n };\r\n}\r\n\r\nexport default getChatGPTResponse;\r\n","/**\r\n * Convert table to representating string table\r\n * @param table\r\n * @returns\r\n */\r\nfunction htmlTableToString(table: HTMLTableElement) {\r\n const tab: string[][] = [];\r\n const lines = Array.from(table.querySelectorAll(\"tr\"));\r\n const maxColumnsLength: number[] = [];\r\n lines.map((line) => {\r\n const cells = Array.from(line.querySelectorAll(\"td, th\"));\r\n const cellsContent = cells.map((cell, index) => {\r\n const content = cell.textContent?.trim();\r\n maxColumnsLength[index] = Math.max(\r\n maxColumnsLength[index] || 0,\r\n content.length || 0\r\n );\r\n return content;\r\n });\r\n tab.push(cellsContent);\r\n });\r\n\r\n const lineSeparationSize =\r\n maxColumnsLength.reduce((a, b) => a + b) + tab[0].length * 3 + 1;\r\n const lineSeparation =\r\n \"\\n\" + Array(lineSeparationSize).fill(\"-\").join(\"\") + \"\\n\";\r\n\r\n const mappedTab = tab.map((line) => {\r\n const mappedLine = line.map((content, index) =>\r\n content.padEnd(\r\n maxColumnsLength[index],\r\n \"\\u00A0\" /* For no matching with \\s */\r\n )\r\n );\r\n return \"| \" + mappedLine.join(\" | \") + \" |\";\r\n });\r\n const head = mappedTab.shift();\r\n return head + lineSeparation + mappedTab.join(\"\\n\");\r\n}\r\n\r\nexport default htmlTableToString;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\nimport htmlTableToString from \"../utils/html-table-to-string\";\r\n\r\n/**\r\n * Normalize the question and add sub informations\r\n * @param langage\r\n * @param question\r\n * @returns\r\n */\r\nfunction createQuestion(config: Config, questionContainer: HTMLElement) {\r\n let question = questionContainer.innerText;\r\n\r\n /* We remove unnecessary information */\r\n const accesshideElements: NodeListOf =\r\n questionContainer.querySelectorAll(\".accesshide\");\r\n for (const useless of accesshideElements) {\r\n question = question.replace(useless.innerText, \"\");\r\n }\r\n\r\n /* Make tables more readable for chat-gpt */\r\n const tables: NodeListOf =\r\n questionContainer.querySelectorAll(\".qtext table\");\r\n for (const table of tables) {\r\n question = question.replace(\r\n table.innerText,\r\n \"\\n\" + htmlTableToString(table) + \"\\n\"\r\n );\r\n }\r\n\r\n return normalizeText(question, false);\r\n}\r\n\r\nexport default createQuestion;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle checkbox and input elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n */\r\nfunction handleRadioAndCheckbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList?.[0] as HTMLInputElement;\r\n\r\n if (!input || (input.type !== \"checkbox\" && input.type !== \"radio\"))\r\n return false;\r\n\r\n for (const input of inputList as NodeListOf) {\r\n const content = normalizeText(input.parentNode.textContent);\r\n const valide = gptAnswer.normalizedResponse.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n if (valide) {\r\n if (config.mouseover) {\r\n input.addEventListener(\"mouseover\", () => (input.checked = true), {\r\n once: true,\r\n });\r\n } else {\r\n input.checked = true;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport default handleRadioAndCheckbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle select elements (and put in order select)\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleSelect(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n if (inputList.length === 0 || inputList[0].tagName !== \"SELECT\") return false;\r\n\r\n let correct = gptAnswer.normalizedResponse.split(\"\\n\");\r\n\r\n if (config.logs) Logs.array(correct);\r\n\r\n /**\r\n * Sometimes ChatGPT give the question so we should remove them\r\n * Example:\r\n * 5*5\r\n * 25\r\n * 10+10\r\n * 20\r\n * 20-10\r\n * 10\r\n *\r\n * And we only want to keep answers\r\n * 25\r\n * 20\r\n * 10\r\n */\r\n if (correct.length === inputList.length * 2) {\r\n correct = correct.filter((answer, index) => index % 2 === 1);\r\n }\r\n\r\n for (let j = 0; j < inputList.length; ++j) {\r\n const options = inputList[j].querySelectorAll(\"option\");\r\n\r\n for (const option of options) {\r\n const content = normalizeText(option.textContent);\r\n const valide = correct[j].includes(content);\r\n\r\n /* Handle put in order question */\r\n if (!/[^\\d]+/gi.test(content)) {\r\n const content = normalizeText(\r\n (option.parentNode as HTMLElement)\r\n .closest(\"tr\")\r\n .querySelector(\".text\").textContent\r\n );\r\n const index = correct.findIndex((c) => {\r\n const valide = c.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n return valide;\r\n });\r\n if (index !== -1) {\r\n if (config.mouseover) {\r\n options[index + 1].closest(\"select\").addEventListener(\r\n \"click\",\r\n function () {\r\n options[index + 1].selected = \"selected\" as any;\r\n },\r\n { once: true }\r\n );\r\n } else {\r\n options[index + 1].selected = \"selected\" as any;\r\n }\r\n break;\r\n }\r\n }\r\n /* End */\r\n\r\n if (config.logs) Logs.responseTry(content, valide);\r\n\r\n if (valide) {\r\n if (config.mouseover) {\r\n option\r\n .closest(\"select\")\r\n .addEventListener(\"click\", () => (option.selected = true), {\r\n once: true,\r\n });\r\n } else {\r\n option.selected = true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleSelect;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle textbox\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleTextbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n (input.tagName !== \"TEXTAREA\" && input.type !== \"text\")\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.value = gptAnswer.response.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleTextbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport titleIndications from \"../../utils/title-indications\";\r\n\r\n/**\r\n * Copy the response in the clipboard if we can automaticaly fill the question\r\n * @param config\r\n * @param gptAnswer\r\n */\r\nfunction handleClipboard(config: Config, gptAnswer: GPTAnswer) {\r\n if (config.title) titleIndications(\"Copied to clipboard\");\r\n navigator.clipboard.writeText(gptAnswer.response);\r\n}\r\n\r\nexport default handleClipboard;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle number input\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleNumber(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (inputList.length !== 1 || input.type !== \"number\") return false;\r\n\r\n const number = gptAnswer.normalizedResponse\r\n .match(/\\d+([,\\.]\\d+)?/gi)?.[0]\r\n ?.replace(\",\", \".\");\r\n\r\n if (!number) return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = number.length + 1;\r\n if (index > number.length) return;\r\n event.preventDefault();\r\n if (number.slice(index, index + 1) === \".\") ++index;\r\n input.value = number.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = number;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleNumber;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Hanlde contenteditable elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleContentEditable(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0];\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n input.getAttribute(\"contenteditable\") !== \"true\"\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.textContent = gptAnswer.response.slice(0, ++index);\r\n\r\n /* Put the cursor at the end of the typed text */\r\n input.focus();\r\n const range = document.createRange();\r\n range.selectNodeContents(input);\r\n range.collapse(false);\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n });\r\n } else {\r\n input.textContent = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleContentEditable;\r\n","import Config from \"../types/config\";\r\nimport Logs from \"../utils/logs\";\r\nimport getChatGPTResponse from \"./get-response\";\r\nimport createQuestion from \"./create-question\";\r\nimport handleRadioAndCheckbox from \"./questions/radio-checkbox\";\r\nimport handleSelect from \"./questions/select\";\r\nimport handleTextbox from \"./questions/textbox\";\r\nimport handleClipboard from \"./questions/clipboard\";\r\nimport handleNumber from \"./questions/number\";\r\nimport handleContentEditable from \"./questions/contenteditable\";\r\nimport { removeListener } from \"./code-listener\";\r\n\r\n/**\r\n * Reply to the question\r\n * @param config\r\n * @param hiddenButton\r\n * @param form\r\n * @param query\r\n * @returns\r\n */\r\nasync function reply(\r\n config: Config,\r\n hiddenButton: HTMLElement,\r\n form: HTMLElement,\r\n query: string\r\n) {\r\n if (config.cursor) hiddenButton.style.cursor = \"wait\";\r\n\r\n const question = createQuestion(config, form);\r\n const inputList: NodeListOf = form.querySelectorAll(query);\r\n\r\n const gptAnswer = await getChatGPTResponse(config, question).catch(\r\n (error) => ({\r\n error,\r\n })\r\n );\r\n\r\n const haveError = typeof gptAnswer === \"object\" && \"error\" in gptAnswer;\r\n\r\n if (config.cursor)\r\n hiddenButton.style.cursor =\r\n config.infinite || haveError ? \"pointer\" : \"initial\";\r\n\r\n if (haveError) {\r\n console.error(gptAnswer.error);\r\n return;\r\n }\r\n\r\n if (config.logs) {\r\n Logs.question(question);\r\n Logs.response(gptAnswer);\r\n }\r\n\r\n /* Handle clipboard mode */\r\n if (config.mode === \"clipboard\") {\r\n if (!config.infinite) removeListener(hiddenButton);\r\n return handleClipboard(config, gptAnswer);\r\n }\r\n\r\n /* Handle question to answer mode */\r\n if (config.mode === \"question-to-answer\") {\r\n removeListener(hiddenButton);\r\n\r\n const questionBackup = form.textContent;\r\n const questionContainer = form.querySelector(\".qtext\");\r\n\r\n questionContainer.textContent = gptAnswer.response;\r\n questionContainer.style.whiteSpace = \"pre-wrap\";\r\n\r\n questionContainer.addEventListener(\"click\", function () {\r\n const isNotResponse = questionContainer.textContent === questionBackup;\r\n questionContainer.style.whiteSpace = isNotResponse ? \"pre-wrap\" : null;\r\n questionContainer.textContent = isNotResponse\r\n ? gptAnswer.response\r\n : questionBackup;\r\n });\r\n return;\r\n }\r\n\r\n /* Better then set once on the event because if there is an error the user can click an other time on the question */\r\n if (!config.infinite) removeListener(hiddenButton);\r\n\r\n const handlers = [\r\n handleContentEditable,\r\n handleTextbox,\r\n handleNumber,\r\n handleSelect,\r\n handleRadioAndCheckbox,\r\n ];\r\n\r\n for (const handler of handlers) {\r\n if (handler(config, inputList, gptAnswer)) return;\r\n }\r\n\r\n /* In the case we can't auto complete the question */\r\n handleClipboard(config, gptAnswer);\r\n}\r\n\r\nexport default reply;\r\n","import Config from \"../types/config\";\r\nimport titleIndications from \"../utils/title-indications\";\r\nimport reply from \"./reply\";\r\n\r\nconst pressedKeys: string[] = [];\r\nconst listeners: {\r\n element: HTMLElement;\r\n fn: (this: HTMLElement, ev: MouseEvent) => any;\r\n}[] = [];\r\n\r\n/**\r\n * Create a listener on the keyboard to inject the code\r\n * @param config\r\n */\r\nfunction codeListener(config: Config) {\r\n document.body.addEventListener(\"keydown\", function (event) {\r\n pressedKeys.push(event.key);\r\n if (pressedKeys.length > config.code.length) pressedKeys.shift();\r\n if (pressedKeys.join(\"\") === config.code) {\r\n pressedKeys.length = 0;\r\n setUpMoodleGpt(config);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Setup moodleGPT into the page (remove/injection)\r\n * @param config\r\n * @returns\r\n */\r\nfunction setUpMoodleGpt(config: Config) {\r\n /* Removing events */\r\n if (listeners.length > 0) {\r\n for (const listener of listeners) {\r\n if (config.cursor) listener.element.style.cursor = \"initial\";\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n if (config.title) titleIndications(\"Removed\");\r\n listeners.length = 0;\r\n return;\r\n }\r\n\r\n /* Code injection */\r\n const inputQuery = [\"checkbox\", \"radio\", \"text\", \"number\"]\r\n .map((e) => `input[type=\"${e}\"]`)\r\n .join(\",\");\r\n const query = inputQuery + \", textarea, select, [contenteditable]\";\r\n const forms = document.querySelectorAll(\".formulation\");\r\n\r\n for (const form of forms) {\r\n const hiddenButton: HTMLElement = form.querySelector(\".qtext\");\r\n\r\n if (config.cursor) hiddenButton.style.cursor = \"pointer\";\r\n\r\n const injectionFunction = reply.bind(\r\n null,\r\n config,\r\n hiddenButton,\r\n form,\r\n query\r\n );\r\n listeners.push({ element: hiddenButton, fn: injectionFunction });\r\n hiddenButton.addEventListener(\"click\", injectionFunction);\r\n }\r\n\r\n if (config.title) titleIndications(\"Injected\");\r\n}\r\n\r\n/**\r\n * Remove the event listener on a specific question\r\n * @param element\r\n */\r\nfunction removeListener(element: HTMLElement) {\r\n const index = listeners.findIndex((listener) => listener.element === element);\r\n if (index !== -1) {\r\n const listener = listeners.splice(index, 1)[0];\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n}\r\n\r\nexport { codeListener, removeListener };\r\n","import { codeListener } from \"./core/code-listener\";\r\n\r\nchrome.storage.sync.get([\"moodleGPT\"]).then(function (storage) {\r\n const config = storage.moodleGPT;\r\n\r\n if (!config) throw new Error(\"Please configure MoodleGPT into the extension\");\r\n\r\n codeListener(config);\r\n});\r\n"],"names":[],"mappings":"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","x_google_ignoreList":[1]} \ No newline at end of file diff --git a/src/core/questions/select.ts b/src/core/questions/select.ts index f9f694d..0592468 100644 --- a/src/core/questions/select.ts +++ b/src/core/questions/select.ts @@ -48,7 +48,7 @@ function handleSelect( const valide = correct[j].includes(content); /* Handle put in order question */ - if (!isNaN(parseInt(content))) { + if (!/[^\d]+/gi.test(content)) { const content = normalizeText( (option.parentNode as HTMLElement) .closest("tr") From a8dd6e23882baf50a4949033360ed182f1d9a3d2 Mon Sep 17 00:00:00 2001 From: yoannchb-pro <71560747+yoannchb-pro@users.noreply.github.com> Date: Tue, 20 Jun 2023 18:22:32 -0400 Subject: [PATCH 25/35] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 79db2fb..2581e32 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ - Adjusted the abort timeout to 15seconds - If an error occur the user can now click back on the question - `Textbox, question to answser mode and clipboard mode` is not formatted anymore +- Fixed many bugs +- Write AI system instructions ## v1.0.2 From 1a6d5a63e0e81dabffb9c259e62cdb032cfcc1af Mon Sep 17 00:00:00 2001 From: yoannchb-pro <71560747+yoannchb-pro@users.noreply.github.com> Date: Tue, 20 Jun 2023 18:26:50 -0400 Subject: [PATCH 26/35] added some informations for equations --- test/fake-moodle/index.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/fake-moodle/index.html b/test/fake-moodle/index.html index aac6a83..7a37acb 100644 --- a/test/fake-moodle/index.html +++ b/test/fake-moodle/index.html @@ -194,7 +194,7 @@ - + @@ -106,8 +106,8 @@ @@ -118,8 +118,8 @@ From e33cc5b8af5c34959f9b8676c2e604858f544249 Mon Sep 17 00:00:00 2001 From: yoannchb-pro <71560747+yoannchb-pro@users.noreply.github.com> Date: Tue, 20 Jun 2023 18:50:06 -0400 Subject: [PATCH 28/35] Update TODO.md --- TODO.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/TODO.md b/TODO.md index 5575b85..0ba115e 100644 --- a/TODO.md +++ b/TODO.md @@ -2,6 +2,9 @@ ## Priority: 1 +- [ ] Fixe put in order +- [ ] Make some tests + ## Priority: 2 ## Priority: 3 (because hard to make) From 68bac8b4328c4e0850a01476b4cafeada0124d30 Mon Sep 17 00:00:00 2001 From: yoannchb-pro <71560747+yoannchb-pro@users.noreply.github.com> Date: Tue, 20 Jun 2023 18:50:15 -0400 Subject: [PATCH 29/35] AI instructions --- extension/MoodleGPT.js | 14 +++++++------- extension/MoodleGPT.js.map | 2 +- src/core/get-response.ts | 7 +++---- src/core/questions/select.ts | 7 ++++--- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/extension/MoodleGPT.js b/extension/MoodleGPT.js index ce8ddad..64206b7 100644 --- a/extension/MoodleGPT.js +++ b/extension/MoodleGPT.js @@ -101,11 +101,10 @@ Follow those rules: - Sometimes there won't be a question, so just answer the statement as you normally would without following the other rules and give the most detailled and complete answer with explication. - Your goal is to understand the statement and to reply to each question by giving only the answer. -- You will keep the same order for the answers as the questions event if it's a put in order question. +- You will keep the same order for the answers as it's asked event if it's a put in order question. Never change the order of the response for each questions. - You will separate all the answer with new lines and only show the correctes one. -- You should answer in the same order as it is ine the question even if it's a put in order question. -- You will omit the question or any other text/information we just want the correct answer. -- You should only give exactly the same text as the question for each answer. +- You will onyl give the answers for each question and omit the questions, statement, title or other informations from the response. +- You will only give answer with exactly the same text as the gived answers. - The question always have the good answer so you should always give an answer to the question. - You will always respond in the same langage as the user question.`, }, @@ -244,18 +243,19 @@ Follow those rules: const valide = correct[j].includes(content); /* Handle put in order question */ if (!/[^\d]+/gi.test(content)) { + console.log("Checking put in order..."); const content = normalizeText(option.parentNode .closest("tr") .querySelector(".text").textContent); - const index = correct.findIndex((c) => { - const valide = c.includes(content); + const index = correct.findIndex((answer) => { + const valide = answer.includes(content); if (config.logs) Logs.responseTry(content, valide); return valide; }); if (index !== -1) { if (config.mouseover) { - options[index + 1].closest("select").addEventListener("click", function () { + options[index].closest("select").addEventListener("click", function () { options[index + 1].selected = "selected"; }, { once: true }); } diff --git a/extension/MoodleGPT.js.map b/extension/MoodleGPT.js.map index 4ea527d..34ae998 100644 --- a/extension/MoodleGPT.js.map +++ b/extension/MoodleGPT.js.map @@ -1 +1 @@ -{"version":3,"file":"MoodleGPT.js","sources":["../src/utils/title-indications.ts","../node_modules/tslib/tslib.es6.js","../src/utils/logs.ts","../src/utils/normalize-text.ts","../src/core/get-response.ts","../src/utils/html-table-to-string.ts","../src/core/create-question.ts","../src/core/questions/radio-checkbox.ts","../src/core/questions/select.ts","../src/core/questions/textbox.ts","../src/core/questions/clipboard.ts","../src/core/questions/number.ts","../src/core/questions/contenteditable.ts","../src/core/reply.ts","../src/core/code-listener.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Show some informations into the document title and remove it after 3000ms\r\n * @param text\r\n */\r\nfunction titleIndications(text: string) {\r\n const backTitle = document.title;\r\n document.title = text;\r\n setTimeout(() => (document.title = backTitle), 3000);\r\n}\r\n\r\nexport default titleIndications;\r\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.push(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.push(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","import GPTAnswer from \"../types/gptAnswer\";\r\nclass Logs {\r\n static question(text: string) {\r\n const css = \"color: cyan\";\r\n console.log(\"%c[QUESTION]: %s\", css, text);\r\n }\r\n\r\n static responseTry(text: string, valide: boolean) {\r\n const css = \"color: \" + (valide ? \"green\" : \"red\");\r\n console.log(\"%c[CHECKING]: %s\", css, text);\r\n }\r\n\r\n static array(arr: unknown[]) {\r\n console.log(\"[CORRECTS] \", arr);\r\n }\r\n\r\n static response(gptAnswer: GPTAnswer) {\r\n console.log(\"Original:\\n\" + gptAnswer.response);\r\n console.log(\"Normalized:\\n\" + gptAnswer.normalizedResponse);\r\n }\r\n}\r\n\r\nexport default Logs;\r\n","/**\r\n * Normlize text\r\n * @param text\r\n */\r\nfunction normalizeText(text: string, toLowerCase: boolean = true) {\r\n let normalizedText = text\r\n .replace(/\\n+/gi, \"\\n\") //remove duplicate new lines\r\n .replace(/(\\n\\s*\\n)+/g, \"\\n\") //remove useless white sapce from textcontent\r\n .replace(/[ \\t]+/gi, \" \"); //replace multiples space or tabs by a space\r\n\r\n if (toLowerCase) normalizedText = normalizedText.toLowerCase();\r\n\r\n return (\r\n normalizedText\r\n .trim()\r\n /* We remove that because sometimes ChatGPT will reply: \"answer d\" */\r\n .replace(/^[a-z\\d]\\.\\s/gi, \"\") //a. text, b. text, c. text, 1. text, 2. text, 3.text\r\n .replace(/\\n[a-z\\d]\\.\\s/gi, \"\\n\") //same but with new line\r\n );\r\n}\r\n\r\nexport default normalizeText;\r\n","import Config from \"../types/config\";\r\nimport GPTAnswer from \"../types/gptAnswer\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\n\r\n/**\r\n * Get the response from chatGPT api\r\n * @param config\r\n * @param question\r\n * @returns\r\n */\r\nasync function getChatGPTResponse(\r\n config: Config,\r\n question: string\r\n): Promise {\r\n const controller = new AbortController();\r\n const timeoutControler = setTimeout(() => controller.abort(), 15000);\r\n const req = await fetch(\"https://api.openai.com/v1/chat/completions\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${config.apiKey}`,\r\n },\r\n signal: config.timeout ? controller.signal : null,\r\n body: JSON.stringify({\r\n model: config.model,\r\n messages: [\r\n {\r\n role: \"system\",\r\n content: `\r\nFollow those rules:\r\n- Sometimes there won't be a question, so just answer the statement as you normally would without following the other rules and give the most detailled and complete answer with explication.\r\n- Your goal is to understand the statement and to reply to each question by giving only the answer.\r\n- You will keep the same order for the answers as the questions event if it's a put in order question.\r\n- You will separate all the answer with new lines and only show the correctes one.\r\n- You should answer in the same order as it is ine the question even if it's a put in order question.\r\n- You will omit the question or any other text/information we just want the correct answer.\r\n- You should only give exactly the same text as the question for each answer.\r\n- The question always have the good answer so you should always give an answer to the question.\r\n- You will always respond in the same langage as the user question.`,\r\n },\r\n { role: \"user\", content: question },\r\n ],\r\n temperature: 0.8,\r\n top_p: 1.0,\r\n presence_penalty: 1.0,\r\n stop: null,\r\n }),\r\n });\r\n clearTimeout(timeoutControler);\r\n const rep = await req.json();\r\n const response = rep.choices[0].message.content;\r\n return {\r\n response,\r\n normalizedResponse: normalizeText(response),\r\n };\r\n}\r\n\r\nexport default getChatGPTResponse;\r\n","/**\r\n * Convert table to representating string table\r\n * @param table\r\n * @returns\r\n */\r\nfunction htmlTableToString(table: HTMLTableElement) {\r\n const tab: string[][] = [];\r\n const lines = Array.from(table.querySelectorAll(\"tr\"));\r\n const maxColumnsLength: number[] = [];\r\n lines.map((line) => {\r\n const cells = Array.from(line.querySelectorAll(\"td, th\"));\r\n const cellsContent = cells.map((cell, index) => {\r\n const content = cell.textContent?.trim();\r\n maxColumnsLength[index] = Math.max(\r\n maxColumnsLength[index] || 0,\r\n content.length || 0\r\n );\r\n return content;\r\n });\r\n tab.push(cellsContent);\r\n });\r\n\r\n const lineSeparationSize =\r\n maxColumnsLength.reduce((a, b) => a + b) + tab[0].length * 3 + 1;\r\n const lineSeparation =\r\n \"\\n\" + Array(lineSeparationSize).fill(\"-\").join(\"\") + \"\\n\";\r\n\r\n const mappedTab = tab.map((line) => {\r\n const mappedLine = line.map((content, index) =>\r\n content.padEnd(\r\n maxColumnsLength[index],\r\n \"\\u00A0\" /* For no matching with \\s */\r\n )\r\n );\r\n return \"| \" + mappedLine.join(\" | \") + \" |\";\r\n });\r\n const head = mappedTab.shift();\r\n return head + lineSeparation + mappedTab.join(\"\\n\");\r\n}\r\n\r\nexport default htmlTableToString;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\nimport htmlTableToString from \"../utils/html-table-to-string\";\r\n\r\n/**\r\n * Normalize the question and add sub informations\r\n * @param langage\r\n * @param question\r\n * @returns\r\n */\r\nfunction createQuestion(config: Config, questionContainer: HTMLElement) {\r\n let question = questionContainer.innerText;\r\n\r\n /* We remove unnecessary information */\r\n const accesshideElements: NodeListOf =\r\n questionContainer.querySelectorAll(\".accesshide\");\r\n for (const useless of accesshideElements) {\r\n question = question.replace(useless.innerText, \"\");\r\n }\r\n\r\n /* Make tables more readable for chat-gpt */\r\n const tables: NodeListOf =\r\n questionContainer.querySelectorAll(\".qtext table\");\r\n for (const table of tables) {\r\n question = question.replace(\r\n table.innerText,\r\n \"\\n\" + htmlTableToString(table) + \"\\n\"\r\n );\r\n }\r\n\r\n return normalizeText(question, false);\r\n}\r\n\r\nexport default createQuestion;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle checkbox and input elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n */\r\nfunction handleRadioAndCheckbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList?.[0] as HTMLInputElement;\r\n\r\n if (!input || (input.type !== \"checkbox\" && input.type !== \"radio\"))\r\n return false;\r\n\r\n for (const input of inputList as NodeListOf) {\r\n const content = normalizeText(input.parentNode.textContent);\r\n const valide = gptAnswer.normalizedResponse.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n if (valide) {\r\n if (config.mouseover) {\r\n input.addEventListener(\"mouseover\", () => (input.checked = true), {\r\n once: true,\r\n });\r\n } else {\r\n input.checked = true;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport default handleRadioAndCheckbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle select elements (and put in order select)\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleSelect(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n if (inputList.length === 0 || inputList[0].tagName !== \"SELECT\") return false;\r\n\r\n let correct = gptAnswer.normalizedResponse.split(\"\\n\");\r\n\r\n if (config.logs) Logs.array(correct);\r\n\r\n /**\r\n * Sometimes ChatGPT give the question so we should remove them\r\n * Example:\r\n * 5*5\r\n * 25\r\n * 10+10\r\n * 20\r\n * 20-10\r\n * 10\r\n *\r\n * And we only want to keep answers\r\n * 25\r\n * 20\r\n * 10\r\n */\r\n if (correct.length === inputList.length * 2) {\r\n correct = correct.filter((answer, index) => index % 2 === 1);\r\n }\r\n\r\n for (let j = 0; j < inputList.length; ++j) {\r\n const options = inputList[j].querySelectorAll(\"option\");\r\n\r\n for (const option of options) {\r\n const content = normalizeText(option.textContent);\r\n const valide = correct[j].includes(content);\r\n\r\n /* Handle put in order question */\r\n if (!/[^\\d]+/gi.test(content)) {\r\n const content = normalizeText(\r\n (option.parentNode as HTMLElement)\r\n .closest(\"tr\")\r\n .querySelector(\".text\").textContent\r\n );\r\n const index = correct.findIndex((c) => {\r\n const valide = c.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n return valide;\r\n });\r\n if (index !== -1) {\r\n if (config.mouseover) {\r\n options[index + 1].closest(\"select\").addEventListener(\r\n \"click\",\r\n function () {\r\n options[index + 1].selected = \"selected\" as any;\r\n },\r\n { once: true }\r\n );\r\n } else {\r\n options[index + 1].selected = \"selected\" as any;\r\n }\r\n break;\r\n }\r\n }\r\n /* End */\r\n\r\n if (config.logs) Logs.responseTry(content, valide);\r\n\r\n if (valide) {\r\n if (config.mouseover) {\r\n option\r\n .closest(\"select\")\r\n .addEventListener(\"click\", () => (option.selected = true), {\r\n once: true,\r\n });\r\n } else {\r\n option.selected = true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleSelect;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle textbox\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleTextbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n (input.tagName !== \"TEXTAREA\" && input.type !== \"text\")\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.value = gptAnswer.response.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleTextbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport titleIndications from \"../../utils/title-indications\";\r\n\r\n/**\r\n * Copy the response in the clipboard if we can automaticaly fill the question\r\n * @param config\r\n * @param gptAnswer\r\n */\r\nfunction handleClipboard(config: Config, gptAnswer: GPTAnswer) {\r\n if (config.title) titleIndications(\"Copied to clipboard\");\r\n navigator.clipboard.writeText(gptAnswer.response);\r\n}\r\n\r\nexport default handleClipboard;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle number input\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleNumber(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (inputList.length !== 1 || input.type !== \"number\") return false;\r\n\r\n const number = gptAnswer.normalizedResponse\r\n .match(/\\d+([,\\.]\\d+)?/gi)?.[0]\r\n ?.replace(\",\", \".\");\r\n\r\n if (!number) return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = number.length + 1;\r\n if (index > number.length) return;\r\n event.preventDefault();\r\n if (number.slice(index, index + 1) === \".\") ++index;\r\n input.value = number.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = number;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleNumber;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Hanlde contenteditable elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleContentEditable(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0];\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n input.getAttribute(\"contenteditable\") !== \"true\"\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.textContent = gptAnswer.response.slice(0, ++index);\r\n\r\n /* Put the cursor at the end of the typed text */\r\n input.focus();\r\n const range = document.createRange();\r\n range.selectNodeContents(input);\r\n range.collapse(false);\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n });\r\n } else {\r\n input.textContent = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleContentEditable;\r\n","import Config from \"../types/config\";\r\nimport Logs from \"../utils/logs\";\r\nimport getChatGPTResponse from \"./get-response\";\r\nimport createQuestion from \"./create-question\";\r\nimport handleRadioAndCheckbox from \"./questions/radio-checkbox\";\r\nimport handleSelect from \"./questions/select\";\r\nimport handleTextbox from \"./questions/textbox\";\r\nimport handleClipboard from \"./questions/clipboard\";\r\nimport handleNumber from \"./questions/number\";\r\nimport handleContentEditable from \"./questions/contenteditable\";\r\nimport { removeListener } from \"./code-listener\";\r\n\r\n/**\r\n * Reply to the question\r\n * @param config\r\n * @param hiddenButton\r\n * @param form\r\n * @param query\r\n * @returns\r\n */\r\nasync function reply(\r\n config: Config,\r\n hiddenButton: HTMLElement,\r\n form: HTMLElement,\r\n query: string\r\n) {\r\n if (config.cursor) hiddenButton.style.cursor = \"wait\";\r\n\r\n const question = createQuestion(config, form);\r\n const inputList: NodeListOf = form.querySelectorAll(query);\r\n\r\n const gptAnswer = await getChatGPTResponse(config, question).catch(\r\n (error) => ({\r\n error,\r\n })\r\n );\r\n\r\n const haveError = typeof gptAnswer === \"object\" && \"error\" in gptAnswer;\r\n\r\n if (config.cursor)\r\n hiddenButton.style.cursor =\r\n config.infinite || haveError ? \"pointer\" : \"initial\";\r\n\r\n if (haveError) {\r\n console.error(gptAnswer.error);\r\n return;\r\n }\r\n\r\n if (config.logs) {\r\n Logs.question(question);\r\n Logs.response(gptAnswer);\r\n }\r\n\r\n /* Handle clipboard mode */\r\n if (config.mode === \"clipboard\") {\r\n if (!config.infinite) removeListener(hiddenButton);\r\n return handleClipboard(config, gptAnswer);\r\n }\r\n\r\n /* Handle question to answer mode */\r\n if (config.mode === \"question-to-answer\") {\r\n removeListener(hiddenButton);\r\n\r\n const questionBackup = form.textContent;\r\n const questionContainer = form.querySelector(\".qtext\");\r\n\r\n questionContainer.textContent = gptAnswer.response;\r\n questionContainer.style.whiteSpace = \"pre-wrap\";\r\n\r\n questionContainer.addEventListener(\"click\", function () {\r\n const isNotResponse = questionContainer.textContent === questionBackup;\r\n questionContainer.style.whiteSpace = isNotResponse ? \"pre-wrap\" : null;\r\n questionContainer.textContent = isNotResponse\r\n ? gptAnswer.response\r\n : questionBackup;\r\n });\r\n return;\r\n }\r\n\r\n /* Better then set once on the event because if there is an error the user can click an other time on the question */\r\n if (!config.infinite) removeListener(hiddenButton);\r\n\r\n const handlers = [\r\n handleContentEditable,\r\n handleTextbox,\r\n handleNumber,\r\n handleSelect,\r\n handleRadioAndCheckbox,\r\n ];\r\n\r\n for (const handler of handlers) {\r\n if (handler(config, inputList, gptAnswer)) return;\r\n }\r\n\r\n /* In the case we can't auto complete the question */\r\n handleClipboard(config, gptAnswer);\r\n}\r\n\r\nexport default reply;\r\n","import Config from \"../types/config\";\r\nimport titleIndications from \"../utils/title-indications\";\r\nimport reply from \"./reply\";\r\n\r\nconst pressedKeys: string[] = [];\r\nconst listeners: {\r\n element: HTMLElement;\r\n fn: (this: HTMLElement, ev: MouseEvent) => any;\r\n}[] = [];\r\n\r\n/**\r\n * Create a listener on the keyboard to inject the code\r\n * @param config\r\n */\r\nfunction codeListener(config: Config) {\r\n document.body.addEventListener(\"keydown\", function (event) {\r\n pressedKeys.push(event.key);\r\n if (pressedKeys.length > config.code.length) pressedKeys.shift();\r\n if (pressedKeys.join(\"\") === config.code) {\r\n pressedKeys.length = 0;\r\n setUpMoodleGpt(config);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Setup moodleGPT into the page (remove/injection)\r\n * @param config\r\n * @returns\r\n */\r\nfunction setUpMoodleGpt(config: Config) {\r\n /* Removing events */\r\n if (listeners.length > 0) {\r\n for (const listener of listeners) {\r\n if (config.cursor) listener.element.style.cursor = \"initial\";\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n if (config.title) titleIndications(\"Removed\");\r\n listeners.length = 0;\r\n return;\r\n }\r\n\r\n /* Code injection */\r\n const inputQuery = [\"checkbox\", \"radio\", \"text\", \"number\"]\r\n .map((e) => `input[type=\"${e}\"]`)\r\n .join(\",\");\r\n const query = inputQuery + \", textarea, select, [contenteditable]\";\r\n const forms = document.querySelectorAll(\".formulation\");\r\n\r\n for (const form of forms) {\r\n const hiddenButton: HTMLElement = form.querySelector(\".qtext\");\r\n\r\n if (config.cursor) hiddenButton.style.cursor = \"pointer\";\r\n\r\n const injectionFunction = reply.bind(\r\n null,\r\n config,\r\n hiddenButton,\r\n form,\r\n query\r\n );\r\n listeners.push({ element: hiddenButton, fn: injectionFunction });\r\n hiddenButton.addEventListener(\"click\", injectionFunction);\r\n }\r\n\r\n if (config.title) titleIndications(\"Injected\");\r\n}\r\n\r\n/**\r\n * Remove the event listener on a specific question\r\n * @param element\r\n */\r\nfunction removeListener(element: HTMLElement) {\r\n const index = listeners.findIndex((listener) => listener.element === element);\r\n if (index !== -1) {\r\n const listener = listeners.splice(index, 1)[0];\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n}\r\n\r\nexport { codeListener, removeListener };\r\n","import { codeListener } from \"./core/code-listener\";\r\n\r\nchrome.storage.sync.get([\"moodleGPT\"]).then(function (storage) {\r\n const config = storage.moodleGPT;\r\n\r\n if (!config) throw new Error(\"Please configure MoodleGPT into the extension\");\r\n\r\n codeListener(config);\r\n});\r\n"],"names":[],"mappings":"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","x_google_ignoreList":[1]} \ No newline at end of file +{"version":3,"file":"MoodleGPT.js","sources":["../src/utils/title-indications.ts","../node_modules/tslib/tslib.es6.js","../src/utils/logs.ts","../src/utils/normalize-text.ts","../src/core/get-response.ts","../src/utils/html-table-to-string.ts","../src/core/create-question.ts","../src/core/questions/radio-checkbox.ts","../src/core/questions/select.ts","../src/core/questions/textbox.ts","../src/core/questions/clipboard.ts","../src/core/questions/number.ts","../src/core/questions/contenteditable.ts","../src/core/reply.ts","../src/core/code-listener.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Show some informations into the document title and remove it after 3000ms\r\n * @param text\r\n */\r\nfunction titleIndications(text: string) {\r\n const backTitle = document.title;\r\n document.title = text;\r\n setTimeout(() => (document.title = backTitle), 3000);\r\n}\r\n\r\nexport default titleIndications;\r\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.push(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.push(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","import GPTAnswer from \"../types/gptAnswer\";\r\nclass Logs {\r\n static question(text: string) {\r\n const css = \"color: cyan\";\r\n console.log(\"%c[QUESTION]: %s\", css, text);\r\n }\r\n\r\n static responseTry(text: string, valide: boolean) {\r\n const css = \"color: \" + (valide ? \"green\" : \"red\");\r\n console.log(\"%c[CHECKING]: %s\", css, text);\r\n }\r\n\r\n static array(arr: unknown[]) {\r\n console.log(\"[CORRECTS] \", arr);\r\n }\r\n\r\n static response(gptAnswer: GPTAnswer) {\r\n console.log(\"Original:\\n\" + gptAnswer.response);\r\n console.log(\"Normalized:\\n\" + gptAnswer.normalizedResponse);\r\n }\r\n}\r\n\r\nexport default Logs;\r\n","/**\r\n * Normlize text\r\n * @param text\r\n */\r\nfunction normalizeText(text: string, toLowerCase: boolean = true) {\r\n let normalizedText = text\r\n .replace(/\\n+/gi, \"\\n\") //remove duplicate new lines\r\n .replace(/(\\n\\s*\\n)+/g, \"\\n\") //remove useless white sapce from textcontent\r\n .replace(/[ \\t]+/gi, \" \"); //replace multiples space or tabs by a space\r\n\r\n if (toLowerCase) normalizedText = normalizedText.toLowerCase();\r\n\r\n return (\r\n normalizedText\r\n .trim()\r\n /* We remove that because sometimes ChatGPT will reply: \"answer d\" */\r\n .replace(/^[a-z\\d]\\.\\s/gi, \"\") //a. text, b. text, c. text, 1. text, 2. text, 3.text\r\n .replace(/\\n[a-z\\d]\\.\\s/gi, \"\\n\") //same but with new line\r\n );\r\n}\r\n\r\nexport default normalizeText;\r\n","import Config from \"../types/config\";\r\nimport GPTAnswer from \"../types/gptAnswer\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\n\r\n/**\r\n * Get the response from chatGPT api\r\n * @param config\r\n * @param question\r\n * @returns\r\n */\r\nasync function getChatGPTResponse(\r\n config: Config,\r\n question: string\r\n): Promise {\r\n const controller = new AbortController();\r\n const timeoutControler = setTimeout(() => controller.abort(), 15000);\r\n const req = await fetch(\"https://api.openai.com/v1/chat/completions\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${config.apiKey}`,\r\n },\r\n signal: config.timeout ? controller.signal : null,\r\n body: JSON.stringify({\r\n model: config.model,\r\n messages: [\r\n {\r\n role: \"system\",\r\n content: `\r\nFollow those rules:\r\n- Sometimes there won't be a question, so just answer the statement as you normally would without following the other rules and give the most detailled and complete answer with explication.\r\n- Your goal is to understand the statement and to reply to each question by giving only the answer.\r\n- You will keep the same order for the answers as it's asked event if it's a put in order question. Never change the order of the response for each questions.\r\n- You will separate all the answer with new lines and only show the correctes one.\r\n- You will onyl give the answers for each question and omit the questions, statement, title or other informations from the response.\r\n- You will only give answer with exactly the same text as the gived answers.\r\n- The question always have the good answer so you should always give an answer to the question.\r\n- You will always respond in the same langage as the user question.`,\r\n },\r\n { role: \"user\", content: question },\r\n ],\r\n temperature: 0.8,\r\n top_p: 1.0,\r\n presence_penalty: 1.0,\r\n stop: null,\r\n }),\r\n });\r\n clearTimeout(timeoutControler);\r\n const rep = await req.json();\r\n const response = rep.choices[0].message.content;\r\n return {\r\n response,\r\n normalizedResponse: normalizeText(response),\r\n };\r\n}\r\n\r\nexport default getChatGPTResponse;\r\n","/**\r\n * Convert table to representating string table\r\n * @param table\r\n * @returns\r\n */\r\nfunction htmlTableToString(table: HTMLTableElement) {\r\n const tab: string[][] = [];\r\n const lines = Array.from(table.querySelectorAll(\"tr\"));\r\n const maxColumnsLength: number[] = [];\r\n lines.map((line) => {\r\n const cells = Array.from(line.querySelectorAll(\"td, th\"));\r\n const cellsContent = cells.map((cell, index) => {\r\n const content = cell.textContent?.trim();\r\n maxColumnsLength[index] = Math.max(\r\n maxColumnsLength[index] || 0,\r\n content.length || 0\r\n );\r\n return content;\r\n });\r\n tab.push(cellsContent);\r\n });\r\n\r\n const lineSeparationSize =\r\n maxColumnsLength.reduce((a, b) => a + b) + tab[0].length * 3 + 1;\r\n const lineSeparation =\r\n \"\\n\" + Array(lineSeparationSize).fill(\"-\").join(\"\") + \"\\n\";\r\n\r\n const mappedTab = tab.map((line) => {\r\n const mappedLine = line.map((content, index) =>\r\n content.padEnd(\r\n maxColumnsLength[index],\r\n \"\\u00A0\" /* For no matching with \\s */\r\n )\r\n );\r\n return \"| \" + mappedLine.join(\" | \") + \" |\";\r\n });\r\n const head = mappedTab.shift();\r\n return head + lineSeparation + mappedTab.join(\"\\n\");\r\n}\r\n\r\nexport default htmlTableToString;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\nimport htmlTableToString from \"../utils/html-table-to-string\";\r\n\r\n/**\r\n * Normalize the question and add sub informations\r\n * @param langage\r\n * @param question\r\n * @returns\r\n */\r\nfunction createQuestion(config: Config, questionContainer: HTMLElement) {\r\n let question = questionContainer.innerText;\r\n\r\n /* We remove unnecessary information */\r\n const accesshideElements: NodeListOf =\r\n questionContainer.querySelectorAll(\".accesshide\");\r\n for (const useless of accesshideElements) {\r\n question = question.replace(useless.innerText, \"\");\r\n }\r\n\r\n /* Make tables more readable for chat-gpt */\r\n const tables: NodeListOf =\r\n questionContainer.querySelectorAll(\".qtext table\");\r\n for (const table of tables) {\r\n question = question.replace(\r\n table.innerText,\r\n \"\\n\" + htmlTableToString(table) + \"\\n\"\r\n );\r\n }\r\n\r\n return normalizeText(question, false);\r\n}\r\n\r\nexport default createQuestion;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle checkbox and input elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n */\r\nfunction handleRadioAndCheckbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList?.[0] as HTMLInputElement;\r\n\r\n if (!input || (input.type !== \"checkbox\" && input.type !== \"radio\"))\r\n return false;\r\n\r\n for (const input of inputList as NodeListOf) {\r\n const content = normalizeText(input.parentNode.textContent);\r\n const valide = gptAnswer.normalizedResponse.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n if (valide) {\r\n if (config.mouseover) {\r\n input.addEventListener(\"mouseover\", () => (input.checked = true), {\r\n once: true,\r\n });\r\n } else {\r\n input.checked = true;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport default handleRadioAndCheckbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle select elements (and put in order select)\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleSelect(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n if (inputList.length === 0 || inputList[0].tagName !== \"SELECT\") return false;\r\n\r\n let correct = gptAnswer.normalizedResponse.split(\"\\n\");\r\n\r\n if (config.logs) Logs.array(correct);\r\n\r\n /**\r\n * Sometimes ChatGPT give the question so we should remove them\r\n * Example:\r\n * 5*5\r\n * 25\r\n * 10+10\r\n * 20\r\n * 20-10\r\n * 10\r\n *\r\n * And we only want to keep answers\r\n * 25\r\n * 20\r\n * 10\r\n */\r\n if (correct.length === inputList.length * 2) {\r\n correct = correct.filter((answer, index) => index % 2 === 1);\r\n }\r\n\r\n for (let j = 0; j < inputList.length; ++j) {\r\n const options = inputList[j].querySelectorAll(\"option\");\r\n\r\n for (const option of options) {\r\n const content = normalizeText(option.textContent);\r\n const valide = correct[j].includes(content);\r\n\r\n /* Handle put in order question */\r\n if (!/[^\\d]+/gi.test(content)) {\r\n console.log(\"Checking put in order...\");\r\n const content = normalizeText(\r\n (option.parentNode as HTMLElement)\r\n .closest(\"tr\")\r\n .querySelector(\".text\").textContent\r\n );\r\n const index = correct.findIndex((answer) => {\r\n const valide = answer.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n return valide;\r\n });\r\n if (index !== -1) {\r\n if (config.mouseover) {\r\n options[index].closest(\"select\").addEventListener(\r\n \"click\",\r\n function () {\r\n options[index + 1].selected = \"selected\" as any;\r\n },\r\n { once: true }\r\n );\r\n } else {\r\n options[index + 1].selected = \"selected\" as any;\r\n }\r\n break;\r\n }\r\n }\r\n /* End */\r\n\r\n if (config.logs) Logs.responseTry(content, valide);\r\n\r\n if (valide) {\r\n if (config.mouseover) {\r\n option\r\n .closest(\"select\")\r\n .addEventListener(\"click\", () => (option.selected = true), {\r\n once: true,\r\n });\r\n } else {\r\n option.selected = true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleSelect;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle textbox\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleTextbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n (input.tagName !== \"TEXTAREA\" && input.type !== \"text\")\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.value = gptAnswer.response.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleTextbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport titleIndications from \"../../utils/title-indications\";\r\n\r\n/**\r\n * Copy the response in the clipboard if we can automaticaly fill the question\r\n * @param config\r\n * @param gptAnswer\r\n */\r\nfunction handleClipboard(config: Config, gptAnswer: GPTAnswer) {\r\n if (config.title) titleIndications(\"Copied to clipboard\");\r\n navigator.clipboard.writeText(gptAnswer.response);\r\n}\r\n\r\nexport default handleClipboard;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle number input\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleNumber(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (inputList.length !== 1 || input.type !== \"number\") return false;\r\n\r\n const number = gptAnswer.normalizedResponse\r\n .match(/\\d+([,\\.]\\d+)?/gi)?.[0]\r\n ?.replace(\",\", \".\");\r\n\r\n if (!number) return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = number.length + 1;\r\n if (index > number.length) return;\r\n event.preventDefault();\r\n if (number.slice(index, index + 1) === \".\") ++index;\r\n input.value = number.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = number;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleNumber;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Hanlde contenteditable elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleContentEditable(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0];\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n input.getAttribute(\"contenteditable\") !== \"true\"\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.textContent = gptAnswer.response.slice(0, ++index);\r\n\r\n /* Put the cursor at the end of the typed text */\r\n input.focus();\r\n const range = document.createRange();\r\n range.selectNodeContents(input);\r\n range.collapse(false);\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n });\r\n } else {\r\n input.textContent = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleContentEditable;\r\n","import Config from \"../types/config\";\r\nimport Logs from \"../utils/logs\";\r\nimport getChatGPTResponse from \"./get-response\";\r\nimport createQuestion from \"./create-question\";\r\nimport handleRadioAndCheckbox from \"./questions/radio-checkbox\";\r\nimport handleSelect from \"./questions/select\";\r\nimport handleTextbox from \"./questions/textbox\";\r\nimport handleClipboard from \"./questions/clipboard\";\r\nimport handleNumber from \"./questions/number\";\r\nimport handleContentEditable from \"./questions/contenteditable\";\r\nimport { removeListener } from \"./code-listener\";\r\n\r\n/**\r\n * Reply to the question\r\n * @param config\r\n * @param hiddenButton\r\n * @param form\r\n * @param query\r\n * @returns\r\n */\r\nasync function reply(\r\n config: Config,\r\n hiddenButton: HTMLElement,\r\n form: HTMLElement,\r\n query: string\r\n) {\r\n if (config.cursor) hiddenButton.style.cursor = \"wait\";\r\n\r\n const question = createQuestion(config, form);\r\n const inputList: NodeListOf = form.querySelectorAll(query);\r\n\r\n const gptAnswer = await getChatGPTResponse(config, question).catch(\r\n (error) => ({\r\n error,\r\n })\r\n );\r\n\r\n const haveError = typeof gptAnswer === \"object\" && \"error\" in gptAnswer;\r\n\r\n if (config.cursor)\r\n hiddenButton.style.cursor =\r\n config.infinite || haveError ? \"pointer\" : \"initial\";\r\n\r\n if (haveError) {\r\n console.error(gptAnswer.error);\r\n return;\r\n }\r\n\r\n if (config.logs) {\r\n Logs.question(question);\r\n Logs.response(gptAnswer);\r\n }\r\n\r\n /* Handle clipboard mode */\r\n if (config.mode === \"clipboard\") {\r\n if (!config.infinite) removeListener(hiddenButton);\r\n return handleClipboard(config, gptAnswer);\r\n }\r\n\r\n /* Handle question to answer mode */\r\n if (config.mode === \"question-to-answer\") {\r\n removeListener(hiddenButton);\r\n\r\n const questionBackup = form.textContent;\r\n const questionContainer = form.querySelector(\".qtext\");\r\n\r\n questionContainer.textContent = gptAnswer.response;\r\n questionContainer.style.whiteSpace = \"pre-wrap\";\r\n\r\n questionContainer.addEventListener(\"click\", function () {\r\n const isNotResponse = questionContainer.textContent === questionBackup;\r\n questionContainer.style.whiteSpace = isNotResponse ? \"pre-wrap\" : null;\r\n questionContainer.textContent = isNotResponse\r\n ? gptAnswer.response\r\n : questionBackup;\r\n });\r\n return;\r\n }\r\n\r\n /* Better then set once on the event because if there is an error the user can click an other time on the question */\r\n if (!config.infinite) removeListener(hiddenButton);\r\n\r\n const handlers = [\r\n handleContentEditable,\r\n handleTextbox,\r\n handleNumber,\r\n handleSelect,\r\n handleRadioAndCheckbox,\r\n ];\r\n\r\n for (const handler of handlers) {\r\n if (handler(config, inputList, gptAnswer)) return;\r\n }\r\n\r\n /* In the case we can't auto complete the question */\r\n handleClipboard(config, gptAnswer);\r\n}\r\n\r\nexport default reply;\r\n","import Config from \"../types/config\";\r\nimport titleIndications from \"../utils/title-indications\";\r\nimport reply from \"./reply\";\r\n\r\nconst pressedKeys: string[] = [];\r\nconst listeners: {\r\n element: HTMLElement;\r\n fn: (this: HTMLElement, ev: MouseEvent) => any;\r\n}[] = [];\r\n\r\n/**\r\n * Create a listener on the keyboard to inject the code\r\n * @param config\r\n */\r\nfunction codeListener(config: Config) {\r\n document.body.addEventListener(\"keydown\", function (event) {\r\n pressedKeys.push(event.key);\r\n if (pressedKeys.length > config.code.length) pressedKeys.shift();\r\n if (pressedKeys.join(\"\") === config.code) {\r\n pressedKeys.length = 0;\r\n setUpMoodleGpt(config);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Setup moodleGPT into the page (remove/injection)\r\n * @param config\r\n * @returns\r\n */\r\nfunction setUpMoodleGpt(config: Config) {\r\n /* Removing events */\r\n if (listeners.length > 0) {\r\n for (const listener of listeners) {\r\n if (config.cursor) listener.element.style.cursor = \"initial\";\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n if (config.title) titleIndications(\"Removed\");\r\n listeners.length = 0;\r\n return;\r\n }\r\n\r\n /* Code injection */\r\n const inputQuery = [\"checkbox\", \"radio\", \"text\", \"number\"]\r\n .map((e) => `input[type=\"${e}\"]`)\r\n .join(\",\");\r\n const query = inputQuery + \", textarea, select, [contenteditable]\";\r\n const forms = document.querySelectorAll(\".formulation\");\r\n\r\n for (const form of forms) {\r\n const hiddenButton: HTMLElement = form.querySelector(\".qtext\");\r\n\r\n if (config.cursor) hiddenButton.style.cursor = \"pointer\";\r\n\r\n const injectionFunction = reply.bind(\r\n null,\r\n config,\r\n hiddenButton,\r\n form,\r\n query\r\n );\r\n listeners.push({ element: hiddenButton, fn: injectionFunction });\r\n hiddenButton.addEventListener(\"click\", injectionFunction);\r\n }\r\n\r\n if (config.title) titleIndications(\"Injected\");\r\n}\r\n\r\n/**\r\n * Remove the event listener on a specific question\r\n * @param element\r\n */\r\nfunction removeListener(element: HTMLElement) {\r\n const index = listeners.findIndex((listener) => listener.element === element);\r\n if (index !== -1) {\r\n const listener = listeners.splice(index, 1)[0];\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n}\r\n\r\nexport { codeListener, removeListener };\r\n","import { codeListener } from \"./core/code-listener\";\r\n\r\nchrome.storage.sync.get([\"moodleGPT\"]).then(function (storage) {\r\n const config = storage.moodleGPT;\r\n\r\n if (!config) throw new Error(\"Please configure MoodleGPT into the extension\");\r\n\r\n codeListener(config);\r\n});\r\n"],"names":[],"mappings":";;;;;EAAA;;;EAGG;EACH,SAAS,gBAAgB,CAAC,IAAY,EAAA;EACpC,IAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC;EACjC,IAAA,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC;EACtB,IAAA,UAAU,CAAC,OAAO,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;EACvD;;ECRA;EACA;AACA;EACA;EACA;AACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAoGA;EACO,SAAS,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE;EAC7D,IAAI,SAAS,KAAK,CAAC,KAAK,EAAE,EAAE,OAAO,KAAK,YAAY,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,UAAU,OAAO,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;EAChH,IAAI,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,EAAE,UAAU,OAAO,EAAE,MAAM,EAAE;EAC/D,QAAQ,SAAS,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;EACnG,QAAQ,SAAS,QAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;EACtG,QAAQ,SAAS,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,EAAE;EACtH,QAAQ,IAAI,CAAC,CAAC,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;EAC9E,KAAK,CAAC,CAAC;EACP;;ECzHA,MAAM,IAAI,CAAA;MACR,OAAO,QAAQ,CAAC,IAAY,EAAA;UAC1B,MAAM,GAAG,GAAG,aAAa,CAAC;UAC1B,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;OAC5C;EAED,IAAA,OAAO,WAAW,CAAC,IAAY,EAAE,MAAe,EAAA;EAC9C,QAAA,MAAM,GAAG,GAAG,SAAS,IAAI,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC,CAAC;UACnD,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;OAC5C;MAED,OAAO,KAAK,CAAC,GAAc,EAAA;EACzB,QAAA,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;OACjC;MAED,OAAO,QAAQ,CAAC,SAAoB,EAAA;UAClC,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;UAChD,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,SAAS,CAAC,kBAAkB,CAAC,CAAC;OAC7D;EACF;;ECpBD;;;EAGG;EACH,SAAS,aAAa,CAAC,IAAY,EAAE,cAAuB,IAAI,EAAA;MAC9D,IAAI,cAAc,GAAG,IAAI;EACtB,SAAA,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;EACtB,SAAA,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC;EAC5B,SAAA,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;EAE5B,IAAA,IAAI,WAAW;EAAE,QAAA,cAAc,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC;EAE/D,IAAA,QACE,cAAc;EACX,SAAA,IAAI,EAAE;;EAEN,SAAA,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC;EAC7B,SAAA,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC;QACnC;EACJ;;ECfA;;;;;EAKG;EACH,SAAe,kBAAkB,CAC/B,MAAc,EACd,QAAgB,EAAA;;EAEhB,QAAA,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;EACzC,QAAA,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;EACrE,QAAA,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,4CAA4C,EAAE;EACpE,YAAA,MAAM,EAAE,MAAM;EACd,YAAA,OAAO,EAAE;EACP,gBAAA,cAAc,EAAE,kBAAkB;EAClC,gBAAA,aAAa,EAAE,CAAA,OAAA,EAAU,MAAM,CAAC,MAAM,CAAE,CAAA;EACzC,aAAA;EACD,YAAA,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,UAAU,CAAC,MAAM,GAAG,IAAI;EACjD,YAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;kBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;EACnB,gBAAA,QAAQ,EAAE;EACR,oBAAA;EACE,wBAAA,IAAI,EAAE,QAAQ;EACd,wBAAA,OAAO,EAAE,CAAA;;;;;;;;;AASiD,mEAAA,CAAA;EAC3D,qBAAA;EACD,oBAAA,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE;EACpC,iBAAA;EACD,gBAAA,WAAW,EAAE,GAAG;EAChB,gBAAA,KAAK,EAAE,GAAG;EACV,gBAAA,gBAAgB,EAAE,GAAG;EACrB,gBAAA,IAAI,EAAE,IAAI;eACX,CAAC;EACH,SAAA,CAAC,CAAC;UACH,YAAY,CAAC,gBAAgB,CAAC,CAAC;EAC/B,QAAA,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;EAC7B,QAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;UAChD,OAAO;cACL,QAAQ;EACR,YAAA,kBAAkB,EAAE,aAAa,CAAC,QAAQ,CAAC;WAC5C,CAAC;OACH,CAAA,CAAA;EAAA;;ECtDD;;;;EAIG;EACH,SAAS,iBAAiB,CAAC,KAAuB,EAAA;MAChD,MAAM,GAAG,GAAe,EAAE,CAAC;EAC3B,IAAA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;MACvD,MAAM,gBAAgB,GAAa,EAAE,CAAC;EACtC,IAAA,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;EACjB,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;UAC1D,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;;cAC7C,MAAM,OAAO,GAAG,CAAA,EAAA,GAAA,IAAI,CAAC,WAAW,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,IAAI,EAAE,CAAC;cACzC,gBAAgB,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAChC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,EAC5B,OAAO,CAAC,MAAM,IAAI,CAAC,CACpB,CAAC;EACF,YAAA,OAAO,OAAO,CAAC;EACjB,SAAC,CAAC,CAAC;EACH,QAAA,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;EACzB,KAAC,CAAC,CAAC;EAEH,IAAA,MAAM,kBAAkB,GACtB,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;MACnE,MAAM,cAAc,GAClB,IAAI,GAAG,KAAK,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;MAE7D,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;UACjC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,KACzC,OAAO,CAAC,MAAM,CACZ,gBAAgB,CAAC,KAAK,CAAC,EACvB,QAAQ,+BACT,CACF,CAAC;UACF,OAAO,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;EAC9C,KAAC,CAAC,CAAC;EACH,IAAA,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;MAC/B,OAAO,IAAI,GAAG,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;EACtD;;EClCA;;;;;EAKG;EACH,SAAS,cAAc,CAAC,MAAc,EAAE,iBAA8B,EAAA;EACpE,IAAA,IAAI,QAAQ,GAAG,iBAAiB,CAAC,SAAS,CAAC;;MAG3C,MAAM,kBAAkB,GACtB,iBAAiB,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;EACpD,IAAA,KAAK,MAAM,OAAO,IAAI,kBAAkB,EAAE;UACxC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;EACpD,KAAA;;MAGD,MAAM,MAAM,GACV,iBAAiB,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;EACrD,IAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;EAC1B,QAAA,QAAQ,GAAG,QAAQ,CAAC,OAAO,CACzB,KAAK,CAAC,SAAS,EACf,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC,GAAG,IAAI,CACvC,CAAC;EACH,KAAA;EAED,IAAA,OAAO,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;EACxC;;EC1BA;;;;;EAKG;EACH,SAAS,sBAAsB,CAC7B,MAAc,EACd,SAAkC,EAClC,SAAoB,EAAA;MAEpB,MAAM,KAAK,GAAG,SAAS,KAAT,IAAA,IAAA,SAAS,uBAAT,SAAS,CAAG,CAAC,CAAqB,CAAC;EAEjD,IAAA,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;EACjE,QAAA,OAAO,KAAK,CAAC;EAEf,IAAA,KAAK,MAAM,KAAK,IAAI,SAAyC,EAAE;UAC7D,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;UAC5D,MAAM,MAAM,GAAG,SAAS,CAAC,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;UAC9D,IAAI,MAAM,CAAC,IAAI;EAAE,YAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EACnD,QAAA,IAAI,MAAM,EAAE;cACV,IAAI,MAAM,CAAC,SAAS,EAAE;EACpB,gBAAA,KAAK,CAAC,gBAAgB,CAAC,WAAW,EAAE,OAAO,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE;EAChE,oBAAA,IAAI,EAAE,IAAI;EACX,iBAAA,CAAC,CAAC;EACJ,aAAA;EAAM,iBAAA;EACL,gBAAA,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;EACtB,aAAA;EACF,SAAA;EACF,KAAA;EACD,IAAA,OAAO,IAAI,CAAC;EACd;;EC/BA;;;;;;EAMG;EACH,SAAS,YAAY,CACnB,MAAc,EACd,SAAkC,EAClC,SAAoB,EAAA;EAEpB,IAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ;EAAE,QAAA,OAAO,KAAK,CAAC;MAE9E,IAAI,OAAO,GAAG,SAAS,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;MAEvD,IAAI,MAAM,CAAC,IAAI;EAAE,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;EAErC;;;;;;;;;;;;;;EAcG;MACH,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;EAC3C,QAAA,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,KAAK,KAAK,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;EAC9D,KAAA;EAED,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;UACzC,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;EAExD,QAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;cAC5B,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;cAClD,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;;EAG5C,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;EAC7B,gBAAA,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;EACxC,gBAAA,MAAM,OAAO,GAAG,aAAa,CAC1B,MAAM,CAAC,UAA0B;uBAC/B,OAAO,CAAC,IAAI,CAAC;EACb,qBAAA,aAAa,CAAC,OAAO,CAAC,CAAC,WAAW,CACtC,CAAC;kBACF,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,KAAI;sBACzC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;sBACxC,IAAI,MAAM,CAAC,IAAI;EAAE,wBAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EACnD,oBAAA,OAAO,MAAM,CAAC;EAChB,iBAAC,CAAC,CAAC;EACH,gBAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;sBAChB,IAAI,MAAM,CAAC,SAAS,EAAE;EACpB,wBAAA,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,gBAAgB,CAC/C,OAAO,EACP,YAAA;8BACE,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,UAAiB,CAAC;EAClD,yBAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;EACH,qBAAA;EAAM,yBAAA;0BACL,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,UAAiB,CAAC;EACjD,qBAAA;sBACD,MAAM;EACP,iBAAA;EACF,aAAA;;cAGD,IAAI,MAAM,CAAC,IAAI;EAAE,gBAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EAEnD,YAAA,IAAI,MAAM,EAAE;kBACV,IAAI,MAAM,CAAC,SAAS,EAAE;sBACpB,MAAM;2BACH,OAAO,CAAC,QAAQ,CAAC;EACjB,yBAAA,gBAAgB,CAAC,OAAO,EAAE,OAAO,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE;EACzD,wBAAA,IAAI,EAAE,IAAI;EACX,qBAAA,CAAC,CAAC;EACN,iBAAA;EAAM,qBAAA;EACL,oBAAA,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;EACxB,iBAAA;kBACD,MAAM;EACP,aAAA;EACF,SAAA;EACF,KAAA;EAED,IAAA,OAAO,IAAI,CAAC;EACd;;EC9FA;;;;;;EAMG;EACH,SAAS,aAAa,CACpB,MAAc,EACd,SAAkC,EAClC,SAAoB,EAAA;EAEpB,IAAA,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAA2C,CAAC;EAErE,IAAA,IACE,SAAS,CAAC,MAAM,KAAK,CAAC;WACrB,KAAK,CAAC,OAAO,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;EAEvD,QAAA,OAAO,KAAK,CAAC;MAEf,IAAI,MAAM,CAAC,MAAM,EAAE;UACjB,IAAI,KAAK,GAAG,CAAC,CAAC;EACd,QAAA,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,KAAoB,EAAA;EAC9D,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW;kBAAE,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;EACrE,YAAA,IAAI,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM;kBAAE,OAAO;cAC9C,KAAK,CAAC,cAAc,EAAE,CAAC;EACvB,YAAA,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;EACrD,SAAC,CAAC,CAAC;EACJ,KAAA;EAAM,SAAA;EACL,QAAA,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC;EAClC,KAAA;EAED,IAAA,OAAO,IAAI,CAAC;EACd;;EChCA;;;;EAIG;EACH,SAAS,eAAe,CAAC,MAAc,EAAE,SAAoB,EAAA;MAC3D,IAAI,MAAM,CAAC,KAAK;UAAE,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;MAC1D,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;EACpD;;ECTA;;;;;;EAMG;EACH,SAAS,YAAY,CACnB,MAAc,EACd,SAAkC,EAClC,SAAoB,EAAA;;EAEpB,IAAA,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAA2C,CAAC;MAErE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;EAAE,QAAA,OAAO,KAAK,CAAC;EAEpE,IAAA,MAAM,MAAM,GAAG,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,SAAS,CAAC,kBAAkB;EACxC,SAAA,KAAK,CAAC,kBAAkB,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAG,CAAC,CAAC,MAC7B,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;EAEtB,IAAA,IAAI,CAAC,MAAM;EAAE,QAAA,OAAO,KAAK,CAAC;MAE1B,IAAI,MAAM,CAAC,MAAM,EAAE;UACjB,IAAI,KAAK,GAAG,CAAC,CAAC;EACd,QAAA,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,KAAoB,EAAA;EAC9D,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW;EAAE,gBAAA,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;EACzD,YAAA,IAAI,KAAK,GAAG,MAAM,CAAC,MAAM;kBAAE,OAAO;cAClC,KAAK,CAAC,cAAc,EAAE,CAAC;cACvB,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG;EAAE,gBAAA,EAAE,KAAK,CAAC;EACpD,YAAA,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;EACzC,SAAC,CAAC,CAAC;EACJ,KAAA;EAAM,SAAA;EACL,QAAA,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;EACtB,KAAA;EAED,IAAA,OAAO,IAAI,CAAC;EACd;;ECpCA;;;;;;EAMG;EACH,SAAS,qBAAqB,CAC5B,MAAc,EACd,SAAkC,EAClC,SAAoB,EAAA;EAEpB,IAAA,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;EAE3B,IAAA,IACE,SAAS,CAAC,MAAM,KAAK,CAAC;EACtB,QAAA,KAAK,CAAC,YAAY,CAAC,iBAAiB,CAAC,KAAK,MAAM;EAEhD,QAAA,OAAO,KAAK,CAAC;MAEf,IAAI,MAAM,CAAC,MAAM,EAAE;UACjB,IAAI,KAAK,GAAG,CAAC,CAAC;EACd,QAAA,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,KAAoB,EAAA;EAC9D,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW;kBAAE,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;EACrE,YAAA,IAAI,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM;kBAAE,OAAO;cAC9C,KAAK,CAAC,cAAc,EAAE,CAAC;EACvB,YAAA,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;;cAGzD,KAAK,CAAC,KAAK,EAAE,CAAC;EACd,YAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;EACrC,YAAA,KAAK,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;EAChC,YAAA,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;EACtB,YAAA,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;cACxC,SAAS,CAAC,eAAe,EAAE,CAAC;EAC5B,YAAA,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;EAC5B,SAAC,CAAC,CAAC;EACJ,KAAA;EAAM,SAAA;EACL,QAAA,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC,QAAQ,CAAC;EACxC,KAAA;EAED,IAAA,OAAO,IAAI,CAAC;EACd;;ECjCA;;;;;;;EAOG;EACH,SAAe,KAAK,CAClB,MAAc,EACd,YAAyB,EACzB,IAAiB,EACjB,KAAa,EAAA;;UAEb,IAAI,MAAM,CAAC,MAAM;EAAE,YAAA,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;UAEtD,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;UAC9C,MAAM,SAAS,GAA4B,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;EAExE,QAAA,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,CAChE,CAAC,KAAK,MAAM;cACV,KAAK;EACN,SAAA,CAAC,CACH,CAAC;UAEF,MAAM,SAAS,GAAG,OAAO,SAAS,KAAK,QAAQ,IAAI,OAAO,IAAI,SAAS,CAAC;UAExE,IAAI,MAAM,CAAC,MAAM;cACf,YAAY,CAAC,KAAK,CAAC,MAAM;EACvB,gBAAA,MAAM,CAAC,QAAQ,IAAI,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;EAEzD,QAAA,IAAI,SAAS,EAAE;EACb,YAAA,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;cAC/B,OAAO;EACR,SAAA;UAED,IAAI,MAAM,CAAC,IAAI,EAAE;EACf,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;EACxB,YAAA,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;EAC1B,SAAA;;EAGD,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE;cAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ;kBAAE,cAAc,CAAC,YAAY,CAAC,CAAC;EACnD,YAAA,OAAO,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;EAC3C,SAAA;;EAGD,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,oBAAoB,EAAE;cACxC,cAAc,CAAC,YAAY,CAAC,CAAC;EAE7B,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC;cACxC,MAAM,iBAAiB,GAAG,IAAI,CAAC,aAAa,CAAc,QAAQ,CAAC,CAAC;EAEpE,YAAA,iBAAiB,CAAC,WAAW,GAAG,SAAS,CAAC,QAAQ,CAAC;EACnD,YAAA,iBAAiB,CAAC,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;EAEhD,YAAA,iBAAiB,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAA;EAC1C,gBAAA,MAAM,aAAa,GAAG,iBAAiB,CAAC,WAAW,KAAK,cAAc,CAAC;EACvE,gBAAA,iBAAiB,CAAC,KAAK,CAAC,UAAU,GAAG,aAAa,GAAG,UAAU,GAAG,IAAI,CAAC;kBACvE,iBAAiB,CAAC,WAAW,GAAG,aAAa;wBACzC,SAAS,CAAC,QAAQ;wBAClB,cAAc,CAAC;EACrB,aAAC,CAAC,CAAC;cACH,OAAO;EACR,SAAA;;UAGD,IAAI,CAAC,MAAM,CAAC,QAAQ;cAAE,cAAc,CAAC,YAAY,CAAC,CAAC;EAEnD,QAAA,MAAM,QAAQ,GAAG;cACf,qBAAqB;cACrB,aAAa;cACb,YAAY;cACZ,YAAY;cACZ,sBAAsB;WACvB,CAAC;EAEF,QAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;EAC9B,YAAA,IAAI,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC;kBAAE,OAAO;EACnD,SAAA;;EAGD,QAAA,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;OACpC,CAAA,CAAA;EAAA;;EC5FD,MAAM,WAAW,GAAa,EAAE,CAAC;EACjC,MAAM,SAAS,GAGT,EAAE,CAAC;EAET;;;EAGG;EACH,SAAS,YAAY,CAAC,MAAc,EAAA;MAClC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,KAAK,EAAA;EACvD,QAAA,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;UAC5B,IAAI,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM;cAAE,WAAW,CAAC,KAAK,EAAE,CAAC;UACjE,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,IAAI,EAAE;EACxC,YAAA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;cACvB,cAAc,CAAC,MAAM,CAAC,CAAC;EACxB,SAAA;EACH,KAAC,CAAC,CAAC;EACL,CAAC;EAED;;;;EAIG;EACH,SAAS,cAAc,CAAC,MAAc,EAAA;;EAEpC,IAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;EACxB,QAAA,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;cAChC,IAAI,MAAM,CAAC,MAAM;kBAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;cAC7D,QAAQ,CAAC,OAAO,CAAC,mBAAmB,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;EAC5D,SAAA;UACD,IAAI,MAAM,CAAC,KAAK;cAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;EAC9C,QAAA,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;UACrB,OAAO;EACR,KAAA;;MAGD,MAAM,UAAU,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC;WACvD,GAAG,CAAC,CAAC,CAAC,KAAK,CAAA,YAAA,EAAe,CAAC,CAAA,EAAA,CAAI,CAAC;WAChC,IAAI,CAAC,GAAG,CAAC,CAAC;EACb,IAAA,MAAM,KAAK,GAAG,UAAU,GAAG,uCAAuC,CAAC;MACnE,MAAM,KAAK,GAAG,QAAQ,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;EAExD,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;UACxB,MAAM,YAAY,GAAgB,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;UAE/D,IAAI,MAAM,CAAC,MAAM;EAAE,YAAA,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;EAEzD,QAAA,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAClC,IAAI,EACJ,MAAM,EACN,YAAY,EACZ,IAAI,EACJ,KAAK,CACN,CAAC;EACF,QAAA,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,iBAAiB,EAAE,CAAC,CAAC;EACjE,QAAA,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;EAC3D,KAAA;MAED,IAAI,MAAM,CAAC,KAAK;UAAE,gBAAgB,CAAC,UAAU,CAAC,CAAC;EACjD,CAAC;EAED;;;EAGG;EACH,SAAS,cAAc,CAAC,OAAoB,EAAA;EAC1C,IAAA,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;EAC9E,IAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;EAChB,QAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;UAC/C,QAAQ,CAAC,OAAO,CAAC,mBAAmB,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;EAC5D,KAAA;EACH;;EC5EA,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,OAAO,EAAA;EAC3D,IAAA,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;EAEjC,IAAA,IAAI,CAAC,MAAM;EAAE,QAAA,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;MAE9E,YAAY,CAAC,MAAM,CAAC,CAAC;EACvB,CAAC,CAAC;;;;;;","x_google_ignoreList":[1]} \ No newline at end of file diff --git a/src/core/get-response.ts b/src/core/get-response.ts index 9d844d9..b3b9e28 100644 --- a/src/core/get-response.ts +++ b/src/core/get-response.ts @@ -30,11 +30,10 @@ async function getChatGPTResponse( Follow those rules: - Sometimes there won't be a question, so just answer the statement as you normally would without following the other rules and give the most detailled and complete answer with explication. - Your goal is to understand the statement and to reply to each question by giving only the answer. -- You will keep the same order for the answers as the questions event if it's a put in order question. +- You will keep the same order for the answers as it's asked event if it's a put in order question. Never change the order of the response for each questions. - You will separate all the answer with new lines and only show the correctes one. -- You should answer in the same order as it is ine the question even if it's a put in order question. -- You will omit the question or any other text/information we just want the correct answer. -- You should only give exactly the same text as the question for each answer. +- You will onyl give the answers for each question and omit the questions, statement, title or other informations from the response. +- You will only give answer with exactly the same text as the gived answers. - The question always have the good answer so you should always give an answer to the question. - You will always respond in the same langage as the user question.`, }, diff --git a/src/core/questions/select.ts b/src/core/questions/select.ts index 0592468..4497821 100644 --- a/src/core/questions/select.ts +++ b/src/core/questions/select.ts @@ -49,19 +49,20 @@ function handleSelect( /* Handle put in order question */ if (!/[^\d]+/gi.test(content)) { + console.log("Checking put in order..."); const content = normalizeText( (option.parentNode as HTMLElement) .closest("tr") .querySelector(".text").textContent ); - const index = correct.findIndex((c) => { - const valide = c.includes(content); + const index = correct.findIndex((answer) => { + const valide = answer.includes(content); if (config.logs) Logs.responseTry(content, valide); return valide; }); if (index !== -1) { if (config.mouseover) { - options[index + 1].closest("select").addEventListener( + options[index].closest("select").addEventListener( "click", function () { options[index + 1].selected = "selected" as any; From 46b4ebb7b74a232109f727cbd0c7aee4e2209528 Mon Sep 17 00:00:00 2001 From: yoannchb-pro <71560747+yoannchb-pro@users.noreply.github.com> Date: Tue, 20 Jun 2023 20:31:08 -0400 Subject: [PATCH 30/35] minified extension file --- extension/MoodleGPT.js | 543 +------------------------------------ extension/MoodleGPT.js.map | 2 +- package.json | 5 +- rollup.config.js | 3 +- 4 files changed, 6 insertions(+), 547 deletions(-) diff --git a/extension/MoodleGPT.js b/extension/MoodleGPT.js index 64206b7..0d0487e 100644 --- a/extension/MoodleGPT.js +++ b/extension/MoodleGPT.js @@ -1,543 +1,2 @@ -(function (factory) { - typeof define === 'function' && define.amd ? define(factory) : - factory(); -})((function () { 'use strict'; - - /** - * Show some informations into the document title and remove it after 3000ms - * @param text - */ - function titleIndications(text) { - const backTitle = document.title; - document.title = text; - setTimeout(() => (document.title = backTitle), 3000); - } - - /****************************************************************************** - Copyright (c) Microsoft Corporation. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR - OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. - ***************************************************************************** */ - - function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - } - - class Logs { - static question(text) { - const css = "color: cyan"; - console.log("%c[QUESTION]: %s", css, text); - } - static responseTry(text, valide) { - const css = "color: " + (valide ? "green" : "red"); - console.log("%c[CHECKING]: %s", css, text); - } - static array(arr) { - console.log("[CORRECTS] ", arr); - } - static response(gptAnswer) { - console.log("Original:\n" + gptAnswer.response); - console.log("Normalized:\n" + gptAnswer.normalizedResponse); - } - } - - /** - * Normlize text - * @param text - */ - function normalizeText(text, toLowerCase = true) { - let normalizedText = text - .replace(/\n+/gi, "\n") //remove duplicate new lines - .replace(/(\n\s*\n)+/g, "\n") //remove useless white sapce from textcontent - .replace(/[ \t]+/gi, " "); //replace multiples space or tabs by a space - if (toLowerCase) - normalizedText = normalizedText.toLowerCase(); - return (normalizedText - .trim() - /* We remove that because sometimes ChatGPT will reply: "answer d" */ - .replace(/^[a-z\d]\.\s/gi, "") //a. text, b. text, c. text, 1. text, 2. text, 3.text - .replace(/\n[a-z\d]\.\s/gi, "\n") //same but with new line - ); - } - - /** - * Get the response from chatGPT api - * @param config - * @param question - * @returns - */ - function getChatGPTResponse(config, question) { - return __awaiter(this, void 0, void 0, function* () { - const controller = new AbortController(); - const timeoutControler = setTimeout(() => controller.abort(), 15000); - const req = yield fetch("https://api.openai.com/v1/chat/completions", { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${config.apiKey}`, - }, - signal: config.timeout ? controller.signal : null, - body: JSON.stringify({ - model: config.model, - messages: [ - { - role: "system", - content: ` -Follow those rules: -- Sometimes there won't be a question, so just answer the statement as you normally would without following the other rules and give the most detailled and complete answer with explication. -- Your goal is to understand the statement and to reply to each question by giving only the answer. -- You will keep the same order for the answers as it's asked event if it's a put in order question. Never change the order of the response for each questions. -- You will separate all the answer with new lines and only show the correctes one. -- You will onyl give the answers for each question and omit the questions, statement, title or other informations from the response. -- You will only give answer with exactly the same text as the gived answers. -- The question always have the good answer so you should always give an answer to the question. -- You will always respond in the same langage as the user question.`, - }, - { role: "user", content: question }, - ], - temperature: 0.8, - top_p: 1.0, - presence_penalty: 1.0, - stop: null, - }), - }); - clearTimeout(timeoutControler); - const rep = yield req.json(); - const response = rep.choices[0].message.content; - return { - response, - normalizedResponse: normalizeText(response), - }; - }); - } - - /** - * Convert table to representating string table - * @param table - * @returns - */ - function htmlTableToString(table) { - const tab = []; - const lines = Array.from(table.querySelectorAll("tr")); - const maxColumnsLength = []; - lines.map((line) => { - const cells = Array.from(line.querySelectorAll("td, th")); - const cellsContent = cells.map((cell, index) => { - var _a; - const content = (_a = cell.textContent) === null || _a === void 0 ? void 0 : _a.trim(); - maxColumnsLength[index] = Math.max(maxColumnsLength[index] || 0, content.length || 0); - return content; - }); - tab.push(cellsContent); - }); - const lineSeparationSize = maxColumnsLength.reduce((a, b) => a + b) + tab[0].length * 3 + 1; - const lineSeparation = "\n" + Array(lineSeparationSize).fill("-").join("") + "\n"; - const mappedTab = tab.map((line) => { - const mappedLine = line.map((content, index) => content.padEnd(maxColumnsLength[index], "\u00A0" /* For no matching with \s */)); - return "| " + mappedLine.join(" | ") + " |"; - }); - const head = mappedTab.shift(); - return head + lineSeparation + mappedTab.join("\n"); - } - - /** - * Normalize the question and add sub informations - * @param langage - * @param question - * @returns - */ - function createQuestion(config, questionContainer) { - let question = questionContainer.innerText; - /* We remove unnecessary information */ - const accesshideElements = questionContainer.querySelectorAll(".accesshide"); - for (const useless of accesshideElements) { - question = question.replace(useless.innerText, ""); - } - /* Make tables more readable for chat-gpt */ - const tables = questionContainer.querySelectorAll(".qtext table"); - for (const table of tables) { - question = question.replace(table.innerText, "\n" + htmlTableToString(table) + "\n"); - } - return normalizeText(question, false); - } - - /** - * Handle checkbox and input elements - * @param config - * @param inputList - * @param gptAnswer - */ - function handleRadioAndCheckbox(config, inputList, gptAnswer) { - const input = inputList === null || inputList === void 0 ? void 0 : inputList[0]; - if (!input || (input.type !== "checkbox" && input.type !== "radio")) - return false; - for (const input of inputList) { - const content = normalizeText(input.parentNode.textContent); - const valide = gptAnswer.normalizedResponse.includes(content); - if (config.logs) - Logs.responseTry(content, valide); - if (valide) { - if (config.mouseover) { - input.addEventListener("mouseover", () => (input.checked = true), { - once: true, - }); - } - else { - input.checked = true; - } - } - } - return true; - } - - /** - * Handle select elements (and put in order select) - * @param config - * @param inputList - * @param gptAnswer - * @returns - */ - function handleSelect(config, inputList, gptAnswer) { - if (inputList.length === 0 || inputList[0].tagName !== "SELECT") - return false; - let correct = gptAnswer.normalizedResponse.split("\n"); - if (config.logs) - Logs.array(correct); - /** - * Sometimes ChatGPT give the question so we should remove them - * Example: - * 5*5 - * 25 - * 10+10 - * 20 - * 20-10 - * 10 - * - * And we only want to keep answers - * 25 - * 20 - * 10 - */ - if (correct.length === inputList.length * 2) { - correct = correct.filter((answer, index) => index % 2 === 1); - } - for (let j = 0; j < inputList.length; ++j) { - const options = inputList[j].querySelectorAll("option"); - for (const option of options) { - const content = normalizeText(option.textContent); - const valide = correct[j].includes(content); - /* Handle put in order question */ - if (!/[^\d]+/gi.test(content)) { - console.log("Checking put in order..."); - const content = normalizeText(option.parentNode - .closest("tr") - .querySelector(".text").textContent); - const index = correct.findIndex((answer) => { - const valide = answer.includes(content); - if (config.logs) - Logs.responseTry(content, valide); - return valide; - }); - if (index !== -1) { - if (config.mouseover) { - options[index].closest("select").addEventListener("click", function () { - options[index + 1].selected = "selected"; - }, { once: true }); - } - else { - options[index + 1].selected = "selected"; - } - break; - } - } - /* End */ - if (config.logs) - Logs.responseTry(content, valide); - if (valide) { - if (config.mouseover) { - option - .closest("select") - .addEventListener("click", () => (option.selected = true), { - once: true, - }); - } - else { - option.selected = true; - } - break; - } - } - } - return true; - } - - /** - * Handle textbox - * @param config - * @param inputList - * @param gptAnswer - * @returns - */ - function handleTextbox(config, inputList, gptAnswer) { - const input = inputList[0]; - if (inputList.length !== 1 || - (input.tagName !== "TEXTAREA" && input.type !== "text")) - return false; - if (config.typing) { - let index = 0; - input.addEventListener("keydown", function (event) { - if (event.key === "Backspace") - index = gptAnswer.response.length + 1; - if (index > gptAnswer.response.length) - return; - event.preventDefault(); - input.value = gptAnswer.response.slice(0, ++index); - }); - } - else { - input.value = gptAnswer.response; - } - return true; - } - - /** - * Copy the response in the clipboard if we can automaticaly fill the question - * @param config - * @param gptAnswer - */ - function handleClipboard(config, gptAnswer) { - if (config.title) - titleIndications("Copied to clipboard"); - navigator.clipboard.writeText(gptAnswer.response); - } - - /** - * Handle number input - * @param config - * @param inputList - * @param gptAnswer - * @returns - */ - function handleNumber(config, inputList, gptAnswer) { - var _a, _b; - const input = inputList[0]; - if (inputList.length !== 1 || input.type !== "number") - return false; - const number = (_b = (_a = gptAnswer.normalizedResponse - .match(/\d+([,\.]\d+)?/gi)) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.replace(",", "."); - if (!number) - return false; - if (config.typing) { - let index = 0; - input.addEventListener("keydown", function (event) { - if (event.key === "Backspace") - index = number.length + 1; - if (index > number.length) - return; - event.preventDefault(); - if (number.slice(index, index + 1) === ".") - ++index; - input.value = number.slice(0, ++index); - }); - } - else { - input.value = number; - } - return true; - } - - /** - * Hanlde contenteditable elements - * @param config - * @param inputList - * @param gptAnswer - * @returns - */ - function handleContentEditable(config, inputList, gptAnswer) { - const input = inputList[0]; - if (inputList.length !== 1 || - input.getAttribute("contenteditable") !== "true") - return false; - if (config.typing) { - let index = 0; - input.addEventListener("keydown", function (event) { - if (event.key === "Backspace") - index = gptAnswer.response.length + 1; - if (index > gptAnswer.response.length) - return; - event.preventDefault(); - input.textContent = gptAnswer.response.slice(0, ++index); - /* Put the cursor at the end of the typed text */ - input.focus(); - const range = document.createRange(); - range.selectNodeContents(input); - range.collapse(false); - const selection = window.getSelection(); - selection.removeAllRanges(); - selection.addRange(range); - }); - } - else { - input.textContent = gptAnswer.response; - } - return true; - } - - /** - * Reply to the question - * @param config - * @param hiddenButton - * @param form - * @param query - * @returns - */ - function reply(config, hiddenButton, form, query) { - return __awaiter(this, void 0, void 0, function* () { - if (config.cursor) - hiddenButton.style.cursor = "wait"; - const question = createQuestion(config, form); - const inputList = form.querySelectorAll(query); - const gptAnswer = yield getChatGPTResponse(config, question).catch((error) => ({ - error, - })); - const haveError = typeof gptAnswer === "object" && "error" in gptAnswer; - if (config.cursor) - hiddenButton.style.cursor = - config.infinite || haveError ? "pointer" : "initial"; - if (haveError) { - console.error(gptAnswer.error); - return; - } - if (config.logs) { - Logs.question(question); - Logs.response(gptAnswer); - } - /* Handle clipboard mode */ - if (config.mode === "clipboard") { - if (!config.infinite) - removeListener(hiddenButton); - return handleClipboard(config, gptAnswer); - } - /* Handle question to answer mode */ - if (config.mode === "question-to-answer") { - removeListener(hiddenButton); - const questionBackup = form.textContent; - const questionContainer = form.querySelector(".qtext"); - questionContainer.textContent = gptAnswer.response; - questionContainer.style.whiteSpace = "pre-wrap"; - questionContainer.addEventListener("click", function () { - const isNotResponse = questionContainer.textContent === questionBackup; - questionContainer.style.whiteSpace = isNotResponse ? "pre-wrap" : null; - questionContainer.textContent = isNotResponse - ? gptAnswer.response - : questionBackup; - }); - return; - } - /* Better then set once on the event because if there is an error the user can click an other time on the question */ - if (!config.infinite) - removeListener(hiddenButton); - const handlers = [ - handleContentEditable, - handleTextbox, - handleNumber, - handleSelect, - handleRadioAndCheckbox, - ]; - for (const handler of handlers) { - if (handler(config, inputList, gptAnswer)) - return; - } - /* In the case we can't auto complete the question */ - handleClipboard(config, gptAnswer); - }); - } - - const pressedKeys = []; - const listeners = []; - /** - * Create a listener on the keyboard to inject the code - * @param config - */ - function codeListener(config) { - document.body.addEventListener("keydown", function (event) { - pressedKeys.push(event.key); - if (pressedKeys.length > config.code.length) - pressedKeys.shift(); - if (pressedKeys.join("") === config.code) { - pressedKeys.length = 0; - setUpMoodleGpt(config); - } - }); - } - /** - * Setup moodleGPT into the page (remove/injection) - * @param config - * @returns - */ - function setUpMoodleGpt(config) { - /* Removing events */ - if (listeners.length > 0) { - for (const listener of listeners) { - if (config.cursor) - listener.element.style.cursor = "initial"; - listener.element.removeEventListener("click", listener.fn); - } - if (config.title) - titleIndications("Removed"); - listeners.length = 0; - return; - } - /* Code injection */ - const inputQuery = ["checkbox", "radio", "text", "number"] - .map((e) => `input[type="${e}"]`) - .join(","); - const query = inputQuery + ", textarea, select, [contenteditable]"; - const forms = document.querySelectorAll(".formulation"); - for (const form of forms) { - const hiddenButton = form.querySelector(".qtext"); - if (config.cursor) - hiddenButton.style.cursor = "pointer"; - const injectionFunction = reply.bind(null, config, hiddenButton, form, query); - listeners.push({ element: hiddenButton, fn: injectionFunction }); - hiddenButton.addEventListener("click", injectionFunction); - } - if (config.title) - titleIndications("Injected"); - } - /** - * Remove the event listener on a specific question - * @param element - */ - function removeListener(element) { - const index = listeners.findIndex((listener) => listener.element === element); - if (index !== -1) { - const listener = listeners.splice(index, 1)[0]; - listener.element.removeEventListener("click", listener.fn); - } - } - - chrome.storage.sync.get(["moodleGPT"]).then(function (storage) { - const config = storage.moodleGPT; - if (!config) - throw new Error("Please configure MoodleGPT into the extension"); - codeListener(config); - }); - -})); +!function(e){"function"==typeof define&&define.amd?define(e):e()}((function(){"use strict";function e(e){const t=document.title;document.title=e,setTimeout((()=>document.title=t),3e3)}function t(e,t,n,o){return new(n||(n=Promise))((function(r,s){function i(e){try{c(o.next(e))}catch(e){s(e)}}function l(e){try{c(o.throw(e))}catch(e){s(e)}}function c(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(i,l)}c((o=o.apply(e,t||[])).next())}))}class n{static question(e){console.log("%c[QUESTION]: %s","color: cyan",e)}static responseTry(e,t){const n="color: "+(t?"green":"red");console.log("%c[CHECKING]: %s",n,e)}static array(e){console.log("[CORRECTS] ",e)}static response(e){console.log("Original:\n"+e.response),console.log("Normalized:\n"+e.normalizedResponse)}}function o(e,t=!0){let n=e.replace(/\n+/gi,"\n").replace(/(\n\s*\n)+/g,"\n").replace(/[ \t]+/gi," ");return t&&(n=n.toLowerCase()),n.trim().replace(/^[a-z\d]\.\s/gi,"").replace(/\n[a-z\d]\.\s/gi,"\n")}function r(e){const t=[],n=Array.from(e.querySelectorAll("tr")),o=[];n.map((e=>{const n=Array.from(e.querySelectorAll("td, th")).map(((e,t)=>{var n;const r=null===(n=e.textContent)||void 0===n?void 0:n.trim();return o[t]=Math.max(o[t]||0,r.length||0),r}));t.push(n)}));const r=o.reduce(((e,t)=>e+t))+3*t[0].length+1,s="\n"+Array(r).fill("-").join("")+"\n",i=t.map((e=>"| "+e.map(((e,t)=>e.padEnd(o[t]," "))).join(" | ")+" |"));return i.shift()+s+i.join("\n")}function s(e,t,r){const s=null==t?void 0:t[0];if(!s||"checkbox"!==s.type&&"radio"!==s.type)return!1;for(const s of t){const t=o(s.parentNode.textContent),i=r.normalizedResponse.includes(t);e.logs&&n.responseTry(t,i),i&&(e.mouseover?s.addEventListener("mouseover",(()=>s.checked=!0),{once:!0}):s.checked=!0)}return!0}function i(e,t,r){if(0===t.length||"SELECT"!==t[0].tagName)return!1;let s=r.normalizedResponse.split("\n");e.logs&&n.array(s),s.length===2*t.length&&(s=s.filter(((e,t)=>t%2==1)));for(let r=0;r{const o=t.includes(r);return e.logs&&n.responseTry(r,o),o}));if(-1!==l){e.mouseover?i[l].closest("select").addEventListener("click",(function(){i[l+1].selected="selected"}),{once:!0}):i[l+1].selected="selected";break}}if(e.logs&&n.responseTry(l,c),c){e.mouseover?t.closest("select").addEventListener("click",(()=>t.selected=!0),{once:!0}):t.selected=!0;break}}}return!0}function l(e,t,n){const o=t[0];if(1!==t.length||"TEXTAREA"!==o.tagName&&"text"!==o.type)return!1;if(e.typing){let e=0;o.addEventListener("keydown",(function(t){"Backspace"===t.key&&(e=n.response.length+1),e>n.response.length||(t.preventDefault(),o.value=n.response.slice(0,++e))}))}else o.value=n.response;return!0}function c(t,n){t.title&&e("Copied to clipboard"),navigator.clipboard.writeText(n.response)}function a(e,t,n){var o,r;const s=t[0];if(1!==t.length||"number"!==s.type)return!1;const i=null===(r=null===(o=n.normalizedResponse.match(/\d+([,\.]\d+)?/gi))||void 0===o?void 0:o[0])||void 0===r?void 0:r.replace(",",".");if(!i)return!1;if(e.typing){let e=0;s.addEventListener("keydown",(function(t){"Backspace"===t.key&&(e=i.length+1),e>i.length||(t.preventDefault(),"."===i.slice(e,e+1)&&++e,s.value=i.slice(0,++e))}))}else s.value=i;return!0}function u(e,t,n){const o=t[0];if(1!==t.length||"true"!==o.getAttribute("contenteditable"))return!1;if(e.typing){let e=0;o.addEventListener("keydown",(function(t){if("Backspace"===t.key&&(e=n.response.length+1),e>n.response.length)return;t.preventDefault(),o.textContent=n.response.slice(0,++e),o.focus();const r=document.createRange();r.selectNodeContents(o),r.collapse(!1);const s=window.getSelection();s.removeAllRanges(),s.addRange(r)}))}else o.textContent=n.response;return!0}function d(e,d,f,p){return t(this,void 0,void 0,(function*(){e.cursor&&(d.style.cursor="wait");const h=function(e,t){let n=t.innerText;const s=t.querySelectorAll(".accesshide");for(const e of s)n=n.replace(e.innerText,"");const i=t.querySelectorAll(".qtext table");for(const e of i)n=n.replace(e.innerText,"\n"+r(e)+"\n");return o(n,!1)}(0,f),g=f.querySelectorAll(p),y=yield function(e,n){return t(this,void 0,void 0,(function*(){const t=new AbortController,r=setTimeout((()=>t.abort()),15e3),s=yield fetch("https://api.openai.com/v1/chat/completions",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},signal:e.timeout?t.signal:null,body:JSON.stringify({model:e.model,messages:[{role:"system",content:"\nFollow those rules:\n- Sometimes there won't be a question, so just answer the statement as you normally would without following the other rules and give the most detailled and complete answer with explication.\n- Your goal is to understand the statement and to reply to each question by giving only the answer.\n- You will keep the same order for the answers as it's asked event if it's a put in order question. Never change the order of the response for each questions.\n- You will separate all the answer with new lines and only show the correctes one.\n- You will onyl give the answers for each question and omit the questions, statement, title or other informations from the response.\n- You will only give answer with exactly the same text as the gived answers.\n- The question always have the good answer so you should always give an answer to the question.\n- You will always respond in the same langage as the user question."},{role:"user",content:n}],temperature:.8,top_p:1,presence_penalty:1,stop:null})});clearTimeout(r);const i=(yield s.json()).choices[0].message.content;return{response:i,normalizedResponse:o(i)}}))}(e,h).catch((e=>({error:e}))),v="object"==typeof y&&"error"in y;if(e.cursor&&(d.style.cursor=e.infinite||v?"pointer":"initial"),v)return void console.error(y.error);if(e.logs&&(n.question(h),n.response(y)),"clipboard"===e.mode)return e.infinite||m(d),c(e,y);if("question-to-answer"===e.mode){m(d);const e=f.textContent,t=f.querySelector(".qtext");return t.textContent=y.response,t.style.whiteSpace="pre-wrap",void t.addEventListener("click",(function(){const n=t.textContent===e;t.style.whiteSpace=n?"pre-wrap":null,t.textContent=n?y.response:e}))}e.infinite||m(d);const w=[u,l,a,i,s];for(const t of w)if(t(e,g,y))return;c(e,y)}))}const f=[],p=[];function h(t){document.body.addEventListener("keydown",(function(n){f.push(n.key),f.length>t.code.length&&f.shift(),f.join("")===t.code&&(f.length=0,function(t){if(p.length>0){for(const e of p)t.cursor&&(e.element.style.cursor="initial"),e.element.removeEventListener("click",e.fn);return t.title&&e("Removed"),void(p.length=0)}const n=["checkbox","radio","text","number"].map((e=>`input[type="${e}"]`)).join(",")+", textarea, select, [contenteditable]",o=document.querySelectorAll(".formulation");for(const e of o){const o=e.querySelector(".qtext");t.cursor&&(o.style.cursor="pointer");const r=d.bind(null,t,o,e,n);p.push({element:o,fn:r}),o.addEventListener("click",r)}t.title&&e("Injected")}(t))}))}function m(e){const t=p.findIndex((t=>t.element===e));if(-1!==t){const e=p.splice(t,1)[0];e.element.removeEventListener("click",e.fn)}}chrome.storage.sync.get(["moodleGPT"]).then((function(e){const t=e.moodleGPT;if(!t)throw new Error("Please configure MoodleGPT into the extension");h(t)}))})); //# sourceMappingURL=MoodleGPT.js.map diff --git a/extension/MoodleGPT.js.map b/extension/MoodleGPT.js.map index 34ae998..4ac858e 100644 --- a/extension/MoodleGPT.js.map +++ b/extension/MoodleGPT.js.map @@ -1 +1 @@ -{"version":3,"file":"MoodleGPT.js","sources":["../src/utils/title-indications.ts","../node_modules/tslib/tslib.es6.js","../src/utils/logs.ts","../src/utils/normalize-text.ts","../src/core/get-response.ts","../src/utils/html-table-to-string.ts","../src/core/create-question.ts","../src/core/questions/radio-checkbox.ts","../src/core/questions/select.ts","../src/core/questions/textbox.ts","../src/core/questions/clipboard.ts","../src/core/questions/number.ts","../src/core/questions/contenteditable.ts","../src/core/reply.ts","../src/core/code-listener.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Show some informations into the document title and remove it after 3000ms\r\n * @param text\r\n */\r\nfunction titleIndications(text: string) {\r\n const backTitle = document.title;\r\n document.title = text;\r\n setTimeout(() => (document.title = backTitle), 3000);\r\n}\r\n\r\nexport default titleIndications;\r\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.push(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.push(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","import GPTAnswer from \"../types/gptAnswer\";\r\nclass Logs {\r\n static question(text: string) {\r\n const css = \"color: cyan\";\r\n console.log(\"%c[QUESTION]: %s\", css, text);\r\n }\r\n\r\n static responseTry(text: string, valide: boolean) {\r\n const css = \"color: \" + (valide ? \"green\" : \"red\");\r\n console.log(\"%c[CHECKING]: %s\", css, text);\r\n }\r\n\r\n static array(arr: unknown[]) {\r\n console.log(\"[CORRECTS] \", arr);\r\n }\r\n\r\n static response(gptAnswer: GPTAnswer) {\r\n console.log(\"Original:\\n\" + gptAnswer.response);\r\n console.log(\"Normalized:\\n\" + gptAnswer.normalizedResponse);\r\n }\r\n}\r\n\r\nexport default Logs;\r\n","/**\r\n * Normlize text\r\n * @param text\r\n */\r\nfunction normalizeText(text: string, toLowerCase: boolean = true) {\r\n let normalizedText = text\r\n .replace(/\\n+/gi, \"\\n\") //remove duplicate new lines\r\n .replace(/(\\n\\s*\\n)+/g, \"\\n\") //remove useless white sapce from textcontent\r\n .replace(/[ \\t]+/gi, \" \"); //replace multiples space or tabs by a space\r\n\r\n if (toLowerCase) normalizedText = normalizedText.toLowerCase();\r\n\r\n return (\r\n normalizedText\r\n .trim()\r\n /* We remove that because sometimes ChatGPT will reply: \"answer d\" */\r\n .replace(/^[a-z\\d]\\.\\s/gi, \"\") //a. text, b. text, c. text, 1. text, 2. text, 3.text\r\n .replace(/\\n[a-z\\d]\\.\\s/gi, \"\\n\") //same but with new line\r\n );\r\n}\r\n\r\nexport default normalizeText;\r\n","import Config from \"../types/config\";\r\nimport GPTAnswer from \"../types/gptAnswer\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\n\r\n/**\r\n * Get the response from chatGPT api\r\n * @param config\r\n * @param question\r\n * @returns\r\n */\r\nasync function getChatGPTResponse(\r\n config: Config,\r\n question: string\r\n): Promise {\r\n const controller = new AbortController();\r\n const timeoutControler = setTimeout(() => controller.abort(), 15000);\r\n const req = await fetch(\"https://api.openai.com/v1/chat/completions\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${config.apiKey}`,\r\n },\r\n signal: config.timeout ? controller.signal : null,\r\n body: JSON.stringify({\r\n model: config.model,\r\n messages: [\r\n {\r\n role: \"system\",\r\n content: `\r\nFollow those rules:\r\n- Sometimes there won't be a question, so just answer the statement as you normally would without following the other rules and give the most detailled and complete answer with explication.\r\n- Your goal is to understand the statement and to reply to each question by giving only the answer.\r\n- You will keep the same order for the answers as it's asked event if it's a put in order question. Never change the order of the response for each questions.\r\n- You will separate all the answer with new lines and only show the correctes one.\r\n- You will onyl give the answers for each question and omit the questions, statement, title or other informations from the response.\r\n- You will only give answer with exactly the same text as the gived answers.\r\n- The question always have the good answer so you should always give an answer to the question.\r\n- You will always respond in the same langage as the user question.`,\r\n },\r\n { role: \"user\", content: question },\r\n ],\r\n temperature: 0.8,\r\n top_p: 1.0,\r\n presence_penalty: 1.0,\r\n stop: null,\r\n }),\r\n });\r\n clearTimeout(timeoutControler);\r\n const rep = await req.json();\r\n const response = rep.choices[0].message.content;\r\n return {\r\n response,\r\n normalizedResponse: normalizeText(response),\r\n };\r\n}\r\n\r\nexport default getChatGPTResponse;\r\n","/**\r\n * Convert table to representating string table\r\n * @param table\r\n * @returns\r\n */\r\nfunction htmlTableToString(table: HTMLTableElement) {\r\n const tab: string[][] = [];\r\n const lines = Array.from(table.querySelectorAll(\"tr\"));\r\n const maxColumnsLength: number[] = [];\r\n lines.map((line) => {\r\n const cells = Array.from(line.querySelectorAll(\"td, th\"));\r\n const cellsContent = cells.map((cell, index) => {\r\n const content = cell.textContent?.trim();\r\n maxColumnsLength[index] = Math.max(\r\n maxColumnsLength[index] || 0,\r\n content.length || 0\r\n );\r\n return content;\r\n });\r\n tab.push(cellsContent);\r\n });\r\n\r\n const lineSeparationSize =\r\n maxColumnsLength.reduce((a, b) => a + b) + tab[0].length * 3 + 1;\r\n const lineSeparation =\r\n \"\\n\" + Array(lineSeparationSize).fill(\"-\").join(\"\") + \"\\n\";\r\n\r\n const mappedTab = tab.map((line) => {\r\n const mappedLine = line.map((content, index) =>\r\n content.padEnd(\r\n maxColumnsLength[index],\r\n \"\\u00A0\" /* For no matching with \\s */\r\n )\r\n );\r\n return \"| \" + mappedLine.join(\" | \") + \" |\";\r\n });\r\n const head = mappedTab.shift();\r\n return head + lineSeparation + mappedTab.join(\"\\n\");\r\n}\r\n\r\nexport default htmlTableToString;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\nimport htmlTableToString from \"../utils/html-table-to-string\";\r\n\r\n/**\r\n * Normalize the question and add sub informations\r\n * @param langage\r\n * @param question\r\n * @returns\r\n */\r\nfunction createQuestion(config: Config, questionContainer: HTMLElement) {\r\n let question = questionContainer.innerText;\r\n\r\n /* We remove unnecessary information */\r\n const accesshideElements: NodeListOf =\r\n questionContainer.querySelectorAll(\".accesshide\");\r\n for (const useless of accesshideElements) {\r\n question = question.replace(useless.innerText, \"\");\r\n }\r\n\r\n /* Make tables more readable for chat-gpt */\r\n const tables: NodeListOf =\r\n questionContainer.querySelectorAll(\".qtext table\");\r\n for (const table of tables) {\r\n question = question.replace(\r\n table.innerText,\r\n \"\\n\" + htmlTableToString(table) + \"\\n\"\r\n );\r\n }\r\n\r\n return normalizeText(question, false);\r\n}\r\n\r\nexport default createQuestion;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle checkbox and input elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n */\r\nfunction handleRadioAndCheckbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList?.[0] as HTMLInputElement;\r\n\r\n if (!input || (input.type !== \"checkbox\" && input.type !== \"radio\"))\r\n return false;\r\n\r\n for (const input of inputList as NodeListOf) {\r\n const content = normalizeText(input.parentNode.textContent);\r\n const valide = gptAnswer.normalizedResponse.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n if (valide) {\r\n if (config.mouseover) {\r\n input.addEventListener(\"mouseover\", () => (input.checked = true), {\r\n once: true,\r\n });\r\n } else {\r\n input.checked = true;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport default handleRadioAndCheckbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle select elements (and put in order select)\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleSelect(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n if (inputList.length === 0 || inputList[0].tagName !== \"SELECT\") return false;\r\n\r\n let correct = gptAnswer.normalizedResponse.split(\"\\n\");\r\n\r\n if (config.logs) Logs.array(correct);\r\n\r\n /**\r\n * Sometimes ChatGPT give the question so we should remove them\r\n * Example:\r\n * 5*5\r\n * 25\r\n * 10+10\r\n * 20\r\n * 20-10\r\n * 10\r\n *\r\n * And we only want to keep answers\r\n * 25\r\n * 20\r\n * 10\r\n */\r\n if (correct.length === inputList.length * 2) {\r\n correct = correct.filter((answer, index) => index % 2 === 1);\r\n }\r\n\r\n for (let j = 0; j < inputList.length; ++j) {\r\n const options = inputList[j].querySelectorAll(\"option\");\r\n\r\n for (const option of options) {\r\n const content = normalizeText(option.textContent);\r\n const valide = correct[j].includes(content);\r\n\r\n /* Handle put in order question */\r\n if (!/[^\\d]+/gi.test(content)) {\r\n console.log(\"Checking put in order...\");\r\n const content = normalizeText(\r\n (option.parentNode as HTMLElement)\r\n .closest(\"tr\")\r\n .querySelector(\".text\").textContent\r\n );\r\n const index = correct.findIndex((answer) => {\r\n const valide = answer.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n return valide;\r\n });\r\n if (index !== -1) {\r\n if (config.mouseover) {\r\n options[index].closest(\"select\").addEventListener(\r\n \"click\",\r\n function () {\r\n options[index + 1].selected = \"selected\" as any;\r\n },\r\n { once: true }\r\n );\r\n } else {\r\n options[index + 1].selected = \"selected\" as any;\r\n }\r\n break;\r\n }\r\n }\r\n /* End */\r\n\r\n if (config.logs) Logs.responseTry(content, valide);\r\n\r\n if (valide) {\r\n if (config.mouseover) {\r\n option\r\n .closest(\"select\")\r\n .addEventListener(\"click\", () => (option.selected = true), {\r\n once: true,\r\n });\r\n } else {\r\n option.selected = true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleSelect;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle textbox\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleTextbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n (input.tagName !== \"TEXTAREA\" && input.type !== \"text\")\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.value = gptAnswer.response.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleTextbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport titleIndications from \"../../utils/title-indications\";\r\n\r\n/**\r\n * Copy the response in the clipboard if we can automaticaly fill the question\r\n * @param config\r\n * @param gptAnswer\r\n */\r\nfunction handleClipboard(config: Config, gptAnswer: GPTAnswer) {\r\n if (config.title) titleIndications(\"Copied to clipboard\");\r\n navigator.clipboard.writeText(gptAnswer.response);\r\n}\r\n\r\nexport default handleClipboard;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle number input\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleNumber(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (inputList.length !== 1 || input.type !== \"number\") return false;\r\n\r\n const number = gptAnswer.normalizedResponse\r\n .match(/\\d+([,\\.]\\d+)?/gi)?.[0]\r\n ?.replace(\",\", \".\");\r\n\r\n if (!number) return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = number.length + 1;\r\n if (index > number.length) return;\r\n event.preventDefault();\r\n if (number.slice(index, index + 1) === \".\") ++index;\r\n input.value = number.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = number;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleNumber;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Hanlde contenteditable elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleContentEditable(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0];\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n input.getAttribute(\"contenteditable\") !== \"true\"\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.textContent = gptAnswer.response.slice(0, ++index);\r\n\r\n /* Put the cursor at the end of the typed text */\r\n input.focus();\r\n const range = document.createRange();\r\n range.selectNodeContents(input);\r\n range.collapse(false);\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n });\r\n } else {\r\n input.textContent = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleContentEditable;\r\n","import Config from \"../types/config\";\r\nimport Logs from \"../utils/logs\";\r\nimport getChatGPTResponse from \"./get-response\";\r\nimport createQuestion from \"./create-question\";\r\nimport handleRadioAndCheckbox from \"./questions/radio-checkbox\";\r\nimport handleSelect from \"./questions/select\";\r\nimport handleTextbox from \"./questions/textbox\";\r\nimport handleClipboard from \"./questions/clipboard\";\r\nimport handleNumber from \"./questions/number\";\r\nimport handleContentEditable from \"./questions/contenteditable\";\r\nimport { removeListener } from \"./code-listener\";\r\n\r\n/**\r\n * Reply to the question\r\n * @param config\r\n * @param hiddenButton\r\n * @param form\r\n * @param query\r\n * @returns\r\n */\r\nasync function reply(\r\n config: Config,\r\n hiddenButton: HTMLElement,\r\n form: HTMLElement,\r\n query: string\r\n) {\r\n if (config.cursor) hiddenButton.style.cursor = \"wait\";\r\n\r\n const question = createQuestion(config, form);\r\n const inputList: NodeListOf = form.querySelectorAll(query);\r\n\r\n const gptAnswer = await getChatGPTResponse(config, question).catch(\r\n (error) => ({\r\n error,\r\n })\r\n );\r\n\r\n const haveError = typeof gptAnswer === \"object\" && \"error\" in gptAnswer;\r\n\r\n if (config.cursor)\r\n hiddenButton.style.cursor =\r\n config.infinite || haveError ? \"pointer\" : \"initial\";\r\n\r\n if (haveError) {\r\n console.error(gptAnswer.error);\r\n return;\r\n }\r\n\r\n if (config.logs) {\r\n Logs.question(question);\r\n Logs.response(gptAnswer);\r\n }\r\n\r\n /* Handle clipboard mode */\r\n if (config.mode === \"clipboard\") {\r\n if (!config.infinite) removeListener(hiddenButton);\r\n return handleClipboard(config, gptAnswer);\r\n }\r\n\r\n /* Handle question to answer mode */\r\n if (config.mode === \"question-to-answer\") {\r\n removeListener(hiddenButton);\r\n\r\n const questionBackup = form.textContent;\r\n const questionContainer = form.querySelector(\".qtext\");\r\n\r\n questionContainer.textContent = gptAnswer.response;\r\n questionContainer.style.whiteSpace = \"pre-wrap\";\r\n\r\n questionContainer.addEventListener(\"click\", function () {\r\n const isNotResponse = questionContainer.textContent === questionBackup;\r\n questionContainer.style.whiteSpace = isNotResponse ? \"pre-wrap\" : null;\r\n questionContainer.textContent = isNotResponse\r\n ? gptAnswer.response\r\n : questionBackup;\r\n });\r\n return;\r\n }\r\n\r\n /* Better then set once on the event because if there is an error the user can click an other time on the question */\r\n if (!config.infinite) removeListener(hiddenButton);\r\n\r\n const handlers = [\r\n handleContentEditable,\r\n handleTextbox,\r\n handleNumber,\r\n handleSelect,\r\n handleRadioAndCheckbox,\r\n ];\r\n\r\n for (const handler of handlers) {\r\n if (handler(config, inputList, gptAnswer)) return;\r\n }\r\n\r\n /* In the case we can't auto complete the question */\r\n handleClipboard(config, gptAnswer);\r\n}\r\n\r\nexport default reply;\r\n","import Config from \"../types/config\";\r\nimport titleIndications from \"../utils/title-indications\";\r\nimport reply from \"./reply\";\r\n\r\nconst pressedKeys: string[] = [];\r\nconst listeners: {\r\n element: HTMLElement;\r\n fn: (this: HTMLElement, ev: MouseEvent) => any;\r\n}[] = [];\r\n\r\n/**\r\n * Create a listener on the keyboard to inject the code\r\n * @param config\r\n */\r\nfunction codeListener(config: Config) {\r\n document.body.addEventListener(\"keydown\", function (event) {\r\n pressedKeys.push(event.key);\r\n if (pressedKeys.length > config.code.length) pressedKeys.shift();\r\n if (pressedKeys.join(\"\") === config.code) {\r\n pressedKeys.length = 0;\r\n setUpMoodleGpt(config);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Setup moodleGPT into the page (remove/injection)\r\n * @param config\r\n * @returns\r\n */\r\nfunction setUpMoodleGpt(config: Config) {\r\n /* Removing events */\r\n if (listeners.length > 0) {\r\n for (const listener of listeners) {\r\n if (config.cursor) listener.element.style.cursor = \"initial\";\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n if (config.title) titleIndications(\"Removed\");\r\n listeners.length = 0;\r\n return;\r\n }\r\n\r\n /* Code injection */\r\n const inputQuery = [\"checkbox\", \"radio\", \"text\", \"number\"]\r\n .map((e) => `input[type=\"${e}\"]`)\r\n .join(\",\");\r\n const query = inputQuery + \", textarea, select, [contenteditable]\";\r\n const forms = document.querySelectorAll(\".formulation\");\r\n\r\n for (const form of forms) {\r\n const hiddenButton: HTMLElement = form.querySelector(\".qtext\");\r\n\r\n if (config.cursor) hiddenButton.style.cursor = \"pointer\";\r\n\r\n const injectionFunction = reply.bind(\r\n null,\r\n config,\r\n hiddenButton,\r\n form,\r\n query\r\n );\r\n listeners.push({ element: hiddenButton, fn: injectionFunction });\r\n hiddenButton.addEventListener(\"click\", injectionFunction);\r\n }\r\n\r\n if (config.title) titleIndications(\"Injected\");\r\n}\r\n\r\n/**\r\n * Remove the event listener on a specific question\r\n * @param element\r\n */\r\nfunction removeListener(element: HTMLElement) {\r\n const index = listeners.findIndex((listener) => listener.element === element);\r\n if (index !== -1) {\r\n const listener = listeners.splice(index, 1)[0];\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n}\r\n\r\nexport { codeListener, removeListener };\r\n","import { codeListener } from \"./core/code-listener\";\r\n\r\nchrome.storage.sync.get([\"moodleGPT\"]).then(function (storage) {\r\n const config = storage.moodleGPT;\r\n\r\n if (!config) throw new Error(\"Please configure MoodleGPT into the extension\");\r\n\r\n codeListener(config);\r\n});\r\n"],"names":[],"mappings":"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","x_google_ignoreList":[1]} \ No newline at end of file +{"version":3,"file":"MoodleGPT.js","sources":["../src/utils/title-indications.ts","../node_modules/tslib/tslib.es6.js","../src/utils/logs.ts","../src/utils/normalize-text.ts","../src/utils/html-table-to-string.ts","../src/core/questions/radio-checkbox.ts","../src/core/questions/select.ts","../src/core/questions/textbox.ts","../src/core/questions/clipboard.ts","../src/core/questions/number.ts","../src/core/questions/contenteditable.ts","../src/core/reply.ts","../src/core/create-question.ts","../src/core/get-response.ts","../src/core/code-listener.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Show some informations into the document title and remove it after 3000ms\r\n * @param text\r\n */\r\nfunction titleIndications(text: string) {\r\n const backTitle = document.title;\r\n document.title = text;\r\n setTimeout(() => (document.title = backTitle), 3000);\r\n}\r\n\r\nexport default titleIndications;\r\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.push(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.push(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","import GPTAnswer from \"../types/gptAnswer\";\r\nclass Logs {\r\n static question(text: string) {\r\n const css = \"color: cyan\";\r\n console.log(\"%c[QUESTION]: %s\", css, text);\r\n }\r\n\r\n static responseTry(text: string, valide: boolean) {\r\n const css = \"color: \" + (valide ? \"green\" : \"red\");\r\n console.log(\"%c[CHECKING]: %s\", css, text);\r\n }\r\n\r\n static array(arr: unknown[]) {\r\n console.log(\"[CORRECTS] \", arr);\r\n }\r\n\r\n static response(gptAnswer: GPTAnswer) {\r\n console.log(\"Original:\\n\" + gptAnswer.response);\r\n console.log(\"Normalized:\\n\" + gptAnswer.normalizedResponse);\r\n }\r\n}\r\n\r\nexport default Logs;\r\n","/**\r\n * Normlize text\r\n * @param text\r\n */\r\nfunction normalizeText(text: string, toLowerCase: boolean = true) {\r\n let normalizedText = text\r\n .replace(/\\n+/gi, \"\\n\") //remove duplicate new lines\r\n .replace(/(\\n\\s*\\n)+/g, \"\\n\") //remove useless white sapce from textcontent\r\n .replace(/[ \\t]+/gi, \" \"); //replace multiples space or tabs by a space\r\n\r\n if (toLowerCase) normalizedText = normalizedText.toLowerCase();\r\n\r\n return (\r\n normalizedText\r\n .trim()\r\n /* We remove that because sometimes ChatGPT will reply: \"answer d\" */\r\n .replace(/^[a-z\\d]\\.\\s/gi, \"\") //a. text, b. text, c. text, 1. text, 2. text, 3.text\r\n .replace(/\\n[a-z\\d]\\.\\s/gi, \"\\n\") //same but with new line\r\n );\r\n}\r\n\r\nexport default normalizeText;\r\n","/**\r\n * Convert table to representating string table\r\n * @param table\r\n * @returns\r\n */\r\nfunction htmlTableToString(table: HTMLTableElement) {\r\n const tab: string[][] = [];\r\n const lines = Array.from(table.querySelectorAll(\"tr\"));\r\n const maxColumnsLength: number[] = [];\r\n lines.map((line) => {\r\n const cells = Array.from(line.querySelectorAll(\"td, th\"));\r\n const cellsContent = cells.map((cell, index) => {\r\n const content = cell.textContent?.trim();\r\n maxColumnsLength[index] = Math.max(\r\n maxColumnsLength[index] || 0,\r\n content.length || 0\r\n );\r\n return content;\r\n });\r\n tab.push(cellsContent);\r\n });\r\n\r\n const lineSeparationSize =\r\n maxColumnsLength.reduce((a, b) => a + b) + tab[0].length * 3 + 1;\r\n const lineSeparation =\r\n \"\\n\" + Array(lineSeparationSize).fill(\"-\").join(\"\") + \"\\n\";\r\n\r\n const mappedTab = tab.map((line) => {\r\n const mappedLine = line.map((content, index) =>\r\n content.padEnd(\r\n maxColumnsLength[index],\r\n \"\\u00A0\" /* For no matching with \\s */\r\n )\r\n );\r\n return \"| \" + mappedLine.join(\" | \") + \" |\";\r\n });\r\n const head = mappedTab.shift();\r\n return head + lineSeparation + mappedTab.join(\"\\n\");\r\n}\r\n\r\nexport default htmlTableToString;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle checkbox and input elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n */\r\nfunction handleRadioAndCheckbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList?.[0] as HTMLInputElement;\r\n\r\n if (!input || (input.type !== \"checkbox\" && input.type !== \"radio\"))\r\n return false;\r\n\r\n for (const input of inputList as NodeListOf) {\r\n const content = normalizeText(input.parentNode.textContent);\r\n const valide = gptAnswer.normalizedResponse.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n if (valide) {\r\n if (config.mouseover) {\r\n input.addEventListener(\"mouseover\", () => (input.checked = true), {\r\n once: true,\r\n });\r\n } else {\r\n input.checked = true;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport default handleRadioAndCheckbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle select elements (and put in order select)\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleSelect(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n if (inputList.length === 0 || inputList[0].tagName !== \"SELECT\") return false;\r\n\r\n let correct = gptAnswer.normalizedResponse.split(\"\\n\");\r\n\r\n if (config.logs) Logs.array(correct);\r\n\r\n /**\r\n * Sometimes ChatGPT give the question so we should remove them\r\n * Example:\r\n * 5*5\r\n * 25\r\n * 10+10\r\n * 20\r\n * 20-10\r\n * 10\r\n *\r\n * And we only want to keep answers\r\n * 25\r\n * 20\r\n * 10\r\n */\r\n if (correct.length === inputList.length * 2) {\r\n correct = correct.filter((answer, index) => index % 2 === 1);\r\n }\r\n\r\n for (let j = 0; j < inputList.length; ++j) {\r\n const options = inputList[j].querySelectorAll(\"option\");\r\n\r\n for (const option of options) {\r\n const content = normalizeText(option.textContent);\r\n const valide = correct[j].includes(content);\r\n\r\n /* Handle put in order question */\r\n if (!/[^\\d]+/gi.test(content)) {\r\n console.log(\"Checking put in order...\");\r\n const content = normalizeText(\r\n (option.parentNode as HTMLElement)\r\n .closest(\"tr\")\r\n .querySelector(\".text\").textContent\r\n );\r\n const index = correct.findIndex((answer) => {\r\n const valide = answer.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n return valide;\r\n });\r\n if (index !== -1) {\r\n if (config.mouseover) {\r\n options[index].closest(\"select\").addEventListener(\r\n \"click\",\r\n function () {\r\n options[index + 1].selected = \"selected\" as any;\r\n },\r\n { once: true }\r\n );\r\n } else {\r\n options[index + 1].selected = \"selected\" as any;\r\n }\r\n break;\r\n }\r\n }\r\n /* End */\r\n\r\n if (config.logs) Logs.responseTry(content, valide);\r\n\r\n if (valide) {\r\n if (config.mouseover) {\r\n option\r\n .closest(\"select\")\r\n .addEventListener(\"click\", () => (option.selected = true), {\r\n once: true,\r\n });\r\n } else {\r\n option.selected = true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleSelect;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle textbox\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleTextbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n (input.tagName !== \"TEXTAREA\" && input.type !== \"text\")\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.value = gptAnswer.response.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleTextbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport titleIndications from \"../../utils/title-indications\";\r\n\r\n/**\r\n * Copy the response in the clipboard if we can automaticaly fill the question\r\n * @param config\r\n * @param gptAnswer\r\n */\r\nfunction handleClipboard(config: Config, gptAnswer: GPTAnswer) {\r\n if (config.title) titleIndications(\"Copied to clipboard\");\r\n navigator.clipboard.writeText(gptAnswer.response);\r\n}\r\n\r\nexport default handleClipboard;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle number input\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleNumber(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (inputList.length !== 1 || input.type !== \"number\") return false;\r\n\r\n const number = gptAnswer.normalizedResponse\r\n .match(/\\d+([,\\.]\\d+)?/gi)?.[0]\r\n ?.replace(\",\", \".\");\r\n\r\n if (!number) return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = number.length + 1;\r\n if (index > number.length) return;\r\n event.preventDefault();\r\n if (number.slice(index, index + 1) === \".\") ++index;\r\n input.value = number.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = number;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleNumber;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Hanlde contenteditable elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleContentEditable(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0];\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n input.getAttribute(\"contenteditable\") !== \"true\"\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.textContent = gptAnswer.response.slice(0, ++index);\r\n\r\n /* Put the cursor at the end of the typed text */\r\n input.focus();\r\n const range = document.createRange();\r\n range.selectNodeContents(input);\r\n range.collapse(false);\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n });\r\n } else {\r\n input.textContent = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleContentEditable;\r\n","import Config from \"../types/config\";\r\nimport Logs from \"../utils/logs\";\r\nimport getChatGPTResponse from \"./get-response\";\r\nimport createQuestion from \"./create-question\";\r\nimport handleRadioAndCheckbox from \"./questions/radio-checkbox\";\r\nimport handleSelect from \"./questions/select\";\r\nimport handleTextbox from \"./questions/textbox\";\r\nimport handleClipboard from \"./questions/clipboard\";\r\nimport handleNumber from \"./questions/number\";\r\nimport handleContentEditable from \"./questions/contenteditable\";\r\nimport { removeListener } from \"./code-listener\";\r\n\r\n/**\r\n * Reply to the question\r\n * @param config\r\n * @param hiddenButton\r\n * @param form\r\n * @param query\r\n * @returns\r\n */\r\nasync function reply(\r\n config: Config,\r\n hiddenButton: HTMLElement,\r\n form: HTMLElement,\r\n query: string\r\n) {\r\n if (config.cursor) hiddenButton.style.cursor = \"wait\";\r\n\r\n const question = createQuestion(config, form);\r\n const inputList: NodeListOf = form.querySelectorAll(query);\r\n\r\n const gptAnswer = await getChatGPTResponse(config, question).catch(\r\n (error) => ({\r\n error,\r\n })\r\n );\r\n\r\n const haveError = typeof gptAnswer === \"object\" && \"error\" in gptAnswer;\r\n\r\n if (config.cursor)\r\n hiddenButton.style.cursor =\r\n config.infinite || haveError ? \"pointer\" : \"initial\";\r\n\r\n if (haveError) {\r\n console.error(gptAnswer.error);\r\n return;\r\n }\r\n\r\n if (config.logs) {\r\n Logs.question(question);\r\n Logs.response(gptAnswer);\r\n }\r\n\r\n /* Handle clipboard mode */\r\n if (config.mode === \"clipboard\") {\r\n if (!config.infinite) removeListener(hiddenButton);\r\n return handleClipboard(config, gptAnswer);\r\n }\r\n\r\n /* Handle question to answer mode */\r\n if (config.mode === \"question-to-answer\") {\r\n removeListener(hiddenButton);\r\n\r\n const questionBackup = form.textContent;\r\n const questionContainer = form.querySelector(\".qtext\");\r\n\r\n questionContainer.textContent = gptAnswer.response;\r\n questionContainer.style.whiteSpace = \"pre-wrap\";\r\n\r\n questionContainer.addEventListener(\"click\", function () {\r\n const isNotResponse = questionContainer.textContent === questionBackup;\r\n questionContainer.style.whiteSpace = isNotResponse ? \"pre-wrap\" : null;\r\n questionContainer.textContent = isNotResponse\r\n ? gptAnswer.response\r\n : questionBackup;\r\n });\r\n return;\r\n }\r\n\r\n /* Better then set once on the event because if there is an error the user can click an other time on the question */\r\n if (!config.infinite) removeListener(hiddenButton);\r\n\r\n const handlers = [\r\n handleContentEditable,\r\n handleTextbox,\r\n handleNumber,\r\n handleSelect,\r\n handleRadioAndCheckbox,\r\n ];\r\n\r\n for (const handler of handlers) {\r\n if (handler(config, inputList, gptAnswer)) return;\r\n }\r\n\r\n /* In the case we can't auto complete the question */\r\n handleClipboard(config, gptAnswer);\r\n}\r\n\r\nexport default reply;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\nimport htmlTableToString from \"../utils/html-table-to-string\";\r\n\r\n/**\r\n * Normalize the question and add sub informations\r\n * @param langage\r\n * @param question\r\n * @returns\r\n */\r\nfunction createQuestion(config: Config, questionContainer: HTMLElement) {\r\n let question = questionContainer.innerText;\r\n\r\n /* We remove unnecessary information */\r\n const accesshideElements: NodeListOf =\r\n questionContainer.querySelectorAll(\".accesshide\");\r\n for (const useless of accesshideElements) {\r\n question = question.replace(useless.innerText, \"\");\r\n }\r\n\r\n /* Make tables more readable for chat-gpt */\r\n const tables: NodeListOf =\r\n questionContainer.querySelectorAll(\".qtext table\");\r\n for (const table of tables) {\r\n question = question.replace(\r\n table.innerText,\r\n \"\\n\" + htmlTableToString(table) + \"\\n\"\r\n );\r\n }\r\n\r\n return normalizeText(question, false);\r\n}\r\n\r\nexport default createQuestion;\r\n","import Config from \"../types/config\";\r\nimport GPTAnswer from \"../types/gptAnswer\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\n\r\n/**\r\n * Get the response from chatGPT api\r\n * @param config\r\n * @param question\r\n * @returns\r\n */\r\nasync function getChatGPTResponse(\r\n config: Config,\r\n question: string\r\n): Promise {\r\n const controller = new AbortController();\r\n const timeoutControler = setTimeout(() => controller.abort(), 15000);\r\n const req = await fetch(\"https://api.openai.com/v1/chat/completions\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${config.apiKey}`,\r\n },\r\n signal: config.timeout ? controller.signal : null,\r\n body: JSON.stringify({\r\n model: config.model,\r\n messages: [\r\n {\r\n role: \"system\",\r\n content: `\r\nFollow those rules:\r\n- Sometimes there won't be a question, so just answer the statement as you normally would without following the other rules and give the most detailled and complete answer with explication.\r\n- Your goal is to understand the statement and to reply to each question by giving only the answer.\r\n- You will keep the same order for the answers as it's asked event if it's a put in order question. Never change the order of the response for each questions.\r\n- You will separate all the answer with new lines and only show the correctes one.\r\n- You will onyl give the answers for each question and omit the questions, statement, title or other informations from the response.\r\n- You will only give answer with exactly the same text as the gived answers.\r\n- The question always have the good answer so you should always give an answer to the question.\r\n- You will always respond in the same langage as the user question.`,\r\n },\r\n { role: \"user\", content: question },\r\n ],\r\n temperature: 0.8,\r\n top_p: 1.0,\r\n presence_penalty: 1.0,\r\n stop: null,\r\n }),\r\n });\r\n clearTimeout(timeoutControler);\r\n const rep = await req.json();\r\n const response = rep.choices[0].message.content;\r\n return {\r\n response,\r\n normalizedResponse: normalizeText(response),\r\n };\r\n}\r\n\r\nexport default getChatGPTResponse;\r\n","import Config from \"../types/config\";\r\nimport titleIndications from \"../utils/title-indications\";\r\nimport reply from \"./reply\";\r\n\r\nconst pressedKeys: string[] = [];\r\nconst listeners: {\r\n element: HTMLElement;\r\n fn: (this: HTMLElement, ev: MouseEvent) => any;\r\n}[] = [];\r\n\r\n/**\r\n * Create a listener on the keyboard to inject the code\r\n * @param config\r\n */\r\nfunction codeListener(config: Config) {\r\n document.body.addEventListener(\"keydown\", function (event) {\r\n pressedKeys.push(event.key);\r\n if (pressedKeys.length > config.code.length) pressedKeys.shift();\r\n if (pressedKeys.join(\"\") === config.code) {\r\n pressedKeys.length = 0;\r\n setUpMoodleGpt(config);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Setup moodleGPT into the page (remove/injection)\r\n * @param config\r\n * @returns\r\n */\r\nfunction setUpMoodleGpt(config: Config) {\r\n /* Removing events */\r\n if (listeners.length > 0) {\r\n for (const listener of listeners) {\r\n if (config.cursor) listener.element.style.cursor = \"initial\";\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n if (config.title) titleIndications(\"Removed\");\r\n listeners.length = 0;\r\n return;\r\n }\r\n\r\n /* Code injection */\r\n const inputQuery = [\"checkbox\", \"radio\", \"text\", \"number\"]\r\n .map((e) => `input[type=\"${e}\"]`)\r\n .join(\",\");\r\n const query = inputQuery + \", textarea, select, [contenteditable]\";\r\n const forms = document.querySelectorAll(\".formulation\");\r\n\r\n for (const form of forms) {\r\n const hiddenButton: HTMLElement = form.querySelector(\".qtext\");\r\n\r\n if (config.cursor) hiddenButton.style.cursor = \"pointer\";\r\n\r\n const injectionFunction = reply.bind(\r\n null,\r\n config,\r\n hiddenButton,\r\n form,\r\n query\r\n );\r\n listeners.push({ element: hiddenButton, fn: injectionFunction });\r\n hiddenButton.addEventListener(\"click\", injectionFunction);\r\n }\r\n\r\n if (config.title) titleIndications(\"Injected\");\r\n}\r\n\r\n/**\r\n * Remove the event listener on a specific question\r\n * @param element\r\n */\r\nfunction removeListener(element: HTMLElement) {\r\n const index = listeners.findIndex((listener) => listener.element === element);\r\n if (index !== -1) {\r\n const listener = listeners.splice(index, 1)[0];\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n}\r\n\r\nexport { codeListener, removeListener };\r\n","import { codeListener } from \"./core/code-listener\";\r\n\r\nchrome.storage.sync.get([\"moodleGPT\"]).then(function (storage) {\r\n const config = storage.moodleGPT;\r\n\r\n if (!config) throw new Error(\"Please configure MoodleGPT into the extension\");\r\n\r\n codeListener(config);\r\n});\r\n"],"names":["titleIndications","text","backTitle","document","title","setTimeout","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","Logs","static","console","log","valide","css","arr","gptAnswer","response","normalizedResponse","normalizeText","toLowerCase","normalizedText","replace","trim","htmlTableToString","table","tab","lines","Array","from","querySelectorAll","maxColumnsLength","map","line","cellsContent","cell","index","content","_a","textContent","Math","max","length","push","lineSeparationSize","reduce","a","b","lineSeparation","fill","join","mappedTab","padEnd","shift","handleRadioAndCheckbox","config","inputList","input","type","parentNode","includes","logs","responseTry","mouseover","addEventListener","checked","once","handleSelect","tagName","correct","split","array","filter","answer","j","options","option","test","closest","querySelector","findIndex","selected","handleTextbox","typing","event","key","preventDefault","slice","handleClipboard","navigator","clipboard","writeText","handleNumber","number","_b","match","handleContentEditable","getAttribute","focus","range","createRange","selectNodeContents","collapse","selection","window","getSelection","removeAllRanges","addRange","reply","hiddenButton","form","query","cursor","style","question","questionContainer","innerText","accesshideElements","useless","tables","createQuestion","controller","AbortController","timeoutControler","abort","req","fetch","method","headers","Authorization","apiKey","signal","timeout","body","JSON","stringify","model","messages","role","temperature","top_p","presence_penalty","stop","clearTimeout","json","choices","message","getChatGPTResponse","catch","error","haveError","infinite","mode","removeListener","questionBackup","whiteSpace","isNotResponse","handlers","handler","pressedKeys","listeners","codeListener","code","listener","element","removeEventListener","fn","forms","injectionFunction","bind","setUpMoodleGpt","splice","chrome","storage","sync","get","moodleGPT","Error"],"mappings":"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","x_google_ignoreList":[1]} \ No newline at end of file diff --git a/package.json b/package.json index 8a6f118..0e25c09 100644 --- a/package.json +++ b/package.json @@ -23,11 +23,10 @@ }, "homepage": "https://github.com/yoannchb-pro/MoodleGPT#readme", "devDependencies": { + "@types/chrome": "^0.0.224", + "@rollup/plugin-terser": "^0.4.3", "rollup": "^3.20.0", "rollup-plugin-ts": "^3.2.0", "typescript": "^5.0.2" - }, - "dependencies": { - "@types/chrome": "^0.0.224" } } diff --git a/rollup.config.js b/rollup.config.js index f3f3780..ea4a70e 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,4 +1,5 @@ const ts = require("rollup-plugin-ts"); +const terser = require("@rollup/plugin-terser"); const config = require("./tsconfig.json"); @@ -11,5 +12,5 @@ module.exports = { sourcemap: true, }, ], - plugins: [ts(config)], + plugins: [ts(config), terser()], }; From 4d18aaf1b25f1e0b0bd4092fe6922677a608c4e0 Mon Sep 17 00:00:00 2001 From: yoannchb-pro <71560747+yoannchb-pro@users.noreply.github.com> Date: Tue, 20 Jun 2023 21:17:58 -0400 Subject: [PATCH 31/35] fixed put in order questions --- extension/MoodleGPT.js | 2 +- extension/MoodleGPT.js.map | 2 +- src/core/get-response.ts | 5 +++-- src/core/questions/select.ts | 23 ++++++++++++----------- test/fake-moodle/index.html | 11 ++++------- 5 files changed, 21 insertions(+), 22 deletions(-) diff --git a/extension/MoodleGPT.js b/extension/MoodleGPT.js index 0d0487e..ca4c87f 100644 --- a/extension/MoodleGPT.js +++ b/extension/MoodleGPT.js @@ -1,2 +1,2 @@ -!function(e){"function"==typeof define&&define.amd?define(e):e()}((function(){"use strict";function e(e){const t=document.title;document.title=e,setTimeout((()=>document.title=t),3e3)}function t(e,t,n,o){return new(n||(n=Promise))((function(r,s){function i(e){try{c(o.next(e))}catch(e){s(e)}}function l(e){try{c(o.throw(e))}catch(e){s(e)}}function c(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(i,l)}c((o=o.apply(e,t||[])).next())}))}class n{static question(e){console.log("%c[QUESTION]: %s","color: cyan",e)}static responseTry(e,t){const n="color: "+(t?"green":"red");console.log("%c[CHECKING]: %s",n,e)}static array(e){console.log("[CORRECTS] ",e)}static response(e){console.log("Original:\n"+e.response),console.log("Normalized:\n"+e.normalizedResponse)}}function o(e,t=!0){let n=e.replace(/\n+/gi,"\n").replace(/(\n\s*\n)+/g,"\n").replace(/[ \t]+/gi," ");return t&&(n=n.toLowerCase()),n.trim().replace(/^[a-z\d]\.\s/gi,"").replace(/\n[a-z\d]\.\s/gi,"\n")}function r(e){const t=[],n=Array.from(e.querySelectorAll("tr")),o=[];n.map((e=>{const n=Array.from(e.querySelectorAll("td, th")).map(((e,t)=>{var n;const r=null===(n=e.textContent)||void 0===n?void 0:n.trim();return o[t]=Math.max(o[t]||0,r.length||0),r}));t.push(n)}));const r=o.reduce(((e,t)=>e+t))+3*t[0].length+1,s="\n"+Array(r).fill("-").join("")+"\n",i=t.map((e=>"| "+e.map(((e,t)=>e.padEnd(o[t]," "))).join(" | ")+" |"));return i.shift()+s+i.join("\n")}function s(e,t,r){const s=null==t?void 0:t[0];if(!s||"checkbox"!==s.type&&"radio"!==s.type)return!1;for(const s of t){const t=o(s.parentNode.textContent),i=r.normalizedResponse.includes(t);e.logs&&n.responseTry(t,i),i&&(e.mouseover?s.addEventListener("mouseover",(()=>s.checked=!0),{once:!0}):s.checked=!0)}return!0}function i(e,t,r){if(0===t.length||"SELECT"!==t[0].tagName)return!1;let s=r.normalizedResponse.split("\n");e.logs&&n.array(s),s.length===2*t.length&&(s=s.filter(((e,t)=>t%2==1)));for(let r=0;r{const o=t.includes(r);return e.logs&&n.responseTry(r,o),o}));if(-1!==l){e.mouseover?i[l].closest("select").addEventListener("click",(function(){i[l+1].selected="selected"}),{once:!0}):i[l+1].selected="selected";break}}if(e.logs&&n.responseTry(l,c),c){e.mouseover?t.closest("select").addEventListener("click",(()=>t.selected=!0),{once:!0}):t.selected=!0;break}}}return!0}function l(e,t,n){const o=t[0];if(1!==t.length||"TEXTAREA"!==o.tagName&&"text"!==o.type)return!1;if(e.typing){let e=0;o.addEventListener("keydown",(function(t){"Backspace"===t.key&&(e=n.response.length+1),e>n.response.length||(t.preventDefault(),o.value=n.response.slice(0,++e))}))}else o.value=n.response;return!0}function c(t,n){t.title&&e("Copied to clipboard"),navigator.clipboard.writeText(n.response)}function a(e,t,n){var o,r;const s=t[0];if(1!==t.length||"number"!==s.type)return!1;const i=null===(r=null===(o=n.normalizedResponse.match(/\d+([,\.]\d+)?/gi))||void 0===o?void 0:o[0])||void 0===r?void 0:r.replace(",",".");if(!i)return!1;if(e.typing){let e=0;s.addEventListener("keydown",(function(t){"Backspace"===t.key&&(e=i.length+1),e>i.length||(t.preventDefault(),"."===i.slice(e,e+1)&&++e,s.value=i.slice(0,++e))}))}else s.value=i;return!0}function u(e,t,n){const o=t[0];if(1!==t.length||"true"!==o.getAttribute("contenteditable"))return!1;if(e.typing){let e=0;o.addEventListener("keydown",(function(t){if("Backspace"===t.key&&(e=n.response.length+1),e>n.response.length)return;t.preventDefault(),o.textContent=n.response.slice(0,++e),o.focus();const r=document.createRange();r.selectNodeContents(o),r.collapse(!1);const s=window.getSelection();s.removeAllRanges(),s.addRange(r)}))}else o.textContent=n.response;return!0}function d(e,d,f,p){return t(this,void 0,void 0,(function*(){e.cursor&&(d.style.cursor="wait");const h=function(e,t){let n=t.innerText;const s=t.querySelectorAll(".accesshide");for(const e of s)n=n.replace(e.innerText,"");const i=t.querySelectorAll(".qtext table");for(const e of i)n=n.replace(e.innerText,"\n"+r(e)+"\n");return o(n,!1)}(0,f),g=f.querySelectorAll(p),y=yield function(e,n){return t(this,void 0,void 0,(function*(){const t=new AbortController,r=setTimeout((()=>t.abort()),15e3),s=yield fetch("https://api.openai.com/v1/chat/completions",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},signal:e.timeout?t.signal:null,body:JSON.stringify({model:e.model,messages:[{role:"system",content:"\nFollow those rules:\n- Sometimes there won't be a question, so just answer the statement as you normally would without following the other rules and give the most detailled and complete answer with explication.\n- Your goal is to understand the statement and to reply to each question by giving only the answer.\n- You will keep the same order for the answers as it's asked event if it's a put in order question. Never change the order of the response for each questions.\n- You will separate all the answer with new lines and only show the correctes one.\n- You will onyl give the answers for each question and omit the questions, statement, title or other informations from the response.\n- You will only give answer with exactly the same text as the gived answers.\n- The question always have the good answer so you should always give an answer to the question.\n- You will always respond in the same langage as the user question."},{role:"user",content:n}],temperature:.8,top_p:1,presence_penalty:1,stop:null})});clearTimeout(r);const i=(yield s.json()).choices[0].message.content;return{response:i,normalizedResponse:o(i)}}))}(e,h).catch((e=>({error:e}))),v="object"==typeof y&&"error"in y;if(e.cursor&&(d.style.cursor=e.infinite||v?"pointer":"initial"),v)return void console.error(y.error);if(e.logs&&(n.question(h),n.response(y)),"clipboard"===e.mode)return e.infinite||m(d),c(e,y);if("question-to-answer"===e.mode){m(d);const e=f.textContent,t=f.querySelector(".qtext");return t.textContent=y.response,t.style.whiteSpace="pre-wrap",void t.addEventListener("click",(function(){const n=t.textContent===e;t.style.whiteSpace=n?"pre-wrap":null,t.textContent=n?y.response:e}))}e.infinite||m(d);const w=[u,l,a,i,s];for(const t of w)if(t(e,g,y))return;c(e,y)}))}const f=[],p=[];function h(t){document.body.addEventListener("keydown",(function(n){f.push(n.key),f.length>t.code.length&&f.shift(),f.join("")===t.code&&(f.length=0,function(t){if(p.length>0){for(const e of p)t.cursor&&(e.element.style.cursor="initial"),e.element.removeEventListener("click",e.fn);return t.title&&e("Removed"),void(p.length=0)}const n=["checkbox","radio","text","number"].map((e=>`input[type="${e}"]`)).join(",")+", textarea, select, [contenteditable]",o=document.querySelectorAll(".formulation");for(const e of o){const o=e.querySelector(".qtext");t.cursor&&(o.style.cursor="pointer");const r=d.bind(null,t,o,e,n);p.push({element:o,fn:r}),o.addEventListener("click",r)}t.title&&e("Injected")}(t))}))}function m(e){const t=p.findIndex((t=>t.element===e));if(-1!==t){const e=p.splice(t,1)[0];e.element.removeEventListener("click",e.fn)}}chrome.storage.sync.get(["moodleGPT"]).then((function(e){const t=e.moodleGPT;if(!t)throw new Error("Please configure MoodleGPT into the extension");h(t)}))})); +!function(e){"function"==typeof define&&define.amd?define(e):e()}((function(){"use strict";function e(e){const t=document.title;document.title=e,setTimeout((()=>document.title=t),3e3)}function t(e,t,n,o){return new(n||(n=Promise))((function(r,s){function i(e){try{c(o.next(e))}catch(e){s(e)}}function l(e){try{c(o.throw(e))}catch(e){s(e)}}function c(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(i,l)}c((o=o.apply(e,t||[])).next())}))}class n{static question(e){console.log("%c[QUESTION]: %s","color: cyan",e)}static responseTry(e,t){const n="color: "+(t?"green":"red");console.log("%c[CHECKING]: %s",n,e)}static array(e){console.log("[CORRECTS] ",e)}static response(e){console.log("Original:\n"+e.response),console.log("Normalized:\n"+e.normalizedResponse)}}function o(e,t=!0){let n=e.replace(/\n+/gi,"\n").replace(/(\n\s*\n)+/g,"\n").replace(/[ \t]+/gi," ");return t&&(n=n.toLowerCase()),n.trim().replace(/^[a-z\d]\.\s/gi,"").replace(/\n[a-z\d]\.\s/gi,"\n")}function r(e){const t=[],n=Array.from(e.querySelectorAll("tr")),o=[];n.map((e=>{const n=Array.from(e.querySelectorAll("td, th")).map(((e,t)=>{var n;const r=null===(n=e.textContent)||void 0===n?void 0:n.trim();return o[t]=Math.max(o[t]||0,r.length||0),r}));t.push(n)}));const r=o.reduce(((e,t)=>e+t))+3*t[0].length+1,s="\n"+Array(r).fill("-").join("")+"\n",i=t.map((e=>"| "+e.map(((e,t)=>e.padEnd(o[t]," "))).join(" | ")+" |"));return i.shift()+s+i.join("\n")}function s(e,t,r){const s=null==t?void 0:t[0];if(!s||"checkbox"!==s.type&&"radio"!==s.type)return!1;for(const s of t){const t=o(s.parentNode.textContent),i=r.normalizedResponse.includes(t);e.logs&&n.responseTry(t,i),i&&(e.mouseover?s.addEventListener("mouseover",(()=>s.checked=!0),{once:!0}):s.checked=!0)}return!0}function i(e,t,r){if(0===t.length||"SELECT"!==t[0].tagName)return!1;let s=r.normalizedResponse.split("\n");e.logs&&n.array(s),s.length===2*t.length&&(s=s.filter(((e,t)=>t%2==1)));for(let r=0;r{const o=t.includes(r);return e.logs&&n.responseTry(r,o),o}));if(-1!==l){e.mouseover?i[l+1].closest("select").addEventListener("click",(function(){i[l+1].selected="selected"}),{once:!0}):i[l+1].selected="selected";break}}if(e.logs&&n.responseTry(l,c),c){e.mouseover?t.closest("select").addEventListener("click",(()=>t.selected=!0),{once:!0}):t.selected=!0;break}}}return!0}function l(e,t,n){const o=t[0];if(1!==t.length||"TEXTAREA"!==o.tagName&&"text"!==o.type)return!1;if(e.typing){let e=0;o.addEventListener("keydown",(function(t){"Backspace"===t.key&&(e=n.response.length+1),e>n.response.length||(t.preventDefault(),o.value=n.response.slice(0,++e))}))}else o.value=n.response;return!0}function c(t,n){t.title&&e("Copied to clipboard"),navigator.clipboard.writeText(n.response)}function a(e,t,n){var o,r;const s=t[0];if(1!==t.length||"number"!==s.type)return!1;const i=null===(r=null===(o=n.normalizedResponse.match(/\d+([,\.]\d+)?/gi))||void 0===o?void 0:o[0])||void 0===r?void 0:r.replace(",",".");if(!i)return!1;if(e.typing){let e=0;s.addEventListener("keydown",(function(t){"Backspace"===t.key&&(e=i.length+1),e>i.length||(t.preventDefault(),"."===i.slice(e,e+1)&&++e,s.value=i.slice(0,++e))}))}else s.value=i;return!0}function u(e,t,n){const o=t[0];if(1!==t.length||"true"!==o.getAttribute("contenteditable"))return!1;if(e.typing){let e=0;o.addEventListener("keydown",(function(t){if("Backspace"===t.key&&(e=n.response.length+1),e>n.response.length)return;t.preventDefault(),o.textContent=n.response.slice(0,++e),o.focus();const r=document.createRange();r.selectNodeContents(o),r.collapse(!1);const s=window.getSelection();s.removeAllRanges(),s.addRange(r)}))}else o.textContent=n.response;return!0}function d(e,d,f,p){return t(this,void 0,void 0,(function*(){e.cursor&&(d.style.cursor="wait");const h=function(e,t){let n=t.innerText;const s=t.querySelectorAll(".accesshide");for(const e of s)n=n.replace(e.innerText,"");const i=t.querySelectorAll(".qtext table");for(const e of i)n=n.replace(e.innerText,"\n"+r(e)+"\n");return o(n,!1)}(0,f),g=f.querySelectorAll(p),y=yield function(e,n){return t(this,void 0,void 0,(function*(){const t=new AbortController,r=setTimeout((()=>t.abort()),15e3),s=yield fetch("https://api.openai.com/v1/chat/completions",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`},signal:e.timeout?t.signal:null,body:JSON.stringify({model:e.model,messages:[{role:"system",content:"\nFollow those rules:\n- Sometimes there won't be a question, so just answer the statement as you normally would without following the other rules and give the most detailled and complete answer with explication.\n- For put in order question just give the good order separate by new line\n- Your goal is to understand the statement and to reply to each question by giving only the answer.\n- You will keep the same order for the answers like in the text. \n- You will separate all the answer with new lines and only show the correctes one.\n- You will only give the answers for each question and omit the questions, statement, title or other informations from the response.\n- You will only give answer with exactly the same text as the gived answers.\n- The question always have the good answer so you should always give an answer to the question.\n- You will always respond in the same langage as the user question."},{role:"user",content:n}],temperature:.8,top_p:1,presence_penalty:1,stop:null})});clearTimeout(r);const i=(yield s.json()).choices[0].message.content;return{response:i,normalizedResponse:o(i)}}))}(e,h).catch((e=>({error:e}))),v="object"==typeof y&&"error"in y;if(e.cursor&&(d.style.cursor=e.infinite||v?"pointer":"initial"),v)return void console.error(y.error);if(e.logs&&(n.question(h),n.response(y)),"clipboard"===e.mode)return e.infinite||m(d),c(e,y);if("question-to-answer"===e.mode){m(d);const e=f.textContent,t=f.querySelector(".qtext");return t.textContent=y.response,t.style.whiteSpace="pre-wrap",void t.addEventListener("click",(function(){const n=t.textContent===e;t.style.whiteSpace=n?"pre-wrap":null,t.textContent=n?y.response:e}))}e.infinite||m(d);const w=[u,l,a,i,s];for(const t of w)if(t(e,g,y))return;c(e,y)}))}const f=[],p=[];function h(t){document.body.addEventListener("keydown",(function(n){f.push(n.key),f.length>t.code.length&&f.shift(),f.join("")===t.code&&(f.length=0,function(t){if(p.length>0){for(const e of p)t.cursor&&(e.element.style.cursor="initial"),e.element.removeEventListener("click",e.fn);return t.title&&e("Removed"),void(p.length=0)}const n=["checkbox","radio","text","number"].map((e=>`input[type="${e}"]`)).join(",")+", textarea, select, [contenteditable]",o=document.querySelectorAll(".formulation");for(const e of o){const o=e.querySelector(".qtext");t.cursor&&(o.style.cursor="pointer");const r=d.bind(null,t,o,e,n);p.push({element:o,fn:r}),o.addEventListener("click",r)}t.title&&e("Injected")}(t))}))}function m(e){const t=p.findIndex((t=>t.element===e));if(-1!==t){const e=p.splice(t,1)[0];e.element.removeEventListener("click",e.fn)}}chrome.storage.sync.get(["moodleGPT"]).then((function(e){const t=e.moodleGPT;if(!t)throw new Error("Please configure MoodleGPT into the extension");h(t)}))})); //# sourceMappingURL=MoodleGPT.js.map diff --git a/extension/MoodleGPT.js.map b/extension/MoodleGPT.js.map index 4ac858e..3a5c726 100644 --- a/extension/MoodleGPT.js.map +++ b/extension/MoodleGPT.js.map @@ -1 +1 @@ -{"version":3,"file":"MoodleGPT.js","sources":["../src/utils/title-indications.ts","../node_modules/tslib/tslib.es6.js","../src/utils/logs.ts","../src/utils/normalize-text.ts","../src/utils/html-table-to-string.ts","../src/core/questions/radio-checkbox.ts","../src/core/questions/select.ts","../src/core/questions/textbox.ts","../src/core/questions/clipboard.ts","../src/core/questions/number.ts","../src/core/questions/contenteditable.ts","../src/core/reply.ts","../src/core/create-question.ts","../src/core/get-response.ts","../src/core/code-listener.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Show some informations into the document title and remove it after 3000ms\r\n * @param text\r\n */\r\nfunction titleIndications(text: string) {\r\n const backTitle = document.title;\r\n document.title = text;\r\n setTimeout(() => (document.title = backTitle), 3000);\r\n}\r\n\r\nexport default titleIndications;\r\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.push(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.push(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","import GPTAnswer from \"../types/gptAnswer\";\r\nclass Logs {\r\n static question(text: string) {\r\n const css = \"color: cyan\";\r\n console.log(\"%c[QUESTION]: %s\", css, text);\r\n }\r\n\r\n static responseTry(text: string, valide: boolean) {\r\n const css = \"color: \" + (valide ? \"green\" : \"red\");\r\n console.log(\"%c[CHECKING]: %s\", css, text);\r\n }\r\n\r\n static array(arr: unknown[]) {\r\n console.log(\"[CORRECTS] \", arr);\r\n }\r\n\r\n static response(gptAnswer: GPTAnswer) {\r\n console.log(\"Original:\\n\" + gptAnswer.response);\r\n console.log(\"Normalized:\\n\" + gptAnswer.normalizedResponse);\r\n }\r\n}\r\n\r\nexport default Logs;\r\n","/**\r\n * Normlize text\r\n * @param text\r\n */\r\nfunction normalizeText(text: string, toLowerCase: boolean = true) {\r\n let normalizedText = text\r\n .replace(/\\n+/gi, \"\\n\") //remove duplicate new lines\r\n .replace(/(\\n\\s*\\n)+/g, \"\\n\") //remove useless white sapce from textcontent\r\n .replace(/[ \\t]+/gi, \" \"); //replace multiples space or tabs by a space\r\n\r\n if (toLowerCase) normalizedText = normalizedText.toLowerCase();\r\n\r\n return (\r\n normalizedText\r\n .trim()\r\n /* We remove that because sometimes ChatGPT will reply: \"answer d\" */\r\n .replace(/^[a-z\\d]\\.\\s/gi, \"\") //a. text, b. text, c. text, 1. text, 2. text, 3.text\r\n .replace(/\\n[a-z\\d]\\.\\s/gi, \"\\n\") //same but with new line\r\n );\r\n}\r\n\r\nexport default normalizeText;\r\n","/**\r\n * Convert table to representating string table\r\n * @param table\r\n * @returns\r\n */\r\nfunction htmlTableToString(table: HTMLTableElement) {\r\n const tab: string[][] = [];\r\n const lines = Array.from(table.querySelectorAll(\"tr\"));\r\n const maxColumnsLength: number[] = [];\r\n lines.map((line) => {\r\n const cells = Array.from(line.querySelectorAll(\"td, th\"));\r\n const cellsContent = cells.map((cell, index) => {\r\n const content = cell.textContent?.trim();\r\n maxColumnsLength[index] = Math.max(\r\n maxColumnsLength[index] || 0,\r\n content.length || 0\r\n );\r\n return content;\r\n });\r\n tab.push(cellsContent);\r\n });\r\n\r\n const lineSeparationSize =\r\n maxColumnsLength.reduce((a, b) => a + b) + tab[0].length * 3 + 1;\r\n const lineSeparation =\r\n \"\\n\" + Array(lineSeparationSize).fill(\"-\").join(\"\") + \"\\n\";\r\n\r\n const mappedTab = tab.map((line) => {\r\n const mappedLine = line.map((content, index) =>\r\n content.padEnd(\r\n maxColumnsLength[index],\r\n \"\\u00A0\" /* For no matching with \\s */\r\n )\r\n );\r\n return \"| \" + mappedLine.join(\" | \") + \" |\";\r\n });\r\n const head = mappedTab.shift();\r\n return head + lineSeparation + mappedTab.join(\"\\n\");\r\n}\r\n\r\nexport default htmlTableToString;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle checkbox and input elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n */\r\nfunction handleRadioAndCheckbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList?.[0] as HTMLInputElement;\r\n\r\n if (!input || (input.type !== \"checkbox\" && input.type !== \"radio\"))\r\n return false;\r\n\r\n for (const input of inputList as NodeListOf) {\r\n const content = normalizeText(input.parentNode.textContent);\r\n const valide = gptAnswer.normalizedResponse.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n if (valide) {\r\n if (config.mouseover) {\r\n input.addEventListener(\"mouseover\", () => (input.checked = true), {\r\n once: true,\r\n });\r\n } else {\r\n input.checked = true;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport default handleRadioAndCheckbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle select elements (and put in order select)\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleSelect(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n if (inputList.length === 0 || inputList[0].tagName !== \"SELECT\") return false;\r\n\r\n let correct = gptAnswer.normalizedResponse.split(\"\\n\");\r\n\r\n if (config.logs) Logs.array(correct);\r\n\r\n /**\r\n * Sometimes ChatGPT give the question so we should remove them\r\n * Example:\r\n * 5*5\r\n * 25\r\n * 10+10\r\n * 20\r\n * 20-10\r\n * 10\r\n *\r\n * And we only want to keep answers\r\n * 25\r\n * 20\r\n * 10\r\n */\r\n if (correct.length === inputList.length * 2) {\r\n correct = correct.filter((answer, index) => index % 2 === 1);\r\n }\r\n\r\n for (let j = 0; j < inputList.length; ++j) {\r\n const options = inputList[j].querySelectorAll(\"option\");\r\n\r\n for (const option of options) {\r\n const content = normalizeText(option.textContent);\r\n const valide = correct[j].includes(content);\r\n\r\n /* Handle put in order question */\r\n if (!/[^\\d]+/gi.test(content)) {\r\n console.log(\"Checking put in order...\");\r\n const content = normalizeText(\r\n (option.parentNode as HTMLElement)\r\n .closest(\"tr\")\r\n .querySelector(\".text\").textContent\r\n );\r\n const index = correct.findIndex((answer) => {\r\n const valide = answer.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n return valide;\r\n });\r\n if (index !== -1) {\r\n if (config.mouseover) {\r\n options[index].closest(\"select\").addEventListener(\r\n \"click\",\r\n function () {\r\n options[index + 1].selected = \"selected\" as any;\r\n },\r\n { once: true }\r\n );\r\n } else {\r\n options[index + 1].selected = \"selected\" as any;\r\n }\r\n break;\r\n }\r\n }\r\n /* End */\r\n\r\n if (config.logs) Logs.responseTry(content, valide);\r\n\r\n if (valide) {\r\n if (config.mouseover) {\r\n option\r\n .closest(\"select\")\r\n .addEventListener(\"click\", () => (option.selected = true), {\r\n once: true,\r\n });\r\n } else {\r\n option.selected = true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleSelect;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle textbox\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleTextbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n (input.tagName !== \"TEXTAREA\" && input.type !== \"text\")\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.value = gptAnswer.response.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleTextbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport titleIndications from \"../../utils/title-indications\";\r\n\r\n/**\r\n * Copy the response in the clipboard if we can automaticaly fill the question\r\n * @param config\r\n * @param gptAnswer\r\n */\r\nfunction handleClipboard(config: Config, gptAnswer: GPTAnswer) {\r\n if (config.title) titleIndications(\"Copied to clipboard\");\r\n navigator.clipboard.writeText(gptAnswer.response);\r\n}\r\n\r\nexport default handleClipboard;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle number input\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleNumber(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (inputList.length !== 1 || input.type !== \"number\") return false;\r\n\r\n const number = gptAnswer.normalizedResponse\r\n .match(/\\d+([,\\.]\\d+)?/gi)?.[0]\r\n ?.replace(\",\", \".\");\r\n\r\n if (!number) return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = number.length + 1;\r\n if (index > number.length) return;\r\n event.preventDefault();\r\n if (number.slice(index, index + 1) === \".\") ++index;\r\n input.value = number.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = number;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleNumber;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Hanlde contenteditable elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleContentEditable(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0];\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n input.getAttribute(\"contenteditable\") !== \"true\"\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.textContent = gptAnswer.response.slice(0, ++index);\r\n\r\n /* Put the cursor at the end of the typed text */\r\n input.focus();\r\n const range = document.createRange();\r\n range.selectNodeContents(input);\r\n range.collapse(false);\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n });\r\n } else {\r\n input.textContent = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleContentEditable;\r\n","import Config from \"../types/config\";\r\nimport Logs from \"../utils/logs\";\r\nimport getChatGPTResponse from \"./get-response\";\r\nimport createQuestion from \"./create-question\";\r\nimport handleRadioAndCheckbox from \"./questions/radio-checkbox\";\r\nimport handleSelect from \"./questions/select\";\r\nimport handleTextbox from \"./questions/textbox\";\r\nimport handleClipboard from \"./questions/clipboard\";\r\nimport handleNumber from \"./questions/number\";\r\nimport handleContentEditable from \"./questions/contenteditable\";\r\nimport { removeListener } from \"./code-listener\";\r\n\r\n/**\r\n * Reply to the question\r\n * @param config\r\n * @param hiddenButton\r\n * @param form\r\n * @param query\r\n * @returns\r\n */\r\nasync function reply(\r\n config: Config,\r\n hiddenButton: HTMLElement,\r\n form: HTMLElement,\r\n query: string\r\n) {\r\n if (config.cursor) hiddenButton.style.cursor = \"wait\";\r\n\r\n const question = createQuestion(config, form);\r\n const inputList: NodeListOf = form.querySelectorAll(query);\r\n\r\n const gptAnswer = await getChatGPTResponse(config, question).catch(\r\n (error) => ({\r\n error,\r\n })\r\n );\r\n\r\n const haveError = typeof gptAnswer === \"object\" && \"error\" in gptAnswer;\r\n\r\n if (config.cursor)\r\n hiddenButton.style.cursor =\r\n config.infinite || haveError ? \"pointer\" : \"initial\";\r\n\r\n if (haveError) {\r\n console.error(gptAnswer.error);\r\n return;\r\n }\r\n\r\n if (config.logs) {\r\n Logs.question(question);\r\n Logs.response(gptAnswer);\r\n }\r\n\r\n /* Handle clipboard mode */\r\n if (config.mode === \"clipboard\") {\r\n if (!config.infinite) removeListener(hiddenButton);\r\n return handleClipboard(config, gptAnswer);\r\n }\r\n\r\n /* Handle question to answer mode */\r\n if (config.mode === \"question-to-answer\") {\r\n removeListener(hiddenButton);\r\n\r\n const questionBackup = form.textContent;\r\n const questionContainer = form.querySelector(\".qtext\");\r\n\r\n questionContainer.textContent = gptAnswer.response;\r\n questionContainer.style.whiteSpace = \"pre-wrap\";\r\n\r\n questionContainer.addEventListener(\"click\", function () {\r\n const isNotResponse = questionContainer.textContent === questionBackup;\r\n questionContainer.style.whiteSpace = isNotResponse ? \"pre-wrap\" : null;\r\n questionContainer.textContent = isNotResponse\r\n ? gptAnswer.response\r\n : questionBackup;\r\n });\r\n return;\r\n }\r\n\r\n /* Better then set once on the event because if there is an error the user can click an other time on the question */\r\n if (!config.infinite) removeListener(hiddenButton);\r\n\r\n const handlers = [\r\n handleContentEditable,\r\n handleTextbox,\r\n handleNumber,\r\n handleSelect,\r\n handleRadioAndCheckbox,\r\n ];\r\n\r\n for (const handler of handlers) {\r\n if (handler(config, inputList, gptAnswer)) return;\r\n }\r\n\r\n /* In the case we can't auto complete the question */\r\n handleClipboard(config, gptAnswer);\r\n}\r\n\r\nexport default reply;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\nimport htmlTableToString from \"../utils/html-table-to-string\";\r\n\r\n/**\r\n * Normalize the question and add sub informations\r\n * @param langage\r\n * @param question\r\n * @returns\r\n */\r\nfunction createQuestion(config: Config, questionContainer: HTMLElement) {\r\n let question = questionContainer.innerText;\r\n\r\n /* We remove unnecessary information */\r\n const accesshideElements: NodeListOf =\r\n questionContainer.querySelectorAll(\".accesshide\");\r\n for (const useless of accesshideElements) {\r\n question = question.replace(useless.innerText, \"\");\r\n }\r\n\r\n /* Make tables more readable for chat-gpt */\r\n const tables: NodeListOf =\r\n questionContainer.querySelectorAll(\".qtext table\");\r\n for (const table of tables) {\r\n question = question.replace(\r\n table.innerText,\r\n \"\\n\" + htmlTableToString(table) + \"\\n\"\r\n );\r\n }\r\n\r\n return normalizeText(question, false);\r\n}\r\n\r\nexport default createQuestion;\r\n","import Config from \"../types/config\";\r\nimport GPTAnswer from \"../types/gptAnswer\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\n\r\n/**\r\n * Get the response from chatGPT api\r\n * @param config\r\n * @param question\r\n * @returns\r\n */\r\nasync function getChatGPTResponse(\r\n config: Config,\r\n question: string\r\n): Promise {\r\n const controller = new AbortController();\r\n const timeoutControler = setTimeout(() => controller.abort(), 15000);\r\n const req = await fetch(\"https://api.openai.com/v1/chat/completions\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${config.apiKey}`,\r\n },\r\n signal: config.timeout ? controller.signal : null,\r\n body: JSON.stringify({\r\n model: config.model,\r\n messages: [\r\n {\r\n role: \"system\",\r\n content: `\r\nFollow those rules:\r\n- Sometimes there won't be a question, so just answer the statement as you normally would without following the other rules and give the most detailled and complete answer with explication.\r\n- Your goal is to understand the statement and to reply to each question by giving only the answer.\r\n- You will keep the same order for the answers as it's asked event if it's a put in order question. Never change the order of the response for each questions.\r\n- You will separate all the answer with new lines and only show the correctes one.\r\n- You will onyl give the answers for each question and omit the questions, statement, title or other informations from the response.\r\n- You will only give answer with exactly the same text as the gived answers.\r\n- The question always have the good answer so you should always give an answer to the question.\r\n- You will always respond in the same langage as the user question.`,\r\n },\r\n { role: \"user\", content: question },\r\n ],\r\n temperature: 0.8,\r\n top_p: 1.0,\r\n presence_penalty: 1.0,\r\n stop: null,\r\n }),\r\n });\r\n clearTimeout(timeoutControler);\r\n const rep = await req.json();\r\n const response = rep.choices[0].message.content;\r\n return {\r\n response,\r\n normalizedResponse: normalizeText(response),\r\n };\r\n}\r\n\r\nexport default getChatGPTResponse;\r\n","import Config from \"../types/config\";\r\nimport titleIndications from \"../utils/title-indications\";\r\nimport reply from \"./reply\";\r\n\r\nconst pressedKeys: string[] = [];\r\nconst listeners: {\r\n element: HTMLElement;\r\n fn: (this: HTMLElement, ev: MouseEvent) => any;\r\n}[] = [];\r\n\r\n/**\r\n * Create a listener on the keyboard to inject the code\r\n * @param config\r\n */\r\nfunction codeListener(config: Config) {\r\n document.body.addEventListener(\"keydown\", function (event) {\r\n pressedKeys.push(event.key);\r\n if (pressedKeys.length > config.code.length) pressedKeys.shift();\r\n if (pressedKeys.join(\"\") === config.code) {\r\n pressedKeys.length = 0;\r\n setUpMoodleGpt(config);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Setup moodleGPT into the page (remove/injection)\r\n * @param config\r\n * @returns\r\n */\r\nfunction setUpMoodleGpt(config: Config) {\r\n /* Removing events */\r\n if (listeners.length > 0) {\r\n for (const listener of listeners) {\r\n if (config.cursor) listener.element.style.cursor = \"initial\";\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n if (config.title) titleIndications(\"Removed\");\r\n listeners.length = 0;\r\n return;\r\n }\r\n\r\n /* Code injection */\r\n const inputQuery = [\"checkbox\", \"radio\", \"text\", \"number\"]\r\n .map((e) => `input[type=\"${e}\"]`)\r\n .join(\",\");\r\n const query = inputQuery + \", textarea, select, [contenteditable]\";\r\n const forms = document.querySelectorAll(\".formulation\");\r\n\r\n for (const form of forms) {\r\n const hiddenButton: HTMLElement = form.querySelector(\".qtext\");\r\n\r\n if (config.cursor) hiddenButton.style.cursor = \"pointer\";\r\n\r\n const injectionFunction = reply.bind(\r\n null,\r\n config,\r\n hiddenButton,\r\n form,\r\n query\r\n );\r\n listeners.push({ element: hiddenButton, fn: injectionFunction });\r\n hiddenButton.addEventListener(\"click\", injectionFunction);\r\n }\r\n\r\n if (config.title) titleIndications(\"Injected\");\r\n}\r\n\r\n/**\r\n * Remove the event listener on a specific question\r\n * @param element\r\n */\r\nfunction removeListener(element: HTMLElement) {\r\n const index = listeners.findIndex((listener) => listener.element === element);\r\n if (index !== -1) {\r\n const listener = listeners.splice(index, 1)[0];\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n}\r\n\r\nexport { codeListener, removeListener };\r\n","import { codeListener } from \"./core/code-listener\";\r\n\r\nchrome.storage.sync.get([\"moodleGPT\"]).then(function (storage) {\r\n const config = storage.moodleGPT;\r\n\r\n if (!config) throw new Error(\"Please configure MoodleGPT into the extension\");\r\n\r\n codeListener(config);\r\n});\r\n"],"names":["titleIndications","text","backTitle","document","title","setTimeout","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","Logs","static","console","log","valide","css","arr","gptAnswer","response","normalizedResponse","normalizeText","toLowerCase","normalizedText","replace","trim","htmlTableToString","table","tab","lines","Array","from","querySelectorAll","maxColumnsLength","map","line","cellsContent","cell","index","content","_a","textContent","Math","max","length","push","lineSeparationSize","reduce","a","b","lineSeparation","fill","join","mappedTab","padEnd","shift","handleRadioAndCheckbox","config","inputList","input","type","parentNode","includes","logs","responseTry","mouseover","addEventListener","checked","once","handleSelect","tagName","correct","split","array","filter","answer","j","options","option","test","closest","querySelector","findIndex","selected","handleTextbox","typing","event","key","preventDefault","slice","handleClipboard","navigator","clipboard","writeText","handleNumber","number","_b","match","handleContentEditable","getAttribute","focus","range","createRange","selectNodeContents","collapse","selection","window","getSelection","removeAllRanges","addRange","reply","hiddenButton","form","query","cursor","style","question","questionContainer","innerText","accesshideElements","useless","tables","createQuestion","controller","AbortController","timeoutControler","abort","req","fetch","method","headers","Authorization","apiKey","signal","timeout","body","JSON","stringify","model","messages","role","temperature","top_p","presence_penalty","stop","clearTimeout","json","choices","message","getChatGPTResponse","catch","error","haveError","infinite","mode","removeListener","questionBackup","whiteSpace","isNotResponse","handlers","handler","pressedKeys","listeners","codeListener","code","listener","element","removeEventListener","fn","forms","injectionFunction","bind","setUpMoodleGpt","splice","chrome","storage","sync","get","moodleGPT","Error"],"mappings":"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","x_google_ignoreList":[1]} \ No newline at end of file +{"version":3,"file":"MoodleGPT.js","sources":["../src/utils/title-indications.ts","../node_modules/tslib/tslib.es6.js","../src/utils/logs.ts","../src/utils/normalize-text.ts","../src/utils/html-table-to-string.ts","../src/core/questions/radio-checkbox.ts","../src/core/questions/select.ts","../src/core/questions/textbox.ts","../src/core/questions/clipboard.ts","../src/core/questions/number.ts","../src/core/questions/contenteditable.ts","../src/core/reply.ts","../src/core/create-question.ts","../src/core/get-response.ts","../src/core/code-listener.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Show some informations into the document title and remove it after 3000ms\r\n * @param text\r\n */\r\nfunction titleIndications(text: string) {\r\n const backTitle = document.title;\r\n document.title = text;\r\n setTimeout(() => (document.title = backTitle), 3000);\r\n}\r\n\r\nexport default titleIndications;\r\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.push(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.push(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","import GPTAnswer from \"../types/gptAnswer\";\r\nclass Logs {\r\n static question(text: string) {\r\n const css = \"color: cyan\";\r\n console.log(\"%c[QUESTION]: %s\", css, text);\r\n }\r\n\r\n static responseTry(text: string, valide: boolean) {\r\n const css = \"color: \" + (valide ? \"green\" : \"red\");\r\n console.log(\"%c[CHECKING]: %s\", css, text);\r\n }\r\n\r\n static array(arr: unknown[]) {\r\n console.log(\"[CORRECTS] \", arr);\r\n }\r\n\r\n static response(gptAnswer: GPTAnswer) {\r\n console.log(\"Original:\\n\" + gptAnswer.response);\r\n console.log(\"Normalized:\\n\" + gptAnswer.normalizedResponse);\r\n }\r\n}\r\n\r\nexport default Logs;\r\n","/**\r\n * Normlize text\r\n * @param text\r\n */\r\nfunction normalizeText(text: string, toLowerCase: boolean = true) {\r\n let normalizedText = text\r\n .replace(/\\n+/gi, \"\\n\") //remove duplicate new lines\r\n .replace(/(\\n\\s*\\n)+/g, \"\\n\") //remove useless white sapce from textcontent\r\n .replace(/[ \\t]+/gi, \" \"); //replace multiples space or tabs by a space\r\n\r\n if (toLowerCase) normalizedText = normalizedText.toLowerCase();\r\n\r\n return (\r\n normalizedText\r\n .trim()\r\n /* We remove that because sometimes ChatGPT will reply: \"answer d\" */\r\n .replace(/^[a-z\\d]\\.\\s/gi, \"\") //a. text, b. text, c. text, 1. text, 2. text, 3.text\r\n .replace(/\\n[a-z\\d]\\.\\s/gi, \"\\n\") //same but with new line\r\n );\r\n}\r\n\r\nexport default normalizeText;\r\n","/**\r\n * Convert table to representating string table\r\n * @param table\r\n * @returns\r\n */\r\nfunction htmlTableToString(table: HTMLTableElement) {\r\n const tab: string[][] = [];\r\n const lines = Array.from(table.querySelectorAll(\"tr\"));\r\n const maxColumnsLength: number[] = [];\r\n lines.map((line) => {\r\n const cells = Array.from(line.querySelectorAll(\"td, th\"));\r\n const cellsContent = cells.map((cell, index) => {\r\n const content = cell.textContent?.trim();\r\n maxColumnsLength[index] = Math.max(\r\n maxColumnsLength[index] || 0,\r\n content.length || 0\r\n );\r\n return content;\r\n });\r\n tab.push(cellsContent);\r\n });\r\n\r\n const lineSeparationSize =\r\n maxColumnsLength.reduce((a, b) => a + b) + tab[0].length * 3 + 1;\r\n const lineSeparation =\r\n \"\\n\" + Array(lineSeparationSize).fill(\"-\").join(\"\") + \"\\n\";\r\n\r\n const mappedTab = tab.map((line) => {\r\n const mappedLine = line.map((content, index) =>\r\n content.padEnd(\r\n maxColumnsLength[index],\r\n \"\\u00A0\" /* For no matching with \\s */\r\n )\r\n );\r\n return \"| \" + mappedLine.join(\" | \") + \" |\";\r\n });\r\n const head = mappedTab.shift();\r\n return head + lineSeparation + mappedTab.join(\"\\n\");\r\n}\r\n\r\nexport default htmlTableToString;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle checkbox and input elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n */\r\nfunction handleRadioAndCheckbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList?.[0] as HTMLInputElement;\r\n\r\n if (!input || (input.type !== \"checkbox\" && input.type !== \"radio\"))\r\n return false;\r\n\r\n for (const input of inputList as NodeListOf) {\r\n const content = normalizeText(input.parentNode.textContent);\r\n const valide = gptAnswer.normalizedResponse.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n if (valide) {\r\n if (config.mouseover) {\r\n input.addEventListener(\"mouseover\", () => (input.checked = true), {\r\n once: true,\r\n });\r\n } else {\r\n input.checked = true;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport default handleRadioAndCheckbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport Logs from \"../../utils/logs\";\r\nimport normalizeText from \"../../utils/normalize-text\";\r\n\r\n/**\r\n * Handle select elements (and put in order select)\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleSelect(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n if (inputList.length === 0 || inputList[0].tagName !== \"SELECT\") return false;\r\n\r\n let correct = gptAnswer.normalizedResponse.split(\"\\n\");\r\n\r\n if (config.logs) Logs.array(correct);\r\n\r\n /**\r\n * Sometimes ChatGPT give the question so we should remove them\r\n * Example:\r\n * 5*5\r\n * 25\r\n * 10+10\r\n * 20\r\n * 20-10\r\n * 10\r\n *\r\n * And we only want to keep answers\r\n * 25\r\n * 20\r\n * 10\r\n */\r\n if (correct.length === inputList.length * 2) {\r\n correct = correct.filter((answer, index) => index % 2 === 1);\r\n }\r\n\r\n for (let j = 0; j < inputList.length; ++j) {\r\n const options = inputList[j].querySelectorAll(\"option\");\r\n\r\n for (const option of options) {\r\n const content = normalizeText(option.textContent);\r\n const valide = correct[j].includes(content);\r\n\r\n /* Handle put in order question */\r\n if (!/[^\\d]+/gi.test(content)) {\r\n const elementTitle = (option.parentNode as HTMLElement)\r\n .closest(\"tr\")\r\n .querySelector(\".text\");\r\n const content = normalizeText(elementTitle.textContent);\r\n\r\n const indexCorrectAnswer = correct.findIndex((answer) => {\r\n const valide = answer.includes(content);\r\n if (config.logs) Logs.responseTry(content, valide);\r\n return valide;\r\n });\r\n\r\n if (indexCorrectAnswer !== -1) {\r\n //we do + 1 because we skip the first option: Choose...\r\n if (config.mouseover) {\r\n options[indexCorrectAnswer + 1].closest(\"select\").addEventListener(\r\n \"click\",\r\n function () {\r\n options[indexCorrectAnswer + 1].selected = \"selected\" as any;\r\n },\r\n { once: true }\r\n );\r\n } else {\r\n options[indexCorrectAnswer + 1].selected = \"selected\" as any;\r\n }\r\n break;\r\n }\r\n }\r\n /* End */\r\n\r\n if (config.logs) Logs.responseTry(content, valide);\r\n\r\n if (valide) {\r\n if (config.mouseover) {\r\n option\r\n .closest(\"select\")\r\n .addEventListener(\"click\", () => (option.selected = true), {\r\n once: true,\r\n });\r\n } else {\r\n option.selected = true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleSelect;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle textbox\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleTextbox(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n (input.tagName !== \"TEXTAREA\" && input.type !== \"text\")\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.value = gptAnswer.response.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleTextbox;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\nimport titleIndications from \"../../utils/title-indications\";\r\n\r\n/**\r\n * Copy the response in the clipboard if we can automaticaly fill the question\r\n * @param config\r\n * @param gptAnswer\r\n */\r\nfunction handleClipboard(config: Config, gptAnswer: GPTAnswer) {\r\n if (config.title) titleIndications(\"Copied to clipboard\");\r\n navigator.clipboard.writeText(gptAnswer.response);\r\n}\r\n\r\nexport default handleClipboard;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Handle number input\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleNumber(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0] as HTMLInputElement | HTMLTextAreaElement;\r\n\r\n if (inputList.length !== 1 || input.type !== \"number\") return false;\r\n\r\n const number = gptAnswer.normalizedResponse\r\n .match(/\\d+([,\\.]\\d+)?/gi)?.[0]\r\n ?.replace(\",\", \".\");\r\n\r\n if (!number) return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = number.length + 1;\r\n if (index > number.length) return;\r\n event.preventDefault();\r\n if (number.slice(index, index + 1) === \".\") ++index;\r\n input.value = number.slice(0, ++index);\r\n });\r\n } else {\r\n input.value = number;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleNumber;\r\n","import Config from \"../../types/config\";\r\nimport GPTAnswer from \"../../types/gptAnswer\";\r\n\r\n/**\r\n * Hanlde contenteditable elements\r\n * @param config\r\n * @param inputList\r\n * @param gptAnswer\r\n * @returns\r\n */\r\nfunction handleContentEditable(\r\n config: Config,\r\n inputList: NodeListOf,\r\n gptAnswer: GPTAnswer\r\n): boolean {\r\n const input = inputList[0];\r\n\r\n if (\r\n inputList.length !== 1 ||\r\n input.getAttribute(\"contenteditable\") !== \"true\"\r\n )\r\n return false;\r\n\r\n if (config.typing) {\r\n let index = 0;\r\n input.addEventListener(\"keydown\", function (event: KeyboardEvent) {\r\n if (event.key === \"Backspace\") index = gptAnswer.response.length + 1;\r\n if (index > gptAnswer.response.length) return;\r\n event.preventDefault();\r\n input.textContent = gptAnswer.response.slice(0, ++index);\r\n\r\n /* Put the cursor at the end of the typed text */\r\n input.focus();\r\n const range = document.createRange();\r\n range.selectNodeContents(input);\r\n range.collapse(false);\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n });\r\n } else {\r\n input.textContent = gptAnswer.response;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default handleContentEditable;\r\n","import Config from \"../types/config\";\r\nimport Logs from \"../utils/logs\";\r\nimport getChatGPTResponse from \"./get-response\";\r\nimport createQuestion from \"./create-question\";\r\nimport handleRadioAndCheckbox from \"./questions/radio-checkbox\";\r\nimport handleSelect from \"./questions/select\";\r\nimport handleTextbox from \"./questions/textbox\";\r\nimport handleClipboard from \"./questions/clipboard\";\r\nimport handleNumber from \"./questions/number\";\r\nimport handleContentEditable from \"./questions/contenteditable\";\r\nimport { removeListener } from \"./code-listener\";\r\n\r\n/**\r\n * Reply to the question\r\n * @param config\r\n * @param hiddenButton\r\n * @param form\r\n * @param query\r\n * @returns\r\n */\r\nasync function reply(\r\n config: Config,\r\n hiddenButton: HTMLElement,\r\n form: HTMLElement,\r\n query: string\r\n) {\r\n if (config.cursor) hiddenButton.style.cursor = \"wait\";\r\n\r\n const question = createQuestion(config, form);\r\n const inputList: NodeListOf = form.querySelectorAll(query);\r\n\r\n const gptAnswer = await getChatGPTResponse(config, question).catch(\r\n (error) => ({\r\n error,\r\n })\r\n );\r\n\r\n const haveError = typeof gptAnswer === \"object\" && \"error\" in gptAnswer;\r\n\r\n if (config.cursor)\r\n hiddenButton.style.cursor =\r\n config.infinite || haveError ? \"pointer\" : \"initial\";\r\n\r\n if (haveError) {\r\n console.error(gptAnswer.error);\r\n return;\r\n }\r\n\r\n if (config.logs) {\r\n Logs.question(question);\r\n Logs.response(gptAnswer);\r\n }\r\n\r\n /* Handle clipboard mode */\r\n if (config.mode === \"clipboard\") {\r\n if (!config.infinite) removeListener(hiddenButton);\r\n return handleClipboard(config, gptAnswer);\r\n }\r\n\r\n /* Handle question to answer mode */\r\n if (config.mode === \"question-to-answer\") {\r\n removeListener(hiddenButton);\r\n\r\n const questionBackup = form.textContent;\r\n const questionContainer = form.querySelector(\".qtext\");\r\n\r\n questionContainer.textContent = gptAnswer.response;\r\n questionContainer.style.whiteSpace = \"pre-wrap\";\r\n\r\n questionContainer.addEventListener(\"click\", function () {\r\n const isNotResponse = questionContainer.textContent === questionBackup;\r\n questionContainer.style.whiteSpace = isNotResponse ? \"pre-wrap\" : null;\r\n questionContainer.textContent = isNotResponse\r\n ? gptAnswer.response\r\n : questionBackup;\r\n });\r\n return;\r\n }\r\n\r\n /* Better then set once on the event because if there is an error the user can click an other time on the question */\r\n if (!config.infinite) removeListener(hiddenButton);\r\n\r\n const handlers = [\r\n handleContentEditable,\r\n handleTextbox,\r\n handleNumber,\r\n handleSelect,\r\n handleRadioAndCheckbox,\r\n ];\r\n\r\n for (const handler of handlers) {\r\n if (handler(config, inputList, gptAnswer)) return;\r\n }\r\n\r\n /* In the case we can't auto complete the question */\r\n handleClipboard(config, gptAnswer);\r\n}\r\n\r\nexport default reply;\r\n","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\nimport htmlTableToString from \"../utils/html-table-to-string\";\r\n\r\n/**\r\n * Normalize the question and add sub informations\r\n * @param langage\r\n * @param question\r\n * @returns\r\n */\r\nfunction createQuestion(config: Config, questionContainer: HTMLElement) {\r\n let question = questionContainer.innerText;\r\n\r\n /* We remove unnecessary information */\r\n const accesshideElements: NodeListOf =\r\n questionContainer.querySelectorAll(\".accesshide\");\r\n for (const useless of accesshideElements) {\r\n question = question.replace(useless.innerText, \"\");\r\n }\r\n\r\n /* Make tables more readable for chat-gpt */\r\n const tables: NodeListOf =\r\n questionContainer.querySelectorAll(\".qtext table\");\r\n for (const table of tables) {\r\n question = question.replace(\r\n table.innerText,\r\n \"\\n\" + htmlTableToString(table) + \"\\n\"\r\n );\r\n }\r\n\r\n return normalizeText(question, false);\r\n}\r\n\r\nexport default createQuestion;\r\n","import Config from \"../types/config\";\r\nimport GPTAnswer from \"../types/gptAnswer\";\r\nimport normalizeText from \"../utils/normalize-text\";\r\n\r\n/**\r\n * Get the response from chatGPT api\r\n * @param config\r\n * @param question\r\n * @returns\r\n */\r\nasync function getChatGPTResponse(\r\n config: Config,\r\n question: string\r\n): Promise {\r\n const controller = new AbortController();\r\n const timeoutControler = setTimeout(() => controller.abort(), 15000);\r\n const req = await fetch(\"https://api.openai.com/v1/chat/completions\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${config.apiKey}`,\r\n },\r\n signal: config.timeout ? controller.signal : null,\r\n body: JSON.stringify({\r\n model: config.model,\r\n messages: [\r\n {\r\n role: \"system\",\r\n content: `\r\nFollow those rules:\r\n- Sometimes there won't be a question, so just answer the statement as you normally would without following the other rules and give the most detailled and complete answer with explication.\r\n- For put in order question just give the good order separate by new line\r\n- Your goal is to understand the statement and to reply to each question by giving only the answer.\r\n- You will keep the same order for the answers like in the text. \r\n- You will separate all the answer with new lines and only show the correctes one.\r\n- You will only give the answers for each question and omit the questions, statement, title or other informations from the response.\r\n- You will only give answer with exactly the same text as the gived answers.\r\n- The question always have the good answer so you should always give an answer to the question.\r\n- You will always respond in the same langage as the user question.`,\r\n },\r\n { role: \"user\", content: question },\r\n ],\r\n temperature: 0.8,\r\n top_p: 1.0,\r\n presence_penalty: 1.0,\r\n stop: null,\r\n }),\r\n });\r\n clearTimeout(timeoutControler);\r\n const rep = await req.json();\r\n const response = rep.choices[0].message.content;\r\n return {\r\n response,\r\n normalizedResponse: normalizeText(response),\r\n };\r\n}\r\n\r\nexport default getChatGPTResponse;\r\n","import Config from \"../types/config\";\r\nimport titleIndications from \"../utils/title-indications\";\r\nimport reply from \"./reply\";\r\n\r\nconst pressedKeys: string[] = [];\r\nconst listeners: {\r\n element: HTMLElement;\r\n fn: (this: HTMLElement, ev: MouseEvent) => any;\r\n}[] = [];\r\n\r\n/**\r\n * Create a listener on the keyboard to inject the code\r\n * @param config\r\n */\r\nfunction codeListener(config: Config) {\r\n document.body.addEventListener(\"keydown\", function (event) {\r\n pressedKeys.push(event.key);\r\n if (pressedKeys.length > config.code.length) pressedKeys.shift();\r\n if (pressedKeys.join(\"\") === config.code) {\r\n pressedKeys.length = 0;\r\n setUpMoodleGpt(config);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Setup moodleGPT into the page (remove/injection)\r\n * @param config\r\n * @returns\r\n */\r\nfunction setUpMoodleGpt(config: Config) {\r\n /* Removing events */\r\n if (listeners.length > 0) {\r\n for (const listener of listeners) {\r\n if (config.cursor) listener.element.style.cursor = \"initial\";\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n if (config.title) titleIndications(\"Removed\");\r\n listeners.length = 0;\r\n return;\r\n }\r\n\r\n /* Code injection */\r\n const inputQuery = [\"checkbox\", \"radio\", \"text\", \"number\"]\r\n .map((e) => `input[type=\"${e}\"]`)\r\n .join(\",\");\r\n const query = inputQuery + \", textarea, select, [contenteditable]\";\r\n const forms = document.querySelectorAll(\".formulation\");\r\n\r\n for (const form of forms) {\r\n const hiddenButton: HTMLElement = form.querySelector(\".qtext\");\r\n\r\n if (config.cursor) hiddenButton.style.cursor = \"pointer\";\r\n\r\n const injectionFunction = reply.bind(\r\n null,\r\n config,\r\n hiddenButton,\r\n form,\r\n query\r\n );\r\n listeners.push({ element: hiddenButton, fn: injectionFunction });\r\n hiddenButton.addEventListener(\"click\", injectionFunction);\r\n }\r\n\r\n if (config.title) titleIndications(\"Injected\");\r\n}\r\n\r\n/**\r\n * Remove the event listener on a specific question\r\n * @param element\r\n */\r\nfunction removeListener(element: HTMLElement) {\r\n const index = listeners.findIndex((listener) => listener.element === element);\r\n if (index !== -1) {\r\n const listener = listeners.splice(index, 1)[0];\r\n listener.element.removeEventListener(\"click\", listener.fn);\r\n }\r\n}\r\n\r\nexport { codeListener, removeListener };\r\n","import { codeListener } from \"./core/code-listener\";\r\n\r\nchrome.storage.sync.get([\"moodleGPT\"]).then(function (storage) {\r\n const config = storage.moodleGPT;\r\n\r\n if (!config) throw new Error(\"Please configure MoodleGPT into the extension\");\r\n\r\n codeListener(config);\r\n});\r\n"],"names":["titleIndications","text","backTitle","document","title","setTimeout","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","Logs","static","console","log","valide","css","arr","gptAnswer","response","normalizedResponse","normalizeText","toLowerCase","normalizedText","replace","trim","htmlTableToString","table","tab","lines","Array","from","querySelectorAll","maxColumnsLength","map","line","cellsContent","cell","index","content","_a","textContent","Math","max","length","push","lineSeparationSize","reduce","a","b","lineSeparation","fill","join","mappedTab","padEnd","shift","handleRadioAndCheckbox","config","inputList","input","type","parentNode","includes","logs","responseTry","mouseover","addEventListener","checked","once","handleSelect","tagName","correct","split","array","filter","answer","j","options","option","test","closest","querySelector","indexCorrectAnswer","findIndex","selected","handleTextbox","typing","event","key","preventDefault","slice","handleClipboard","navigator","clipboard","writeText","handleNumber","number","_b","match","handleContentEditable","getAttribute","focus","range","createRange","selectNodeContents","collapse","selection","window","getSelection","removeAllRanges","addRange","reply","hiddenButton","form","query","cursor","style","question","questionContainer","innerText","accesshideElements","useless","tables","createQuestion","controller","AbortController","timeoutControler","abort","req","fetch","method","headers","Authorization","apiKey","signal","timeout","body","JSON","stringify","model","messages","role","temperature","top_p","presence_penalty","stop","clearTimeout","json","choices","message","getChatGPTResponse","catch","error","haveError","infinite","mode","removeListener","questionBackup","whiteSpace","isNotResponse","handlers","handler","pressedKeys","listeners","codeListener","code","listener","element","removeEventListener","fn","forms","injectionFunction","bind","setUpMoodleGpt","splice","chrome","storage","sync","get","moodleGPT","Error"],"mappings":"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","x_google_ignoreList":[1]} \ No newline at end of file diff --git a/src/core/get-response.ts b/src/core/get-response.ts index b3b9e28..d5dcc7b 100644 --- a/src/core/get-response.ts +++ b/src/core/get-response.ts @@ -29,10 +29,11 @@ async function getChatGPTResponse( content: ` Follow those rules: - Sometimes there won't be a question, so just answer the statement as you normally would without following the other rules and give the most detailled and complete answer with explication. +- For put in order question just give the good order separate by new line - Your goal is to understand the statement and to reply to each question by giving only the answer. -- You will keep the same order for the answers as it's asked event if it's a put in order question. Never change the order of the response for each questions. +- You will keep the same order for the answers like in the text. - You will separate all the answer with new lines and only show the correctes one. -- You will onyl give the answers for each question and omit the questions, statement, title or other informations from the response. +- You will only give the answers for each question and omit the questions, statement, title or other informations from the response. - You will only give answer with exactly the same text as the gived answers. - The question always have the good answer so you should always give an answer to the question. - You will always respond in the same langage as the user question.`, diff --git a/src/core/questions/select.ts b/src/core/questions/select.ts index 4497821..0ebcbb2 100644 --- a/src/core/questions/select.ts +++ b/src/core/questions/select.ts @@ -49,28 +49,29 @@ function handleSelect( /* Handle put in order question */ if (!/[^\d]+/gi.test(content)) { - console.log("Checking put in order..."); - const content = normalizeText( - (option.parentNode as HTMLElement) - .closest("tr") - .querySelector(".text").textContent - ); - const index = correct.findIndex((answer) => { + const elementTitle = (option.parentNode as HTMLElement) + .closest("tr") + .querySelector(".text"); + const content = normalizeText(elementTitle.textContent); + + const indexCorrectAnswer = correct.findIndex((answer) => { const valide = answer.includes(content); if (config.logs) Logs.responseTry(content, valide); return valide; }); - if (index !== -1) { + + if (indexCorrectAnswer !== -1) { + //we do + 1 because we skip the first option: Choose... if (config.mouseover) { - options[index].closest("select").addEventListener( + options[indexCorrectAnswer + 1].closest("select").addEventListener( "click", function () { - options[index + 1].selected = "selected" as any; + options[indexCorrectAnswer + 1].selected = "selected" as any; }, { once: true } ); } else { - options[index + 1].selected = "selected" as any; + options[indexCorrectAnswer + 1].selected = "selected" as any; } break; } diff --git a/test/fake-moodle/index.html b/test/fake-moodle/index.html index 29d727e..9f8bef2 100644 --- a/test/fake-moodle/index.html +++ b/test/fake-moodle/index.html @@ -131,17 +131,14 @@
-

- Put the three steps needed in a general sense for a computer program - to solve the problem in the correct order -

+

Put in order the step to create a java program.

-

1. 5*5

+

1. 5*5 = ?

-

2. 20 - 10

+

2. 20 - 10 = ?

3. 10+10

3. 10+10 = ?

- +
-

Understand the problem

+

Write java code

-

Carry out the plan and write the actual code

+

Execute the java executable file

-

Create a step-by-step plan for how you'll solve it

+

Compile the java code