Модуль:Transclude/песочница

Материал из Тептар — свободной энциклопедии
< Модуль:Transclude
Версия от 16:49, 12 февраля 2022; Adam (обсуждение | вклад) (Новая страница: «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, func) -- нумерованные ключи из args loca...»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

См. Модуль:Transclude/tests и Шаблон:Test transclude.

Служебные шаблоны[править код]

Тесты шаблона[править код]

13 тестов провалено.

test_call:

Текст Ожидаемое значение Фактическое значение
✔ {{Test transclude/call|26|03|1941}} [источник не указан 30557 дней]
дополнение
[источник не указан 30557 дней]
дополнение
✔ {{Test transclude/call|26|03|1941|обс=привет}} [источник не указан 30557 дней (обс.)]
дополнение
[источник не указан 30557 дней (обс.)]
дополнение
✔ {{Test transclude/call|1=26|2=03|3=1941|обс=привет}} [источник не указан 30557 дней (обс.)]
дополнение
[источник не указан 30557 дней (обс.)]
дополнение
✔ {{Test transclude/call|2=03|1=26|3=1941|обс=привет}} [источник не указан 30557 дней (обс.)]
дополнение
[источник не указан 30557 дней (обс.)]
дополнение
✔ {{Test transclude/call|обс=привет|2=03|1=26|3=1941}} [источник не указан 30557 дней (обс.)]
дополнение
[источник не указан 30557 дней (обс.)]
дополнение

test_forall_no_sep:

Текст Ожидаемое значение Фактическое значение
✔ {{Test transclude/forall no sep}}
N {{Test transclude/forall no sep|H201|H202|H235+H410}} Шаблон:H-фразаШаблон:H-фразаШаблон:H-фраза Ошибка Lua: expandTemplate: template "H-фраза" does not exist.
N {{Test transclude/forall no sep|1=H201|2=H202|3=H235+H410}} Шаблон:H-фразаШаблон:H-фразаШаблон:H-фраза Ошибка Lua: expandTemplate: template "H-фраза" does not exist.
N {{Test transclude/forall no sep|2=H202|1=H201|3=H235+H410}} Шаблон:H-фразаШаблон:H-фразаШаблон:H-фраза Ошибка Lua: expandTemplate: template "H-фраза" does not exist.
N {{Test transclude/forall no sep|1=H201|2=H202|4=H235+H410}} Шаблон:H-фразаШаблон:H-фразаШаблон:H-фраза Ошибка Lua: expandTemplate: template "H-фраза" does not exist.
N {{Test transclude/forall no sep|2=H201|3=H202|4=H235+H410}} Шаблон:H-фразаШаблон:H-фразаШаблон:H-фраза Ошибка Lua: expandTemplate: template "H-фраза" does not exist.
N {{Test transclude/forall no sep|H201|H202|H235+H410|пар=знач}} Шаблон:H-фразаШаблон:H-фразаШаблон:H-фраза Ошибка Lua: expandTemplate: template "H-фраза" does not exist.
N {{Test transclude/forall no sep|1=H201|2=H202|3=H235+H410|пар=знач}} Шаблон:H-фразаШаблон:H-фразаШаблон:H-фраза Ошибка Lua: expandTemplate: template "H-фраза" does not exist.

test_forall_sep_and_conj:

Текст Ожидаемое значение Фактическое значение
N {{Test transclude/forall sep and conj|H201|H202|H235+H410}} Шаблон:H-фраза; Шаблон:H-фраза или Шаблон:H-фраза Ошибка Lua: expandTemplate: template "H-фраза" does not exist.

test_forall_sep_only:

Текст Ожидаемое значение Фактическое значение
N {{Test transclude/forall sep only|H201|H202|H235+H410}} Шаблон:H-фраза; Шаблон:H-фраза; Шаблон:H-фраза Ошибка Lua: expandTemplate: template "H-фраза" does not exist.

test_join_no_sep:

Текст Ожидаемое значение Фактическое значение
✔ {{Test transclude/join no sep|H201|H202|H235+H410}} H201H202H235+H410 H201H202H235+H410
✔ {{Test transclude/join no sep|H201||H235+H410}} H201H235+H410 H201H235+H410

test_join_sep_and_conj:

