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
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+ Moodle test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
-
-
-
MoodleGPT
-
+
+
+
@@ -70,20 +72,6 @@
MoodleGPT
Settings:
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
zcmb7qWl&sEkS-S71HonRAi*U#gA*)3@E`#KgaBc1x53>ZI6(po?m9sN10=Y+28SSn
z4E82lyIb|D_HEVsaqsCq-F@!4bxwDE-PKXrn#u&Y)VL@pC
h|wJUH!=5g@VG|
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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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