CSU calculate GPA / 中南大学GPA换算

convert grade from 100-scale to 4.0-scale easily / 轻松换算GPA

// ==UserScript==
// @name         CSU calculate GPA / 中南大学GPA换算
// @namespace    https://greasyfork.org/en/scripts/470368-csu-calculate-gpa-%E4%B8%AD%E5%8D%97%E5%A4%A7%E5%AD%A6gpa%E6%8D%A2%E7%AE%97
// @version      0.1.2
// @description  convert grade from 100-scale to 4.0-scale easily / 轻松换算GPA
// @author       0xDkXy
// @match        https://csujwc.its.csu.edu.cn/jsxsd/kscj/cjcx_list
// @icon         https://www.google.com/s2/favicons?sz=64&domain=csu.edu.cn
// @grant        none
// @license      Apache 2.0
// ==/UserScript==

(function() {
    'use strict';
    // 将 等级映射为分数
    function map_level_2_float(score_str)
    {
        var float_score = parseFloat(score_str);
        // console.log(typeof float_score);
        if (!isNaN(float_score)) {
            return float_score;
        }
        if (score_str == "优") {
            return 4.0;
        } else if (score_str == "良") {
            return 3.0;
        } else if (score_str == "中") {
            return 2.0;
        } else if (score_str == "及格") {
            return 1.0
        } else {
            return 0.0
        }
    }

    function map_level_2_float_100(score_str)
    {
        var float_score = parseFloat(score_str);
        // console.log(typeof float_score);
        if (!isNaN(float_score)) {
            return float_score;
        }
        if (score_str == "优") {
            return 95.0;
        } else if (score_str == "良") {
            return 85.0;
        } else if (score_str == "中") {
            return 75.0;
        } else if (score_str == "及格") {
            return 60.0
        } else {
            return 0.0
        }
    }

    let title_list = new Array(
        "标准4.0",
        "改进4.0 1",
        "改进4.0 2",
        "北大4.0",
        "百分制",
    )

    let standard_convert = new Array(
        { ori:90.0, new:4.0 },
        { ori:80.0, new:3.0 },
        { ori:70.0, new:2.0 },
        { ori:60.0, new:1.0 },
        { ori:0.0,  new:0.0 },
    );

    let improve_convert_1 = new Array(
        { ori:85.0, new:4.0 },
        { ori:70.0, new:3.0 },
        { ori:60.0, new:2.0 },
        { ori:0.0,  new:0.0 },
    );

    let improve_convert_2 = new Array(
        { ori:85.0, new:4.0 },
        { ori:75.0, new:3.0 },
        { ori:60.0, new:2.0 },
        { ori:0.0,  new:0.0 },
    );

    let PKU_convert = new Array(
        { ori:90.0, new:4.0 },
        { ori:85.0, new:3.7 },
        { ori:82.0, new:3.3 },
        { ori:78.0, new:3.0 },
        { ori:75.0, new:2.7 },
        { ori:72.0, new:2.3 },
        { ori:68.0, new:2.0 },
        { ori:64.0, new:1.5 },
        { ori:60.0, new:1.0 },
        { ori:0.0,  new:0.0 },
    );

    let canada_convert = new Array(
        { ori:90.0, new:4.3 },
        { ori:85.0, new:4.0 },
        { ori:80.0, new:3.7 },
        { ori:75.0, new:3.3 },
        { ori:70.0, new:3.0 },
        { ori:65.0, new:2.7 },
        { ori:60.0, new:2.3 },
        { ori:0.0,  new:0.0 },
    );

    function convert(score_str, method, is_hundred=false) {
        var score = parseFloat(score_str);
        if (is_hundred || isNaN(score)) {
            return is_hundred ? map_level_2_float_100(score_str):map_level_2_float(score_str);
        } else {
            for (var i = 0; i < method.length; ++i) {
                let item = method[i];
                if (score >= item.ori) {
                    return item.new;
                }
            }
        }
    }

    var origin_grade_list = new Array();

    var hundred = 0.0
    var credit_sum = 0.0
    var grade_tr_list = document.getElementsByTagName("tbody")[1].childNodes;
    var grade_tr_list_len = grade_tr_list.length;
    for (var i = 2; i < grade_tr_list_len; i += 4) {
        var grade_line = grade_tr_list[i].childNodes; // get a line of score
        // var score = map_level_2_float(grade_line[11].innerText);
        var score = grade_line[11].innerText;
        var credit = parseFloat(grade_line[13].innerText);
        credit_sum += credit;
        // console.log(score,credit,credit_sum);
        origin_grade_list.push({score:score, credit:credit});
    }
    console.log(credit_sum);

    var standard_GPA = 0.0;
    var improve_1_GPA = 0.0;
    var improve_2_GPA = 0.0;
    var PKU_GPA = 0.0;

    for (i = 0; i < origin_grade_list.length; ++i) {
        let item = origin_grade_list[i];
        var weighted = item.credit / credit_sum;
        score = convert(item.score, standard_convert);
        standard_GPA += score * weighted;
        score = convert(item.score, improve_convert_1);
        improve_1_GPA += score * weighted;
        score = convert(item.score, improve_convert_2);
        improve_2_GPA += score * weighted;
        score = convert(item.score, PKU_convert);
        PKU_GPA += score * weighted;
        score = convert(item.score, NaN, true);
        console.log("hundred ", score);
        hundred += score * weighted;
    }

    console.log(standard_GPA, improve_1_GPA, improve_2_GPA, PKU_GPA, hundred);

    let GPA_list = new Array(
        standard_GPA,
        improve_1_GPA,
        improve_2_GPA,
        PKU_GPA,
        hundred
    );

    let left_menu = document.getElementById("LeftMenu1_divChildMenu");

    let div_GPA = document.createElement("div");
    for (i = 0; i < GPA_list.length; ++i) {
        let tmp_h4_title = document.createElement("h4");
        tmp_h4_title.innerText = title_list[i];
        let tmp_h4_GPA = document.createElement("h4");
        tmp_h4_GPA = GPA_list[i];
        div_GPA.append(tmp_h4_title);
        div_GPA.append(tmp_h4_GPA);
    }
    left_menu.append(div_GPA);


})();