// ==UserScript== // @name Chaoxing Paste Unlock // @name:zh-CN 超星粘贴限制解除 // @namespace https://mooc2-ans.chaoxing.com/ // @version 0.1.1 // @description Remove paste restrictions in Chaoxing AI evaluate code editor pages. // @description:zh-CN 解除超星 AI 作答代码编辑器页面的粘贴限制。 // @author GrassskyR // @homepageURL https://github.com/GrassskyR/Fuck-chaoxing-AntiPaste // @supportURL https://github.com/GrassskyR/Fuck-chaoxing-AntiPaste/issues // @updateURL https://raw.githubusercontent.com/GrassskyR/Fuck-chaoxing-AntiPaste/main/unlock-chaoxing-paste.user.js // @downloadURL https://raw.githubusercontent.com/GrassskyR/Fuck-chaoxing-AntiPaste/main/unlock-chaoxing-paste.user.js // @license MIT // @match https://mooc2-ans.chaoxing.com/mooc2-ans/ai-evaluate/v2/answer* // @run-at document-start // @grant none // ==/UserScript== (function () { 'use strict'; const POLL_INTERVAL_MS = 500; const LOG_PREFIX = '[chaoxing-paste-unlock]'; const win = typeof unsafeWindow !== 'undefined' ? unsafeWindow : window; function log(message) { console.debug(`${LOG_PREFIX} ${message}`); } function unlockApp(app) { if (!app) { return false; } let changed = false; if (app.publishSetting && app.publishSetting.notAllowPaste !== 0) { app.publishSetting.notAllowPaste = 0; changed = true; } if (app.current && app.current.publishSetting && app.current.publishSetting.notAllowPaste !== 0) { app.current.publishSetting.notAllowPaste = 0; changed = true; } if (typeof app.handlePasteContent === 'function' && !app.handlePasteContent.__pasteUnlocked) { const unlockedHandler = function handlePasteContentUnlocked() { return true; }; unlockedHandler.__pasteUnlocked = true; unlockedHandler.__original = app.handlePasteContent; app.handlePasteContent = unlockedHandler; changed = true; } return changed; } function unlockEditors() { let changed = false; const editorNodes = document.querySelectorAll('.CodeMirror'); editorNodes.forEach((node) => { const editor = node && node.CodeMirror; if (!editor) { return; } if (editor.getOption('readOnly') === true) { return; } const inputField = typeof editor.getInputField === 'function' ? editor.getInputField() : node.querySelector('textarea'); if (!inputField || inputField.__pasteUnlockCaptureInstalled) { return; } inputField.addEventListener( 'paste', (event) => { event.stopImmediatePropagation(); }, true ); inputField.__pasteUnlockCaptureInstalled = true; changed = true; }); return changed; } function patchRuntime() { const appChanged = unlockApp(win.app); const editorChanged = unlockEditors(); if (appChanged || editorChanged) { log('paste restriction removed'); } } patchRuntime(); window.addEventListener('load', patchRuntime, { once: false }); setInterval(patchRuntime, POLL_INTERVAL_MS); })();