Модуль:For loop
Зовнішній вигляд
| Цей модуль позначений як К:реліз, готовий до загального вжитку (285). Він досягнув стадії готовності й вважається, що вільний від помилок і може використовуватись всюди, де знадобиться. Його можна згадувати на довідкових сторінках та інших сторінках Вікіпедії як можливість для навчання новачків. Аби зменшити навантаження на сервери та некоректний показ сторінок, його потрібно вдосконалювати через тестування у пісочниці[en], а не через застосування спроб і помилок. |
Цей модуль впроваджує {{For loop}}. Будь ласка, щодо документації див. сторінку шаблону.
Документація вище включена з Модуль:For loop/документація. (ред. | історія)
Дописувачі можуть експериментувати на підсторінках пісочниця (створити | дзеркало) та тести (створити) цього модуля.
Будь ласка, додавайте категорії до підсторінки /документація. Підсторінки цієї сторінки.
Дописувачі можуть експериментувати на підсторінках пісочниця (створити | дзеркало) та тести (створити) цього модуля.
Будь ласка, додавайте категорії до підсторінки /документація. Підсторінки цієї сторінки.
-- 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