模組:VGNL
外观
![]() | 此模块使用Lua语言: |
本模组可生成最新出刊的《电子游戏专题简讯》页面名和标签。
示例
{{#invoke:VGNL|link}}
⇒ 第38行Lua错误:attempt to concatenate field '?' (a nil value){{#invoke:VGNL|target|upcoming}}
⇒ 第38行Lua错误:attempt to concatenate field '?' (a nil value){{#invoke:VGNL|date|2024-01}}
⇒ 脚本错误:函数“date”不存在。{{#invoke:VGNL|toc|style=inline}}
⇒ 第38行Lua错误:attempt to concatenate field '?' (a nil value){{#invoke:VGNL|toc}}
⇒ (以点列生成上方内容){{#invoke:VGNL|index}}
⇒ (生成简讯的目录表)
目录
資料定義於子模組Module:VGNL/items。
脚本错误:函数“index”不存在。
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 newsletter_page_prefix = 'WikiProject:電子遊戲/簡訊/'
local is_draft = args[1] == 'draft'
local toc_page_name = 'WikiProject:電子遊戲/簡訊/目錄'
local toc_page_content = mw.title.new(toc_page_name):getContent()
local ptn = 'data%-sort%-value%s*=%s*"'
ptn = ptn .. (is_draft and '%-' or '') .. '(%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 newsletter_page_prefix .. 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