计蒜客助手 Jisuanke Helper

取消复制限制;选择题显示序号(一般情况最小的几个是答案);跳过强制等待;双击单行或块代码区域复制代码

当前为 2020-02-19 提交的版本,查看 最新版本

// ==UserScript==
// @name         计蒜客助手 Jisuanke Helper
// @namespace    http://tampermonkey.net/
// @version      0.4
// @description  取消复制限制;选择题显示序号(一般情况最小的几个是答案);跳过强制等待;双击单行或块代码区域复制代码
// @author       yusanshi
// @match        http://www.jisuanke.com/course/*
// @match        https://www.jisuanke.com/course/*
// @grant        none
// @run-at       document-start
// @require      https://cdn.jsdelivr.net/gh/colxi/getEventListeners/src/getEventListeners.min.js
// ==/UserScript==

(function () {
    'use strict';

    setInterval(() => {
        // remove disabled and oncopy attribute continually
        removeCls('jsk-disabled');
        for (let elem of ['disabled', 'oncopy', 'oncut']) {
            removeAttr(elem);
        }

        // delete line numbers to avoid its being copied
        for (let selector of ['#guide .CodeMirror-linenumber', '#hint .CodeMirror-linenumber']) {
            for (let elem of document.querySelectorAll(selector)) {
                elem.remove();
            }
        }

        // remove mousedown event handler
        for (let selector of ['#guide .CodeMirror-scroll', '#lint .CodeMirror-scroll']) {
            for (let elem of document.querySelectorAll(selector)) {
                customRemoveEventLister(elem, 'mousedown');
            }
        }

        // remove selectstart event handler
        for (let selector of ['#guide .CodeMirror-lines', '#lint .CodeMirror-lines']) {
            for (let elem of document.querySelectorAll(selector)) {
                customRemoveEventLister(elem.querySelector('div'), 'selectstart');
            }
        }

        // skip waiting
        for (let elem of document.querySelectorAll('[data-unlocked]')) {
            elem.setAttribute('data-unlocked', '100');
        }

        // double click to copy
        for (let selector of ['code', '.CodeMirror-scroll']) {
            for (let elem of document.querySelectorAll(selector)) {
                elem.ondblclick = () => {
                    copyTextToClipboard(elem.innerText);
                }
            }
        }

    }, 500);


    window.onload = () => {
        // add number prompts for multiple choice problem
        for (let elem of document.querySelectorAll('[num]')) {
            const span = document.createElement('span');
            span.style.color = 'green';
            span.innerText = elem.getAttribute('num');
            elem.insertAdjacentElement('afterbegin', span);
        }
    }

    function customRemoveEventLister(target, listenerType) {
        for (let event of target.getEventListeners(listenerType)) {
            target.removeEventListener(event.type, event.listener, event.useCapture);
        }
    }

    function removeCls(cls) {
        for (let elem of document.querySelectorAll(`.${cls}`)) {
            elem.classList.remove(cls);
        }
    }

    function removeAttr(attr) {
        for (let elem of document.querySelectorAll(`[${attr}]`)) {
            elem.removeAttribute(attr);
        }
    }

    // https://stackoverflow.com/questions/400212/how-do-i-copy-to-the-clipboard-in-javascript
    function copyTextToClipboard(text) {
        if (!navigator.clipboard) {
            fallbackCopyTextToClipboard(text);
            return;
        }
        navigator.clipboard.writeText(text).then(function () {
            console.log('Async: Copying to clipboard was successful!');
        }, function (err) {
            console.error('Async: Could not copy text: ', err);
        });
    }

    function fallbackCopyTextToClipboard(text) {
        const textArea = document.createElement("textarea");
        textArea.value = text;
        textArea.style.position = "fixed"; //avoid scrolling to bottom
        document.body.appendChild(textArea);
        textArea.focus();
        textArea.select();

        try {
            const successful = document.execCommand('copy');
            const msg = successful ? 'successful' : 'unsuccessful';
            console.log('Fallback: Copying text command was ' + msg);
        } catch (err) {
            console.error('Fallback: Oops, unable to copy', err);
        }
        document.body.removeChild(textArea);
    }

})();