มอดูล:ForLoop
นี่เป็นมอดูลที่ถูกป้องกันถาวรเนื่องจากมีความเสี่ยงสูง กรุณาอภิปรายการเปลี่ยนแปลงใด ๆ ทางหน้าคุย คุณอาจส่งคำขอแก้ไขไปยังผู้ดูแลระบบเพื่อให้แก้ไขได้หากเป็นการแก้ไขที่ไม่มีการคัดค้านหรือมีความเห็นพ้องสนับสนุน คุณยังสามารถขอให้เลิกป้องกันหน้าได้ |
มอดูลนี้ขึ้นอยู่กับมอดูลอื่น ๆ ดังต่อไปนี้ |
This template implements a for loop or a foreach loop.
This template calls a user-specified template (the "called template") multiple times: once for each value in either 1) an iterated sequence or 2) an explicit list. Each value in the sequence or list is passed to the same specified parameter of the called template (the "variable parameter"). Optionally, pre- and postfixes can be attached to the passed values.
In addition to the specified variable parameter, other parameters of the called template ("static parameters") can be given a value which is the same in each iteration.
Usage
Group | Parameter | Meaning | Default value |
---|---|---|---|
Mandatory | 1 (unnamed) | separator to output between calls (may be blank; whitespace is preserved) | |
call | template to call | ||
pv | name (or number) of the variable parameter of the called template | 1 | |
Option 1: iterated sequence |
start | first numeric value to pass to variable parameter | 1 |
stop | maximum numeric value for variable parameter | ||
by | iteration step size between values passed to variable parameter | 1 | |
Option 2: explicit values |
(unnamed parameters) | explicit values, given as separate parameters (whitespace is stripped) | |
skipBlanks | set to "true" to skip empty parameter values | false | |
Other optional parameters |
pc[N]n | name (or number) of the Nth static parameter of the called template | |
pc[N]v | value for the Nth static parameter of the called template | ||
prefix | static prefix prepended to each value passed to the variable parameter | ||
postfix | static postfix appended to each value passed to the variable parameter | ||
substall | set to "false" to not substitute the called template when {{for loop}} is substituted | true |
Either option 1 (iteration parameters) or option 2 (an explicit list of values) may be used, but not both.
The first unnamed parameter, prior to any explicit values, is a separator. The separator is a string that is output between calls to the template named in |call=
. It is not output after the last call.
Caution
- The separator can be prefixed with "1=", but in that case it cannot contain newlines and spaces at the start and end.
- If any parameter value contains an equals sign, use
{{=}}
(see Template Usage hints and workarounds). - If you use named parameters, note that the first value is parameter 2 (e.g.
|2=Your1stValue
), because parameter 1 is the separator. - If you use named parameters, you must not skip any numbers. The loop will terminate after the first absent numbered parameter. (Parameters can be blank, but not absent.)
Substitution
The current Lua-based template supports substitution. If |substall=no
is not specified, then substituting the template will substitute everything, including the call to the template passed in |call=
. If it is specified, then the template substitutes into a sequence of calls to the template specified.
Example: {{subst:for loop|sep|01|02|03|04|05|06|07|call=1x}}
-> 01sep 02sep 03sep 04sep 05sep 06sep 07
, {{subst:for loop|sep|01|02|03|04|05|06|07|substall=no}}
-> {{1x|01}}sep {{1x|02}}sep {{1x|03}}sep {{1x|04}}sep {{1x|05}}sep {{1x|06}}sep {{1x|07}}
For full substitution Special:ExpandTemplates can also be used.
Examples
Form | Code | Explanation | Result |
---|---|---|---|
Iterator |
{{for loop|&|call = spanbox |pv = font size |start=10|stop=52|by=8 |postfix = px |pc1n = 1 |pc1v = A |pc2n = background |pc2v = yellow }} |
Call the template "spanbox" with values:
Separating outputs with "&" |
ข้อผิดพลาด Lua: expandTemplate: template "spanbox" does not exist |
Explicit values | {{for loop|, |call=1x |prefix=1 |00|01|02|03|04|05|06|07|08|09 |10|11|12|13|14|15|16|17|18|19 |20|21|22|23|24|25|26|27|28|29 |30|31|32|33|34|35|36|37|38|39 |40|41|42|43|44|45|46|47|48|49 |50|51|52|53|54|55|56|57|58|59 |60|61|62|63|64|65|66|67|68|69 |70|71|72|73|74|75|76|77|78|79 |80|81|82|83|84|85|86|87|88|89 |90|91|92|93|94|95|96|97|98|99 }} |
Call the template "1x" with values "1[NN]", where NN = "00" through "99" (given explicitly), separating the outputs with the string ", " | 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199 |
Other examples with explicit values
{{for loop|-|a|3||c|g|call=3x}}
using {{3x}} gives
ข้อผิดพลาด Lua: expandTemplate: template "3x" does not exist
{{for loop|
|a|3||c|g|call=3x}}
gives
ข้อผิดพลาด Lua: expandTemplate: template "3x" does not exist
{|class="wikitable sortable" |- !Test |- | {{for loop| {{!}}- {{!}} |a|b|c|d|e|call=3x}} |}
gives:
Test |
---|
ข้อผิดพลาด Lua: expandTemplate: template "3x" does not exist |
{{for loop| |01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19 |20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39 |40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59 |60|61|62|63|64|65|66|67|68|69|70|71|72|73|74|75|76|77|78|79 |80|81|82|83|84|85|86|87|88|89|90|91|92|93|94|95|96|97|98|99 |100|101|102|103|104|105|106|107|108|109|110|111|112|113|114|115|116|117|118|119 |120|121|122|123|124|125|126|127|128|129|130|131|132|133|134|135|136|137|138|139 |140|141|142|143|144|145|146|147|148|149|150|151|152|153|154|call=1x}}
gives:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
begin->{{for loop|{{=}} |01|02|03|04|05|06|07|08|09|10 |11{{=}}{{=}}{{=}}|12|13|14|15|16|17|18|19|call=1x}}<-end
gives:
begin->01= 02= 03= 04= 05= 06= 07= 08= 09= 10= 11==== 12= 13= 14= 15= 16= 17= 18= 19<-end
Notes about legacy codes
This template is currently in its third incarnation. It now uses the Lua code at Module:For loop. It was ported to Lua from ParserFunctions. There was also a previous version with a named "sep" parameter to specify the separator value. The template was originally based on Template:For on meta. The template name was changed because there was already a Template:For on Wikipedia.
The old versions were limited to 150 variable values and four fixed parameters. There are no such limits in the current version. Also, in the first version the "sep" parameter didn't allow whitespace in the separator value. This was fixed with the second version and was retained in the current version.
See also
- mw:Template:Fe
- mw:Template:foreach
- m:แม่แบบ:tblb (backlinks edit)
- {{for nowiki}}
- {{item}}
- {{loop}}
- {{simple recursion}}
- Help:Parameter default
- Help:Array
- mw:Extension:LoopFunctions
คู่มือการใช้งานที่ปรากฏด้านบนนี้ดึงมาจาก มอดูล:ForLoop/doc (แก้ | ประวัติ) ผู้เขียนสามารถทำการทดลองได้ที่กระบะทราย (แก้ | ดูความแตกต่าง) และชุดทดสอบ (สร้าง) ของมอดูลนี้ หน้าย่อยของมอดูลนี้ |
-- This module implements {{for loop}}.
local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')
local p = {}
function p.main(frame)
local args = getArgs(frame, {
trim = false,
removeBlanks = false
})
return p._main(args)
end
function p._main(args)
local template = args['call'] or 'void'
local calltemplates = yesno(args.substall or "", true) or not mw.isSubsting()
local variableParam = args.pv
variableParam = tonumber(variableParam) or variableParam or 1 -- fix for positional parameters
local variableValPrefix = args.prefix or ''
local variableValPostfix = args.postfix or ''
local sep = args[1] or ''
local constantArgs = p.getConstants(args)
local variableVals = p.getVariableVals(args)
local result = ''
local addSeparator = false;
for _, v in ipairs(variableVals) do
v = mw.text.trim(v)
if #v > 0 or not yesno(args.skipBlanks) then
if addSeparator then
result = result .. sep
end
addSeparator = true;
local targs = constantArgs
targs[variableParam] = variableValPrefix .. v .. variableValPostfix
if calltemplates then
local output = p.callTemplate(template, targs)
if #mw.text.trim(output) == 0 then
addSeparator = false
end
result = result .. output
else
local makeTemplate = require('Module:Template invocation').invocation
result = result .. makeTemplate(template, targs)
end
end
end
return result
end
function p.getConstants(args)
local constantArgNums = p.getArgNums(args, 'pc', 'n')
local constantArgs = {}
for _, num in ipairs(constantArgNums) do
local keyArg = 'pc' .. tostring(num) .. 'n'
local valArg = 'pc' .. tostring(num) .. 'v'
local key = args[keyArg]
key = tonumber(key) or key
local value = args[valArg]
constantArgs[key] = value
end
return constantArgs
end
function p.getVariableVals(args)
local variableVals = {}
if args.start or args.stop or args.by then
if args[2] then
error("Both start/stop/by and numbered parameters specified")
end
local start = tonumber(args.start or 1)
local stop = tonumber(args.stop or 1)
local by = tonumber(args.by or 1)
for i = start, stop, by do
variableVals [#variableVals + 1] = i
end
else
for i, v in ipairs(args) do
if i ~= 1 then
variableVals[i - 1] = v
end
end
end
return variableVals
end
function p.getArgNums(args, prefix, suffix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix and suffix.
local nums = {}
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
for k, _ in pairs(args) do
local num = tostring(k):match(pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
table.sort(nums)
return nums
end
function p.callTemplate(template, targs)
return mw.getCurrentFrame():expandTemplate{title = template, args = targs}
end
return p