Модуль:ParamValue2Value

Материал из Тептар — свободной энциклопедии
Перейти к навигации Перейти к поиску

Этот модуль позволяет в отдельных случаях избавиться от нужды использовать в неименованных параметрах шаблона костыли типа шаблона {{=}}, HTML-сущности = или ручной нумерации параметров. Он:

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

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

В частности, этот модуль используется в шаблоне {{сделано}}:

{{#invoke:ParamValue2Value|main|_pass_to=Сделано/форматирование}}

В шаблоне Сделано/formatting осуществляется финальное форматирование, и в результате мы можем вызвать {{сделано}} со ссылкой в первом параметре, не используя для этого костыли в виде шаблона {{=}}, HTML-сущности = или ручной нумерации параметров:

{{сделано|https://massarn.com/w/index.php?title=Конгресс_Мексики&diff=47059625&oldid=47059396}}✔ Сделано

См. также[править код]


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