Модуль:ParamValue2Value

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
{{i}} Документація модуля[перегляд] [редагувати] [історія] [очистити кеш]

Цей модуль дозволяє в окремих випадках позбутися від потреби використовувати в різних неназваних параметрах шаблону милиці типу шаблону {{=}}, HTML-сутності = або ручної нумерації параметрів. Він:

  1. приймає від шаблону параметри, з якими той був викликаний;
  2. перетворює іменовані параметри виду параметр=значення, за винятком тих, ім'я яких починаються зі знака підкреслення _, і перерахованих через / у параметрі _exceptions, в неіменовані, поєднуючи ім'я параметра і його значення знаком = і додаючи отриманий параметр у кінець списку;
  3. передає всі параметри у шаблон, зазначений у параметрі _pass_to.

Важливо: поки не буде вирішена проблема спотвореного порядку іменованих параметрів у Scribunto, модуль працюватиме стабільно тільки при одному, і не більше, іменованому параметрі, який треба перетворити; інакше порядок проходження параметрів може змінюватися без будь-якої логіки. Причому параметр, у який може затесатися знак «=», повинен бути останнім у списку, інакше порядок спотвориться.

Зокрема, він використовується в шаблонах для посилань на шаблони із зазначенням параметрів, таких як {{tp}}, {{tc}} і {{tlc}}. Наприклад, у шаблоні {{tp}} він викликається так:

{{#invoke:ParamValue2Value|main|_pass_to=tp/formatting}}

У шаблоні tp/formatting здійснюється фінальне форматування, і в результаті ми можемо викликати {{tp}} з іменованими параметрами, не використовуючи для цього милиці у вигляді шаблону {{=}}, HTML-сутності = або ручної нумерації параметрів:

{{tp|шаблон|параметр 1}}{{шаблон|параметр 1|параметр 2=значення}}

Див. також[ред. код]

local p = {}

--[=[
Helper function that escapes all pattern characters so that they will be treated
as plain text. Copied from [[:en:Module:String]].
]=]
local function escapePattern(pattern_str)
	return mw.ustring.gsub(pattern_str, '([%(%)%.%%%+%-%*%?%[%^%$%]])', '%%%1')
end

-- виклик шаблону, при помилці повертає порожній рядок
local function expand(frame, tname, targs)
	local success, result = pcall(
		frame.expandTemplate,
		frame,
		{title = tname, args = targs}
	)
	if success then
		return result
	else
		return ''
	end
end

local function is_exception(arg, exceptions)
	return mw.ustring.find(exceptions, '/' .. escapePattern(arg) .. '/')
end

function p.main(frame)
	if not getArgs then
		getArgs = require('Module:Arguments').getArgs
	end
	local args = getArgs(frame, {
		trim = false,
		removeBlanks = false
	})
	local tname = args._pass_to
	local exceptions = args._exceptions and '/' .. args._exceptions .. '/' or ''
	local targs, i = {}, 1
	for k, v in pairs(args) do
		if type(k) == 'number' then --неіменовані параметри
			targs[i] = v
			i = i+1
		elseif not k:find('^_') and not is_exception(k, exceptions) then --іменовані параметри, виключаючи налаштування шаблону, що викликає
			targs[i] = k .. "=" .. v
			i = i+1
		elseif k ~= '_pass_to' and k ~= '_exceptions' then --налаштування шаблону, що викликає
			targs[k] = v
		end
	end
	
	return tostring(expand(frame, tname, targs))
end

return p