Текст Ожидаемое значение Фактическое значение
N {{Test transclude/join sep and conj|H201|H202|H235+H410}} H201; H202 или H235+H410 H201; H202 или H235+H410
N {{Test transclude/join sep and conj|H201||H235+H410}} H201 или H235+H410 H201 или H235+H410

test_join_sep_only:

Текст Ожидаемое значение Фактическое значение
N {{Test transclude/join sep only|H201|H202|H235+H410}} H201; H202; H235+H410 H201; H202; H235+H410
N {{Test transclude/join sep only|H201||H235+H410}} H201; H235+H410 H201; H235+H410

test_npc_infobox_below:

Текст Ожидаемое значение Фактическое значение
✔ <table class="wikitable">{{Test transclude/npc infobox below}}</table>
✔ <table class="wikitable">{{Test transclude/npc infobox below|внизу1=низ1|внизу2=низ2|внизу3=низ3}}</table>
низ1
низ2
низ3
низ1
низ2
низ3
✔ <table class="wikitable">{{Test transclude/npc infobox below|внизу1=низ1|класс_внизу1=классвнизу1}}</table>
низ1
низ1
✔ <table class="wikitable">{{Test transclude/npc infobox below|внизу2=низ2|внизу1=низ1|внизу3=низ3}}</table>
низ1
низ2
низ3
низ1
низ2
низ3
✔ <table class="wikitable">{{Test transclude/npc infobox below|внизу1=низ1|внизу2=низ2|внизу4=низ4}}</table>
низ1
низ2
низ4
низ1
низ2
низ4
✔ <table class="wikitable">{{Test transclude/npc infobox below|внизу2=низ2|внизу3=низ3|внизу5=низ5}}</table>
низ2
низ3
низ5
низ2
низ3
низ5
✔ <table class="wikitable">{{Test transclude/npc infobox below|стиль_внизу2=стильниза2|внизу2=низ2|внизу3=низ3|стиль_внизу3=стильниза3|внизу5=низ5}}</table>
низ2
низ3
низ5
низ2
низ3
низ5
✔ <table class="wikitable">{{Test transclude/npc infobox below|стиль_внизу2=стильниза2|внизу2=низ2|внизу3=низ3|стиль_внизу3=стильниза3|внизу5=низ5|стиль_внизу6=стильниза6}}</table>
низ2
низ3
низ5
низ2
низ3
низ5
✔ <table class="wikitable">{{Test transclude/npc infobox below|стиль_внизу=стильнизов|стиль_внизу2=стильниза2|внизу2=низ2|внизу3=низ3|стиль_внизу3=стильниза3|внизу5=низ5}}</table>
низ2
низ3
низ5
низ2
низ3
низ5
✔ <table class="wikitable">{{Test transclude/npc infobox below|внизу 1=низ1|внизу 2=низ2|внизу 3=низ3}}</table>
низ1
низ2
низ3
низ1
низ2
низ3
✔ <table class="wikitable">{{Test transclude/npc infobox below|1внизу 1=низ1|1внизу 2=низ2|1внизу 3=низ3}}</table>

test_npc_with_num:

Текст Ожидаемое значение Фактическое значение
✔ <table class="wikitable">{{Test transclude/npc with num}}</table>
✔ <table class="wikitable">{{Test transclude/npc with num|блок 1 левый 1=л1|блок 1 правый 1=п1|блок 1 левый 2=л2}}</table> Блок 1 левый: л1

Блок 1 правый: п1Блок 1 левый: л2

Блок 1 правый:
Блок 1 левый: л1

Блок 1 правый: п1Блок 1 левый: л2

Блок 1 правый:



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, 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
		local value = func(args[key])
		table.insert(results, value)
	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 args = frame:getParent().args
	local func = function(value)
		return frame:expandTemplate{ title = template, args = {value} } -- или другой frame?
	end
	return forallImpl(args, separator, conjunction, func)
end

-- Берёт нумерованные аргументы объемлющего шаблона и склеивает их в единую строку
function p.join(frame)
	local separator = frame.args[1] or ''
	local conjunction = frame.args[2] or separator
	local args = frame:getParent().args
	local func = function(value)
		return value
	end
	return forallImpl(args, separator, conjunction, 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