diff --git a/README.md b/README.md index 7a18c31..9f4ccbe 100644 --- a/README.md +++ b/README.md @@ -43,14 +43,27 @@ Type back the code on the keyboard and the code will be removed from the - Cursor indication: show a pointer cursor and a hourglass to know when the request is finished. - Title indication: show some informations into the title to know for example if the code have been injected.
![Injected](./assets/title-injected.png) -- Infinite try: click as much as you want on the question (don't forget to reset the question). - Console logs: show logs into the console.
Logs +- Request timeout: If the request is too long it will be abort after 10seconds. - 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.
![Mouseover](./assets/mouseover.gif)
![Mouseover2](./assets/mouseover2.gif) +- Table formatting: Format table from the question to make it more readable for CHAT-GPT. + +``` +-------------------------------- +| |name |birthDate |cars| +-------------------------------- +|Person 1|Yvick|15/08/1999|yes | +-------------------------------- +|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). ## Examples diff --git a/assets/popup.png b/assets/popup.png index 21a20c9..1f109d0 100644 Binary files a/assets/popup.png and b/assets/popup.png differ diff --git a/extension/moodle-gpt.js b/extension/moodle-gpt.js index 8ab0167..45dc961 100644 --- a/extension/moodle-gpt.js +++ b/extension/moodle-gpt.js @@ -77,12 +77,15 @@ */ function getChatGPTResponse(config, question) { return __awaiter(this, void 0, void 0, function* () { + const controller = new AbortController(); + const timeoutControler = setTimeout(() => controller.abort(), 10000); 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 && config.model !== "" ? config.model : "gpt-3.5-turbo", messages: [{ role: "user", content: question }], @@ -92,21 +95,58 @@ stop: null, }), }); + clearTimeout(timeoutControler); const rep = yield req.json(); const response = rep.choices[0].message.content; return 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 + 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")); + return "|" + mappedLine.join("|") + "|"; + }); + return lineSeparation + mappedTab.join(lineSeparation) + lineSeparation; + } + /** * Normalize the question and add sub informations * @param langage * @param question * @returns */ - function normalizeQuestion(langage, question) { - const finalQuestion = `Give a short response as possible for this question, reply in ${langage && langage !== "" - ? 'this langage "' + langage + '"' + function normalizeQuestion(config, questionContainer) { + let question = questionContainer.textContent; + if (config.table) { + //make table more readable for chat-gpt + const tables = questionContainer.querySelectorAll("table"); + for (const table of tables) { + question = question.replace(table.textContent, htmlTableToString(table)); + } + } + const finalQuestion = `Give a short response as possible for this question, reply in ${config.langage && config.langage !== "" + ? 'this langage "' + config.langage + '"' : "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)`; @@ -297,15 +337,21 @@ if (config.cursor) hiddenButton.style.cursor = "wait"; (_a = form.querySelector(".accesshide")) === null || _a === void 0 ? void 0 : _a.remove(); - const question = normalizeQuestion(config.langage, form.textContent); + const question = normalizeQuestion(config, form); const inputList = form.querySelectorAll(query); - const response = yield getChatGPTResponse(config, question); + const response = yield getChatGPTResponse(config, question).catch((error) => ({ + error, + })); + if (config.cursor) + hiddenButton.style.cursor = config.infinite ? "pointer" : "initial"; + if (typeof response === "object" && "error" in response) { + console.error(response.error); + return; + } if (config.logs) { Logs.question(question); Logs.response(response); } - if (config.cursor) - hiddenButton.style.cursor = config.infinite ? "pointer" : "initial"; const handlers = [ handleTextbox, handleNumber, diff --git a/extension/moodle-gpt.js.map b/extension/moodle-gpt.js.map index 6ba6016..666793f 100644 --- a/extension/moodle-gpt.js.map +++ b/extension/moodle-gpt.js.map @@ -1 +1 @@ -{"version":3,"file":"moodle-gpt.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/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/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+/g, \"\\n\")\r\n .replace(/[ \\t]+/g, \" \")\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 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 body: JSON.stringify({\r\n model:\r\n config.model && config.model !== \"\" ? config.model : \"gpt-3.5-turbo\",\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 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","import Config from \"../types/config\";\r\nimport normalizeText from \"../utils/normalize-text\";\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(langage: Config[\"langage\"], question: string) {\r\n const finalQuestion = `Give a short response as possible for this question, reply in ${\r\n langage && langage !== \"\"\r\n ? 'this langage \"' + langage + '\"'\r\n : \"the following question langage\"\r\n } 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\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\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.langage, form.textContent);\r\n const inputList: NodeListOf = form.querySelectorAll(query);\r\n\r\n const response = await getChatGPTResponse(config, question);\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.cursor)\r\n hiddenButton.style.cursor = config.infinite ? \"pointer\" : \"initial\";\r\n\r\n const handlers = [\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 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\";\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":"moodle-gpt.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/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+/g, \"\\n\")\r\n .replace(/[ \\t]+/g, \" \")\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:\r\n config.model && config.model !== \"\" ? config.model : \"gpt-3.5-turbo\",\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 + 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(maxColumnsLength[index], \"\\u00A0\")\r\n );\r\n return \"|\" + mappedLine.join(\"|\") + \"|\";\r\n });\r\n\r\n return lineSeparation + mappedTab.join(lineSeparation) + lineSeparation;\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 = questionContainer.querySelectorAll(\"table\");\r\n for (const table of tables) {\r\n question = question.replace(table.textContent, htmlTableToString(table));\r\n }\r\n }\r\n\r\n const finalQuestion = `Give a short response as possible for this question, reply in ${\r\n config.langage && config.langage !== \"\"\r\n ? 'this langage \"' + config.langage + '\"'\r\n : \"the following question langage\"\r\n } 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\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\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 const handlers = [\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 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\";\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/popup/index.html b/extension/popup/index.html index e186268..d4971c8 100644 --- a/extension/popup/index.html +++ b/extension/popup/index.html @@ -45,6 +45,10 @@ +
+ + +
@@ -63,6 +67,10 @@
+
+ + +

Message

diff --git a/extension/popup/index.js b/extension/popup/index.js index 0366410..3a64487 100644 --- a/extension/popup/index.js +++ b/extension/popup/index.js @@ -9,6 +9,8 @@ const inputsCheckbox = [ "typing", "mouseover", "infinite", + "table", + "timeout", ]; function showMessage(messageTxt, valide) { @@ -23,9 +25,10 @@ saveBtn.addEventListener("click", function () { const [apiKey, code, langage, model] = inputsText.map((selector) => document.querySelector("#" + selector).value.trim() ); - const [logs, title, cursor, typing, mouseover, infinite] = inputsCheckbox.map( - (selector) => document.querySelector("#" + selector).checked - ); + const [logs, title, cursor, typing, mouseover, infinite, table, timeout] = + inputsCheckbox.map( + (selector) => document.querySelector("#" + selector).checked + ); if (!apiKey || !code) { showMessage("Please comple all the form"); @@ -49,6 +52,8 @@ saveBtn.addEventListener("click", function () { typing, mouseover, infinite, + table, + timeout, }, }); diff --git a/src/core/get-response.ts b/src/core/get-response.ts index 368d4f8..43decad 100644 --- a/src/core/get-response.ts +++ b/src/core/get-response.ts @@ -11,12 +11,15 @@ async function getChatGPTResponse( config: Config, question: string ): Promise { + const controller = new AbortController(); + const timeoutControler = setTimeout(() => controller.abort(), 10000); const req = await 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 && config.model !== "" ? config.model : "gpt-3.5-turbo", @@ -27,6 +30,7 @@ async function getChatGPTResponse( stop: null, }), }); + clearTimeout(timeoutControler); const rep = await req.json(); const response = rep.choices[0].message.content; return normalizeText(response); diff --git a/src/core/normalize-question.ts b/src/core/normalize-question.ts index e214ac7..c6f9b41 100644 --- a/src/core/normalize-question.ts +++ b/src/core/normalize-question.ts @@ -1,5 +1,6 @@ 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 @@ -7,10 +8,20 @@ import normalizeText from "../utils/normalize-text"; * @param question * @returns */ -function normalizeQuestion(langage: Config["langage"], question: string) { +function normalizeQuestion(config: Config, questionContainer: HTMLElement) { + let question = questionContainer.textContent; + + if (config.table) { + //make table more readable for chat-gpt + const tables = questionContainer.querySelectorAll("table"); + for (const table of tables) { + question = question.replace(table.textContent, htmlTableToString(table)); + } + } + const finalQuestion = `Give a short response as possible for this question, reply in ${ - langage && langage !== "" - ? 'this langage "' + langage + '"' + config.langage && config.langage !== "" + ? 'this langage "' + config.langage + '"' : "the following question langage" } and only show the result: ${question} diff --git a/src/core/reply.ts b/src/core/reply.ts index 10ea803..a7e5ede 100644 --- a/src/core/reply.ts +++ b/src/core/reply.ts @@ -26,19 +26,28 @@ async function reply( form.querySelector(".accesshide")?.remove(); - const question = normalizeQuestion(config.langage, form.textContent); + const question = normalizeQuestion(config, form); const inputList: NodeListOf = form.querySelectorAll(query); - const response = await getChatGPTResponse(config, question); + const response = await getChatGPTResponse(config, question).catch( + (error) => ({ + error, + }) + ); + + if (config.cursor) + hiddenButton.style.cursor = config.infinite ? "pointer" : "initial"; + + if (typeof response === "object" && "error" in response) { + console.error(response.error); + return; + } if (config.logs) { Logs.question(question); Logs.response(response); } - if (config.cursor) - hiddenButton.style.cursor = config.infinite ? "pointer" : "initial"; - const handlers = [ handleTextbox, handleNumber, diff --git a/src/types/config.d.ts b/src/types/config.d.ts index ad0b704..2f53194 100644 --- a/src/types/config.d.ts +++ b/src/types/config.d.ts @@ -9,6 +9,8 @@ type Config = { cursor?: boolean; logs?: boolean; title?: boolean; + table?: boolean; + timeout?: boolean; }; export default Config; diff --git a/src/utils/html-table-to-string.ts b/src/utils/html-table-to-string.ts new file mode 100644 index 0000000..367ef9a --- /dev/null +++ b/src/utils/html-table-to-string.ts @@ -0,0 +1,38 @@ +/** + * Convert table to representating string table + * @param table + * @returns + */ +function htmlTableToString(table: HTMLTableElement) { + const tab: string[][] = []; + const lines = Array.from(table.querySelectorAll("tr")); + const maxColumnsLength: number[] = []; + lines.map((line) => { + const cells = Array.from(line.querySelectorAll("td, th")); + const cellsContent = cells.map((cell, index) => { + const content = cell.textContent?.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 + 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") + ); + return "|" + mappedLine.join("|") + "|"; + }); + + return lineSeparation + mappedTab.join(lineSeparation) + lineSeparation; +} + +export default htmlTableToString;