Bước tới nội dung

Mô đun:Template invocation

Bách khoa toàn thư mở Wikipedia
-- This module provides functions for making MediaWiki template invocations.local checkType = require('libraryUtil').checkTypelocal p = {}--------------------------------------------------------------------------         Name:  p.name--      Purpose:  Find a template invocation name from a page name or a--                mw.title object.--  Description:  This function detects whether a string or a mw.title--                object has been passed in, and uses that to find a--                template name as it is used in template invocations.--   Parameters:  title - full page name or mw.title object for the--                template (string or mw.title object)--      Returns:  String------------------------------------------------------------------------function p.name(title)	if type(title) == 'string' then		title = mw.title.new(title)		if not title or #title.prefixedText == 0 or #title.interwiki > 0 then			error("tiêu đề không hợp lệ trong tham số #1 của hàm 'name'", 2)		end	elseif type(title) ~= 'table' or type(title.getContent) ~= 'function' then		error("tham số #1 của hàm 'name' phải có một chuỗi hoặc một đối tượng mw.title", 2)	end	if title.namespace == 10 then		local text = title.text		local check = mw.title.new(text, 10)		-- Exclude the prefix, unless we have something like "Template:Category:Foo", which can't be abbreviated to "Category:Foo".		return check and mw.title.equals(title, check) and text or title.prefixedText	elseif title.namespace == 0 then		return ':' .. title.prefixedText	else		return title.prefixedText	endend--------------------------------------------------------------------------         Name:  p.invocation--      Purpose:  Construct a MediaWiki template invocation.--  Description:  This function makes a template invocation from the--                name and the arguments given. Note that it isn't--                perfect: we have no way of knowing what whitespace was--                in the original invocation, the named parameters will be--                alphabetically sorted, and any parameters with duplicate keys--                will be removed.--   Parameters:  name - the template name, formatted as it will appear--                    in the invocation. (string)--                args - a table of template arguments. (table)--                format - formatting options. (string, optional)--                    Set to "nowiki" to escape, curly braces, pipes and--                    equals signs with their HTML entities. The default--                    is unescaped.--      Returns:  String------------------------------------------------------------------------function p.invocation(name, args, format)	checkType('invocation', 1, name, 'string')	checkType('invocation', 2, args, 'table')	checkType('invocation', 3, format, 'string', true)	-- Validate the args table and make a copy to work from. We need to	-- make a copy of the table rather than just using the original, as	-- some of the values may be erased when building the invocation.	local invArgs = {}	for k, v in pairs(args) do		local typek = type(k)		local typev = type(v)		if typek ~= 'string' and typek ~= 'number'			or typev ~= 'string' and typev ~= 'number'		then			error("bảng đối số không hợp lệ trong tham số #2 của " ..			"'lời gọi' (khoá và giá trị phải là chuỗi hoặc số)", 2)		end		invArgs[k] = v	end	-- Get the separators to use.	local seps = {		openb = '{{',		closeb = '}}',		pipe = '|',		equals = '='	}	if format == 'nowiki' then		for k, v in pairs(seps) do			seps[k] = mw.text.nowiki(v)		end	end	-- Build the invocation body with numbered args first, then named.	local ret = {}	ret[#ret + 1] = seps.openb	ret[#ret + 1] = name	for k, v in ipairs(invArgs) do		if type(v) == 'string' and v:find('=', 1, true) then			-- Likely something like 1=foo=bar which needs to be displayed as a named arg.		else			ret[#ret + 1] = seps.pipe			ret[#ret + 1] = v			invArgs[k] = nil -- Erase the key so that we don't add the value twice		end	end	local keys = {} -- sort parameter list; better than arbitrary order	for k, _ in pairs(invArgs) do		keys[#keys + 1] = k	end	table.sort(keys,		function (a, b)			-- Sort with keys of type number first, then string.			if type(a) == type(b) then				return a < b			elseif type(a) == 'number' then				return true			end		end	)		local maybeSpace = '' -- First named parameter should not be separated by a space	for _, v in ipairs(keys) do -- Add named args based on sorted parameter list		ret[#ret + 1] = maybeSpace .. seps.pipe		ret[#ret + 1] = tostring(v)		ret[#ret + 1] = seps.equals		ret[#ret + 1] = invArgs[v]		maybeSpace = ' '	end	ret[#ret + 1] = seps.closeb	return table.concat(ret)endreturn p