PeopleSoft Export

ha ha ha ha ha ha ha ha ha ha ha !

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да инсталирате разширение, като например Tampermonkey .

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name         PeopleSoft Export
// @namespace    peoplesoft_export
// @match        *://scrsprd.zju.edu.cn/*
// @version      0.0.1
// @license      MIT
// @description  ha ha ha ha ha ha ha ha ha ha ha !
// @author       NaN
// @require      https://cdn.bootcdn.net/ajax/libs/jquery/3.6.2/jquery.slim.min.js
// ==/UserScript==

(function () {
    'use strict';


    function download(filename, text) {
        var element = document.createElement('a');
        element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
        element.setAttribute('download', filename);

        element.style.display = 'none';
        document.body.appendChild(element);

        element.click();

        document.body.removeChild(element);
    }


    // Your code here...
    var until = '20230524T000000';
    // yyyymmdd hhmmss
    var first_Sunday = new Date('2023-2-12');
    function getCourseTime(week, timeInfo) {
        // alert(timeInfo);
        let thatDay = new Date(first_Sunday.getTime() + 86400000 * week);
        var year = String(thatDay.getFullYear());
        var month = String(thatDay.getMonth() + 1).padStart(2, 0);
        var date = String(thatDay.getDate()).padStart(2, 0);
        var times = /(\d+):(\d+)([上下])午/.exec(timeInfo).slice(1);
        if (times[2] == '下') times[0] = String(Number(times[0]) + 12);
        times[0] = times[0].padStart(2, 0);
        return `${year}${month}${date}T${times[0]}${times[1]}00`;
    };



    var btn = $('<span>导出日程表</span>');
    $('div#win0divPAGEBAR').after(btn);


    btn.click(() => {
        var maxTime = Array(8);
        var startTime = Array(8);

        var ics = '';

        console.clear();
        $('.SSSTEXTWEEKLY').each((index, ele) => {
            let content = $(ele).html().split('<br>');
            let info = content.slice(0, 5);
            let staff = content.slice(5);
            let from_to = info[3].split(' - ');
            let days = $(ele).parent().index();
            // console.log($(ele).siblings());
            // return;
            if(!$(ele).parent().siblings().hasClass('SSSWEEKLYTIMEBACKGROUND'))
                days++;

            let from = getCourseTime(1, from_to[0]).slice(-6);
            let to = getCourseTime(1, from_to[1]).slice(-6);

            console.log(content[0], '-------------------\n', days);

            let week = 1;
            while(days){
                if(maxTime[week] == undefined || maxTime[week] <= from
                    || startTime[week] >= from)
                    days--, console.log('fill', week, ':', maxTime[week], startTime[week]);
                week++;
            }
            week--;
            from = getCourseTime(week, from_to[0]);
            to = getCourseTime(week, from_to[1]);

            // do{
            //     week++;
            //     // alert($(ele).siblings());
            //     from = getCourseTime(week, from_to[0]);
            //     to = getCourseTime(week, from_to[1]);
            // } while(maxTime[week] != undefined && maxTime[week] > from)
            maxTime[week] = to.slice(-6);
            startTime[week] = from.slice(-6);

            console.log(content[0], '====================\n', week);

                ics +=
                `
BEGIN:VEVENT
SUMMARY:${info.slice(0, 3).join('\\n')}
DTSTART:${getCourseTime(week, from_to[0])}
DTEND:${getCourseTime(week, from_to[1])}
RRULE:FREQ=WEEKLY;UNTIL=${until}
UID:course${index}
DESCRIPTION:${staff.join('\\n')}
LOCATION:${info[4]}
END:VEVENT
`;
            // console.log(info, staff);
        });



        ics =
`BEGIN:VCALENDAR
PRODID:-//PeopleSoftExport//CN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:My School Timetable
X-WR-TIMEZONE:Asia/Shanghai`
            + ics +
            `END:VCALENDAR #日历结束`;

            console.log(ics);
            download('shedule.ics', ics);
    });
})();