模組:Current VGNL

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

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

此模板根据简讯目录原始碼中的链接判断信息。如模组报错,请检查该页面填写是否正确。

語法

调用本模组的targetlabellinkcontent函数,分别生成页面名、标签、链接、簡訊首頁內容:

  • {{#invoke:Current VGNL|target}} ⇒ 維基專題:電子遊戲/簡訊/2024-01
  • {{#invoke:Current VGNL|label}} ⇒ 2023年第四季
  • {{#invoke:Current VGNL|link}}2023年第四季
  • {{#invoke:Current VGNL|content}} ⇒ (最近一期簡訊首頁)
  • {{#invoke:Current VGNL|toc}} ⇒ (最近一期簡訊內容目錄)

若函数若将函数第一参数设定为draft,则读取简讯草稿:

  • {{#invoke:Current VGNL|target|draft}} ⇒ 維基專題:電子遊戲/簡訊/2024-04
  • {{#invoke:Current VGNL|label|draft}} ⇒ 2024年第一季
  • {{#invoke:Current VGNL|link|draft}}2024年第一季

示例

返回最近一期簡訊內容目錄

{{#invoke:Current VGNL|link}}專題簡訊內容如下:
{{#invoke:Current VGNL|toc}}

2023年第四季專題簡訊內容如下:

技术说明

  • 页面名遍历简讯目录原始碼中的页面链接,根据最大值查找出刊日期。
    • 出刊日期列形如data-sort-value="draft2023####"的为草稿简讯。有多期草稿简讯时取最小值。
  • 标签读取当期简讯主页原始碼中的“YYYY年第×季”。如維基專題:電子遊戲/簡訊/2021-07页面中的「2021年第二季」。

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

p.target = makeInvokeFunc('_target')
function p._target(args)
    --[=[ 根据[[WikiProject:電子遊戲/簡訊/目錄]]的期数链接,获取最新简讯页(或当前草稿简讯页)的页面标题

    若 args[1] = 'draft',则检查出刊日期列data-sort-value属性值为"draft########"'的项目,并取属性值最小的项目
    否则,取出刊日期列data-sort-value属性值为"########"'的项目,并属性值最大的项目

    :param args: 传入本模组的参数组
    :return: 最新一期简讯的页面名字符串,如'維基專題:電子遊戲/簡訊/2023-10'
    ]=]

    local is_draft = args[1] == 'draft'
    local toc_page_name = 'WikiProject:電子遊戲/簡訊/目錄'
    local toc_page_content = mw.title.new(toc_page_name):getContent()
    local ptn = '!%s*scope%s*=%s*"row"%s*|%s*%[%[([^|]+)|%d%d%d%d%-%d%d%]%]%s*' .. '|%s*data%-sort%-value%s*=%s*"' .. (is_draft and 'draft' or '') .. '%d%d%d%d%d%d%d%d"'

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

    local result_pos = is_draft and 1 or #available_page_names
    return available_page_names[result_pos]
end

p.label = makeInvokeFunc('_label')
function p._label(args)
    --[=[ 从当期简讯页面中抓取期号名

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

    local target = p._target(args)
    local text = mw.title.new(target):getContent() or ''
    return text:match('%d%d%d%d年第.-季') or '待定'
end

p.link = makeInvokeFunc('_link')
function p._link(args)
    --[=[ 获取当期简讯主页的内部链接

    :param args: 传入本模组的参数组
    :return: 最新一期简讯的管道链接,如'[[維基專題:電子遊戲/簡訊/2023-10|2023年第三季]]'
    ]=]
    local target = p._target(args)
    local label = p._label(args)
    return '[[' .. target .. '|' .. label .. ']]'
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

p.toc = makeInvokeFunc('_toc')
function p._toc(args)
    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
return p