YSU教室课表标色

燕山大学教室课表标色

目前為 2021-04-26 提交的版本,檢視 最新版本

// ==UserScript==
// @name         YSU教室课表标色
// @version      1.0.3.2
// @author       Haomin Kong
// @description  燕山大学教室课表标色
// @match        */zjdxgc/mycjcx/*
// @icon         http://ysu.edu.cn/images/favicon.png
// @require	     https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js
// @grant        GM_registerMenuCommand
// @grant        GM_unregisterMenuCommand
// @grant        GM_openInTab
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_notification
// @grant	     GM_registerMenuCommand
// @grant	     GM_addStyle
// @license      GPL-3.0 License
// @run-at       document-end
// @namespace    https://gitee.com/a645162/ysu-web-browser-scripts
// ==/UserScript==

(function () {
    ("use strict");

    GM_registerMenuCommand("更新脚本", function () {
        window.location.href = "https://gitee.com/a645162/ysu-web-browser-scripts";
    });

    var week = 1;

    let CurrentConfig = {
        auto: true,
        week: 0,
        colornow: true,
        delform: true,
        selflearn: true,
        delselflearn: true,
        colorfuture: true,
        delnow: false,
        delfuture: false,
    };
    let DefaultConfig = {
        auto: true, //自动执行脚本
        week: 0, //自定义周数
        colornow: true, //标色当前周
        delform: true, //删除没课
        selflearn: true, //忽略自习借教室
        delselflearn: true, //删除自习借教室
        colorfuture: true, //标色未来周
        delnow: false, //删除当前周
        delfuture: false, //删除未来周
    };

    function UpdateSettings() {
        let settingString = JSON.stringify(CurrentConfig);
        GM_setValue("YSUJWConfig", settingString);
        //setCookie(("YSUKHMJSCOLOR", settingString));
    }

    Promise.all([GM_getValue("YSUJWConfig")])
        //Promise.all(getCookie("YSUKHMJSCOLOR"))
        .then(function (data) {
            if (data[0] !== undefined) {
                try {
                    CurrentConfig = JSON.parse(data[0]);
                } catch (e) {
                    CurrentConfig = data[0];
                }
            } else {
                CurrentConfig = DefaultConfig;
            }
            for (var key in DefaultConfig) {
                if (typeof CurrentConfig[key] == "undefined") {
                    CurrentConfig[key] = DefaultConfig[key];
                }
            }
        })
        .catch(function (except) {
            console.log("错误!请复制后上报bug。谢谢==>", except);
        });

    function DoJob() {
        let weekText = /本周为第[0-9]+周周[0-9]/.exec(
            document.getElementsByTagName("body")[0].textContent
        );
        weekText = /第[0-9]+周/.exec(weekText);
        week = parseInt(/[0-9]+/.exec(weekText));
        let as = document.getElementsByTagName("table");
        for (var i = 0, j = as.length; i < j; ++i) {
            TraverseTable(as[i]);
        }
    }

    function TraverseTable(tableObj) {
        for (var i = 0, i1 = tableObj.rows.length; i < i1 && i1 >= 8; i++) {
            for (var j = 0, j1 = tableObj.rows[i].cells.length; j < j1; j++) {
                re(tableObj.rows[i].cells[j]);
            }
        }
    }

    function re(td) {
        let text = td.innerText.trim();
        let regExp = /[0-9]+-[0-9]+周/g;
        if (!regExp.test(text)) {
            return;
        }
        let courseSplit = text.split("\n\n");
        //console.log(courseSplit);
        let now = week;
        if (CurrentConfig.week > 0) {
            now = week;
        }
        //now = 10;

        let state = 0;

        let finalIsSelf = false;

        for (let i = 0, j = courseSplit.length; i < j; i++) {
            let current = courseSplit[i].trim();
            //console.log(current);
            //type:1正常上课 2考试 3借用 4借用(自习)
            let type = 0;

            if (current.indexOf("正常上课") !== -1) {
                type = 1;
            } else if (current.indexOf("考试") !== -1) {
                type = 2;
            } else if (current.indexOf("借用") !== -1) {
                type = 3;
                if (current.indexOf("自习") !== -1) {
                    type = 4;
                }
            }

            let oneLineText = current;
            while (oneLineText.indexOf("\n") !== -1) {
                oneLineText = oneLineText.replace("\n", "");
            }
            let match = /[0-9]+-[0-9]+周/g.exec(oneLineText);
            match = /[0-9]+-[0-9]+/.exec(match[0].trim())[0].trim();
            let l = match.split("-");
            if (l.length === 2) {
                let start = parseInt(l[0]);
                let end = parseInt(l[1]);

                if (start <= now && now <= end) {
                    //还在上
                    state = 1;
                    if (type === 4) {
                        finalIsSelf = true;
                    }
                }

                if (now < start && state !== 1) {
                    //未开课
                    state = 2;
                    if (type === 4) {
                        //finalIsSelf = true;
                    }
                }
            }
        }

        if (courseSplit.length !== 0) {
            if (state === 1) {
                if (CurrentConfig.colornow) {
                    td.bgColor = "FFFFBB";
                }
                if (finalIsSelf && CurrentConfig.selflearn) {
                    td.bgColor = "FFFFFF";
                    if (CurrentConfig.delselflearn) {
                        td.textContent = "";
                    }
                } else if (CurrentConfig.delnow) {
                    td.textContent = "";
                }
            } else if (state === 2) {
                if (CurrentConfig.colorfuture) {
                    td.bgColor = "FFDDDD";
                }
                if (CurrentConfig.delfuture) {
                    td.textContent = "";
                }
            } else {
                td.bgColor = "FFFFFF";

                if (CurrentConfig.delform) {
                    td.textContent = "";
                }
            }
        }
    }

    function addLink() {
        let submit = document.getElementsByName("Submit")[0];
        let parent1 = submit.parentNode;
        let parent2 = submit.parentNode.parentNode.childNodes[1];

        submit.insertAdjacentHTML("afterend", "<br />");

        //let as = document.getElementsByTagName("table");

        var cbauto = document.createElement("input");
        cbauto.id = "cbauto";
        cbauto.type = "checkbox";
        cbauto.checked = CurrentConfig.auto;
        cbauto.addEventListener("change", function (e) {
            //alert(Boolean(cb1.checked));
            CurrentConfig.auto = cbauto.checked;
            UpdateSettings();
        });
        parent1.appendChild(cbauto);
        cbauto.insertAdjacentText("afterend", "自动执行脚本");

        var cb1 = document.createElement("input");
        cb1.id = "cbdelform";
        cb1.type = "checkbox";
        cb1.checked = CurrentConfig.delform;
        cb1.addEventListener("change", function (e) {
            //alert(Boolean(cb1.checked));
            CurrentConfig.delform = cb1.checked;
            UpdateSettings();
        });
        parent1.appendChild(cb1);
        cb1.insertAdjacentText("afterend", "自动删除没课的格子");

        var cb2 = document.createElement("input");
        cb2.id = "cbselflearn";
        cb2.type = "checkbox";
        cb2.checked = CurrentConfig.selflearn;
        cb2.addEventListener("change", function (e) {
            //alert(Boolean(cb1.checked));
            CurrentConfig.selflearn = cb2.checked;
            UpdateSettings();
        });
        parent1.appendChild(cb2);
        cb2.insertAdjacentText("afterend", "借教室自习当做没课");
        cb2.insertAdjacentHTML("beforebegin", "<br />");

        var cb3 = document.createElement("input");
        cb3.id = "cbdelselflearn";
        cb3.type = "checkbox";
        cb3.checked = CurrentConfig.delselflearn;
        cb3.addEventListener("change", function (e) {
            CurrentConfig.delselflearn = cb3.checked;
            UpdateSettings();
        });
        parent1.appendChild(cb3);
        cb3.insertAdjacentText("afterend", "自动删除借教室自习的格子");
        cb3.insertAdjacentHTML("beforebegin", "<br />");

        if (!CurrentConfig.auto) {
            var btn2 = document.createElement("Button");
            btn2.addEventListener("click", function (e) {
                DoJob();
            });

            btn2.innerText = "执行脚本";

            parent1.appendChild(btn2);
            btn2.insertAdjacentHTML("beforebegin", "<br />");
        }

        //第二个格子

        var text1 = document.createElement("input");
        text1.id = "text_week";
        text1.type = "number";
        text1.max = 20;
        text1.min = 0;
        text1.value = CurrentConfig.week.toString();
        parent2.appendChild(text1);
        text1.insertAdjacentText("afterend", "周(0为自动获取)");
        text1.insertAdjacentHTML("beforebegin", "<br />");
        text1.insertAdjacentHTML("beforebegin", "设置当前周数:");

        var btn_save_week = document.createElement("Button");
        btn_save_week.addEventListener("click", function (e) {
            CurrentConfig.week = parseInt(text1.value);
            UpdateSettings();
        });

        btn_save_week.innerText = "保存";

        parent2.appendChild(btn_save_week);

        var cb_color_now = document.createElement("input");
        cb_color_now.id = "cb_color_now";
        cb_color_now.type = "checkbox";
        cb_color_now.checked = CurrentConfig.colornow;
        cb_color_now.addEventListener("change", function (e) {
            CurrentConfig.colornow = cb_color_now.checked;
            UpdateSettings();
        });
        parent2.appendChild(cb_color_now);
        cb_color_now.insertAdjacentText("afterend", "标色当前周有课");
        cb_color_now.insertAdjacentHTML("beforebegin", "<br />");

        var cb_del_now = document.createElement("input");
        cb_del_now.id = "cb_color_now";
        cb_del_now.type = "checkbox";
        cb_del_now.checked = CurrentConfig.delnow;
        cb_del_now.addEventListener("change", function (e) {
            CurrentConfig.delnow = cb_del_now.checked;
            UpdateSettings();
        });
        parent2.appendChild(cb_del_now);
        cb_del_now.insertAdjacentText("afterend", "删除当前周有课");
        cb_del_now.insertAdjacentHTML("beforebegin", "&nbsp;&nbsp;");

        var cb_color_future = document.createElement("input");
        cb_color_future.id = "cb_color_now";
        cb_color_future.type = "checkbox";
        cb_color_future.checked = CurrentConfig.colorfuture;
        cb_color_future.addEventListener("change", function (e) {
            CurrentConfig.colorfuture = cb_color_future.checked;
            UpdateSettings();
        });
        parent2.appendChild(cb_color_future);
        cb_color_future.insertAdjacentText("afterend", "标色未来周有课");
        cb_color_future.insertAdjacentHTML("beforebegin", "<br />");

        var cb_del_future = document.createElement("input");
        cb_del_future.id = "cb_color_now";
        cb_del_future.type = "checkbox";
        cb_del_future.checked = CurrentConfig.delfuture;
        cb_del_future.addEventListener("change", function (e) {
            CurrentConfig.delfuture = cb_del_future.checked;
            UpdateSettings();
        });
        parent2.appendChild(cb_del_future);
        cb_del_future.insertAdjacentText("afterend", "删除未来周有课");
        cb_del_future.insertAdjacentHTML("beforebegin", "&nbsp;&nbsp;");

        var btn1 = document.createElement("Button");
        btn1.setAttribute("onclick", "location.reload();");
        btn1.innerText = "刷新页面";

        parent2.appendChild(btn1);
        btn1.insertAdjacentHTML("beforebegin", "<br />");

        var btn3 = document.createElement("Button");

        btn3.innerText = "更新脚本";
        btn3.setAttribute(
            "onclick",
            "window.location.href = 'https://gitee.com/a645162/ysu-web-browser-scripts'"
        );
        parent2.appendChild(btn3);
        btn3.insertAdjacentHTML("beforebegin", "<br />");
        btn3.insertAdjacentHTML("beforebegin", "<br />");

        var lab1 = document.createElement("a");
        lab1.innerText = " 脚本作者:孔昊旻";
        lab1.setAttribute("href", "https://gitee.com/a645162");

        parent2.appendChild(lab1);
    }

    //JS操作cookies方法!
    //写cookies
    function setCookie(name, value) {
        var Days = 30;
        var exp = new Date();
        exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000);
        document.cookie =
            name + "=" + escape(value) + ";expires=" + exp.toGMTString();
    }

    //读取cookies
    function getCookie(name) {
        var arr,
            reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
        if ((arr = document.cookie.match(reg))) return unescape(arr[2]);
        else return null;
    }

    //删除cookies
    function delCookie(name) {
        var exp = new Date();
        exp.setTime(exp.getTime() - 1);
        var cval = getCookie(name);
        if (cval != null)
            document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString();
    }

    function print() {
        document.body.innerHTML = temp1.outerHTML;
    }

    //DoJob();
    //addLink();
    window.onload = function () {
        if (CurrentConfig.auto) {
            DoJob();
        }
        addLink();
    };
})();