Skip to content

Commit

Permalink
Merge pull request #25 from AlexPeng517/dev
Browse files Browse the repository at this point in the history
[Major Update] Refactor GradReviewer.tsx, integrate with firebase RTDB, refine review report html.
  • Loading branch information
AlexPeng517 authored Feb 17, 2024
2 parents 3c82afe + d43b947 commit cb9de96
Show file tree
Hide file tree
Showing 12 changed files with 11,460 additions and 5,930 deletions.
14,869 changes: 9,981 additions & 4,888 deletions package-lock.json

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
"name": "my-app",
"version": "0.1.0",
"private": true,
"type": "module",
"dependencies": {
"@testing-library/jest-dom": "^5.16.4",
"@testing-library/react": "^13.3.0",
Expand All @@ -15,7 +16,10 @@
"axios": "^0.27.2",
"bootstrap": "^5.2.0",
"buffer": "^6.0.3",
"html2canvas": "^1.4.1",
"iconv-lite": "^0.6.3",
"iconv-lite-ts": "0.0.1",
"jspdf": "^2.5.1",
"react": "^18.2.0",
"react-bootstrap": "^2.5.0",
"react-dom": "^18.2.0",
Expand Down
51 changes: 51 additions & 0 deletions public/background.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
/* eslint-disable no-undef */
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

'use strict';


// eslint-disable-next-line no-restricted-globals
self.importScripts("firebase-app-compat.js", "firebase-database-compat.js");

chrome.runtime.onInstalled.addListener(function () {
chrome.declarativeContent.onPageChanged.removeRules(undefined, function () {
chrome.declarativeContent.onPageChanged.addRules([{
Expand All @@ -18,3 +23,49 @@ chrome.runtime.onInstalled.addListener(function () {
}]);
});
});

// eslint-disable-next-line no-undef
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
try {
console.log("Message received by firebase background script");
// eslint-disable-next-line no-restricted-globals
// loadScript("../node_modules/firebase/firebase-database.js");
let rules;
const firebaseConfig = {
apiKey: "AIzaSyCbIdg1a_ZIvB9zbv_r3MNVwWGBj7Lp8XE",
authDomain: "ipeecs-gradreviewer.firebaseapp.com",
databaseURL: "https://ipeecs-gradreviewer-default-rtdb.asia-southeast1.firebasedatabase.app",
projectId: "ipeecs-gradreviewer",
storageBucket: "ipeecs-gradreviewer.appspot.com",
messagingSenderId: "648476820901",
appId: "1:648476820901:web:68be500214bacc27d7944c",
measurementId: "G-Y89HNZVCQY"
};
firebase.initializeApp(firebaseConfig);
console.log("Firebase initialized", firebase);
const db = firebase.database();
const dbRef = db.ref();


if (request.action === "fetchGradeReviewRule") {
dbRef.child(request.ruleYear).once('value', (snapshot) => {
if (snapshot.exists()) {
rules = snapshot.val();
console.log(rules);
} else {
console.log("No data available");
}
sendResponse(rules);
}, (error) => {
console.log(error);
});

}



} catch (error) {
console.log(error);
}
return true;
});
107 changes: 107 additions & 0 deletions public/contentScript.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@

// import { createRequire } from 'module'
// const require = createRequire(import.meta.url);

// const iconv = require('iconv-lite');
// let iconv;
console.log("contentScript.js is running");
// (async () => {
// // eslint-disable-next-line no-undef
// const src = chrome.runtime.getURL('iconvImport.js');
// iconv = await import(src);
// })();

// function loadScript(url) {
// const script = document.createElement('script');
// script.src = chrome.runtime.getURL(url);
// document.head.appendChild(script);
// }
// const loadScriptAsync = async (url) => {
// await import(chrome.runtime.getURL("./firebase-app.js"));
// await import(chrome.runtime.getURL("./firebase-database.js"));}
// loadScriptAsync();


function parseHTMLTableElem(tableEl) {
// console.log(tableEl);
// const columns = Array.from(tableEl.querySelectorAll('th')).map(it => it.textContent)
// console.log(columns);
const rows = tableEl.querySelectorAll('tbody > tr')
// console.log(rows);
let courseList = [];
for (let i = 2; i < rows.length-1; i++) {
let course = {
"courseID": "",
"courseName": "",
"courseType": "",
"courseCredit": "",
"courseGrade": "",
};
const cells = Array.from(rows[i].querySelectorAll('td'))
course.courseID = cells[0].innerText;
course.courseName = cells[2].innerText;
course.courseType = cells[3].innerText;
course.courseCredit = parseInt(cells[5].innerText);
if (cells[6].innerText ==="勞動服務通過"){
course.courseGrade = cells[6].innerText;
}else{
course.courseGrade = parseInt(cells[6].innerText);
}
courseList.push(course);
}
console.log(courseList);
return courseList;
// console.log(courseList);
// return JSON.stringify(Array.from(rows).map(row => {
// const cells = Array.from(row.querySelectorAll('td'))
// return columns.reduce((obj, col, idx) => {
// obj[col] = cells[idx].textContent
// return obj;
// }, {})
// }));
}






// eslint-disable-next-line no-undef
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
let gradeTablesContainer = document.getElementsByClassName("container");
let gradeTablesBySemester = gradeTablesContainer[1].getElementsByTagName("table");
let allCourses = {
"courseList": [],
};
console.log(gradeTablesContainer);
console.log("printing gradeTablesBySemester");
console.log(gradeTablesBySemester);
// console.log(parseHTMLTableElem(gradeTablesBySemester[0]));
for (let i = 0; i < gradeTablesBySemester.length; i++) {
allCourses.courseList = allCourses.courseList.concat(parseHTMLTableElem(gradeTablesBySemester[i]));
}
console.log(allCourses.courseList.length);
console.log(JSON.stringify(allCourses));



if(request.action === "fetchGradeTable"){

sendResponse(JSON.stringify(allCourses));
}

if(request.action === "fetchGeneralInfo"){
let generalInfoData = document.getElementsByClassName("container")[0].getElementsByClassName("shadow-none p-3 m-2 bg-light rounded")[0];
let generalInfoElements = generalInfoData.querySelectorAll("span");
let generalInfo = {
"studentID": generalInfoElements[3].innerText,
"studentName": generalInfoElements[0].innerText,
};
console.log("generalInfo",generalInfo);
sendResponse(JSON.stringify(generalInfo));

}
});



