- // ==UserScript==
- // @name Formify
- // @version 4.1
- // @description Let AI solve your google forms
- // @author rohitaryal
- // @license MIT
- // @grant GM_addElement
- // @grant GM_addStyle
- // @grant unsafeWindow
- // @namespace https://docs.google.com/
- // @match https://docs.google.com/forms/*
- // @icon https://www.google.com/s2/favicons?sz=64&domain=docs.google.com
- // ==/UserScript==
-
-
- const css = `body.hidden {
- overflow: hidden;
- }
-
- .dialog-container * {
- margin: 0;
- padding: 0;
- font-family: system-ui;
- box-sizing: border-box;
- }
-
- .dialog-container {
- position: fixed;
- top: 0;
- left: 0;
- height: 100vh;
- width: 100vw;
- background-color: rgba(0, 0, 0, 0.836);
- z-index: 999;
- display: none;
- }
-
- .dialog-container .dialog {
- z-index: 1000;
- position: relative;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- height: 80%;
- width: 30rem;
- background-color: white;
- border-radius: .5rem;
- overflow: hidden;
- display: flex;
- align-items: center;
- flex-direction: column;
- }
-
- .dialog-container.active {
- display: block;
- }
-
- .dialog-container .dialog .formify-header {
- display: flex;
- width: 100%;
- padding: .5rem 1rem .5rem .5rem;
- gap: 1rem;
- align-items: center;
- font-size: xx-large;
- font-family: system-ui;
- border-bottom: 4px solid rgba(0, 0, 255, 0.45);
- }
-
- .dialog-container .dialog .formify-header .formify-text {
- flex: 1;
- }
-
- .dialog-container .dialog .formify-header .formify-text b {
- font-weight: 600;
- font-size: 1.2em;
- background-clip: text;
- color: transparent;
- background-image: linear-gradient(to right, #159957, #155799, rgb(81, 81, 255));
- animation: animateheader 2s linear infinite;
- }
-
- @keyframes animateheader {
-
- 0%,
- 100% {
- filter: hue-rotate(0deg);
- }
-
- 100% {
- filter: hue-rotate(360deg);
- }
- }
-
- .dialog-container .dialog .formify-header .close {
- cursor: pointer;
- transition-duration: .2s;
- }
-
- .dialog-container .dialog .formify-header .close:hover {
- opacity: .5;
- }
-
- .dialog-container .dialog .formify-header .close {
- font-size: 2.5rem;
- }
-
- .dialog-container .dialog .formify-header .close:active {
- transform: scale(1.1);
- }
-
- .dialog-container .dialog .form-body {
- flex: 1;
- width: 100%;
- overflow-y: auto;
- }
-
- .dialog-container .dialog .form-body ul {
- list-style-type: none;
- }
-
- .dialog-container .dialog .form-body ul li {
- font-size: large;
- padding: 1rem;
- display: flex;
- align-items: center;
- border-bottom: 1px solid rgba(0, 0, 255, 0.192);
- }
-
- .dialog-container .dialog .form-body ul li code {
- background-color: rgba(128, 128, 128, 0.084);
- padding: .2em;
- border-radius: 5px;
- color: rgb(21, 21, 21);
- }
-
- .dialog-container .dialog .form-body ul label {
- flex: 1;
- font-size: 1.2rem;
- padding: .5rem 0;
- }
-
- .dialog-container .dialog .form-body ul input,
- .dialog-container .dialog .form-body ul select {
- outline: none;
- border: 2px solid rgba(0, 0, 255, 0.192);
- font-size: 1.2rem;
- padding: .5rem;
- width: 60%;
- border-radius: .5rem;
- background-color: transparent;
- }
-
- .dialog-container .dialog .form-footer {
- width: 100%;
- display: flex;
- padding: .1rem .5rem;
- gap: .5rem;
- align-items: center;
- border-top: 2px solid rgba(0, 0, 0, 0.107);
- }
-
- .dialog-container .dialog .form-footer img {
- cursor: pointer;
- text-decoration: none;
- }
-
- .dialog-container .dialog .form-footer a {
- text-decoration: none;
- color: #155799;
- }
-
- .ai-container {
- overflow: hidden;
- display: flex;
- flex-direction: column;
- height: fit-content;
- margin: .5rem;
- border-radius: 1rem;
- box-shadow: rgba(0, 0, 0, 0.15) 0px 2px 8px;
- }
-
- .ai-container.inactive {
- display: none;
- }
-
- .ai-container .container-header {
- display: flex;
- padding: .5rem 1rem;
- align-items: center;
- background-color: rgba(0, 0, 255, 0.192);
- justify-content: space-between;
- border-bottom: 1px solid rgba(0, 0, 0, 0.201);
- }
-
- .ai-container .container-header .buttons button {
- border: none;
- cursor: pointer;
- padding: .5rem;
- border-radius: .3rem;
- background-color: transparent;
- }
-
- .ai-container .container-header .buttons button:hover {
- color: white;
- background-color: rgba(0, 0, 0, 0.322);
- }
-
- .ai-container .container-body {
- padding: 1rem;
- color: rgb(20, 20, 34);
- }
-
-
- .aiChatDialog {
- position: fixed; /* Stay in place on the screen */
- top: 0; /* stick to the top */
- right: 0; /* stick to the right */
- transform: translate(0,0); /* Reset transform properties, crucial */
- background-color: #f9f9f9;
- border: 1px solid #ccc;
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
- width: 300px;
- height: 400px;
- display: none;
- flex-direction: column;
- border-radius: 5px;
- overflow: hidden;
- z-index: 1000;
- left: auto; /* Add this to ensure it doesn't try to be on the left */
- }
-
-
- .dialogHeader {
- background-color: #ddd;
- padding: 10px;
- cursor: move;
- display: flex;
- justify-content: space-between;
- align-items: center;
- }
-
- .closeButton {
- cursor: pointer;
- font-size: 16px;
- }
-
- .chatHistory {
- flex-grow: 1;
- padding: 10px;
- overflow-y: auto;
- }
-
- .chatInputArea {
- padding: 10px;
- border-top: 1px solid #ccc;
- display: flex;
- outline: none;
- align-items: center;
- }
-
- .messageInput {
- flex-grow: 1;
- padding: 8px;
- border: 1px solid #ccc;
- border-radius: 4px;
- margin-right: 5px;
- }
-
- .sendButton {
- padding: 8px 12px;
- background-color: #4CAF50;
- color: white;
- border: none;
- border-radius: 4px;
- cursor: pointer;
- }
-
- .message {
- margin-bottom: 5px;
- padding: 8px;
- border-radius: 5px;
- }
-
- .userMessage {
- background-color: #DCF8C6;
- text-align: right;
- }
-
- .aiMessage {
- background-color: #ECE5DD;
- text-align: left;
- }
-
- @media(max-width: 600px) {
- .dialog-container .dialog {
- width: 25rem;
- }
- }
- `;
-
- const js = `const overlay = document.querySelector(".dialog-container");
- const dialog = document.querySelector(".dialog-container .dialog");
- const closeButton = document.querySelector(".dialog-container .dialog .formify-header .close");
- const apiField = document.querySelector('.dialog-container .dialog input#apikey');
- const modelSelect = document.querySelector('.dialog-container .dialog select#ai-model');
- const searchEngineSelect = document.querySelector('.dialog-container .dialog select#search-engine');
- const customPromptField = document.querySelector('.dialog-container .dialog input#custom-prompt');
-
- const setItem = (key, value) => {
- const storage = localStorage.getItem('formify');
- const parsedStorage = JSON.parse(storage || '{}');
-
- parsedStorage[key] = value;
-
- localStorage.setItem('formify', JSON.stringify(parsedStorage));
- }
-
- const getItem = (key) => {
- const storage = localStorage.getItem('formify');
- const parsedStorage = JSON.parse(storage || '{}');
- return parsedStorage[key];
- }
-
- const apiKey = getItem('apiKey');
- const model = getItem('model');
- const searchEngine = getItem('searchURL');
- const customPrompt = getItem('customPrompt');
-
- if (!model)
- setItem('model', "gemini-2.0-flash-lite");
-
- if (!searchEngine)
- setItem('searchURL', "https://www.google.com/search?q=");
-
- if (!customPrompt)
- setItem("customPrompt", "Your answer must include one of the options i provided here and please answer shortly and no markdown like response allowed, plain text and write the full answer, provide short description if possible");
-
- // Re-assigning values to the fields
- apiField.value = getItem('apiKey');
- modelSelect.value = getItem('model');
- searchEngineSelect.value = getItem('searchURL');
- customPromptField.value = getItem('customPrompt');
-
- overlay.addEventListener('click', (e) => {
- if (
- e.target === overlay ||
- e.target === closeButton
- ) {
- overlay.classList.toggle("active");
- }
- });
-
- apiField.addEventListener('input', (e) => {
- const apiKey = e.target.value;
- setItem('apiKey', apiKey);
- });
-
- modelSelect.addEventListener('change', (e) => {
- const selectedModel = e.target.value;
- setItem('model', selectedModel);
- });
-
- searchEngineSelect.addEventListener('change', (e) => {
- const selectedEngine = e.target.value;
- setItem('searchURL', selectedEngine);
- });
-
- customPromptField.addEventListener('input', (e) => {
- const promptValue = e.target.value;
- setItem('customPrompt', promptValue);
- });`;
- // src/utils/parsers/HTMLFormParser.ts
- var formHeaderParser = (form) => {
- const formContentContainer = form.querySelector(".lrKTG");
- if (!formContentContainer)
- throw new Error("[!] Form content not found. Are you sure you are providing correct form?");
- const formHeader = formContentContainer.querySelector(".m7w29c.O8VmIc.tIvQIf");
- if (!formHeader)
- console.warn("[W] Form header was not found");
- const formTitleContainer = formHeader?.querySelector(".ahS2Le");
- const formDescriptionContainer = formHeader?.querySelector(".cBGGJ.OIC90c");
- return {
- formTitle: formTitleContainer?.textContent || document.title,
- formDescription: formDescriptionContainer?.textContent || ""
- };
- };
- var formQuestionParser = (form) => {
- if (!(form instanceof HTMLFormElement))
- throw new Error("[!] I strictly require HTMLFormElement to parse header");
- const questionContainer = form.querySelector(".o3Dpx[role='list']");
- if (!questionContainer)
- throw new Error("Question container is missing. Are you sure you are providing correct form?");
- const questionList = questionContainer.querySelectorAll(".Qr7Oae[role='listitem']");
- if (!questionList.length)
- console.warn("[W] No questions found.");
- const parsedQuestions = [...questionList]?.map((questionContainer2) => {
- const infoContainerDiv = questionContainer2.querySelector("div[jsmodel='CP1oW']");
- const dataParams = infoContainerDiv?.getAttribute("data-params");
- const betterDataParams = dataParams?.replace("%.@.", "[").replace(/"/g, "'");
- const question = JSON.parse(betterDataParams || "[]")[0];
- if (!question) {
- return {
- title: "",
- moreInfo: "",
- type: -1,
- id: "",
- required: false,
- options: []
- };
- }
- const questionTitle = question[1];
- const extraInformation = question[9] || null;
- const questionType = question[3];
- const submitID = question[4][0][0];
- const isRequiredQuestion = question[4][0][2];
- const options = question[4][0][1]?.map((option) => {
- return {
- value: option[0],
- moreInfo: option[5] || null
- };
- });
- return {
- title: questionTitle,
- moreInfo: extraInformation,
- type: questionType,
- id: submitID,
- required: isRequiredQuestion,
- options
- };
- });
- return parsedQuestions;
- };
- var parse = () => {
- const form = document.querySelector("form#mG61Hd");
- if (!form) {
- throw new Error("Form element not found");
- }
- const { formDescription, formTitle } = formHeaderParser(form);
- const parsedQuestionList = formQuestionParser(form);
- return {
- title: formTitle,
- description: formDescription,
- questions: parsedQuestionList
- };
- };
-
- // src/utils/Utils.ts
- var groupedLog = (title, ...args) => {
- console.groupCollapsed(title);
- args.forEach((arg) => console.log(arg));
- console.groupEnd();
- };
-
- // src/utils/StorageUtils.ts
- var getItem = (key) => {
- const storage = localStorage.getItem("formify");
- try {
- const parsedStorage = JSON.parse(storage || "{}");
- return parsedStorage[key] || null;
- } catch (err) {
- groupedLog("Failed to parse JSON from localStorage", err);
- return null;
- }
- };
- var setItem = (key, value) => {
- const storage = localStorage.getItem("formify");
- let parsedStorage = {};
- try {
- parsedStorage = JSON.parse(storage || "{}");
- } catch (err) {
- groupedLog("Failed to parse JSON from localStorage", err);
- }
- parsedStorage[key] = value;
- localStorage.setItem("formify", JSON.stringify(parsedStorage));
- };
-
- // src/utils/NetworkUtils.ts
- var request = async (requestURL, requestOption = {
- method: "GET"
- }) => {
- if (requestOption.method == "GET" && requestOption.body) {
- groupedLog("Removing body from GET request.", requestURL, requestOption);
- delete requestOption.body;
- }
- try {
- const response = await fetch(requestURL, requestOption);
- const responseBody = await response.text();
- if (response.status != 200) {
- groupedLog(`Server responded with status ${response.status}`, requestURL, requestOption, responseBody);
- } else {
- groupedLog("Server responded successfully", requestURL, requestOption, responseBody);
- }
- return {
- success: response.status == 200,
- response: responseBody,
- statusText: response.statusText
- };
- } catch (err) {
- groupedLog("Failed to send request.", requestURL, requestOption, err);
- return {
- success: false,
- statusText: "ERROR",
- response: err instanceof Error ? err.message : String(err)
- };
- }
- };
-
- // src/utils/AIUtils.ts
- var getAIResponse = async (prompt2) => {
- const model = getItem("model") || "gemini-2.0-flash";
- if (model == "gemini-2.0-flash" || model == "gemini-2.0-pro-experimental" || model == "gemini-2.0-flash-lite" || model == "gemini-2.0-pro-exp-02-05") {
- return getGeminiResponse(prompt2);
- } else {
- return "Model not supported for now: " + model;
- }
- };
- var getGeminiResponse = async (prompt2) => {
- const model = getItem("model") || "gemini-2.0-flash";
- const apiKey = getItem("apiKey") || "";
- const response = await request(`https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent?key=${apiKey}`, {
- headers: new Headers({
- "Content-Type": "application/json"
- }),
- method: "POST",
- body: JSON.stringify({
- contents: [{
- parts: [
- {
- text: prompt2.prompt
- }
- ]
- }]
- })
- });
- if (!response.success) {
- return "Failed to fetch: " + response.statusText;
- }
- try {
- const parsedContent = JSON.parse(response.response);
- return parsedContent?.candidates?.[0]?.content?.parts?.[0]?.text;
- } catch (err) {
- return "Failed to parse response: " + err.message;
- }
- };
-
- // src/utils/DOMUtils.ts
- var answerModal = ({ options, question, answer }) => {
- const div = document.createElement("div");
- div.classList.add("ai-container");
- const header = document.createElement("span");
- header.classList.add("container-header");
- const modelNameSpan = document.createElement("span");
- modelNameSpan.classList.add("model-name");
- modelNameSpan.textContent = `\uD83E\uDD95 ${getItem("model") || "gemini-2.0-flash"}`;
- const buttons = document.createElement("span");
- buttons.classList.add("buttons");
- const body = document.createElement("span");
- body.classList.add("container-body");
- body.textContent = answer;
- const option = options?.map((option2) => option2.value)?.join(" ") || "";
- const buttonConfigs = [
- {
- id: "copy",
- title: "Copy answer to clipboard",
- text: "Copy",
- onclick: (e) => {
- e.preventDefault();
- navigator.clipboard.writeText(answer);
- e.target.textContent = "Copied";
- setTimeout(() => {
- e.target.textContent = "Copy";
- }, 2000);
- }
- },
- {
- id: "regenerate",
- title: "Re-generate answer",
- text: "Re-generate",
- onclick: async (e) => {
- e.preventDefault();
- body.textContent = "Re-generating answer... \uD83E\uDD95";
- const response = await getAIResponse({
- prompt: getItem("customPrompt") + `
- ` + question + option
- });
- body.textContent = response;
- }
- },
- {
- id: "open-chat",
- title: "Open this question in chat",
- text: "Open in Chat",
- onclick: (e) => {
- e.preventDefault();
- openAIChat();
- sendMessage(getItem("customPrompt") + `
- ` + question + option);
- }
- },
- {
- id: "search",
- title: "Search this question",
- text: "Search",
- onclick: (e) => {
- const anchor = document.createElement("a");
- anchor.href = (getItem("searchURL") || "https://www.google.com/search?q=") + question + option;
- anchor.target = "_blank";
- anchor.click();
- }
- }
- ];
- buttonConfigs.forEach(({ id, title, text, onclick }) => {
- const button = document.createElement("button");
- button.setAttribute("type", "button");
- button.id = id;
- button.title = title;
- button.textContent = text;
- buttons.appendChild(button);
- button.addEventListener("click", onclick);
- });
- header.appendChild(modelNameSpan);
- header.appendChild(buttons);
- div.appendChild(header);
- div.appendChild(body);
- return div;
- };
- var toggleDialog = (force) => {
- const dialog = document.querySelector(".dialog-container");
- if (!dialog) {
- groupedLog("Dialog container not found");
- return;
- }
- if (force === true) {
- dialog.classList.remove("hidden");
- } else if (force === false) {
- dialog.classList.add("active");
- } else {
- dialog.classList.toggle("active");
- }
- };
- var toggleAnswers = (force) => {
- const aiResponse = document.querySelectorAll(".ai-container");
- aiResponse.forEach((response) => {
- if (force === true) {
- response.classList.remove("inactive");
- } else if (force === false) {
- response.classList.add("inactive");
- } else {
- response.classList.toggle("inactive");
- }
- });
- };
- var dialogWidth = "300px";
- var dialogHeight = "400px";
- var aiChatDialog = null;
- var chatHistory;
- var messageInput;
- var isDragging = false;
- var offsetX;
- var offsetY;
- function addMessage(text, isUser) {
- const messageElement = document.createElement("div");
- messageElement.classList.add("message");
- messageElement.classList.add(isUser ? "userMessage" : "aiMessage");
- messageElement.textContent = text;
- chatHistory.appendChild(messageElement);
- chatHistory.scrollTop = chatHistory.scrollHeight;
- }
- async function sendMessage(msg = "") {
- const message = messageInput.value.trim() || msg;
- if (message) {
- addMessage(message, true);
- messageInput.value = "";
- try {
- const aiResponse = await getAIResponse({ prompt: message });
- addMessage(aiResponse, false);
- } catch (error) {
- addMessage("Error: Could not get AI response.", false);
- console.error("Error fetching AI response:", error);
- }
- }
- }
- function createAIChatDialog() {
- aiChatDialog = document.createElement("div");
- aiChatDialog.id = "aiChatDialog";
- aiChatDialog.style.width = dialogWidth;
- aiChatDialog.style.height = dialogHeight;
- const dialogHeader = document.createElement("div");
- dialogHeader.id = "dialogHeader";
- const headerText = document.createTextNode("Formify");
- dialogHeader.appendChild(headerText);
- const closeButton = document.createElement("span");
- closeButton.id = "closeButton";
- const closeText = document.createTextNode("×");
- closeButton.appendChild(closeText);
- chatHistory = document.createElement("div");
- chatHistory.id = "chatHistory";
- const chatInputArea = document.createElement("div");
- chatInputArea.id = "chatInputArea";
- messageInput = document.createElement("input");
- messageInput.type = "text";
- messageInput.id = "messageInput";
- messageInput.placeholder = "Type your message...";
- const sendButton = document.createElement("button");
- sendButton.id = "sendButton";
- const sendText = document.createTextNode("Send");
- sendButton.appendChild(sendText);
- dialogHeader.appendChild(closeButton);
- chatInputArea.appendChild(messageInput);
- chatInputArea.appendChild(sendButton);
- aiChatDialog.appendChild(dialogHeader);
- aiChatDialog.appendChild(chatHistory);
- aiChatDialog.appendChild(chatInputArea);
- closeButton.addEventListener("click", closeAIChat);
- sendButton.addEventListener("click", () => sendMessage());
- messageInput.addEventListener("keydown", (event) => {
- if (event.key === "Enter") {
- sendMessage();
- }
- });
- dialogHeader.addEventListener("mousedown", (e) => {
- isDragging = true;
- offsetX = e.clientX - aiChatDialog.offsetLeft;
- offsetY = e.clientY - aiChatDialog.offsetTop;
- });
- document.addEventListener("mouseup", () => {
- isDragging = false;
- });
- document.addEventListener("mousemove", (e) => {
- if (!isDragging)
- return;
- let newX = e.clientX - offsetX;
- let newY = e.clientY - offsetY;
- const maxX = window.innerWidth - aiChatDialog.offsetWidth;
- const maxY = window.innerHeight - aiChatDialog.offsetHeight;
- newX = Math.max(0, Math.min(newX, maxX));
- newY = Math.max(0, Math.min(newY, maxY));
- aiChatDialog.style.left = newX + "px";
- aiChatDialog.style.top = newY + "px";
- aiChatDialog.style.right = "auto";
- });
- aiChatDialog.classList.add("aiChatDialog");
- dialogHeader.classList.add("dialogHeader");
- closeButton.classList.add("closeButton");
- chatHistory.classList.add("chatHistory");
- chatInputArea.classList.add("chatInputArea");
- messageInput.classList.add("messageInput");
- sendButton.classList.add("sendButton");
- document.body.appendChild(aiChatDialog);
- addMessage("Starting conversation...", false);
- return aiChatDialog;
- }
- function closeAIChat() {
- if (aiChatDialog) {
- aiChatDialog.style.display = "none";
- }
- }
- function openAIChat() {
- if (!aiChatDialog) {
- createAIChatDialog();
- }
- aiChatDialog.style.display = "flex";
- }
- var ready = () => {
- const dialogContainer = document.createElement("div");
- dialogContainer.className = "dialog-container";
- const dialog = document.createElement("div");
- dialog.className = "dialog";
- const header = document.createElement("span");
- header.className = "formify-header";
- const logo = document.createElement("img");
- logo.alt = "F is for Formify";
- logo.height = 40;
- logo.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAACXBIWXMAATr1AAE69QGXCHZXAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAHqJJREFUeJzt3X/0bWdB3/n3TW5CEiAQEgi/Agk/AyRgwm/BAkoRpCKLAiMOoFRUah0VWylTrWuWpVhEqXVW6yAtCAX5jS1YUFqttShUhVaQUeoMoAPWCiIgmggkmT/2vZDf93vO95zznH3O67XWWcnKOnvvD1nhPp/z7L2fpwAAAAAAAAAAAAAAAAAAAAAAAACAzTkyOsAOOlKdfexzq+qmx/75GdVNRoUCmIm/qv7y2N9/rvqz6k+Pfa4aFWoXKQDLOau6b3Xv6i7V+dUF1XnVrfPvFWDVrqw+Wf1h9dFjnw9XH6w+0FQUWICB6sRuWj2wenj1kKaB/7yhiQC4tj+s3l+9p3pX9Zt9eSaB66EAXNfJTQP9Y6vHVJdWR4cmAmBRX6jeV72zekf1G9UVQxNtGQVgcnr1uOop1dc2TfEDsDs+Vf1i9camQnD52Djj7XMBOLlpsP9fq6+vbj42DgAb8tnqbdWrm2YIrhwbZ4x9LAC3r55RPafp4T0A9tfHm4rA/9X0YOHe2KcCcP/qe6qn5Z4+ANd0ZfX26keqXx+cZSN2vQAcqZ5QPa/6ysFZAJiHd1U/Wv18O7z2wC4XgEc3NbkHjA4CwCy9v3pB04ODO2cXC8DDqhdXDx0dBICd8GvV91fvHh1klXapANyxemH19HbrfxcA2+Hnq/+tHXlY8OTRAVbg1OoHq9c3Pehn8AdgHe5RfXt1UtNswKxfH5z7YPnQ6mXVfUYHAWCv/E71bU1LD8/SSaMDLOn06ieantQ0+AOwaRc1jUEvqU4bnGUpc5wBuE/1s02b8gDAaP9306qy/210kEXM6RmAI9X3VW+o7jA4CwAcd+vqW6rPNW06NAtzmQG4efXy6smjgwDAjXhr9czqM6ODnMgcCsA9q7dU9x4dBAAO4L9XT6o+ODrIjdn2hwC/rvrNDP4AzMc9mvYT+NrRQW7MNj8D8OymHZpOHx0EABZ0k6bN5z7Z9EN262xjATjStJTvP2n7ZygA4IacVD2+6TXBXx6c5Tq2rQCc1LSwz3eNDgIAK/Lw6vbVv2uLdhfcpgJwctOT/s8aHQQAVuz+TQ+1v7UtWUJ4WwrA0aa1/J82OggArMlF1b2qn2sLSsA2FICTqldW/8voIACwZveu7lL92wbfDhhdAI5UP5VpfwD2x32rOzXdDhhmdAF4cfXdgzMAwKZd0vSq4C+NCjCyADy76VU/ANhHD6/+pPqtERcftRTw45qmPo4Ouj4AbIMrqidWP7/pC48oAPeq/kvTBj8AsO8+Wz2o+tAmL7rplfZuXr0pgz8AHHdm01sBZ27yopssAEeaFvqxsQ8AXNM9m16J39jM/CYfAvy+6rkbvB4AzMmF1aeabpOv3aaaxkVNuyGdtqHrAcAc/VXT8wDvX/eFNlEATqt+o7p4A9cCgLn7YPXA6rJ1XmQTtwB+rHrCBq4DALvgNtXp1TvXeZF1zwA8uPq1xq84CABzcmXTQkHvXtcF1lkATq3eV91njdcAgF31gaZthL+wjpOv85f5D1ZPXeP5AWCXnVtdXv3ndZx8XTMA51W/V52xpvMDwD64rOn1wD9c9YnXtRDQj2XwB4DDOr164TpOvI4ZgIc2Pfg3aqMhANglV1V/rXrXKk+6jkH615tKAACwGu+qvmqVJ1z1LYDHZ/AHgFV7ePWYVZ5wlTMAR5rWL37gCs8JAEx+q2mZ4KtWcbJVzgA8IYM/AKzLA6qvW9XJVlkA/v4KzwUAXNf3r+pEq7oF8MCmDX8AgPV6SCvYMnhVMwB+/QPAZjx3FSdZxQzAedVHsuEPAGzCF6vzq48f5iSrmAH41gz+ALApR6tnHfYkh50BOKn6cHXnwwYBAA7sI9XdmrYNXsphZwAem8EfADbtguprDnOCwxaApx/yeABgOYcagw9zC+C06n9WZx4mAACwlM9W51aXL3PwYWYAHp/BHwBGObND7A9wmALw5EMcCwAc3lOXPXDZWwAnV39S3WrZCwMAh/ap6jbVFYseuOwMwEMy+APAaLdq2iRoYcsWgMcueRwAsFqPW+agZQvA0g8dAAArtdSYvMwzADetPt20FCEAMNYXqltWf7nIQcvMADw4gz8AbItTWuI5gGUKwMOWOAYAWJ+Fx+ZlZwAAgO3x0EUPWGYq/75LHMP+uappqei/aHpmBFjckers6pym56/ghiw8Ni/6EOBZTYsOwLV9ovr31S9X76t+r7psaCLYLXeqHl59dfU3mx76guOuahqjP7OuCzzi2EV8fK5qWnnq31RfnwdDYZNOq55S/Wbj/xzw2Z7Pw1vAos8A3GfB77O7Xt805fTE6m3VF8fGgb1yefXG6oFNG7N9cGwctsRCY/SiBeCCBb/P7vlQ9TXVN+YPHdgGb68uqf5e0zM37K+FxmgFgEX86+r+Tff5ge3xherHq4urdw/OwjjnL/LlRQvAQidnZ1xZfVf1zPzCgG32keqR1U8NzsEYa50BuNOC32f+vlB9U/XPRwcBDuTz1Xce+3g2Z7/ceZEvL/Ia4ElNg8GyGwgxP1dV31q9YnQQYClfX72h6a0Bdt8V1alNs7YntMhgftaC32f+/kEGf5iztzXN4LEfTq5ucdAvLzKgn7N4Fmbs7dWLRocADu3nqjeNDsHGnH3QLy46A8B++GT1zU23AID5+57qs6NDsBG3OugXFykApy8RhHl6XlMJAHbDHzW9JsjuO/DzHosUgFOXCML8/LfqZ0aHAFbunzbt2cFuUwBY2gsz9Q+76M+rnxgdgrU78FitAHB1H63ePDoEsDYva9pHgN11k4N+cZEC4BXA3fevO+D7o8AsfSIlf9cdeKw2qHN1rx0dAFg7rwRSKQB82cer3x0dAli7d1Z/OToE4ykAHPcrowMAG/GX1XtHh2A8BYDjPjA6ALAxvz06AOMpABz3e6MDABvzodEBGE8B4Lg/Hh0A2BjLAqMA8CWfGx0A2Bj/f0cB4EsuGx0A2JgzRwdgPAUAYP/cfnQAxlMAAPbP3UcHYDwFAGD/PHJ0AMZTAAD2y52q80eHYDwFAGC/PGB0ALaDAgCwXy4ZHYDtoAAA7BcFgEoBANg3l44OwHZQAAD2x22q240OwXZQAAD2h1//fIkCALA/FAC+RAEA2B8eAORLFACA/aEA8CUKAMB+OLO6y+gQbA8FAGA/XFIdGR2C7aEAAOwH0/9cgwIAsB8UAK5BAQDYDwoA16AAAOy+m1QXjg7BdlEAAHbffatTRodguygAALvP9D/XoQAA7D4FgOtQAAB2nwLAdSgAALvt5Ori0SHYPgoAwG67sDpjdAi2jwIAsNtM/3O9FACA3aYAcL0UAIDdpgBwvRQAgN11pPqK0SHYTgoAwO46vzprdAi2kwIAsLtM/3ODFACA3aUAcIMUAIDddenoAGwvBQBgd5kB4AYpAAC76TbV7UaHYHspAAC76f6jA7DdFACA3WT6nxulAADsJgWAG6UAAOwmBYAbpQAA7J4zq7uMDsF2UwAAds8lTfsAwA1SAAB2j+l/TkgBANg9CgAnpAAA7B4FgBNSAAB2y2nVhaNDsP0UAIDdcnF1yugQbD8FAGC3mP7nQBQAgN2iAHAgCgDAblEAOBAFAGB3nNz0DACckAIAsDsurM4YHYJ5UAAAdofpfw5MAQDYHQoAB6YAAOyOS0cHYD4UAIDdcKS63+gQzIcCALAbzq/OGh2C+VAAAHaD6X8WogAA7AYPALIQBQBgNygALEQBAJi/I9WDRodgXhQAgPm7X3XO6BDMiwIAMH/fMDoA86MAAMzfN40OwPwoAADz9tjqHqNDMD8KAMC8/f3RAZgnBQBgvr6+euToEMyTAgAwT6dXPz46BPOlAADM04uru48OwXwpAADz86TqO0eHYN4UAIB5uaR6VdPqf7A0BQBgPu5Zvb266eggzJ8CADAPl1S/Ut12cA52hAIAsP0eX/2nDP6skAIAsL1Oqf5J9bbq5oOzsGOOjg4AwPV6SPXT1cWjg7CbzAAAbJd7VK+rfj2DP2tkBgBgvKPVo6u/Xf2N/DhjAxQAgM07tbpb9eCmtfwfX509MhD7RwGA3XGP6murB1a3rs7JYjHb5qbHPrevTh6chT2nAMD8Paz64eqrRwcB5kMBgPk6Uj2vemHuGQMLUgBgvn6i+u7RIYB58qsB5ukZGfyBQ1AAYH5Oq35kdAhg3hQAmJ9nVXcYHQKYNwUA5ucJowMA86cAwLycXP210SGA+VMAYF7Oqc4YHQKYPwUA5uWc0QGA3aAAwLycNjoAsBsUAADYQwoAAOwhBQAA9pACAAB7SAEAgD2kAADAHlIAAGAPKQAAsIcUAADYQwoAAOwhBQAA9pACAPNy1egAwG5QAGBe/mx0AGA3KAAwL58YHQDYDQoAzMvnqv9ndAhg/hQAmJ93jg4AzJ8CAPPz8jwMCBySAgDz897qbaNDAPOmAMA8fUf1sdEhgPlSAGCe/rh6YvU/RwcB5kkBgPl6b/WA6j+ODgLMjwIA8/ax6qurR1dvrj49Ng4wF0dHBwBW4peOfU6u7lHd+thHyV+d06vTqttWd60urC7Nn6PMlP9wYbdcUf3usQ/rd7PqYdU3Vk+pbjo2DhycXwcAy/tc9YvVs6rbVc/Pfg3MhAIAsBp/Xr2oulvTYk2w1RQAgNX6VPWt1dOaSgFsJQUAYD1eVz2qqRDA1lEAANbnvdVjqs+ODgLXpgAArNd7q2dkAye2jAIAsH5vrV4yOgRcnQIAsBn/IOszsEUUAIDN+Hz1nNwKYEsoAACb86vVa0eHgFIAADbtB5tmA2AoBQBgsz5SvWJ0CFAAADbvx6srR4dgvykAAJv3+9W/Hx2C/aYAAIzxytEB2G8KAMAYb8/DgAykAACM8ZnqXaNDsL8UAIBx3jc6APtLAQAY57dHB2B/KQAA4/yP0QHYXwoAwDh/PjoA+0sBABjnitEB2F8KAMA4tx0dgP2lAACMc7vRAdhfCgDAOA8eHYD9pQAAjPPI0QHYXwoAwBi3re42OgT7SwEAGMP0P0MpAABjKAAMpQAAjKEAMJQCALB5J1UPGB2C/aYAAGzevaozR4dgvykAAJv3oNEBQAEA2Dz3/xlOAQDYPAWA4RQAgM06o7podAhQAAA26/7V0dEhQAEA2CzT/2wFBQBgs+4/OgCUAgCwaQoAW0EBANicm1V3HR0CSgEA2KRL8ucuW8J/iACbc+noAHCcAgCwOZeMDgDHKQAAm2MGgK2hAABsxmnVhaNDwHEKAMBmXFydMjoEHKcAAGyG6X+2igIAsBkeAGSrKAAAm2EGgK2iAACs39FsAcyWUQAA1u9e1emjQ8DVKQAA62f6n62jAACsnwcA2ToKAMD6mQFg6ygAAOt1pLrv6BBwbQoAwHrdtbrF6BBwbQoAwHp9xegAcH0UAID1unh0ALg+CgDAern/z1ZSAADWSwFgKykAAOtz8+qC0SHg+igAAOtzcdNrgLB1FACA9TH9z9ZSAADWxxsAbC0FAGB9zACwtRQAgPU4Ul00OgTcEAUAYD3Or245OgTcEAUAYD1M/7PVFACA9VAA2GoKAMB6eAOAraYAAKyHGQC2mgIAsHqnV3cbHQJujAIAsHoXVSePDgE3RgEAWL17jw4AJ6IAAKyeAsDWUwAAVu/C0QHgRBQAgNW71+gAcCIKAMBqnVpdMDoEnIgCALBa96iOjg4BJ6IAAKzW3UcHgINQAABW606jA8BBKAAAq3WH0QHgIBQAgNW68+gAcBAKAMDqnFI9enQIOAgFAGB1/np1q9Eh4CAUAIDVecroAHBQCgDAapxbPXV0CDgoBQBgNZ5XnTE6BByUAgBweOdWzxkdAhahAAAc3j/Kr39mRgEAOJzHVM8eHQIWpQAALO+c6meqI4NzwMIUAIDlHKleVt1udBBYhgIAsJwXVk8cHQKWpQAALO57q+ePDgGHoQAALOZ51T8dHQIO6+joAAAzcUr1k3nfnx2hAACc2J2r11QPGx0EVsUtAIAbdkr1d6sPZPBnx5gBALiuo9XTqh+o7jk4C6yFAgDwZfdpGvifWZ03OAuslQIAu+Wsq/390ermo4JsudOa/t3ctukX/kXVo6o7jgwFm6QAwPwcrR5dPbm6b3V+deuRgYD5UQBgXu5evbp60OggwLwpADAft69+5dhfAQ7Fa4AwDydXb8ngD6yIAgDz8O3Vg0eHAHaHAgDb7xbVD48OAewWBQC233Orc0aHAHaLAgDb7ZbV94wOAeweBQC22wubSgDASikAsL3+9+pvjw4B7CYFALbTM6p/PDoEsLsUANg+j6leXh0ZHQTYXQoAbJcLq9dnlU5gzRQA2B5nV2/LQ3/ABigAsB1Oqd5U3W10EGA/KACwHV5WPXJ0CGB/KAAw3vdV3zw6BLBfFAAY69HVi0aHAPaPAgDjXFC9Nk/8AwMoADDGzau3ZpMfYBAFADbvSNNCPxeNDgLsLwUANu+HqyePDgHsNwUANutJ1Q+MDgGgAMDm3K96Vdb4B7aAAgCbcXb1luqmo4MAlAIAm3BK9cbqLqODABynAMD6/UT1qNEhAK5OAYD1+pbqO0eHALg2BQDW5yurl44OAXB9FABYj9tWb6hOHR0E4PooALB6pzQN/ncYHQTghigAsHo/WX3V6BAAN0YBgNV6RvWc0SEATkQBgNW5JA/9ATOhAMBqnF29uTp9dBCAg1AA4PCONq30d8HoIAAHpQDA4b04K/0BM6MAwOE8rfre0SEAFqUAwPLuW71sdAiAZSgAsJyzsr0vMGMKACzupOo11V1HBwFYlgIAi3tB9bjRIQAOQwGAxXxD9fzRIQAOSwGAg7tn9arqyOggAIelAMDB3Lzpob8zRwcBWAUFAE7sSPWK6t6jgwCsigIAJ/YPq785OgTAKikAcOMeU/3Q6BAAq6YAwA27e/X66uTRQQBWTQGA63ezpof+bjk6CMA6KABwXUeqf1VdNDoIwLooAHBd3189dXQIgHVSAOCavqb6x6NDAKybAgBfdqfqtdXR0UEA1k0BgMlp1ZurW48OArAJCgBM/kX1gNEhADZFAYD67upZo0MAbJICwL77yurFo0MAbJoCwD67XfXG6tTRQQA2TQFgX51SvaG6/eggACMoAOyrf149fHQIgFEUAPbRM6tvGx0CYCQFgH3z4OqnR4cAGE0BYJ+cW72pusnoIACjKQDsi6PV66s7jg4CsA0UAPbFi6pHjA4BsC0UAPbBE6vnjg4BsE0UAHbdPatXVkdGBwHYJgoAu+xm1VuqM0cHAdg2CgC76kj1iureo4MAbCMFgF31vOrJo0MAbCsFgF30qOoFo0MAbDMFgF1zXtP7/kdHBwHYZgoAu+SU6rXVrUcHAdh2CgC75P+sHjY6BMAcKADsiqdX3zE6BMBcKADsgvtVLx0dAmBOFADm7qymxX7OGB0EYE4UAObspOo11V1GBwGYGwWAOfs/qseNDgEwRwoAc/U3qh8YHQJgrhQA5uj86mfy3y/A0vwBytycXr25Ont0EIA5UwCYm39RXTo6BMDcKQDMyXdV3zI6BMAuUACYi4dUPz46BMCuUACYg3OrN1Wnjg4CsCsUALbd0abtfe8wOgjALlEA2HYvqh4xOgTArlEA2GZPrJ47OgTALlIA2Fb3rF5ZHRkdBGAXKQBso5s17fB35uggALtKAWDbHKleXt17dBCAXaYAsG2eVz1ldAiAXacAsE0eVb1gdAiAfaAAsC3Oq17X9N4/AGumALANTqleW91mdBCAfaEAsA1+snrY6BAA+0QBYLSnV88ZHQJg3ygAjHS/6qWjQwDsIwWAUc5qWuznjNFBAPaRAsAIJ1Wvru4yOgjAvlqkAFy5thTsmx+qvm50CIAddOCxepEC8IUlgsC1Pb76h6NDAOyovzroFxcpAAc+KdyA85t2+HPrCWA91lIAPr9EEDjutOrN1dmjgwDssLUUgMuWCMJ8nLzm8/90demarwGw7y4/6BcXKQCfWiII83H7NZ7771TPWOP5AZj86UG/uEgBOPBJmaUHrOm8D61esqZzA3BNB/6xfmSBk57U9BzAuqeKGeN91f1XfM5zq/dWd1jxeQG4ri9Wp1ZXHeTLi64D4DbA7rq0esIKz3e0aXtfgz/AZvxpBxz8a/HXsf5gwe8zLy+pbrGic/1I9cgVnQuAE1tojF60AHx0we8zL3etXt7h39N/SvV3Dx8HgAV8ZJEvKwBc25Oql7XY8yFX9+1N6/wvezwAy1lrAfjwgt9nnv5W9arqJgscc8um4vDSpodQANistRaADy74febr6dV/qu52gu8drZ5d/fdjfwVgjIXG6EWnac/KmwD75i+qH67+WddcYvJO1Tc3TfnfcUAuAL7sqqYx+jMHPWCZ+7R/WJ23xHHM2x9V/+PY398m/w0AbJOPVhcscsDRJS7y2/nDfx/dvvUuFwzA8t6/6AHLvO71niWOAQDW592LHrBMAfi1JY4BANbnXYsesMwzAKdXn86rXgCwDT7f9Cr2ZYsctMwMwGXVf13iOABg9X6rBQf/Wn7J13cueRwAsFpLjcnLFoBfWPI4AGC13rHMQcuu135y9SfVrZY8HgA4vE9W51ZXLnrgsjMAV1S/uOSxAMBqvKMlBv863LavbzzEsQDA4b1h2QMPs2XradUfV7c4xDkAgOV8urpt19yn5cAOMwNwefW2QxwPACzv51py8K/DFYCq1xzyeABgOT97mIMPcwugpgLx4erOhzwPAHBwH6nu1pIPANbhZwCurF5+yHMAAIv5Vx1i8K/DzwBU3bFpH+KTV3AuAODGfbE6v/r4YU5y2BmAqo9Vb1nBeQCAE3tjhxz8azUzAFUPrH5jRecCAG7Yg1vBmLuKGYCq32yJvYgBgIX8civ6wb2qAlD1oys8FwBwXS9e1YlWdQvguPc0TU0AAKv17uorV3WyVT+5/7Hq6Ss+JwBQz2p6/38lVj0DUNOzAA9bw3kBYF/9avWIVZ5wHQXgIdWvr+ncALBvrmoaW1f6tt0qHwI87j3Va9dwXgDYR69qDa/ar+tX+h2qD1U3XdP5AWAffK66Z/VHqz7xupbv/fOm2YWvXtP5AWAf/FD1C+s48Trv0x9tWiDoK9Z4DQDYVe+vHlB9YR0nX8czAMd9sfqO6oo1XgMAdtEV1be2psG/1r+D38erW1YPXfN1AGCXvKR65TovsIlX9W7S9PTifTdwLQCYu99p2mTv8nVeZFPv6t+n6XmA0zd0PQCYo8urB1UfWPeF1n0L4LhPNL3K8NgNXQ8A5uh7qn+3iQttqgDUdBvgXk2zAQDANb2uev6mLrbp5Xpv1rRSoBIAAF/2gaYH5v9iUxccsV7/PZtmA84ccG0A2Dafbrrv//ubvOg61wG4IR+qntq0TgAA7LMvNI2JGx38a7PPAFzd/9u0rvETBl0fALbBd1VvGHHhUQWg6r9Wp1UPH5gBAEZ5QfXiURcfWQCqfrk6t2mtYwDYFy+vnjsywOgCUPX26rzqktFBAGADXl39reqqkSG2oQDUVALufewDALvqjdUz24KN8ralAFxZvaW6U7YPBmA3/Wz1jLbkLbhtKQA1TYW8tbpV9eDBWQBglV5aPbst+OV/3DYVgON+oWkHQW8HALALXlD9vQbf87+2bSwAVb9U/X/V17W9GQHgxnyx+jsNfNXvxoxYCngRX9u0QIJlgwGYk09XT6n+w+ggN2TbC0DV3ZseELxodBAAOIDfq55U/e7oIDdmxF4Ai/r9ph2ShiyVCAALeF3T4nZbPfjXfO6vf756c/Wn1aOqo2PjAMA1XFZ9b/X8pg1+tt4cbgFc272r12S9AAC2wwerb6rePzrIIuYyA3B1n6heWZ3RtH/yHG5jALB7rqheUn1j0w63szLHGYCr+4rqX1b3Hx0EgL3y/urbqt8YHWRZc5wBuLo/rl5RXV49pDp1bBwAdtznqh+qvqVpvZrZmnsBqGkfgf9c/Ux186ZdBec+swHAdrmqelP1xKYN7K4cG+fwdnGgfEjTqkuWEgZgFX61+v5mPN1/fXbxAbr3VF917POrg7MAMF/vqZ5QPaIdG/xrN2cAru3xTc3tEaODADAL/7H60abN6XbWPhSA4x7YtBvTk7KQEADX9MWme/w/Vr13cJaN2KcCcNztqmdW317dZXAWAMb6WNPicj9V/cHgLBu1jwXguJOqr6meXn1DdYuxcQDYkE9X/6Z6ddN0/+yf6F/GPheAq7tJ09bDT60eW509Ng4AK/bJ6h3VG6t3Vn81Ns54CsB1ndz0vMBjq8c07ep0ytBEACzq89VvNQ327zj293v5S/+GKAAndnpTIXh40xoDF1fnjwwEwHV8tGl53vdU72oa8C8bGWjbKQDLuUVTEbhPdcGxz/nVnatz2o0VFgG2yRVN0/h/UH2kacD/cNNOfL9TfWZYsplSANbjrKYicIvqlsf+2WlNswkA3LDLmvZ3qfqz6rNNA/+fDUsEAAAAAAAAAAAAAAAAAAAAAAAAAHBo/z9DresJOvIrdwAAAABJRU5ErkJggg==";
- const headerText = document.createElement("span");
- headerText.className = "formify-text";
- const boldText = document.createElement("b");
- boldText.innerText = "Formify";
- headerText.appendChild(boldText);
- const closeBtn = document.createElement("span");
- closeBtn.className = "close";
- closeBtn.innerText = "×";
- header.appendChild(logo);
- header.appendChild(headerText);
- header.appendChild(closeBtn);
- const formBody = document.createElement("span");
- formBody.className = "form-body";
- const ul = document.createElement("ul");
- const listItems = [
- { label: "API Key", type: "text", id: "apikey", placeholder: "Paste API key here" },
- {
- label: "AI Model",
- type: "select",
- id: "ai-model",
- options: [
- { value: "gemini-2.0-pro-exp-02-05", text: "Gemini 2.0 Pro Experimental" },
- { value: "gemini-2.0-flash", text: "Gemini 2.0 Flash" },
- { value: "gemini-2.0-flash-lite", text: "Gemini 2.0 Flash-Lite" },
- { value: "gemini-1.5-pro", text: "Gemini 1.5 Pro" },
- { value: "gpt-4.5-preview", text: "gpt-4.5-preview" },
- { value: "gpt-4o-mini", text: "gpt-4o-mini" }
- ]
- },
- {
- label: "Search Engine",
- type: "select",
- id: "search-engine",
- options: [
- { value: "https://www.google.com/search?q=", text: "Google" },
- { value: "https://chatgpt.com/?q=", text: "ChatGPT Search" },
- { value: "https://www.bing.com/search?q=", text: "Bing" },
- { value: "https://search.yahoo.com/search?p=", text: "Yahoo" },
- { value: "https://duckduckgo.com/?q=", text: "DuckDuckGo" },
- { value: "https://www.baidu.com/s?wd=", text: "Baidu" },
- { value: "https://www.yandex.com/search/?text=", text: "Yandex" },
- { value: "https://www.ecosia.org/search?q=", text: "Ecosia" },
- { value: "https://www.ask.com/web?q=", text: "Ask" },
- { value: "https://www.startpage.com/do/search?q=", text: "Startpage" },
- { value: "https://search.brave.com/search?q=", text: "Brave Search" }
- ]
- },
- { label: "Custom Prompt", type: "text", id: "custom-prompt", placeholder: "Custom prompt to feed the model" },
- { label: "Dialog Shortcuts", type: "code", value: "ALT + K" },
- { label: "AI Response hide/unhide", type: "code", value: "ALT + M" }
- ];
- listItems.forEach((item) => {
- const li = document.createElement("li");
- const label = document.createElement("label");
- label.innerText = item.label;
- if (item.type === "text") {
- const input = document.createElement("input");
- input.type = "text";
- input.setAttribute("name", item.id || "");
- input.setAttribute("id", item.id || "");
- input.setAttribute("placeholder", item.placeholder || "");
- li.appendChild(label);
- li.appendChild(input);
- } else if (item.type === "select") {
- const select = document.createElement("select");
- select.setAttribute("name", item.id || "");
- select.setAttribute("id", item.id || "");
- item.options.forEach((optionData) => {
- const option = document.createElement("option");
- option.setAttribute("value", optionData.value);
- option.textContent = optionData.text;
- select.appendChild(option);
- });
- li.appendChild(label);
- li.appendChild(select);
- } else if (item.type === "code") {
- const code = document.createElement("code");
- code.textContent = item.value || "";
- li.appendChild(label);
- li.appendChild(code);
- }
- ul.appendChild(li);
- });
- formBody.appendChild(ul);
- const formFooter = document.createElement("span");
- formFooter.className = "form-footer";
- const footerLinks = [
- { href: "https://github.com/rohitaryal/formify", text: "Submit a bug ↗" },
- { href: "https://www.youtube.com/watch?v=dQw4w9WgXcQ", text: "Hmm ↗" }
- ];
- footerLinks.forEach((linkData) => {
- const link = document.createElement("a");
- link.target = "_blank";
- link.href = linkData.href;
- link.innerText = linkData.text;
- formFooter.appendChild(link);
- });
- dialog.appendChild(header);
- dialog.appendChild(formBody);
- dialog.appendChild(formFooter);
- dialogContainer.appendChild(dialog);
- document.body.appendChild(dialogContainer);
- };
-
- // src/index.ts
- (async function() {
- GM_addStyle(css);
- ready();
- GM_addElement("script", {
- textContent: js
- });
- let apiKey = getItem("apiKey");
- if (!apiKey) {
- apiKey = prompt("Please paste your API key, you can generate free api key from: https://aistudio.google.com/apikey");
- if (apiKey) {
- setItem("apiKey", apiKey);
- } else {
- alert("API key is required to interact with the AI model.");
- }
- }
- document.addEventListener("keydown", (e) => {
- if (e.altKey && e.key == "k" || e.key == "Escape") {
- toggleDialog();
- }
- if (e.key == "m" && e.altKey) {
- toggleAnswers();
- }
- });
- let scrapedContent = parse();
- const questionContainers = document.querySelectorAll(".Qr7Oae[role='listitem']");
- for (let i = 0;i < questionContainers.length; i++) {
- const questionContainer = questionContainers[i];
- const question = scrapedContent.questions[i];
- const prompt2 = getItem("customPrompt") + `
- ` + question.title + (question.options?.map((option) => option.value + ", ") || "");
- const aiAnswer = await getAIResponse({ prompt: prompt2 });
- const options = questionContainer.querySelectorAll("label");
- for (const option of options || []) {
- const betterOptionText = option.textContent?.trim();
- const betterAiAnswer = aiAnswer.trim();
- if (betterAiAnswer.includes(betterOptionText)) {
- if (question.type == 2 || question.type == 4) {
- option.click();
- if (question.type == 2) {
- break;
- }
- }
- }
- }
- const answer = answerModal({
- question: question.title,
- options: question.options,
- answer: aiAnswer
- });
- questionContainer.appendChild(answer);
- }
- })();