跳转到内容

模块:Current VGNL

维基百科,自由的百科全书
文档图示 模块文档[查看] [编辑] [历史] [清除缓存]

本模组可生成最新出刊的《电子游戏专题简讯》页面名和标签。

此模板根据简讯目录源代码中的data-sort-value="YYYY-MM"判断。如模组报错,请检查简讯目录填写是否正确。

示例

[编辑]
  • {{#invoke:Current VGNL|latest_id}} ⇒ 2024-10
  • {{#invoke:Current VGNL|target}} ⇒ 维基专题:电子游戏/简讯/2024-10
  • {{#invoke:Current VGNL|date}} ⇒ 2024年10月4日
  • {{#invoke:Current VGNL|label|status=draft}} ⇒ 2024年第四季
  • {{#invoke:Current VGNL|link|id=2020-01}}2019年第四季
  • {{#invoke:Current VGNL|content}} ⇒ (最近一期简讯首页)
  • {{#invoke:Current VGNL|toc}} ⇒ (最近一期简讯内容目录)

require('strict')

local p = {}
local getArgs = require('Module:Arguments').getArgs
local function makeInvokeFunc(funcName)
    return function(frame)
        local args = getArgs(frame)
        return p[funcName](args)
    end
end

local base_title = '維基專題:電子遊戲/簡訊'
local toc_title = base_title .. '/目錄'
local toc_content = mw.title.new(toc_title):getContent()

local function get_status_tag(status)
    --[=[
    ]=]

    if status == 'draft' then
        return '!!'
    end
    if status == 'reviewing' then
        return '!'
    end
    if status == 'all' then
        return '!*'
    end
    return ''
end

p.latest_id = makeInvokeFunc('_latest_id')
function p._latest_id(args)
    --[=[ 根據[[WikiProject:電子遊戲/簡訊/目錄]]的原始碼,獲取最新刊物的標識名(即子页面名)。

    從`data-sort-value="YYYY-MM"`中提取最大`YYYY-MM`,亦即最近出刊的項目。

    :param args: 传入本模组的参数组
    :return: 最新一期简讯的標識名,如'2023-10'。
    ]=]


    local ptn = 'data%-sort%-value%s*=%s*"'
            .. get_status_tag(args['status'])
            .. '(%d%d%d%d%-%d%d)"'

    local ids = {}
    for v in mw.ustring.gmatch(toc_content, ptn) do
        table.insert(ids, v)
    end
    table.sort(ids)

    if #ids > 0 then
        return ids[#ids]
    end
end

p.id = makeInvokeFunc('_id')
function p._id(args)
    --[=[ 根據[[WikiProject:電子遊戲/簡訊/目錄]],檢索args['id']是否爲有效刊物標識名。
    若爲有效標識,則返回該標識名。否則爲無效標識,調用p.latest_id(args)返回最新刊物標識名。

    :param args: 传入本模组的参数组
    :return: 简讯標識名,如'2023-10'。
    ]=]

    if args['id'] == nil then
        return p._latest_id(args)
    end

    local ptn = 'data%-sort%-value%s*=%s*"'
            .. get_status_tag(args['status'])
            .. mw.ustring.gsub(args['id'], '-', '%-')
            .. '"'

    if mw.ustring.find(toc_content, ptn) then
        return args['id']
    end

end

p.target = makeInvokeFunc('_target')
function p._target(args)
    --[=[ 返回完整頁面標題。

    :param args: 传入本模组的参数组
    :return: 最新一期简讯的主頁標題,如'維基專題:電子遊戲/簡訊/2023-10'。
    ]=]

    local id = p._id(args)

    if id then
        return base_title .. '/' .. p._id(args)
    end
end

p.label = makeInvokeFunc('_label')
function p._label(args)
    --[=[ 從[[WikiProject:電子遊戲/簡訊/目錄]]的原始碼中提取期號。

    :param args: 传入本模组的参数组
    :return: 简讯的期号名,如'2023年第三季'
    ]=]

    local target = p._target(args)
    if target == nil then
        return
    end
    target = mw.ustring.gsub(target, '-', '%-')  -- 跳脫'YYYY-MM'中的字元'-'
    local ptn = '%[%[' .. target .. '%|(.-)%]%]'
    local _, _, label = mw.ustring.find(toc_content, ptn)
    return label
end

p.link = makeInvokeFunc('_link')
function p._link(args)
    --[=[ 根據id,從[[WikiProject:電子遊戲/簡訊/目錄]]的原始碼中提取期號。

    :param args: 传入本模组的参数组
    :return: 最新一期简讯的管道链接,如'[[維基專題:電子遊戲/簡訊/2023-10|2023年第三季]]'
    ]=]

    local target = p._target(args)
    if target == nil then
        return
    end
    local label = p._label(args)
    return '[[' .. target .. '|' .. label .. ']]'
end

p.date = makeInvokeFunc('_date')
function p._date(args)
    --[=[ 根據id,從[[WikiProject:電子遊戲/簡訊/目錄]]的原始碼中提取出刊時間。

    :param args: 传入本模组的参数组
    :return: 最新一期简讯的管道链接,如'2023年11月4日'
    ]=]

    local id = p._id(args)
    if id == nil then
        return
    end
    id = mw.ustring.gsub(id, '-', '%-')  -- 跳脫'YYYY-MM'中的字元'-'
    local ptn = 'data%-sort%-value%s*=%s*"' .. id .. '".-\n'
            .. '|%s*(%d%d%d%d年%d%d?月%d%d?日)'
    local _, _, date = mw.ustring.find(toc_content, ptn)
    return date

end

p.toc = makeInvokeFunc('_toc')
function p._toc(args)
    -- TODO: 根據目錄重寫

    local target = p._target(args)
    local text = mw.title.new(target):getContent()

    local items = {}
    local pattern = mw.ustring.gsub(target, 'WikiProject:', '維基專題:')
    pattern = '%[%[' .. mw.ustring.gsub(pattern, '%-', '%-') .. '/.-|.-%]%]'
    local pos = 1

    while true do
        local s, e = mw.ustring.find(text, pattern, pos, false)
        if s == nil then
            break
        end
        table.insert(items, mw.ustring.sub(text, s, e))
        pos = e + 1
    end

    if args.style == 'comma' then
        return table.concat(items, '、')
    end

    do
        local items_ = { }
        for _, item in ipairs(items) do
            table.insert(items_, '* ' .. item)
        end
        return table.concat(items_, '\n')
    end
end

p.content = makeInvokeFunc('_content')
function p._content(args)
    --[=[ 生成当期简讯主页的内容

    :param args: 传入本模组的参数组
    :return: 最新一期简讯的内容
    ]=]

    -- ToDo: 移除页面的分类
    local target = p._target(args)
    return mw.getCurrentFrame():expandTemplate { title = target }
end

return p