Module:TimeLine

此后如竟没有炬火,我便是唯一的光。
Morris92留言 | 贡献2022年9月29日 (四) 20:31的版本 (建立内容为“-- Module:Timeline -- U:Morris92 -- This module implements {{tl|Timeline}}. -- Please refrain from invoking this module directly. local p = {} local getArgs =…”的新页面)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)

本模块用于 {{TimeLine}} 模板,以生成大事年表。


-- Module:Timeline
-- U:Morris92

-- This module implements {{tl|Timeline}}.
-- Please refrain from invoking this module directly.

local p = {}

local getArgs = require("Module:Arguments").getArgs

local function notempty(s)
    return (s and s ~= "")
end

function p.main(frame)
    return p._main(getArgs(frame))
end

function p._main(args)
    local anchor = (mw.ustring.lower((args.anchor or "yes")) ~= "no")

    local r = mw.html.create("table"):addClass("timeline"):addClass(args.class):cssText(args.style)

    local data = p.parse(args)

    for _, period in ipairs(data[1]) do
        local timelist = data[period]
        if (notempty(period)) then
            local row = mw.html.create("tr")
            local header =
                mw.html.create("th"):attr("colspan", 3):cssText(args.periodstyle):cssText(args[period .. "style"])
            if (anchor) then
                local heading =
                    mw.html.create("h5"):cssText("display:inline;font-weight:inherit;color:inherit"):wikitext(period)
                header:node(tostring(heading))
            else
                header:wikitext(period)
            end
            row:node(tostring(header))
            r:node(tostring(row))
        end

        for _, time in ipairs(timelist[1]) do
            local events = timelist[time]
            local long = events.l
            local cnt = #events
            local full = period .. time
            for cur, event in ipairs(events) do
                local row = mw.html.create("tr")
                local cell = mw.html.create("td"):cssText(args.textstyle):cssText(args[full .. "textstyle"])
                if (not long) then
                    cell:attr("colspan", 2)
                end
                -- Add line breaks to fix compatibility issues with unordered lists
                cell:wikitext(event .. "\n")

                if (cur == 1) then
                    local header =
                        mw.html.create("th"):css("font-weight", args.timeweight):cssText(args.timestyle):cssText(
                        args[full .. "style"]
                    )

                    if (long) then
                        header:attr("colspan", 2)
                    end

                    if (cnt > 1) then
                        header:attr("rowspan", cnt)
                    end

                    if (args.period == "on") then
                        header:wikitext(period)
                    end
                    header:wikitext(time)
                    header:wikitext(args.sepr or "")

                    row:node(tostring(header))
                end
                row:node(tostring(cell))
                r:node(tostring(row))
            end
        end
    end

    return r
end

function p.parse(args)
    local raw = args.list
    local data = {[1] = {}} -- index

    for v in mw.text.gsplit(raw, ";") do
        if (not notempty(v)) then
            break
        end

        local timelist = mw.text.split(v, ":")
        local period = timelist[1]
        timelist = timelist[2]

        data[period] = {[1] = {}}
        table.insert(data[1], period)

        for time in mw.text.gsplit(timelist, ",") do
            if (not notempty(time)) then
                break
            end

            local value = args["in" .. period .. time]
            time = mw.text.split(time, "#")
            local needSort = false
            if (#time == 1) then
                needSort = true
            end
            time = time[1]

            time = mw.text.split(time, "in")
            if (#time > 1) then
                time = time[2]
                data[period][time] = data[period][time] or {l = true}
            else
                time = time[1]
                data[period][time] = data[period][time] or {}
            end

            if (needSort) then
                table.insert(data[period][1], time)
            end

            table.insert(data[period][time], value)
        end
    end

    return data
end

return p