8 changes: 8 additions & 0 deletions public/firebase-app-compat.js

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions public/firebase-database-compat.js

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions public/iconvImport.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import iconv from '../node_modules/iconv-lite'
export function main(){
return iconv;
}
30 changes: 27 additions & 3 deletions public/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,37 @@
"permissions": [
"cookies",
"declarativeContent",
"storage"
"storage",
"activeTab"
],
"host_permissions": [
"*://*.cc.ncu.edu.tw/system/162*",
"*://cis.ncu.edu.tw/ScoreInquiries/student/student_record.php",
"https://cis.ncu.edu.tw/*"
"*://cis.ncu.edu.tw/*",
"*://portal.ncu.edu.tw/system*"
],
"content_scripts" : [
{
"matches" : ["*://portal.ncu.edu.tw/system*","*://cis.ncu.edu.tw/*"],
"all_frames": true,
"js": ["contentScript.js"]
}
],
"externally_connectable": {
"matches": ["https://portal.ncu.edu.tw/system/162"]
},

"web_accessible_resources": [{
"resources": ["iconvImport.js","contentScript.js","../node_modules/iconv-lite/encodings/index.js"],
"matches": ["<all_urls>"]
}, {
"resources": ["firebase-app-compat.js", "firebase-database-compat.js"],
"matches": ["<all_urls>"]
}
],
"content_security_policy": {
"extension_pages": "object-src 'self'; script-src 'self'"

},
"action": {
"default_popup": "index.html",
"defuault_icon": {
Expand Down
Loading

0 comments on commit cb9de96

Please sign in to comment.