Calculate GPA on plus portals
目前為
// ==UserScript==
// @name GPACalculator
// @version 0.1
// @description Calculate GPA on plus portals
// @author Andrew Miller
// @match https://plusportals.com/ParentStudentDetails/ParentStudentDetails/9754
// @grant none
// @run-at document-idle
// @license MIT
// @namespace https://greasyfork.org/users/1167790
// ==/UserScript==
(function() {
'use strict';
const gpaWeights = {
"A+": 4.33,
"A": 4.17,
"A-": 4.00,
"B+": 3.67,
"B": 3.33,
"B-": 3.00,
"C+": 2.67,
"C": 2.33,
"C-": 2.00,
"D+": 1.67,
"D": 1.33,
"D-": 1.00,
"F": 0.00
};
const checkElements = () => {
const elements = document.querySelectorAll('[title="Subject"], [title="Grade"]');
if(elements.length > 0) {
clearInterval(intervalId);
const subjectGradePairs = {};
let currentSubject = '';
let currentGrade = '';
let totalGPA = 0;
let elementCount = 0;
elements.forEach(element => {
const title = element.getAttribute('title');
if (title === 'Subject') {
currentSubject = element.textContent.trim();
} else if (title === 'Grade') {
currentGrade = element.textContent.trim();
subjectGradePairs[currentSubject] = currentGrade;
let gradeWeight = gpaWeights.hasOwnProperty(currentGrade) ? gpaWeights[currentGrade] : 0;
if ((currentSubject.includes('Hnrs') || currentSubject.includes('Hon')) && gradeWeight >= 2.00) {
gradeWeight += 1;
}
totalGPA += gradeWeight;
elementCount++;
}
});
const averageGPA = elementCount > 0 ? (totalGPA / elementCount).toFixed(2) : 0;
console.log("Average GPA:", averageGPA);
function getLetterGrade(gpa) {
let letterGrade = 'F'; // Default to F
for (const [grade, weight] of Object.entries(gpaWeights)) {
if (gpa >= weight) {
letterGrade = grade;
break;
}
}
return letterGrade;
}
let tbody = document.querySelector('tbody[role="rowgroup"]');
let newRow = document.createElement('tr');
let newCell1 = document.createElement('td');
let newCell2 = document.createElement('td');
let newCell3 = document.createElement('td');
newRow.setAttribute('role', 'row');
newCell1.setAttribute('role', 'gridcell');
newCell2.setAttribute('role', 'gridcell');
newCell3.setAttribute('role', 'gridcell');
newRow.setAttribute('role', 'row');
newCell1.setAttribute('role', 'gridcell');
newCell2.setAttribute('role', 'gridcell');
newCell3.setAttribute('role', 'gridcell');
newCell1.innerHTML = 'Total GPA';
newCell2.innerHTML = averageGPA;
newCell3.innerHTML = getLetterGrade(averageGPA);
newRow.appendChild(newCell1);
newRow.appendChild(newCell2);
newRow.appendChild(newCell3);
if (tbody.firstChild) {
tbody.insertBefore(newRow, tbody.firstChild);
} else {
tbody.appendChild(newRow);
}
}
}
const intervalId = setInterval(checkElements, 750);
})();