NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Math 313 Homework // @namespace // @version 0.1 // @description To mark which homework problems I've already done // @match https://learningsuite.byu.edu/student* // @copyright 2012+, Austin Hughes // ==/UserScript== //Check if the table we're looking for is visible (Look for cell that says "Homework Problems"); var checker = setInterval( function () { var cellToTest = $( "tbody tr td" )[4]; if ( cellToTest ) { if ( $( cellToTest ).text() === "Homework Problems" ) { markHomework(); clearInterval( checker ); } } }, 500); //Function called once cell (and corresponding homework table) is found function markHomework () { //Gather all chapters and assignments var chapters = {}; $( "tbody tr" ).each( function () { var chapter = parseFloat( $(this).find( "td" ).eq(3).text() ); var problems = $(this).find( "td" ).eq(4).text().split( ", " ); if ( !isNaN( chapter ) ) { if ( chapters[chapter] ) { chapter = chapter + "a"; chapters[chapter] = problems; $(this).find( "td" ).eq(3).text( chapter ); //Change duplicate chapter to have "a" on the end } else { chapters[chapter] = problems; } $(this).find( "td" ).eq(3).wrapInner( "<div class=\"chapter\"></div>" ); //wrap chapter class around chapter cells $(this).find( "td" ).eq(4).wrapInner( "<div class=\"problems\"></div>" ); } }); //Create object to hold chapters, and each problem, with a finished flag if ( localStorage.Math313HW ) { var finishedProblems = JSON.parse( localStorage.Math313HW ); } else { var finishedProblems = {}; } for ( var chapter in chapters ) { for ( var problem in chapters[chapter] ) { var num = chapters[chapter][problem]; if ( !finishedProblems[chapter] ) { finishedProblems[chapter] = {}; } if ( !finishedProblems[chapter][num] ) { finishedProblems[chapter][num] = false; } } } localStorage.Math313HW = JSON.stringify( finishedProblems ); //Render which problems are done renderFinishedProblems( finishedProblems ); $( ".chapter" ).on( "click", function () { var finishedProblems = JSON.parse( localStorage.Math313HW ); var chNum = $(this).text(); var num = prompt( "Enter the problem(s) finished for Ch. " + chNum + " (separated by commas) OR \"all\" to mark all done." ); if ( num === "all" ) { for ( var prob in finishedProblems[chNum] ) { if ( finishedProblems[chNum][prob] ) { finishedProblems[chNum][prob] = false; } else { finishedProblems[chNum][prob] = true; } } } else { num = num.split( "," ); for ( var i = 0; i < num.length; i++ ) { if ( finishedProblems[chNum][num[i]] ) { finishedProblems[chNum][num[i]] = false; } else { finishedProblems[chNum][num[i]] = true; } } } renderFinishedProblems( finishedProblems ); localStorage.Math313HW = JSON.stringify( finishedProblems ); }); } // function renderFinishedProblems( finishedProblems ) { $( "tbody tr" ).each( function () { var ch = $(this).find( ".chapter" ).text().trim(); if ( ch.length > 0 ) { var finished = []; var notFinished = []; for ( var prob in finishedProblems[ch] ) { var prblm = finishedProblems[ch][prob]; //console.log(prob, prblm); if ( prblm ) { finished.push( prob );//if 'true' put in finished array } else { notFinished.push( prob ); } } var done = finished.join( ", " ); var not = notFinished.join( ", " ); if ( done.length > 0 && not.length > 0 ) { not = ", " + not; }; var problems = "<span class=\"done\">" + done + "</span>" + not; $(this).find( ".problems" ).html( problems ); } }); } //CSS GM_addStyle('.done {background-color: lightgray;text-decoration: line-through;color:gray}'); GM_addStyle('.chapter {font-weight: bold;background-color: #d1e4f6;border-radius: 5px;padding: 2px;margin: 2px;text-align: center;}'); GM_addStyle('.problems{background-color: rgba(209, 228, 246, 0.56);padding: 5px;margin: -1px;margin-left: -7px;margin-right: -6px;}'); GM_addStyle('.chapter:hover {cursor: pointer;}');