模組:Random list
外观
本模組可以從一個列表中隨機抽取指定數量的項目,以點列(*)的形式展示。
如果您只需要從列表中選取一個項目,請使用Module:Rand(本模板亦是受到該模組啓發而建)。
建議直接使用呼叫本模組的模板{{Random list}}。
使用方式
[编辑]{{#invoke:Random list|randitems|...}}
參數:
- 1:必填。包含所有候選項目的原始文本。
- count:選填。要回傳的項目數量。預設為 1。如果大於總項數,則回傳所有項目。
- 2:選填。自定義分隔符(Lua pattern)。
- 指定後,模組會以
mw.text.split(text, sep)分割第 1 參數。 - 未指定時,模組不使用pattern分割,而是逐行解析wiki列表(以換行切分,並移除行首的
*)。
- 指定後,模組會以
示例
[编辑]隨機從ABCD中抽取2個項目展示:
{{#invoke:Random list|randitems|count=2|
*選項A
*選項B
*選項C
*選項D
}}
效果:
- 選項C
- 選項B
使用獨立頁面
[编辑]與Module:Rand一樣,您也可以建立單獨的頁面,並嵌入到參數1:
例如,若您使用
{{#invoke:Random list|randitems|count=2|{{User:Example/subpage}}}}
並在User:Example/subpage建立以下內容:
*選項A *選項B *選項C *選項D
實現的效果是完全一致的。
參見
[编辑]- Help:隨機顯示:更多與此類模板相關的幫助
- {{Random list}}:直接使用此模組的模板
local p = {}
-- 解析 wiki 列表(* 每行)
local function parse_wikilines(text)
local items = {}
for _, line in ipairs(mw.text.split(text, '\n')) do
line = mw.text.trim(line)
line = line:gsub('^%*%s*', '')
if line ~= '' then
table.insert(items, line)
end
end
return items
end
-- 解析自訂分隔符(Lua pattern)
local function parse_by_separator(text, sep)
local items = {}
for _, part in ipairs(mw.text.split(text, sep)) do
part = mw.text.trim(part)
if part ~= '' then
table.insert(items, part)
end
end
return items
end
function p.randitems(frame)
-- 1. 參數
local text = frame.args[1] or ''
local count = tonumber(frame.args.count) or 1
local sep = frame.args[2]
-- 2. 解析列表
local items
if sep and sep ~= '' then
-- 自訂分隔符模式
items = parse_by_separator(text, sep)
else
-- wiki 列表模式
items = parse_wikilines(text)
end
local n = #items
if n == 0 then return '' end
if count < 1 then count = 1 end
if count > n then count = n end
-- 3. 隨機洗牌(頁面穩定)
local seed = tonumber(mw.hash.hashValue(
'md5',
mw.title.getCurrentTitle().prefixedText
):sub(1, 8), 16)
math.randomseed(seed + os.clock() * 100000)
for i = n, 2, -1 do
local j = math.random(i)
items[i], items[j] = items[j], items[i]
end
-- 4. 輸出
local result = {}
for i = 1, count do
result[#result + 1] = '* ' .. items[i]
end
return table.concat(result, '\n')
end
return p