// ==UserScript==
// @name 中正開課表格優化
// @namespace http://tampermonkey.net/
// @version 1.0
// @description 由於中正大學的開課系統在對時間上過於麻煩,用JavaScript生成課表,用於對照時間
// @author 楊長茂(409220055)
// @match https://kiki.ccu.edu.tw/~ccmisp06/Course/*
// @exclude https://kiki.ccu.edu.tw/~ccmisp06/Course/
// @exclude https://kiki.ccu.edu.tw/~ccmisp06/Course/index.html
// @exclude https://kiki.ccu.edu.tw/~ccmisp06/Course/*_e.html
// @grant none
// @icon https://raw.githubusercontent.com/Jeffreymaomao/figure/main/fig3.jpg
// ==/UserScript==
// 更改表格內部的邊緣弧度--------------------------------------------
function adjust_border_radius(radius){
const box = document.querySelectorAll('td,th');
for (const element of box) {
element.style.borderRadius = radius;
}
}
// 在原有的 object 之後,新增 n 行空白-------------------------------
function newline(n,object){
for(var i=0;i<n-1; i++){
object.insertAdjacentHTML('beforeend', '<br>');
}
}
// 自動調整課表時間的高度--------------------------------------------
function adjust_table_height(){
var H1 = document.getElementById("R1");
var H2 = document.getElementById("R2");
var H3 = document.getElementById("R3");
var H4 = document.getElementById("R4");
var H5 = document.getElementById("R5");
document.getElementById("b1").style.height= "120px";
document.getElementById("b2").style.height= "120px";
document.getElementById("b3").style.height= "120px";
document.getElementById("b4").style.height= "120px";
document.getElementById("b5").style.height= "120px";
document.getElementById("b1").style.height= H1.offsetHeight +"px";
document.getElementById("b2").style.height= H2.offsetHeight +"px";
document.getElementById("b3").style.height= H3.offsetHeight +"px";
document.getElementById("b4").style.height= H4.offsetHeight +"px";
document.getElementById("b5").style.height= H5.offsetHeight +"px";
}
// Xpath 尋找元素--------------------------------------------------
function getElementByXpath(path) {
return document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
}
// 輸入值行最上的中文,回傳以下所有中文---------------------------------
function get_column(name){
var tables = document.getElementsByTagName("table");
var table_index = 0;
for(let k = 0; k < tables.length; k++){
var W = tables[k].rows[0].cells.length;
if(W == 13){
table_index = k;
}
}
var table = tables[table_index]
var width = tables[table_index].rows[0].cells.length;
var height= tables[table_index].rows.length;
var column_index = 0;
var column_text = [];
for (let i = 0; i < width; i++){
var TEXT = tables[table_index].rows[0].cells[i].innerText;
if (TEXT == name){column_index = i;}
}
for (let j = 0; j < height; j++){
column_text.push(tables[table_index].rows[j].cells[column_index].innerText);
}
return column_text;
}
// 將中文數字字符轉換成數字輸出---------------------------------------
function change_chinese_to_number(chinese_number){
var C = chinese_number;
var n = 1;
if(C=="一"){n=1};
if(C=="二"){n=2};
if(C=="三"){n=3};
if(C=="四"){n=4};
if(C=="五"){n=5};
if(C=="六"){n=6};
if(C=="日"){n=7};
return n
}
// 將中文數字字符轉換成數字輸出---------------------------------------
function change_time_to_region(time){
var c = time;
var n = 1;
if(c=="1" ||c=="2" ||c=="3" ||c=="A"||c=="B"){n=1};
if(c=="4" ||c=="5" ||c=="6" ||c=="C"||c=="D"){n=2};
if(c=="7" ||c=="8" ||c=="9" ||c=="E"||c=="F"){n=3};
if(c=="10"||c=="11"||c=="12"||c=="G"||c=="H"){n=4};
if(c=="13"||c=="14"||c=="15"||c=="I"||c=="J"){n=5};
return n
}
// 輸入中文時間,回傳時間向量----------------------------------------
function check_time(time){
time = time.replace(" ","");
var data_index = []
for(let i = 0; i < time.length; i++){
var cha = time[i]
if(cha=="一"||cha=="二"||cha=="三"||cha=="四"||cha=="五"||cha=="六"||cha=="日"){
data_index.push(i)
}
}
for(let j = data_index.length-1; j >= 0 ; j--){
time = time.slice(0, data_index[j]) + "|" + time.slice(data_index[j]);
}
time = time.slice(1,time.length);
time = time.split("|");
var vector = [];
for(let k = 0; k < time.length; k++){
var sub_time = time[k];
//alert("sub : "+sub_time)
var W = change_chinese_to_number(sub_time[0]);
//alert("week : "+W);
var T = sub_time.slice(1,sub_time.length);
T = T.split(",")
for(let l = 0; l < T.length; l++){
var region = change_time_to_region(T[l]);
vector.push([W,region,T[l]]);
}
}
return vector
}
// 生程課表矩陣----------------------------------------------------
function generate_array(){
var times = get_column("上課時間");
var years = get_column("年級");
var id = get_column("編號");
var title = get_column("科目名稱");
var professor = get_column("任課教授");
var credit = get_column("學分");
var people = get_column("限修人數");
var type = get_column("選必");
var place = get_column("上課地點");
var A = [["","","","","","",""],["","","","","","",""],["","","","","","",""],["","","","","","",""],["","","","","","",""]];
for(let i = 1; i < times.length; i++){
var vector = check_time(times[i]);
for(let j = 0; j < vector.length; j++){
var w = vector[j][0]-1; //week 0~6
var r = vector[j][1]-1; //region 0 ~ 4
var t = vector[j][2].replace(" ",""); // 1~15 , A~J
var num = 1;
if(type[i]=="必修"){num=1};
if(type[i]=="選修"){num=2};
if(type[i]=="通識"){num=3};
A[r][w] += '<div class="Class'+num+'">';
A[r][w] += "("+t+")"+ title[i] +"<br>" + professor[i];
A[r][w] += '<div class="hide">';
A[r][w] += "年級:"+years[i]+"<br>";
A[r][w] += "人數:"+people[i]+"<br>";
A[r][w] += "學分:"+credit[i]+"<br>";
A[r][w] += "地點:"+place[i]+"<br>";
A[r][w] += "編號:"+id[i]+"<br>";
A[r][w] += "</div></div>";
}
}
return A
}
//----------------------------------------------------------------
// 寫入星期一到星期日的每一個元素,回傳html----------------------------
function generate_region(A="",B="",C="",D="",E="",F="",G=""){
var html = "<td>" + A + "</td>";
html += "<td>" + B + "</td>";
html += "<td>" + C + "</td>";
html += "<td>" + D + "</td>";
html += "<td>" + E + "</td>";
html += "<td>" + F + "</td>";
html += "<td>" + G + "</td>";
return html;
}
// 寫入五個時間區塊,回傳html----------------------------------------
function generate_html(R1,R2,R3,R4,R5){
var html1 = `
<!DOCTYPE html>
<html>
<head>
<!--<link rel="stylesheet" href="style.css">-->
<style>
.table1 {display: table;border-collapse: separate;box-sizing: border-box;text-indent: initial;white-space: normal;line-height: normal;font-weight: normal;font-size: medium;font-style: normal;color: -internal-quirk-inherit;text-align: start;border-spacing: 2px;border-color: #ccc;font-variant: normal;margin: 0 10 0 0}
.table2 {display: table;border-collapse: separate;box-sizing: border-box;text-indent: initial;white-space: normal;font-weight: normal;font-size: medium;font-style: normal;color: -internal-quirk-inherit;text-align: start;border-spacing: 2px;font-variant: normal;height:auto;width:100%;border="0";}
tr {padding:1px;display: table-row;}
td {border-radius:3px;}
th {border-radius:5px;display: table-cell;vertical-align: inherit;font-weight: bold;}
.WEEK {background-color:#d9d9f3;border-radius:5px;}
.TIME {background-color:#d9d9f3;border:solid 0.5px;border-color:#bbb;border-radius:5px;}
.REGION {padding:0px;background-color:#f4f0e6;border-radius:5px;}
table {border-radius:10px;}
.button span {cursor: pointer;display: inline-block;position: relative;transition: 0.5s;}
.button {display: inline-block;border-radius: 10px;background-color: #656566;border: solid 3px;border-color:#bbb;color: white;text-align: center;font-size: 20px;padding: 10px;width: 200px;transition: all 0.5s;cursor: pointer;margin: 5px;}
.button span:after {content: '→';position: absolute;opacity: 0;top: 0;right: -20px;transition: 0.5s;}
.button:hover span {padding-right: 25px;}
.button:hover span:after {opacity: 1;right: 0;}
/*時間大框框*/
.block1 {height:120px;min-width:140px;background-color:rgb(244,244,244);padding:-10px}
.block2 {width:45%;display:inline-block;text-align:center;border-radius:5px;height:100%;min-height:120px;margin-left:2px;min-width:65px;}
.block2 table {height:100%;}
.block2 td {border:solid 1px;min-width:10px;}
.REGION td{background-color:#d9d9f3;}
.WEEK {font-size:15px;font-size:xx-small;font-style: normal;font-weight: normal;}
.TIME {font-size:xx-small;font-size:xx-small;font-style: normal;font-weight: normal;}
tr td {font-size:10px;}
.TIME td, tr{text-align:center;}
.hide {display: none;}
/*必修---------------------*/
.Class1 {border:solid 1px;border-radius:5px;margin:5px;background-color:rgba(255,204,204,0.5);}
.Class1:hover{position;absolute;display: block;border:solid 1px;border-radius:5px;margin:5px;background-color:rgba(255,204,204,0.8);}
.Class1:hover .hide {
display: block;background-color:rgba(255,255,255,0.8);border:solid 0.5px;border-radius:3px;margin:1px 5px 3px 5px;}
/*-選修------------------*/
.Class2 {border:solid 1px;border-radius:5px;margin:5px;background-color:rgba(204,229,255,0.5);}
.Class2:hover{position;absolute;display: block;border:solid 1px;border-radius:5px;margin:5px;background-color:rgba(204,229,255,0.8);}
.Class2:hover .hide {display: block;background-color:rgba(255,255,255,0.8);border:solid 0.5px;border-radius:3px;margin:1px 5px 3px 5px;}
/*必修---------------------*/
.Class3 {border:solid 1px;border-radius:5px;margin:5px;background-color:rgba(229,255,204,0.5);}
.Class3:hover{position;absolute;display: block;border:solid 1px;border-radius:5px;margin:5px;background-color:rgba(229,255,204,0.8);}
.Class3:hover .hide {display: block;background-color:rgba(255,255,255,0.8);border:solid 0.5px;border-radius:3px;margin:1px 5px 3px 5px;}
.div1 {font-size:18px;display: inline-block;border:solid 1px;padding:10px 40px 10px 40px;border-radius: 10px;background-color:rgba(255,204,204,0.5);margin:5px;}
.div2 {font-size:18px;display: inline-block;border:solid 1px;padding:10px 40px 10px 40px;border-radius: 10px;background-color:rgba(204,229,255,0.5);margin:5px;}
.div3 {font-size:18px;display: inline-block;border:solid 1px;padding:10px 40px 10px 40px;border-radius: 10px;background-color:rgba(229,255,204,0.5);margin:5px;}
.div1:hover {background-color:rgba(255,204,204,0.9);}
.div2:hover {background-color:rgba(204,229,255,0.9);}
.div3:hover {background-color:rgba(229,255,204,0.9);}
</style>
</head>
<body>
<hr>
<p style="text-align:right;margin:10px 100px 10px 0px;font-size:5px">
by 物理系-楊長茂 ( <a href = "mailto: [email protected]">[email protected]</a> )
</p>
<!--<span style="margin:100px;"><button class="button" onclick="changeColor();" ><span>Change color</span></button></span><br>-->
<span style="margin:120px;">
<div class="div1">必修</div>
<div class="div2">選修</div>
<div class="div3">通識</div>
</span><br>
<table class="table1" align="center" border="12" width="90%";>
<tbody>
<!-------------------------------------------------------------------------------------------------------------------------------->
<tr>
<th class="WEEK" id = "COLOR1" width="10%">星期/區段</th>
<th class="WEEK">一</th>
<th class="WEEK">二</th>
<th class="WEEK">三</th>
<th class="WEEK">四</th>
<th class="WEEK">五</th>
<th class="WEEK">六</th>
<th class="WEEK">日</th>
</tr>
<!-------------------------------------------------------------------------------------------------------------------------------->
<tr valign="center" width="100px">
<th class="REGION" id="R1" style="height:auto;">
<div class="block1" id="b1">
<div class="block2">
<table>
<tr>
<td rowspan="3" class="TIME">I</td>
<td class="TIME">1</td>
<td class="TIME">7:10<br>8:00</td>
</tr>
<tr>
<td class="TIME">2</td>
<td class="TIME">8:10<br>9:00</td>
</tr>
<tr>
<td class="TIME">3</td>
<td class="TIME">9:10<br>10:00</td>
</tr>
</table>
</div>
<div class="block2">
<table width="55px">
<tr>
<td class="TIME">A</td>
<td class="TIME">7:00<br>8:00</td>
</tr>
<td class="TIME">B</td>
<td class="TIME">8:10<br>9:00</td>
</tr>
</table>
</div>
</div>
</th>`;
var html2 = `</tr>
<!-------------------------------------------------------------------------------------------------------------------------------->
<tr valign="center">
<th class="REGION" id="R2" style="height:auto;width:auto">
<div class="block1" id="b2">
<div class="block2">
<table>
<tr>
<td rowspan="3" class="TIME">II</td>
<td class="TIME">4</td>
<td class="TIME">10:10<br>11:00</td>
</tr>
<tr>
<td class="TIME">5</td>
<td class="TIME">11:10<br>12:00</td>
</tr>
<tr>
<td class="TIME">6</td>
<td class="TIME">12:10<br>13:00</td>
</tr>
</table>
</div>
<div class="block2">
<table width="55px">
<tr>
<td class="TIME">C</td>
<td class="TIME">10:15<br>11:30</td>
</tr>
<tr>
<td class="TIME">D</td>
<td class="TIME">11:45<br>13:00</td>
</tr>
</table>
</div>
</div>
</th>`;
var html3 = `
</tr>
<!-------------------------------------------------------------------------------------------------------------------------------->
<tr valign="center">
<th class="REGION" id="R3" style="height:auto;width:auto">
<div class="block1" id="b3">
<div class="block2">
<table>
<tr>
<td rowspan="3" class="TIME">III</td>
<td class="TIME">7</td>
<td class="TIME">13:10<br>14:00</td>
</tr>
<tr>
<td class="TIME">8</td>
<td class="TIME">14:10<br>15:00</td>
</tr>
<tr>
<td class="TIME">9</td>
<td class="TIME">15:10<br>16:00</td>
</tr>
</table>
</div>
<div class="block2">
<table width="55px">
<tr>
<td class="TIME">E</td>
<td class="TIME">13:15<br>14:30</td>
</tr>
<tr>
<td class="TIME">F</td>
<td class="TIME">14:45<br>16:00</td>
</tr>
</table>
</div>
</div>
</th>`;
var html4 = `</tr>
<!-------------------------------------------------------------------------------------------------------------------------------->
<tr valign="center">
<th class="REGION" id="R4" style="height:auto;width:auto">
<div class="block1" id="b4">
<div class="block2">
<table>
<tr>
<td rowspan="3" class="TIME">IV</td>
<td class="TIME">10</td>
<td class="TIME">16:10<br>17:00</td>
</tr>
<tr>
<td class="TIME">11</td>
<td class="TIME">17:10<br>18:00</td>
</tr>
<tr>
<td class="TIME">12</td>
<td class="TIME">18:10<br>19:00</td>
</tr>
</table>
</div>
<div class="block2">
<table width="55px">
<tr>
<td class="TIME">G</td>
<td class="TIME">16:15<br>17:30</td>
</tr>
<tr>
<td class="TIME">H</td>
<td class="TIME">17:45<br>19:00</td>
</tr>
</table>
</div>
</div>
</th>`;
var html5 = `</tr>
<!-------------------------------------------------------------------------------------------------------------------------------->
<tr valign="center">
<th class="REGION" id="R5" style="height:auto;width:auto">
<div class="block1" id="b5">
<div class="block2">
<table>
<tr>
<td rowspan="3" class="TIME">V</td>
<td class="TIME">13</td>
<td class="TIME">19:10<br>20:00</td>
</tr>
<tr>
<td class="TIME">14</td>
<td class="TIME">20:10<br>21:00</td>
</tr>
<tr>
<td class="TIME">15</td>
<td class="TIME">21:10<br>22:00</td>
</tr>
</table>
</div>
<div class="block2">
<table width="55px">
<tr>
<td class="TIME">I</td>
<td class="TIME">19:15<br>20:30</td>
</tr>
<tr>
<td class="TIME">J</td>
<td class="TIME">20:45<br>22:00</td>
</tr>
</table>
</div>
</div>
</th>`;
var html6 = `
</tr>
<!-------------------------------------------------------------------------------------------------------------------------------->
</tbody>
</table>
</body>
</html>`;
var html = html1 +R1+ html2 +R2+ html3 +R3+ html4 +R4+ html5 +R5+ html6;
return html;
};
// 將表格插入在輸入之 tag 之後---------------------------------------
function add_table_after_tags(tags,array){
var a = array;
var H1 = document.getElementsByTagName(tags);
newline(2,H1[0]);
var R1 = generate_region(a[0][0],a[0][1],a[0][2],a[0][3],a[0][4],a[0][5],a[0][6]);
var R2 = generate_region(a[1][0],a[1][1],a[1][2],a[1][3],a[1][4],a[1][5],a[1][6]);
var R3 = generate_region(a[2][0],a[2][1],a[2][2],a[2][3],a[2][4],a[2][5],a[2][6]);
var R4 = generate_region(a[3][0],a[3][1],a[3][2],a[3][3],a[3][4],a[3][5],a[3][6]);
var R5 = generate_region(a[4][0],a[4][1],a[4][2],a[4][3],a[4][4],a[4][5],a[4][6]);
var html = generate_html(R1,R2,R3,R4,R5);
H1[0].insertAdjacentHTML('beforeend', html);
newline(2,H1[0])
}
//----------------------------------------------------------------------------------------------------------
// 執行程式
(function() {'use strict';
//修改弧角度
adjust_border_radius("5px");
//生成 table 並加在第一個 tag 之後
add_table_after_tags("h1",generate_array());
})();
//修正表格內部時間表的高度
var intervalId = window.setInterval(function(){adjust_table_height()}, 10);