Modul de ajutor pentru a facilita transformarea unui format substituit într-o transcluziune.

Formatele de întreținere, cum ar fi {{Necesită citare}} sau {{Referințe}}, nu trebuie substituite niciodată. Pentru a evita aceasta, se înlocuiește un format cu forma sa transclusă.

Infocasetele ar trebui să folosească Module:Unsubst-infobox, ca și orice alte formate cu parametri listați implicit în format bloc.

Utilizare modificare

Pentru a face ca un format să se autosubstituie, înconjurați codul existent al formatului cu:

{{ {{{|safesubst:}}}#invoke:Unsubst||$B=

 [ ... existing template code ... ]

}}

Wikitextul de afișat când nu este substituit se dă ca argument pentru "$B". Toți ceilalți parametri pe care îi primește #invoke vor fi copiați la invocarea formatului generat drept valori implicite. Dacă valoarea oricărui parametru implicit este "__DATE__", acea valoare din invocarea formatului generat va fi luna și anul curente.

Unele formate au un <noinclude> care nu este închis de un </noinclude> la sfârșit. În asemenea cazuri, tagul </noinclude> lipsă trebuie adăugat înainte de }} de la final.

Utilizare avansată modificare

{{ {{{|safesubst:}}}#invoke:Unsubst||$params=[ parameters ]|$aliases=[ aliases ]|$flags=[ flags ]|$B=

 [ ... existing template code ... ]

}}

Din cauza limitărilor limbajului Lua, parametrii sunt în mod normal ordonați aleator la substituirea formatului. |$params= se poate utiliza în #invoke:Unsubst pentru a lista parametri formatului în ordine, separați de virgulă (de ex. egg,bacon,sausage,cheese,spam). Parametrii cu numere trebuie puși înaintea celorlalți în listă. Orice alți parametri sunt puși la sfârșitul invocării generate.

Aliasurile pentru parametri pot fi listate în |$aliases= (nu în |$params=), și se vor înlocui automat. Fiecare alias și înlocuitorul său trebuie formatați ca alias>înlocuitor, și fiecare astfel de pereche trebuie să fie separată de virgulă (de ex, œuf>ou,cheese>brânză). Acest parametru poate funcționa cu și fără |$params=.

