跳转到内容

模組:Release timeline

维基百科,自由的百科全书

这是本页的一个历史版本,由Lopullinen留言 | 贡献2019年8月18日 (日) 12:23 (https://en.wikipedia.org/w/index.php?title=Module:Release_timeline&oldid=910477655)编辑。这可能和当前版本存在着巨大的差异。

require("Module:No globals")
local getArgs = require("Module:Arguments").getArgs
local p = {}

local function items(args, year)
    local itemList = {}
    if args[year] or args[year .. "a"] then
        table.insert(itemList, args[year] or args[year .. "a"])
    end
    for asciiletter = 98, 106 do -- 98 > b, 106 > j
        if args[year .. string.char(asciiletter)] then
            table.insert(itemList, args[year .. string.char(asciiletter)])
        end
    end
    return table.maxn(itemList), itemList
end

local function color(args, year, itemNum)
    if args[year .. "_color"] then
        return args[year .. "_color"]
    end

    for yearrange = 1, 5 do
        if args["range" .. yearrange] and args["range" .. yearrange .. "_color"] then
            local _, _, beginyear, endyear = string.find(args["range" .. yearrange], "^(%d%d%d%d)%D+(%d%d%d%d)$")

            local year = tonumber(year) or 9999 -- For year == 'TBA'
            beginyear = tonumber(beginyear) or 0
            endyear = tonumber(endyear) or 9999

            if year >= beginyear and year <= endyear then
                local _, _, color1, color2 = string.find(args["range" .. yearrange .. "_color"], "^(%S*)%s*(%S*)$")
                color2 = string.find(color2, "^#?%w+$") and color2 or color1
                return itemNum > 0 and color1 or color2
            end
        end
    end

    return itemNum > 0 and "#0BDA51" or "#228B22"
end

local function left(builder, args, year, itemNum)
    builder =
        builder:tag("th"):attr("scope", "row"):css("border-right", "1.4em solid " .. color(args, year, itemNum)):wikitext(
        year
    )
    if itemNum > 1 then
        builder = builder:attr("rowspan", itemNum)
    end
end

local function right(builder, args, year, itemNum, itemList)
    if itemNum == 0 then
        return
    end

    if itemNum == 1 then
        builder:tag("td"):wikitext(itemList[1])
        return
    end

    -- if itemNum >= 2
    builder:tag("td"):addClass("rt_first"):wikitext(itemList[1])

    for key = 2, itemNum - 1 do
        builder = builder:tag("tr"):tag("td"):addClass("rt_next"):wikitext(itemList[key])
    end

    builder = builder:tag("tr"):tag("td"):addClass("rt_last"):wikitext(itemList[itemNum])
end

local function row(builder, args, year)
    local itemNum, itemList = items(args, year)
    builder = builder:tag("tr")
    left(builder, args, year, itemNum)
    right(builder, args, year, itemNum, itemList)
end

--------------------------------------------------------------------------------

function p.main(frame)
    local args = getArgs(frame)
    return p._main(args)
end

function p._main(args)
    -- Main module code goes here.
    local currentyear = os.date("%Y")

    local ret
    local firstyear, lastyear
    local TBA = items(args, "TBA") > 0 and true or false

    ret =
        mw.html.create("table"):addClass(
        args.align == "left" and "wikitable release_timeline rt_left" or "wikitable release_timeline"
    )

    ret:tag("caption"):addClass("rt_caption"):addClass("nowrap"):wikitext(
        (args.title or "发行时间轴") ..
            (args.subtitle and ('<div class="rt_subtitle">' .. args.subtitle .. "</div>") or "")
    )

    if tonumber(args.first) then
        firstyear = tonumber(args.first)
    else
        for i = 1940, currentyear do
            if items(args, i) > 0 then
                firstyear = i
                break
            end
        end
    end

    if tonumber(args.last) then
        lastyear = tonumber(args.last)
    else
        for i = currentyear + 3, TBA and currentyear or firstyear, -1 do
            if items(args, i) > 0 then
                lastyear = i
                break
            end
        end
        lastyear = lastyear or (currentyear - 1)
    end

    for year = firstyear, lastyear do
        row(ret, args, year)
    end

    if TBA then
        row(ret, args, "待定")
    end

    return ret
end

return p