Bước tới nội dung

Mô đun:Parameters

Bách khoa toàn thư mở Wikipedia
-- Mô đun này thực hiện [[Bản mẫu:Parameters]].-- [SublimeLinter luacheck-globals:mw]local DEFINITIONS = {	alt = {		code = '<!-- văn bản thay thế cho hình ảnh; xem WP:ALT -->',		dlist = 'văn bản thay thế cho hình ảnh; xem [[WP:ALT]]'},	coordinates = {		code = '<!-- sử dụng {{Tọa độ}} -->',		dlist = 'sử dụng {{tl|Tọa độ}}'},	coords = {		code = '<!-- sử dụng {{Tọa độ}} -->',		dlist = 'sử dụng {{tl|Tọa độ}}'},	native_name = {		code = '<!-- tên trong ngôn ngữ địa phương; nếu nhiều hơn một, riêng biệt ' ..			'sử dụng {{Plainlist}} sử dụng {{lang}}, và bỏ qua native_name_lang -->',		dlist = 'tên trong ngôn ngữ địa phương; nếu nhiều hơn một, riêng biệt ' ..			'sử dụng {{tl|Plainlist}}, sử dụng {{tl|lang}}, và bỏ qua {{thông số|native_name_lang}}'},	native_name_lang = {		code = '<!-- mã ngôn ngữ hai hoặc ba ký tự ISO -->',		dlist = 'mã ngôn ngữ hai hoặc ba ký tự ISO'},	start_date = {		code = '<!-- {{Start date|YYYY|MM|DD|df=y}} -->',		dlist = 'sử dụng {{tlx|Start date|YYYY|MM|DD|df=y}}'},	end_date = {		code = '<!-- {{End date|YYYY|MM|DD|df=y}} -->',		dlist = 'sử dụng {{tlx|Start date|YYYY|MM|DD|df=y}}'},	url = {		code = '<!-- sử dụng {{URL|ví dụ.com}} -->',		dlist = 'sử dụng {{tl|URL}}'},	website = {		code = '<!-- sử dụng {{URL|ví dụ.com}} -->',		dlist = 'sử dụng {{tls|URL|ví dụ.com}}'},}local p = {}local removeDuplicates = require('Mô đun:TableTools').removeDuplicateslocal yesno = require('Mô đun:Yesno')local function makeInvokeFunction(funcName)	return function(frame)		local getArgs = require('Mô đun:Arguments').getArgs		return p[funcName](getArgs(frame, {removeBlanks = false}))	endendlocal function extractParams(page)	local source = mw.title.new(page, 'template'):getContent()	local parameters = {}	for parameter in string.gmatch(source, '{{{(.-)%f[}|<>]') do		table.insert(parameters, parameter)	end	return removeDuplicates(parameters)endlocal function map(tbl, transform)	local returnTable = {}	for k, v in pairs(tbl) do		returnTable[k] = transform(v)	end	return returnTableendlocal function strMap(tbl, transform)	local returnTable = map(tbl, transform)	return table.concat(returnTable)endfunction p._check(args)	local title = args.base or mw.title.getCurrentTitle().fullText	return string.format(		'{{#gọi:Check for unknown parameters|check|unknown=' ..		'[[Thể loại:Trang sử dụng %s có các tham số chưa rõ]]|%s}}', title,		table.concat(extractParams(args.base), '|'))endfunction p._code(args)	local definitions = yesno(args.definitions)	local pad = yesno(args.pad)	local parameters = extractParams(args.base)	-- Space-pad the parameters to align the equal signs vertically	if pad then		local lengthPerPara = map(parameters, function (parameter)			return string.len(parameter) end)		-- Lua doesn't support printf's <*> to specify the width, apparently		local fs = string.format('%%-%ss', math.max(unpack(lengthPerPara)))		for i, parameter in pairs(parameters) do			parameters[i] = string.format(fs, parameter)		end	end	local title = args.base or mw.title.getCurrentTitle().baseText	return string.format([[ <nowiki>{{%s%s}}</nowiki>]], title, strMap(parameters,		function(s)			if definitions then				return string.format('| %s = %s\n', s,					DEFINITIONS[s] and DEFINITIONS[s].code or '')			else				return string.format('| %s = \n', s)			end		end))endfunction p._flatcode(args)	local parameters = extractParams(args.base)	local title = args.base or mw.title.getCurrentTitle().baseText	return string.format(' {{tlp|%s%s}}', title, strMap(parameters,		function(s)			return string.format(' |%s{{=}}<var>%s</var>', s, s)		end)	)endfunction p._compare(args)	local Set = require('Mô đun:Set')	local function normaliseParams(parameters)		local paramsNorm = {}		-- Prepare a key lookup metatable, which will hold the original		-- parameter names for each normalised parameter, e.g.		-- [test] = {TEST, Test}. paramIndex functions like a Python		-- defaultdict, where the default is a table.		local paramIndex = setmetatable({}, {__index = function(t, k)			if not rawget(t, k) then				rawset(t, k, {})			end			return rawget(t, k)		end})		for _, parameter in pairs(parameters) do			table.insert(paramsNorm,				string.lower(string.gsub(parameter, '%A', '')))			table.insert(paramIndex[				string.lower(string.gsub(parameter, '%A', ''))], parameter)		end		paramsNorm = removeDuplicates(paramsNorm)		-- Overload key lookup in paramsNorm. While [[Mô đun:Set]] will		-- operate on the table (which is to say, the normalised parameters		-- array), key access will be by way of the paramIndex metatable.		setmetatable(paramsNorm, {__index = paramIndex})		return paramsNorm	end	local baseParams = extractParams(args.base)	local otherParams = extractParams(args.other)	local baseNormParams = normaliseParams(Set.valueComplement(			otherParams, baseParams))	local otherNormParams = normaliseParams(otherParams)	return string.format([[Identical:%sTương tự:%sKhác nhau:%s]],	strMap(Set.valueIntersection(baseParams, otherParams),		function(v) return string.format('* %s\n', v) end),	strMap(Set.valueIntersection(baseNormParams, otherNormParams),		function(v) return string.format('* %s < %s [%s]\n',			table.concat(baseNormParams[v], '; '),			table.concat(otherNormParams[v], '; '),			v)		end),	strMap(Set.valueComplement(otherNormParams, baseNormParams),		function(v) return strMap(baseNormParams[v],			function(s) return string.format('* %s\n', s) end)		end))endfunction p._demo(args)	local title = args.base and ('|_template=' .. args.base) or ''	return string.format('{{Parameter names example%s|%s}}', title,		table.concat(extractParams(args.base), '|'))endfunction p._dlist(args)	local definitions = yesno(args.definitions, true)	local defFormat = '; %s: %s\n'	local nonDefFormat = '; %s: \n'	if args._para then		defFormat = '; {{thông số|%s}}: %s\n'		nonDefFormat = '; {{thông số|%s}}: \n'	end	return strMap(extractParams(args.base),		function(s)			if definitions then				return string.format(defFormat, s,					DEFINITIONS[s] and DEFINITIONS[s].dlist or '')			else				return string.format(nonDefFormat, s)			end		end)endfunction p._dlistpara(args)	args._para = true	return p._dlist(args)endfunction p._list(args)	return strMap(extractParams(args.base),		function(s) return string.format('* %s\n', s) end)endp.check = makeInvokeFunction('_check')p.code = makeInvokeFunction('_code')p.flatcode = makeInvokeFunction('_flatcode')p.compare = makeInvokeFunction('_compare')p.demo = makeInvokeFunction('_demo')p.dlist = makeInvokeFunction('_dlist')p.dlistpara = makeInvokeFunction('_dlistpara')p.list = makeInvokeFunction('_list')return p