计蒜客助手 Jisuanke Helper

取消复制限制;选择题显示序号(最小的几个是答案)

目前为 2020-02-18 提交的版本,查看 最新版本

// ==UserScript==
// @name         计蒜客助手 Jisuanke Helper
// @namespace    http://tampermonkey.net/
// @version      0.2
// @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';

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

    setInterval(() => {
        // delete line numbers to avoid being copied
        document.querySelectorAll('#hint-content .CodeMirror-linenumber').forEach((elem) => {
            elem.remove();
        });

        // remove mousedown
        document.querySelectorAll('#hint-content .CodeMirror-scroll').forEach((elem) => {
            customRemoveEventLister(elem, 'mousedown');
        });

        // remove selectstart
        document.querySelectorAll('#hint-content .CodeMirror-lines').forEach((elem) => {
            elem.querySelectorAll('div').forEach((target) => {
                customRemoveEventLister(target, 'selectstart');
            });
        });
    }, 500);


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


    function customRemoveEventLister(target, listenerType) {
        target.getEventListeners(listenerType).forEach((event) => {
            target.removeEventListener(event.type, event.listener, event.useCapture);
        });
    }

    function removeCls(cls) {
        document.querySelectorAll(`.${cls}`).forEach((elem) => {
            elem.classList.remove(cls);
        });
    }

    function removeAttr(attr) {
        document.querySelectorAll(`[${attr}]`).forEach((elem) => {
            elem.removeAttribute(attr);
        });
    }

})();