Last active
October 16, 2022 15:22
-
-
Save isaacl/86d5121ede0eeac3eb6a4016555ad70e to your computer and use it in GitHub Desktop.
Gradescope userscript: Expand programming assignments
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name Gradescope assignment expander | |
// @namespace https://gist.github.com/isaacl/86d5121ede0eeac3eb6a4016555ad70e | |
// @version 0.1.8 | |
// @description Expands programming exercises with keyboard | |
// @author Isaac Levy | |
// @match *://*.gradescope.com/* | |
// @grant none | |
// @license MIT | |
// ==/UserScript== | |
/* jshint esversion: 6 */ | |
(function() { | |
'use strict'; | |
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]; | |
let expanded = 0; | |
let cur_href = window.location.href; | |
document.addEventListener('keydown', (e) => { | |
if (!ALL_CODES.includes(e.keyCode)) return; | |
if (document.activeElement?.tagName === 'TEXTAREA') return; | |
if (cur_href !== window.location.href) { | |
expanded = 0; | |
cur_href = window.location.href; | |
} | |
const allToggles = document.querySelectorAll('button.fileViewerHeader--toggleButton'); | |
const numToggles = allToggles.length; | |
switch (e.keyCode) { | |
case C_CODE: | |
const autograderToggle = document.querySelector('div.autograderResultsContainer button') | |
if (autograderToggle !== null) autograderToggle.click(); | |
// Don't mess with programming expansion, return immediately. | |
return; | |
case DOWN_CODE: | |
if (expanded < numToggles - 1) expanded++; | |
break; | |
case UP_CODE: | |
if (expanded > 0) expanded--; | |
break; | |
case X_CODE: | |
if (e.shiftKey) { | |
expanded = (expanded - 1 + numToggles) % numToggles; | |
} else { | |
expanded = (expanded + 1) % numToggles; | |
} | |
break; | |
} | |
allToggles.forEach((e, i) => { | |
const shouldExpand = expanded === i; | |
const isExpanded = e.getAttribute('aria-expanded') === 'true'; | |
if (shouldExpand !== isExpanded) e.click(); | |
}); | |
}); | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment