模組:Loop
外观

給wikitext使用的簡易迴圈,目前只有遞增型和遞減型兩種
使用方法
{{#invoke:Loop|increment|...arguments...}}
{{#invoke:Loop|decrement|...arguments...}}
start
:開始循環的數字。end
:結束循環的數字。range
:每次循環增加或減去的數字。content
:循環的內容。delnowiki
、delmsgnw
:如其名。usingConditionalExpressions
:去除循環內的跳脫字元,參見Module:TemplateParameters#FormatingArguments。
- 範例:
{{#invoke:Loop|increment
|start=1|end=10|range=1|delnowiki=1
|content=<nowiki>* 第{{{1}}}次,你好!</nowiki>
}}
- 或
{{#invoke:Loop|increment
|start=1|end=10|range=1|usingConditionalExpressions=1
|content=* 第\{\{\{1\}\}\}次,你好!\n
}}
- 結果:
function
其他可用在content的變數:
{{{last}}}
:上一個數字,若不存在則為空值。{{{current}}}
:等同{{{1}}}
。{{{next}}}
:下一個數字,若不存在則為空值。
理論上也可以傳入浮點數,但如果出現了奇怪的行為的話建議使用整數。
local p = {}
local mYesno
local mTemplateParameters
local function yesno(value)
if not mYesno then
mYesno = require('Module:Yesno')
end
return mYesno(value)
end
local function loop(default_loopRange, validate_condition, stop_condition)
return function (frame)
local args = frame.args
local loopStart = tonumber(args['start'])
local loopEnd = tonumber(args['end'])
local loopContent = args.content
if loopStart == loopEnd or not loopContent then
return ''
end
local loopRange = tonumber(args['range']) or default_loopRange
validate_condition(loopStart, loopEnd, loopRange)
if yesno(args.delnowiki) then
loopContent = mw.text.unstripNoWiki(loopContent)
end
if yesno(args.delmsgnw) then
loopContent = mw.text.decode(loopContent)
end
if yesno(args.usingConditionalExpressions) then
if not mTemplateParameters then
mTemplateParameters = require('Module:TemplateParameters')
end
loopContent = mTemplateParameters._get_escape(loopContent)
end
local i = loopStart
local output = ''
local check_stop = stop_condition(loopStart, loopEnd, loopRange)
while true do
output = output .. loopContent:gsub('{{{1}}}', tostring(i))
i = i + loopRange
if check_stop(i) then
break
end
end
return mw.getCurrentFrame():preprocess(output)
end
end
function p.increment(frame)
return loop(
-- default_loopRange
1,
-- validate_condition
function (loopStart, loopEnd, loopRange)
if loopStart > loopEnd or loopRange < 0 then
error('Only increment syntax allowed.')
end
end,
-- stop_condition
function (loopStart, loopEnd, loopRange)
return function (i)
return i > loopEnd
end
end
)
end
function p.decrement(frame)
return loop(
-- default_loopRange
-1,
-- validate_condition
function (loopStart, loopEnd, loopRange)
if loopStart < loopEnd or loopRange > 0 then
error('Only decrement syntax allowed.')
end
end,
-- stop_condition
function (loopStart, loopEnd, loopRange)
return function (i)
return i < loopEnd
end
end
)
end
return p