模組: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