Module:Unsubst-infobox

local p = {}

local specialParams = {
	['$params'] = 'all parameters',
	['$extra'] = 'extra parameters',
	['$set1'] = 'parameter set 1',
	['$set2'] = 'parameter set 2',
	['$set3'] = 'parameter set 3',
	['$aliases'] = 'parameter aliases',
	['$indent'] = 'indent',
	['$flags'] = 'flags',
	['$B'] = 'template content',
	['$template-name'] = 'template invocation name override'
}

p[''] = function ( frame )
	if not frame:getParent() then
		error( '{{#invoke:Unsubst-infobox|}} makes no sense without a parent frame' )
	end
	if not frame.args['$B'] then
		error( '{{#invoke:Unsubst-infobox|}} requires parameter $B (template content)' )
	end
	if not frame.args['$params'] then
		error( '{{#invoke:Unsubst-infobox|}} requires parameter $params (parameter list)' )
	end

	if mw.isSubsting() then
		---- substing
		-- 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

		-- Build an equivalent template invocation
		-- First, find the title to use
		local titleobj = mw.title.new(frame:getParent():getTitle())
		local title
		if titleobj.namespace == 10 then -- NS_TEMPLATE
			title = titleobj.text
		elseif titleobj.namespace == 0 then -- NS_MAIN
			title = ':' .. titleobj.text
		else
			title = titleobj.prefixedText
		end

		if frame.args['$template-name'] and '' ~= frame.args['$template-name'] then
			title = frame.args['$template-name'] -- override whatever the template name is with this name
		end

		-- Remove empty fields
		for k, v in pairs( args ) do
			if v == '' then args[k] = nil end
		end

		-- Pull information from parameter aliases
		local aliases, extra = {}, {}
		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*' )
				local alias = (tonumber(mw.ustring.match(tmp[1], '^[1-9][0-9]*$'))) or tmp[1]
				aliases[alias] = ((tonumber(mw.ustring.match(tmp[2], '^[1-9][0-9]*$'))) or tmp[2])
				extra[alias] = true
			end
		end
		for k, v in pairs( aliases ) do
			if args[k] and not args[v] then args[v], args[k] = args[k], nil end
		end

		-- Build the invocation body with numbered args first, then named
		local ret = '{{' .. title
		for k, v in ipairs( args ) do
			if mw.ustring.find( v, '=', 1, true ) then
				-- likely something like 1=foo=bar, we need to do it as a named arg
				break
			end
			ret = ret .. '|' .. v
			args[k] = nil
		end

		-- Pull lists from special parameters
		local discard = {}
		local params = mw.text.split( frame.args['$params'], '%s*,%s*' )
		for k, v in ipairs( params ) do
			-- Numbered args don't go here
			if mw.ustring.match(v, '^[1-9][0-9]*$') then
				table.insert( discard, 1, k )
			end
		end
		for k, v in ipairs( discard ) do table.remove( params, v ) end
		local sets, setparams = {{}, {}, {}}, {}
		for k = 1, 3 do
			local v = frame.args['$set' .. k]
			if v then
				setparams[k] = mw.text.split( v, '%s*,%s*' )
				discard = {}
				for x, y in ipairs( setparams[k] ) do
					sets[k][setparams[k][x]] = true
					-- Numbered args don't go here
					if mw.ustring.match(y, '^[1-9][0-9]*$') then
						table.insert( discard, 1, x )
					end
				end
    			for x, y in ipairs( discard ) do table.remove( setparams[k], y ) end
			end
		end
		if frame.args['$extra'] then
			local tmp = mw.text.split( frame.args['$extra'], '%s*,%s*' )
			for k, v in ipairs( tmp ) do extra[(tonumber(mw.ustring.match(v, '^[1-9][0-9]*$'))) or v] = true end
		end

		-- Replace parameter list with short version if full version not necessary
		local tmp = {}
		for k, v in ipairs( sets ) do
			if next(v) then  -- if table v is not empty
				for _, x in ipairs( params ) do
					if args[x] and not v[x] then
						tmp[k] = true
						break
					end
				end
				if not tmp[k] then params = setparams[k] end
			end
		end

		-- Align parameters correctly and remove extra ones
		local maxlength = 0
		discard = {}
		for k, v in ipairs( params ) do
			if (not extra[v]) or args[v] then
				local tmp = mw.ustring.len( tostring( v ) )
				if tmp > maxlength then maxlength = tmp end
			else
				table.insert( discard, 1, k )
			end
		end
		for k, v in ipairs( discard ) do table.remove( params, v ) end
		local indent = mw.ustring.rep(' ', (tonumber(frame.args['$indent']) or 0))
		-- Numbered args after discontinuity continue first
		discard = {}
		for k, v in pairs( args ) do
			if mw.ustring.match(k, '^[1-9][0-9]*$') then table.insert ( discard, 1, k ) end
		end
		for k, v in ipairs( discard ) do table.insert( params, 1, v ) end

		local space, newline = ' ', '\n'
		if not next(params) then space, newline = '', '' end

		for k, v in ipairs( params ) do
			local tmp = space
			if mw.ustring.match( mw.ustring.sub( ( args[v] or '' ) .. ' ', 1, 1 ), '[%*:;#]' ) then tmp = '\n' end
			ret = ret .. newline .. indent .. '|' .. space .. v .. string.rep(' ', (maxlength - mw.ustring.len( v ))) .. space .. '=' .. tmp .. (args[v] or '')
		end
		
		ret = ret .. newline .. '}}'

		ret = mw.ustring.gsub(ret, '%s+\n', '\n')

		return ret
	else
		-- Not substing
		-- Just return the "body"
		return frame.args['$B']
	end
end

return p

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.