Dokumentaciju za ovaj modul možete napraviti na stranici Modul:Key/dok

-- This module implements {{taster}}.

local kbdPrefix =
	'<kbd class=' ..
	'"keyboard-key nowrap" ' ..
	'style="border: 1px solid #aaa; ' ..
	-- The following is an expansion of {{border-radius|0.2em}}
	'-moz-border-radius: 0.2em; -webkit-border-radius: 0.2em; border-radius: 0.2em; ' ..
	-- The following is an expansion of {{box-shadow|0.1em|0.1em|0.2em|rgba(0,0,0,0.1)}}
	'-moz-box-shadow: 0.1em 0.1em 0.2em rgba(0,0,0,0.1); -webkit-box-shadow: 0.1em 0.1em 0.2em rgba(0,0,0,0.1); box-shadow: 0.1em 0.1em 0.2em rgba(0,0,0,0.1); ' ..
	'background-color: #f9f9f9; ' ..
	-- The following is an expansion of {{linear-gradient|top|#eee, #f9f9f9, #eee}}
	'background-image: -moz-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: -o-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: -webkit-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: linear-gradient(to bottom, #eee, #f9f9f9, #eee); ' ..
	'padding: 0.1em 0.3em; ' ..
	'font-family: inherit; ' ..
	'font-size: 0.85em;">'

local kbdSuffix = '</kbd>'

local keyText = {
	['caps lock'] = '⇪ Caps Lock',
	['[[caps lock]]'] = '⇪ [[Caps Lock]]',
	['shift'] = '⇧ Shift',
	['[[shift]]'] = '⇧ [[Shift]]',
	['enter'] = '↵ Enter',
	['[[enter]]'] = '↵ [[Enter]]',
	['cmd'] = '⌘ Cmd',
	['[[command (taster)|cmd]]'] = '⌘ [[Command (taster)|Cmd]]',
	['command'] = '⌘ Command',
	['[[command (taster)|command]]'] = '⌘ [[Command (taster)|Command]]',
	['opt'] = '⌥ Opt',
	['[[option|opt]]'] = '⌥ [[Option|Opt]]',
	['option'] = '⌥ Option',
	['[[option]]'] = '⌥ [[Option]]',
	['tab'] = 'Tab ↹',
	['[[tab]]'] = '[[Tab]] ↹',
	['backspace'] = '← Backspace',
	['[[backspace]]'] = '← [[Backspace]]',
	['win'] = '⊞ Win',
	['[[windows (taster)|win]]'] = '⊞ [[Windows (taster)|Win]]',
	['meni'] = '≣ Meni',
	['[[meni (taster)|meni]]'] = '≣ [[Meni (taster)|Meni]]',
	['gore'] = '↑',
	['[[strelice na tastaturi|gore]]'] = '[[Strelice na tastaturi|↑]]',
	['dolje'] = '↓',
	['[[strelice na tastaturi|dolje]]'] = '[[Strelice na tastaturi|↓]]',
	['lijevo'] = '←',
	['[[strelice na tastaturi|lijevo]]'] = '[[Strelice na tastaturi|←]]',
	['desno'] = '→',
	['[[strelice na tastaturi|desno]]'] = '[[Strelice na tastaturi|→]]',
	['zvjezdica'] = '&#42;',
	['taraba'] = '&#35;',
	['[[#]]'] = '[[Taraba (znak)|#]]',
	['dvotačka'] = '&#58;',
	['[[:]]'] = '[[Dvotačka|:]]',
	['vertikalna crta'] = '&#124;',
	['[[|]]'] = '[[Vertikalna crta|&#124;]]',
	['tačka-zarez'] = '&#59;',
	['[[;]]'] = '[[Tačka-zarez|&#59;]]',
	['znak jednakosti'] = '&#61;',

	-- Gljivice (L+R umjesto L+D zbog standardiziranog prikaza).
	['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.
	['iks'] = '×',
	['krug'] = '○',
	['kvadrat'] = '□',
	['trougao'] = '△',

	-- Nintendo 64 i 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 = {
	-- ['alternativno ime za taster'] = 'naziv tastera u tabeli, tj. lijeva vrijednost'
	['[[cmd taster|cmd]]'] = '[[command (taster)|cmd]]',
	['[[taster cmd|cmd]]'] = '[[command (taster)|cmd]]',
	['[[cmd taster|command]]'] = '[[command (taster)|command]]',
	['[[taster cmd|command]]'] = '[[command (taster)|command]]',
	['[[opt taster|opt]]'] = '[[option|opt]]',
	['[[taster opt|opt]]'] = '[[option|opt]]',
	['[[option taster]]'] = '[[option]]',
	['[[taster option]]'] = '[[option]]',
	['[[opt taster|option]]'] = '[[option]]',
	['[[taster opt|option]]'] = '[[option]]',
	['[[win taster|win]]'] = '[[windows (taster)|win]]',
	['[[taster win|win]]'] = '[[windows (taster)|win]]',
	['*'] = 'zvjezdica',
	['asterisk'] = 'zvjezdica',
	['#'] = 'taraba',
	['ljestve'] = 'taraba',
	['hash'] = 'taraba',
	['hashtag'] = 'taraba',
	['hešteg'] = 'taraba',
	['haštag'] = 'taraba',
	[':'] = 'dvotačka',
	['dvije tačke'] = 'dvotačka',
	[';'] = 'tačka-zarez',
	['tačka zarez'] = 'tačka-zarez',
	['tačka sa zarezom'] = 'tačka-zarez',
	['tačka-zapeta'] = 'tačka-zarez',
	['tačka zapeta'] = 'tačka-zarez',
	['tačka sa zapetom'] = 'tačka-zarez',
	['l-up'] = 'l up',
	['l-down'] = 'l down',
	['l-left'] = 'l left',
	['l-right'] = 'l right',
	['l-gore'] = 'l up',
	['l gore'] = 'l up',
	['l-dolje'] = 'l down',
	['l dolje'] = 'l down',
	['l-lijevo'] = 'l left',
	['l lijevo'] = 'l left',
	['l-desno'] = 'l right',
	['l desno'] = 'l right',
	['l-ne'] = 'l ne',
	['l-se'] = 'l se',
	['l-nw'] = 'l nw',
	['l-sw'] = 'l sw',
	['l-si'] = 'l ne',
	['l si'] = 'l ne',
	['l gore desno'] = 'l ne',
	['l-gore-desno'] = 'l ne',
	['l-ji'] = 'l se',
	['l ji'] = 'l se',
	['l dolje desno'] = 'l se',
	['l-dolje-desno'] = 'l se',
	['l-sz'] = 'l nw',
	['l sz'] = 'l nw',
	['l gore lijevo'] = 'l nw',
	['l-gore-lijevo'] = 'l nw',
	['l-jz'] = 'l sw',
	['l jz'] = 'l sw',
	['l dolje lijevo'] = 'l sw',
	['l-dolje-lijevo'] = 'l sw',
	['r-up'] = 'r up',
	['r-down'] = 'r down',
	['r-left'] = 'r left',
	['r-right'] = 'r right',
	['r-gore'] = 'r up',
	['r gore'] = 'r up',
	['d-gore'] = 'r up',
	['d gore'] = 'r up',
	['r-dolje'] = 'r down',
	['r dolje'] = 'r down',
	['d-dolje'] = 'r down',
	['d dolje'] = 'r down',
	['r-lijevo'] = 'r left',
	['r lijevo'] = 'r left',
	['d-lijevo'] = 'r left',
	['d lijevo'] = 'r left',
	['r-desno'] = 'r right',
	['r desno'] = 'r right',
	['d-desno'] = 'r right',
	['d desno'] = 'r right',
	['r-ne'] = 'r ne',
	['r-se'] = 'r se',
	['r-nw'] = 'r nw',
	['r-sw'] = 'r sw',
	['r-si'] = 'r ne',
	['r si'] = 'r ne',
	['r-gore-desno'] = 'r ne',
	['r gore desno'] = 'r ne',
	['d-si'] = 'r ne',
	['d si'] = 'r ne',
	['d-gore-desno'] = 'r ne',
	['d gore desno'] = 'r ne',
	['r-ji'] = 'r se',
	['r ji'] = 'r se',
	['r-dolje-desno'] = 'r se',
	['r dolje desno'] = 'r se',
	['d-ji'] = 'r se',
	['d ji'] = 'r se',
	['d-dolje-desno'] = 'r se',
	['d dolje desno'] = 'r se',
	['r-sz'] = 'r nw',
	['r sz'] = 'r nw',
	['r-gore-lijevo'] = 'r nw',
	['r gore lijevo'] = 'r nw',
	['d-sz'] = 'r nw',
	['d sz'] = 'r nw',
	['d-gore-lijevo'] = 'r nw',
	['d gore lijevo'] = 'r nw',
	['r-jz'] = 'r sw',
	['r jz'] = 'r sw',
	['r-dolje-lijevo'] = 'r sw',
	['r dolje lijevo'] = 'r sw',
	['d-jz'] = 'r sw',
	['d jz'] = 'r sw',
	['d-dolje-lijevo'] = 'r sw',
	['d dolje lijevo'] = 'r sw',
	['ps x'] = 'iks',
	['ps iks'] = 'iks',
	['ps kr'] = 'krug',
	['ps krug'] = 'krug',
	['ps kv'] = 'kvadrat',
	['ps kvadrat'] = 'kvadrat',
	['ps t'] = 'trougao',
	['trokut'] = 'trougao',
	['c-up'] = 'c up',
	['c-down'] = 'c down',
	['c-left'] = 'c left',
	['c-right'] = 'c right',
	['c-gore'] = 'c up',
	['c gore'] = 'c up',
	['c-dolje'] = 'c down',
	['c dolje'] = 'c down',
	['c-lijevo'] = 'c left',
	['c lijevo'] = 'c left',
	['c-desno'] = 'c right',
	['c desno'] = 'c right',
	['c-ne'] = 'c ne',
	['c-se'] = 'c se',
	['c-nw'] = 'c nw',
	['c-sw'] = 'c sw',
	['c-si'] = 'c ne',
	['c si'] = 'c ne',
	['c-gore-desno'] = 'c ne',
	['c gore desno'] = 'c ne',
	['c-ji'] = 'c se',
	['c ji'] = 'c se',
	['c-dolje-desno'] = 'c se',
	['c dolje desno'] = 'c se',
	['c-sz'] = 'c nw',
	['c sz'] = 'c nw',
	['c-gore-lijevo'] = 'c nw',
	['c gore lijevo'] = 'c nw',
	['c-jz'] = 'c sw',
	['c jz'] = 'c sw',
	['c-dolje-lijevo'] = 'c sw',
	['c dolje lijevo'] = 'c sw',
	['uspravna crta'] = 'vertikalna crta',
	['okomita crta'] = 'vertikalna crta',
	['tabulator'] = 'tab',
	['[[tabulator]]'] = '[[tab]]',
	['windows'] = 'win',
	['[[windows]]'] = '[[windows (taster)|win]]',
	['jednako'] = 'znak jednakosti',
}

local Collection = {}
Collection.__index = Collection
do
	function Collection:add(item)
		if item ~= nil then
			self.n = self.n + 1
			self[self.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 = {
		'veza 1',
		'veza 2',
		'veza 3',
		'veza 4',
		'veza 5',
		'veza 6',
		'veza 7',
		'veza 8',
		'veza 9',
	}
	local result = Collection.new()
	local chainDefault = args.veza or '+'
	for i, id in ipairs(args) do
		if i > 1 then
			result:add(args[chainNames[i - 1]] or chainDefault)
		end
		local lc = id:lower()
		local text = keyText[lc] or keyText[keyAlias[lc]] or id
		result:add(kbdPrefix .. text .. kbdSuffix)
	end
	return result:join()
end

local function keypress(frame)
	-- Called by "{{key press|...}}".
	-- Using the template doubles the post‐expand include size.
	return keyPress(frame:getParent().args)
end

local function press(frame)
	-- Called by "{{#invoke:key|press|...}}".
	return keyPress(frame.args)
end

return {
	keypress = keypress,
	press = press,
}