Module:ScheduleList

Selfice留言 | 贡献2025年1月23日 (四) 07:22的版本

此模块的文档可以在Module:ScheduleList/doc创建

local p = {}

-- 工具函数:判断是否为闰年
local function is_leap_year(year)
    return (year % 4 == 0 and year % 100 ~= 0) or (year % 400 == 0)
end

-- 工具函数:计算每月天数
local function days_in_month(month, leap_year)
    local days = {31, leap_year and 29 or 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
    return days[month]
end

-- 工具函数:将输入的 `yydd` 转换为 `X月X日`
local function format_date(yydd)
    local month = tonumber(string.sub(yydd, 1, 2)) -- 前两位是月份
    local day = tonumber(string.sub(yydd, 3, 4))   -- 后两位是日期
    return string.format("%d月%d日", month, day)
end

-- 工具函数:计算下一个日期
local function get_next_date(yydd, leap_year)
    local month = tonumber(string.sub(yydd, 1, 2))
    local day = tonumber(string.sub(yydd, 3, 4))
    
    local days_in_current_month = days_in_month(month, leap_year)
    if day == days_in_current_month then
        day = 1
        month = month + 1
        if month > 12 then
            month = 1
        end
    else
        day = day + 1
    end
    
    return string.format("%02d%02d", month, day) -- 返回格式化的 mmdd 格式
end

-- 工具函数:计算周几
local function get_weekday(weekday)
    local weekdays = {"周一", "周二", "周三", "周四", "周五", "周六", "周日"}
    return weekdays[(weekday - 1) % 7 + 1]
end

-- 格式化日期行
local function format_date_line(frame, date, time, week, title, css_class)
    local formatted_date = format_date(date)
    local ruby_output = frame:expandTemplate{
        title = "ruby",
        args = {formatted_date, time}
    }
    if css_class and css_class ~= "" then
        return string.format(
            '<li class="%s" style="display: flex;">' ..
            '<div class="datetime"><span>%s<small>%s</small></span></div>' ..
            '<div class="title">%s</div>' ..
            '</li>',
            css_class, ruby_output, week, title
        )
    else
        return string.format(
            '<li style="display: flex;">' ..
            '<div class="datetime"><span>%s<small>%s</small></span></div>' ..
            '<div class="title">%s</div>' ..
            '</li>',
            ruby_output, week, title
        )
    end
end

-- 主函数
function p.main(frame)
    local args = frame:getParent().args

    -- 获取初始参数
    local date = args.date -- 输入的日期为 `yydd` 格式
    local week = tonumber(args.week) -- 输入的周几 (1~7)
    local leap_year = args.leap_year == "yes" -- 闰年判断
    local time_default = "2:00"

    -- 如果没有输入初始日期,则报错
    if not date then return "请提供初始日期 (date 参数,格式为 mmdd)!" end
    if not week or week < 1 or week > 7 then return "请提供正确的初始周几 (week 参数,1~7)!" end

    -- 初始化结果表
    local result = {}
    local current_date = date
    local current_weekday = week

    -- 循环生成7行
    for i = 1, 7 do
        local title = args["title" .. i] or "无" -- 未提供标题时默认 "无"
        local time = args["time" .. i] or time_default -- 未提供时间时默认 "2:00"
        local css_class = args["class" .. i] -- 每行的 CSS 类
        local week_day = get_weekday(current_weekday) -- 计算周几

        -- 格式化每一行
        table.insert(result, format_date_line(frame, current_date, time, week_day, title, css_class))

        -- 更新日期和周几
        current_date = get_next_date(current_date, leap_year)
        current_weekday = current_weekday + 1
    end

    -- 包装在 <ul> 中,作为返回结果
    return '<ul class="schedule-list">' .. table.concat(result, "\n") .. '</ul>'
end

return p