Greasy Fork is available in English.

Gradescope assignment expander

Expands programming exercises with keyboard

Tính đến 06-10-2022. Xem phiên bản mới nhất.

// ==UserScript==
// @name         Gradescope assignment expander
// @namespace    https://gist.github.com/isaacl/86d5121ede0eeac3eb6a4016555ad70e
// @version      0.1.3
// @description  Expands programming exercises with keyboard
// @author       Isaac Levy
// @match        *://*.gradescope.com/*
// @grant        none
// @license      MIT
// ==/UserScript==

/* jshint esversion: 6 */
(function() {
    'use strict';
    let expanded = 0;
    let allToggles = [];
    let autograderToggle = null;
    const UP_CODE = 38;
    const DOWN_CODE = 40;
    const X_CODE = 88; // Cycle through.
    const C_CODE = 67; // Toggle autograder.
    const ALL_CODES = [UP_CODE, DOWN_CODE, X_CODE, C_CODE];

    document.addEventListener('keydown', (e) => {
        const code = e.keyCode;
        if (!ALL_CODES.includes(code)) return;
        // Cache toggles query.
        if (allToggles.length === 0) {
            allToggles = document.querySelectorAll('button.fileViewerHeader--toggleButton');
        }
        if (autograderToggle === null) {
            autograderToggle = document.querySelector('div.autograderResultsContainer button');
            console.log(autograderToggle);
        }

        const numToggles = allToggles.length;
        if (code === DOWN_CODE && expanded < numToggles - 1) {
            expanded++;
        } else if (code === UP_CODE && expanded > 0) {
            expanded--;
        } else if (code === X_CODE) {
            if (e.shiftKey) {
                expanded = (expanded - 1 + numToggles) % numToggles;
            } else {
                expanded = (expanded + 1) % numToggles;
            }
        } else if (code === C_CODE) {
            if (autograderToggle !== null) autograderToggle.click();
            return;
        }

        allToggles.forEach((e, i) => {
            const shouldExpand = expanded === i;
            const isExpanded = e.getAttribute('aria-expanded') === 'true';
            if (shouldExpand !== isExpanded) e.click();
        });
    });
})();