UnipaBeautifulTimeboard

学生時間割表の見た目を整える

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name        UnipaBeautifulTimeboard
// @namespace   notification
// @description 学生時間割表の見た目を整える
// @include     http*://portal.sa.dendai.ac.jp/up/faces/up/*
// @version     1.29
// @grant       none
// ==/UserScript==

$(function () {
    try {
        var page_title = $('.titleAreaL').html();
        var mode, selector_table_prefix;
        if (page_title == '学生時間割表') {
            mode = 's';
            selector_table_prefix = '#form1\\:calendarList';
        } else if(page_title == '授業時間割表') {
            mode = 'a';
            selector_table_prefix = '#form1\\:tableCal ';
        } else {
            console.log('skip BT script');
            return;
        }
        console.log('load BT script');

        var data = {
            'header:form1:htmlMenuItemButton': '実行',
            'header:form1:hiddenMenuNo': '602',
            'header:form1:hiddenFuncRowId': '0',
            'com.sun.faces.VIEW': $('[name="com.sun.faces.VIEW"]').val(),
            'header:form1': 'header:form1'
        };
        $.ajax({
            url: '#',
            type: 'post',
            timeout: 5000,
            data: data,
            success: function(html, status) {
                var got_units = [];
                $(html).find('#singleTableArea>table>tbody>tr').each(function() {
                    if ('ABCSRARBRCRSRN'.indexOf($(this).find(".tdHyokaList").text()) == -1) {
                        return;
                    }
                    got_units.push($(this).find('.tdKamokuList').text());
                });
                console.log(got_units);

                // 授業情報表示の整形
                $(selector_table_prefix + ' .linkMark>a').each(function() {
                    var params, id, name, term, term_code, teacher, room, unit;
                    params = $(this).html().split(' ');
                    if (mode == 'a') {
                        var params2, params3, params4;
                        params2 = params[0].split(' ');
                        id = params2[0];
                        name = params2[1];
                        params3 = params[1].split(' ');
                        room = params3[1];
                        term = '';
                        if (params3[0].indexOf(')') != -1) {
                            params4 = params3[0].split(')');
                            term = params4[0].replace(/(/g, '(').replace('科目', '') + ')';
                            teacher = params4[1].replace(/[【】]/g, '').replace(/ /, ' ');
                        } else {
                            teacher = params3[0].replace(/[【】]/g, '').replace(/ /, '').replace(/ /, ' ');
                        }
                        $span_unit = '';
                    } else if (mode == 's') {
                        id = params[0];
                        name = params[1];
                        term = params[2].replace(/(/g, '(').replace(/)/g, ')').replace('科目', '');
                        teacher = params[3].replace(/[【】]/g, '').replace(/ /, ' ');
                        room = params[4];
                        unit = params[5].replace('単位', '');
                        if (!unit) {
                            unit = '同上';
                        }
                        $span_unit = $('<span/>').addClass('unit').html(unit);
//                        $span_unit = '<span class="unit">' + unit + '<span>単位</span></span>';
                    }
                    term_code = -1;
                    if (term == ' ') {
                        term = '';
                    } else if (term.indexOf('前期') != -1) {
                        term_code = 0;
                    } else if (term.indexOf('後期') != -1) {
                        term_code = 1;
                    }

                    unit_ids = to_unit_id(name);

                    $(this).parent().addClass('cid-' + id.substr(0, 3));
                    $(this).parent().addClass('name-' + name);
                    if (got_units.indexOf(name) != -1) {
                        $(this).parent().addClass('got');
                    }
                    $(this).parent().addClass('name-' + name);
                    if (term_code != -1) {
                        $(this).parent().addClass('term-' + term_code);
                    }


                    units_html = '';
                    $name_el = $('<span/>').addClass('name').html(name);
                    $term_el = $('<span/>').addClass('term').html(term);
                    if (unit_ids.length != 0) {
                        // unit 科目の処理
                        for (var j = 0; j < unit_ids.length; j++) {
                            $name_el.append(to_unit_str_wrap(unit_ids[j]));
                        }
                    }

                    $(this).html('');
                    $(this).append($('<div/>').append($name_el, $term_el));
                    $(this).after(
                        $('<p/>').addClass('teacher').html('☺' + teacher),
                        $('<p/>').addClass('subs').html('➡').append(
                            $('<span/>').addClass('room').html(room),
                            $span_unit
                        ),
                        $('<p/>').addClass('id').html(id)
                    );
                });

                var $id_params = $('.linkMark .id');

                // style変更
                $('.linkMark>a>div').css({
                    'max-height' : '3em',
                    'overflow' : 'hidden'
                });
                $('.linkMark>a .term').css({
                    'font-size' : '11px',
                    'color' : 'orange'
                });
                $id_params.css({
                    'font-size' : '11px',
                    'color' : 'gray',
                    'display' : 'none'
                });
                $('.linkMark .teacher').css('font-size', '15px');
                $('.linkMark> .room').css({
                    'font-size': '12px',
                    'float' : 'left'
                });
                $('.linkMark>.subs').css({
                    'overflow' : 'auto',
                    'line-height' : '19px'
                });
                $('.linkmark .unit').css({
                    'font-size': '12px',
                    'float' : 'right',
                    'padding' : '0 6px',
                    'background' : '#1d588f',
                    'color' : 'white',
                    'border-radius' : '8px'

                });
                $('.linkmark .unit>span').css({
                    'font-size': '9px',
                });

                $('.koma>span>div').css({
                    'height': '107px'
                });
                $('.koma>span>:not(div:last-child)').css('border-bottom', 'solid 1px');

                // 土曜日の授業がないかチェック
                sut_check = '';
                $('.outline tr.tujoHeight>td:nth-child(7)>span').each(function() {
                    sut_check += $(this).html();
                });
                // 土曜日が空の場合は消去
                if (sut_check == '') {
                    $('.outline tr>*:nth-child(7)').hide();
                }


                var term_cu_str, selector_control, selector;
                if (mode == 's') {
                    term_cu_str = $('#form1\\:lableGakkiName').html().substr(0, 1);
                    $('.left.lineHeight').append('<div id="second-control-box"></div>')

                } else {
                    term_cu_str = $('#form1\\:labelOutLabel3').html().substr(7, 1);
                    $('#form1\\:labelOutLabel').after('<p id="second-control-box"></p>')
                }

                // クラスIDの表示をトグルするチェックボックス
                $('#second-control-box').append('<input id="toggle-show-id" type="checkbox" />クラスIDを表示');
                $('#toggle-show-id').change(function() {
                    if ($(this).is(":checked")) {
                        $id_params.show();
                        $('.koma>span>div').css('height', '117px');
                    } else {
                        $id_params.hide();
                        $('.koma>span>div').css('height', '107px');
                    }
                });

                // 人科のトグル idが11Gから始まるもの
                $('#second-control-box').append('<input id="toggle-show-punit" type="checkbox" checked="" />人科の表示');
                $('#second-control-box').append('<input id="toggle-show-got" type="checkbox" checked=""/>取得科目の表示');
                // 4半期のクラスのみ表示を切り替えるinput
                $('#second-control-box').append(
                        '<input type="radio" name="view-term" value="0" checked="">' + term_cu_str + '期' +
                        '<input type="radio" name="view-term" value="1">' + term_cu_str + '前期' +
                        '<input type="radio" name="view-term" value="2">' + term_cu_str + '後期'
                        );
                var changed_filter = function() {
                    $('.cid-11G').show();
                    $('.got').show();
                    $('.term-0').show();
                    $('.term-1').show();
                    switch($('input[name="view-term"]:radio').val()) {
                        case '0':
                            $('.term-0').show();
                            $('.term-1').show();
                            break;
                        case '1':
                            $('.term-0').show();
                            $('.term-1').hide();
                            break;
                        case '2':
                            $('.term-0').hide();
                            $('.term-1').show();
                            break;
                        default:
                            break;
                    }
                    if (!$('#toggle-show-punit').is(":checked")) {
                        $('.cid-11G').hide();
                    }
                    if (!$('#toggle-show-got').is(":checked")) {
                        $('.got').hide();
                    }
                }
                $('#toggle-show-punit').change(changed_filter);
                $('#toggle-show-got').change(changed_filter);
                $('input[name="view-term"]:radio').change(changed_filter);
            }
        });
    } catch (e) {
        $('body').prepend('<p style="color:red;">[GreasmonkeyScript: BeautifulTimeboard] でエラーが起こっています, 無効にして下さい</p>');
    }

    function to_unit_str(id) {
        return ["CG", "VS", "MI", "WI", "SN", "ST"][id];
    }

    function to_unit_str_long(id) {
        return [
            "Computer Graphics (コンピュータグラフィックス)",
        "Video & Sound (映像と音)",
        "Media & Interaction (メディアとインタラクション)",
        "Web Intelligence (ウェブインテリジェンス)",
        "Security & Network (セキュリティとネットワーク)",
        "Software Technology (ソフトウェアテクノロジ)"
            ][id];
    }

    function to_unit_id(name) {
        lib = [[
            'CGモデリングおよび演習',
        'CGレンダリングおよび演習',
        '形状処理および演習',
        'コンピュータアニメーションおよび演習'
            ], [
            '画像処理',
        '画像処理演習',
        '音声・音響情報処理',
        'コンピュータ音楽作品制作演習',
        'バーチャルリアリティ',
        '音声・音響情報処理'
            ], [
            'ヒューマンインタラクションおよび演習',
        '人間情報システムおよび演習',
        'メディア情報学',
        'インタラクションデザイン'
            ], [
            'サーバ設計論',
        '情報アクセスと知的処理',
        'サーバプログラミング演習',
        'Web情報システム演習',
        'データベースプログラミング演習'
            ], [
            '情報セキュリティの基礎と暗号技術',
        'ネットワークプログラミング',
        'ネットワークプログラミング演習',
        'ネットワークセキュリティおよび演習'
            ], [
            'サーバ設計論',
        'メディア情報学',
        'サーバプログラミング演習',
        'ソフトウェア設計',
        '情報システム論',
        'ソフトウェア分析・モデリング'
            ]];
        kinds = [];
        for (var i = 0; i < lib.length; i++) {
            if (lib[i].indexOf(name) >= 0) {
                kinds.push(i);
            }
        }
        return kinds;
    }

    function to_unit_str_wrap(id) {
        var style = {
            background: 'orange',
            color: 'white',
            'border-radius': '4px',
            'padding-left': '5px',
            'padding-right': '5px',
            'margin-left': '5px',
        };
        // 情報とメディアで色分け
        if (id >= 3) {
            style.background = 'blue';
        }
        return $('<span>').html(to_unit_str(id)).css(style);
    }

});