Skip to content

Instantly share code, notes, and snippets.

@isaacl
Last active October 16, 2022 15:22
Show Gist options
  • Save isaacl/86d5121ede0eeac3eb6a4016555ad70e to your computer and use it in GitHub Desktop.
Save isaacl/86d5121ede0eeac3eb6a4016555ad70e to your computer and use it in GitHub Desktop.
Gradescope userscript: Expand programming assignments
// ==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