Модуль:Transclude
Дакумэнтацыю да гэтага модуля можна стварыць у Модуль:Transclude/Дакумэнтацыя
local p={}
-- Выклікае ўнутраны шаблён з аргумэнтамі абдымаючага шаблёна
function p.call(frame)
local template = frame.args[1]
local args = frame:getParent().args
return frame:expandTemplate{ title=template, args=args }
end
-- Агульная рэалізацыя для forall і call
local function forallImpl(args, separator, conjunction, split_args, func)
-- нумараваныя ключы з args
local keys = {}
-- перабор у вадвольным парадку, нават для нумараваных ключоў
for key, value in pairs(args) do
if type(key) == 'number' and value and value ~= '' then
table.insert(keys, key)
end
end
table.sort(keys)
local results = {}
for _, key in ipairs(keys) do
if split_args ~= '' then
local list = mw.text.split (args[key], '%s*[,;]%s*');
for _, item in ipairs (list) do
local value = func(item)
table.insert(results, value)
end
else
local value = func(args[key])
table.insert(results, value)
end
end
return mw.text.listToText(results, separator, conjunction)
end
-- Выклікае ўнутраны шаблён, перадаючы яму нумараваныя парамэтры абдымаючага шаблёна па-адным
function p.forall(frame)
local template = frame.args[1]
local separator = frame.args.separator or ''
local conjunction = frame.args.conjunction or separator
local split_args = frame.args.split_args or ''
local args = frame:getParent().args
local func = function(value)
return frame:expandTemplate{ title = template, args = {value} } -- альбо другі frame?
end
return forallImpl(args, separator, conjunction, split_args, func)
end
-- Бярэ нумараваныя аргумэнты абдымаючага шаблёна й склейвае іх у вадзіны радок
function p.join(frame)
local separator = frame.args[1] or ''
local conjunction = frame.args[2] or separator
local split_args = frame.args.split_args or ''
local args = frame:getParent().args
local func = function(value)
return value
end
return forallImpl(args, separator, conjunction, split_args, func)
end
-- Службовая функцыя: выдаляе дублікаты з адсартаванага масіва з нумараванымі індэксамі
local function deleteDuplicates(args)
local res = {}
for key, value in pairs(args) do
if args[key+1] ~= value then
table.insert(res, value)
end
end
return res
end
-- Выклікае ўнутраны шаблён некалькі разоў, перадаючы ў яго блёкі аргумэнтаў абдымаючага шаблёна
function p.npc(frame)
local args = frame:getParent().args
local templateFrame = frame:getParent()
local template = frame.args[1]
-- вызначэньне, блёкі аргумэнтаў зь якімі нумарамі патрэбны:
-- калі ў абдымаючым шаблёне есьць "парамэтар12" і ў выкліку модуля ёсьць "парамэтар", то выклікаецца 12-ы блёк
local nums = {}
for key, _ in pairs(args) do
local main, num = string.match(key, '^(.-)%s*(%d*)$')
num = tonumber(num)
-- улічваць "парамэтар12", толькі калі заданы "парамэтар"
if num and frame.args[main] then
table.insert(nums, num)
end
end
table.sort(nums)
nums = deleteDuplicates(nums)
-- праходзіць па патрэбных нумарах блёкаў па ўзрастаньні й аднаразова
-- падстаўляць у шаблён:
-- 1. агульныя аргумэнты дадзенага модуля
-- 2. аргумэнты абдымаючага шаблёна накшталт "парамэтар12" як "парамэтар" у 12-ы блёк
local results = {}
for _, blockNum in ipairs(nums) do
-- агульныя аргумэнты модуля, якія перадаюцца ў кожны блёк
local blockArgs = mw.clone(frame.args)
-- metatable ламае expandTemplate
setmetatable(blockArgs, nil)
for key, value in pairs(args) do
local main, num = string.match(key, '^(.-)%s*(%d*)$')
num = tonumber(num)
-- перадаваць "парамэтар12" як "парамэтар" у 12-ы блёк, только калі ёсьць "парамэтар" пры выкліку модуля
if blockNum == num and frame.args[main] then
blockArgs[main] = value
end
end
local blockText = templateFrame:expandTemplate{ title=template; args=blockArgs }
table.insert(results, blockText)
end
return table.concat(results)
end
-- Дзейнічае аналягічна forall па лічбавай пераменай, якая зьмяняецца (звычайна, ад 1) да f.args[2].
function p.cycle(f)
local tf,ac,op=f:getParent(), {}, f.args.output or 'inline';
local sep='';
if op == 'newline' then
sep='\n';
end
for p,k in pairs(f.args) do
if type(p)=='number' then
if p>2 then ac[p-1]=k end
else ac[p]=k
end
end
local s,fh = f.args[2]:match('^%s*(%-?%d+)%s*%.%.') or 1,
f.args[2]:match('%.%.%s*(%S.*)%s*$') or f.args[2] or '';
fh=tonumber(fh) or fh:match('^%s*(.-)%s*$');
s=tonumber(s);
local acr={};
if not s then error('Пачатак цыкла «'..s..'» — ня лік') end
local function dc(order)
local r=tf:expandTemplate{ title=f.args[1]; args={s,unpack(ac)} }
if order == 'desc' then
s=s-1;
else
s=s+1;
end
if r~='' then table.insert(acr,r); return r end
end
if type(fh)=='number' then
if fh > s then
while s<=fh do dc('asc') end
else
while s>=fh do dc('desc') end
end
elseif fh~='' then
while tf:expandTemplate{ title=fh; args={s,unpack(ac)} } do dc('asc') end
else
while dc('asc') do end
end
return table.concat(acr, sep)
end
return p