Replace monaco with vanilla textarea.
// ==UserScript== // @name LeetCode Turbo // @description Replace monaco with vanilla textarea. // @namespace https://greasyfork.org/users/197529 // @version 0.1.4 // @author kkocdko // @license Unlicense // @match *://leetcode.com/problems/* // @match *://leetcode.cn/problems/* // @run-at document-start // ==/UserScript== "use strict"; const globalThis = this.unsafeWindow || this; const originFetch = globalThis.fetch; const textarea = document.createElement("textarea"); textarea.style = "font-family: monospace; height: 100%; width: 100%; padding: 6px 10px; white-space: pre; outline: none;"; const replaceEditorTimer = setInterval(() => { const el = document.querySelector("#editor"); if (el) el.replaceWith(textarea), clearInterval(replaceEditorTimer); }, 500); globalThis.fetch = (input, init) => { if (input?.includes("/lc-monaco/") || input?.includes("/monaco-tm/")) throw Error("Monaco editor blocked."); if (input?.endsWith("/submit") || input?.endsWith("/submit/")) init.body = JSON.stringify({ ...JSON.parse(init.body), typed_code: textarea.value, }); return originFetch(input, init); }; fetch("https://leetcode.cn/graphql/", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ operationName: "questionEditorData", variables: { titleSlug: location.pathname.split("/")[2] }, query: "query questionEditorData($titleSlug: String!) { question(titleSlug: $titleSlug) { codeSnippets { langSlug code } } }", }), }).then(async (v) => { const snippets = (await v.json()).data.question.codeSnippets; textarea.value = snippets.find((v) => v.langSlug == "cpp").code; }); globalThis.requestAnimationFrame = () => {}; // just ignore the requestAnimationFrame is ok? // make a LRU cache for getComputedStyle /* const cache4gcs = new Map(); const originGetComputedStyle = globalThis.getComputedStyle; globalThis.getComputedStyle = (elt, pseudoElt) => { if (pseudoElt !== undefined) return originGetComputedStyle(elt, pseudoElt); let pair = cache4gcs.get(elt); const now = Date.now(); if (pair === undefined || pair[0] + 900 < now) { pair = [now, originGetComputedStyle(elt, pseudoElt)]; console.log("miss " + now); } cache4gcs.delete(elt); cache4gcs.set(elt, pair); if (cache4gcs.size > 32) { const keys = cache4gcs.keys(); for (let i = 0; i < 8; i++) cache4gcs.delete(keys.next().value); } return pair[1]; }; */ // more conservative requestAnimationFrame /* const cache4raf = new Map(); const originRequestAnimationFrame = globalThis.requestAnimationFrame; globalThis.requestAnimationFrame = (callback) => { const k = callback.toString(); const now = Date.now(); const interval = 200; if (cache4raf.get(k) > now - interval) { originRequestAnimationFrame(callback); } else { setTimeout(() => { originRequestAnimationFrame(callback); }, interval); } if (cache4raf.size > 32) { const keys = cache4raf.keys(); for (let i = 0; i < 8; i++) cache4raf.delete(keys.next().value); } }; */ // https://leetcode.cn/problems/intersection-of-two-arrays-ii/description/ // ublock append ||static.leetcode.cn/lc-monaco/ /* fetch("https://leetcode.cn/graphql/", { headers: { "content-type": "application/json" }, method: "POST", body: JSON.stringify({ query: "\n query questionTitle($titleSlug: String!) {\n question(titleSlug: $titleSlug) {\n questionId\n questionFrontendId\n title\n titleSlug\n isPaidOnly\n difficulty\n likes\n dislikes\n categoryTitle\n }\n}\n ", variables: { titleSlug: "intersection-of-two-arrays-ii" }, operationName: "questionTitle", }), }) .then((v) => v.text()) .then((v) => console.log(v)); // 获取预设代码片段 fetch("https://leetcode.cn/graphql/", { headers: { "content-type": "application/json" }, method: "POST", body: JSON.stringify({ query: "\n query questionEditorData($titleSlug: String!) {\n question(titleSlug: $titleSlug) {\n questionId\n questionFrontendId\n codeSnippets {\n lang\n langSlug\n code\n }\n envInfo\n enableRunCode\n hasFrontendPreview\n frontendPreviews\n }\n}\n ", variables: { titleSlug: "intersection-of-two-arrays-ii" }, operationName: "questionEditorData", }), }) .then((v) => v.json()) .then((v) => console.log(v)); fetch("https://leetcode.cn/graphql/", { headers: { "content-type": "application/json" }, method: "POST", body: JSON.stringify({ query: "\n query questionContent($titleSlug: String!) {\n question(titleSlug: $titleSlug) {\n content\n editorType\n mysqlSchemas\n dataSchemas\n }\n}\n ", variables: { titleSlug: "intersection-of-two-arrays-ii" }, operationName: "questionContent", }), }); fetch("https://leetcode.cn/graphql/", { headers: { "content-type": "application/json" }, method: "POST", body: JSON.stringify({ query: "\n query questionTranslations($titleSlug: String!) {\n question(titleSlug: $titleSlug) {\n translatedTitle\n translatedContent\n }\n}\n ", variables: { titleSlug: "intersection-of-two-arrays-ii" }, operationName: "questionTranslations", }), }); */