Mô đun:Key

-- This module implements .
local kbdPrefix = 
local kbdSuffix = 
local keyText = {
	'caps lock' = '⇪ Caps Lock',
	'caps lock' = '⇪ Caps Lock',
	'shift' = '⇧ Shift',
	'shift' = '⇧ Shift',
	'enter' = '↵ Enter',
	'enter' = '↵ Enter',
	'cmd' = '⌘ Cmd',
	'cmd' = '⌘ Cmd',
	'command' = '⌘ Command',
	'command' = '⌘ Command',
	'opt' = '⌥ Opt',
	'opt' = '⌥ Opt',
	'option' = '⌥ Option',
	'option' = '⌥ Option',
	'tab' = 'Tab ↹',
	'tab' = 'Tab ↹',
	'backspace' = '← Backspace',
	'backspace' = '← Backspace',
	'win' = '⊞ Win',
	'win' = '⊞ Win',
	'menu' = '≣ Menu',
	'menu' = '≣ Menu',
	'up' = '↑',
	'up' = '↑',
	'down' = '↓',
	'down' = '↓',
	'left' = '←',
	'left' = '←',
	'right' = '→',
	'right' = '→',
	'asterisk' = '*',
	'hash' = '#',
	'#' = '#',
	'colon' = ':',
	':' = ':',
	'pipe' = '|',
	 = ,
	'semicolon' = ';',
	';' = ';',
	'equals' = '=',
	-- Left & right analog sticks.
	'l up' = 'L↑',
	'l down' = 'L↓',
	'l left' = 'L←',
	'l right' = 'L→',
	'l ne' = 'L↗',
	'l se' = 'L↘',
	'l nw' = 'L↖',
	'l sw' = 'L↙',
	'r up' = 'R↑',
	'r down' = 'R↓',
	'r left' = 'R←',
	'r right' = 'R→',
	'r ne' = 'R↗',
	'r se' = 'R↘',
	'r nw' = 'R↖',
	'r sw' = 'R↙',
	-- PlayStation.
	'ex' = '×',
	'circle' = '○',
	'square' = '□',
	'triangle' = '△',
	-- Nintendo 64 and GameCube.
	'c up' = 'C↑',
	'c down' = 'C↓',
	'c left' = 'C←',
	'c right' = 'C→',
	'c ne' = 'C↗',
	'c se' = 'C↘',
	'c nw' = 'C↖',
	'c sw' = 'C↙',
}
local keyAlias = {
	-- 'alternate name for key (alias)' = 'name for key used in key table'
	'cmd' = 'cmd',
	'command' = 'command',
	'opt' = 'opt',
	'option key' = 'option',
	'option' = 'option',
	'win' = 'win',
	'*' = 'asterisk',
	'#' = 'hash',
	':' = 'colon',
	';' = 'semicolon',
	'l-up' = 'l up',
	'l-down' = 'l down',
	'l-left' = 'l left',
	'l-right' = 'l right',
	'l-ne' = 'l ne',
	'l-se' = 'l se',
	'l-nw' = 'l nw',
	'l-sw' = 'l sw',
	'r-up' = 'r up',
	'r-down' = 'r down',
	'r-left' = 'r left',
	'r-right' = 'r right',
	'r-ne' = 'r ne',
	'r-se' = 'r se',
	'r-nw' = 'r nw',
	'r-sw' = 'r sw',
	'ps x' = 'ex',
	'ps c' = 'circle',
	'ps s' = 'square',
	'ps t' = 'triangle',
	'c-up' = 'c up',
	'c-down' = 'c down',
	'c-left' = 'c left',
	'c-right' = 'c right',
	'c-ne' = 'c ne',
	'c-se' = 'c se',
	'c-nw' = 'c nw',
	'c-sw' = 'c sw',
}
local Collection = {}
Collection.__index = Collection
do
	function Collection:add(item)
		if item ~= nil then
			self.n = self.n + 1
			selfself.n = item
		end
	end
	function Collection:join(sep)
		return table.concat(self, sep)
	end
	function Collection:sort(comp)
		table.sort(self, comp)
	end
	function Collection.new()
		return setmetatable({n = 0}, Collection)
	end
end
local function keyPress(args)
	local chainNames = {
		'chain first',
		'chain second',
		'chain third',
		'chain fourth',
		'chain fifth',
		'chain sixth',
		'chain seventh',
		'chain eighth',
		'chain ninth',
	}
	local result = Collection.new()
	local chainDefault = args.chain or '+'
	for i, id in ipairs(args) do
		if i > 1 then
			result:add(argschainNamesi - 1 or chainDefault)
		end
		local lc = id:lower()
		local text = keyTextlc or keyTextkeyAliaslc or id
		result:add(kbdPrefix .. text .. kbdSuffix)
	end
	return mw.getCurrentFrame():extensionTag{
		name = 'templatestyles', args = { src = 'Template:Phím tắt/styles.css'} 
	} .. result:join()
end
local function keypress(frame)
	-- Called by "...".
	-- Using the template doubles the post‐expand include size.
	return keyPress(frame:getParent().args)
end
local function press(frame)
	-- Called by "...".
	return keyPress(frame.args)
end
return {
	keypress = keypress,
	press = press,
}