Parametrul |$flags= poate fi utilizat pentru a modifica alte aspecte ale comportamentului formatului; valorile sunt separate de virgulă. Flaguri valide sunt override (permite ca parametrii din #invoke: să aibă prioritate față de parametrii din invocarea originară a formatului); keep-whitespace (împiedică eliminarea whitespace-ului de la începutul și sfârșitul parametrilor fără nume); și remove-empty (înlătură parametrii goi).

Acești parametri pot fi manipulați folosind funcții parser pentru a crea opțiuni mai complicate (atenție că în parametri orice funcție parser, apel de format ori modul, trebuie să aibă Format:(((|safesubst:Format:)))).

Exemplu modificare

Fie un format Format:Exemplu cu următorul cod:

{{ {{{|safesubst:}}}#invoke:Unsubst||foo=bar |date=__DATE__ |$B=

 [ ... Codul formatului ... ]

}}
Originar Rezultat
{{subst:exemplu}} {{Exemplu|foo=bar|date=iunie 2024}}
{{subst:exemplu|foo=X}} {{Exemplu|foo=X|date=iunie 2024}}
{{subst:exemplu|baz=X}} {{Exemplu|foo=bar|baz=X|date=iunie 2024}}
{{subst:exemplu|date=ianuarie 2001}} {{Exemplu|foo=bar|date=ianuarie 2001}}



local checkType = require('libraryUtil').checkType

local p = {}

local BODY_PARAM = '$B'

local specialParams = {
	['$params'] = 'parameter list',
	['$aliases'] = 'parameter aliases',
	['$flags'] = 'flags',
	['$B'] = 'template content'
}

function p.main(frame, body)
	-- If we are substing, this function returns a template invocation, and if
	-- not, it returns the template body. The template body can be specified in
	-- the body parameter, or in the template parameter defined in the
	-- BODY_PARAM variable. This function can be called from Lua or from
	-- #invoke.

	-- Return the template body if we aren't substing.
	if not mw.isSubsting() then
		if body ~= nil then
			return body
		elseif frame.args[BODY_PARAM] ~= nil then
			return frame.args[BODY_PARAM]
		else
			error(string.format(
				"no template content specified (use parameter '%s' from #invoke)",
				BODY_PARAM
			), 2)
		end
	end

	-- Sanity check for the frame object.
	if type(frame) ~= 'table'
		or type(frame.getParent) ~= 'function'
		or not frame:getParent()
	then
		error(
			"argument #1 to 'main' must be a frame object with a parent " ..
			"frame available",
			2
		)
	end

	-- Find the invocation name.
	local mTemplateInvocation = require('Module:Template invocation')
	local name = mTemplateInvocation.name(frame:getParent():getTitle())

	-- Combine passed args with passed defaults
	local args = {}
	if string.find( ','..(frame.args['$flags'] or '')..',', ',%s*override%s*,' ) then
		for k, v in pairs( frame:getParent().args ) do
			args[k] = v
		end
		for k, v in pairs( frame.args ) do
			if not specialParams[k] then
				if v == '__DATE__' then
					v = mw.getContentLanguage():formatDate( 'F Y' )
				end
				args[k] = v
			end
		end
	else
		for k, v in pairs( frame.args ) do
			if not specialParams[k] then
				if v == '__DATE__' then
					v = mw.getContentLanguage():formatDate( 'F Y' )
				end
				args[k] = v
			end
		end
		for k, v in pairs( frame:getParent().args ) do
			args[k] = v
		end
	end

	-- Trim parameters, if not specified otherwise
	if not string.find( ','..(frame.args['$flags'] or '')..',', ',%s*keep%-whitespace%s*,' ) then
		for k, v in pairs( args ) do args[k] = mw.ustring.match(v, '^%s*(.*)%s*$') or '' end
	end

	-- Pull information from parameter aliases
	local aliases = {}
	if frame.args['$aliases'] then
		local list = mw.text.split( frame.args['$aliases'], '%s*,%s*' )
		for k, v in ipairs( list ) do
			local tmp = mw.text.split( v, '%s*>%s*' )
			aliases[tonumber(mw.ustring.match(tmp[1], '^[1-9][0-9]*$')) or tmp[1]] = ((tonumber(mw.ustring.match(tmp[2], '^[1-9][0-9]*$'))) or tmp[2])
		end
	end
	for k, v in pairs( aliases ) do
		if args[k] and ( not args[v] or args[v] == '' ) then
			args[v] = args[k]
		end
		args[k] = nil
	end

	-- Remove empty parameters, if specified
	if string.find( ','..(frame.args['$flags'] or '')..',', ',%s*remove%-empty%s*,' ) then
		local tmp = 0
		for k, v in ipairs( args ) do
			if v ~= '' or ( args[k+1] and args[k+1] ~= '' ) or ( args[k+2] and args[k+2] ~= '' ) then
				tmp = k
			else
				break
			end
		end
		for k, v in pairs( args ) do
			if v == '' then
				if not (type(k) == 'number' and k < tmp) then args[k] = nil end
			end
		end
	end

	-- Order parameters
	if frame.args['$params'] then
		local params, tmp = mw.text.split( frame.args['$params'], '%s*,%s*' ), {}
		for k, v in ipairs(params) do
			v = tonumber(mw.ustring.match(v, '^[1-9][0-9]*$')) or v
			if args[v] then tmp[v], args[v] = args[v], nil end
		end
		for k, v in pairs(args) do tmp[k], args[k] = args[k], nil end
		args = tmp
	end

	return mTemplateInvocation.invocation(name, args)
end

p[''] = p.main -- For backwards compatibility

return p