Deprecated: Use of User::getOption was deprecated in MediaWiki 1.35. [Called from SkinScratchWikiSkin::onOutputPageBodyAttributes in /var/www/html/mediawiki/skins/ScratchWikiSkin2/ScratchWikiSkin.skin.php at line 81] in /var/www/html/mediawiki/includes/debug/MWDebug.php on line 381

Deprecated: Use of QuickTemplate::(get/html/text/haveData) with parameter `headelement` was deprecated in MediaWiki 1.39. [Called from QuickTemplate::get in /var/www/html/mediawiki/includes/skins/QuickTemplate.php at line 144] in /var/www/html/mediawiki/includes/debug/MWDebug.php on line 381

Deprecated: Use of BaseTemplate::getTrail was deprecated in MediaWiki 1.39. [Called from MediaWiki\Skins\Cosmos\CosmosTemplate::execute in /var/www/html/mediawiki/skins/Cosmos/includes/CosmosTemplate.php at line 82] in /var/www/html/mediawiki/includes/debug/MWDebug.php on line 381

Deprecated: Use of QuickTemplate::(get/html/text/haveData) with parameter `bottomscripts` was deprecated in MediaWiki 1.39. [Called from QuickTemplate::get in /var/www/html/mediawiki/includes/skins/QuickTemplate.php at line 144] in /var/www/html/mediawiki/includes/debug/MWDebug.php on line 381
Module:Key - Pi Server Wiki
×
Create or edit a page
Write your page title here:
There are currently 14 pages on the wiki. Enter a name above to create a page, or check out the list of broken links.
Warning: Users creating spam pages will be blocked and have their pages moved to the trash.



    Pi Server Wiki

    Module:Key

    Documentation for this module may be created at Module:Key/doc

    -- This module implements {{key press}}.
    
    local kbdPrefix =
    	'<kbd class=' ..
    	'"keyboard-key nowrap" ' ..
    	'style="border: 1px solid #aaa; ' ..
    	-- The following is an expansion of {{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)}}
    	'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: linear-gradient(to bottom, #eee, #f9f9f9, #eee); ' ..
    	-- Force black color to fix [[phab:T200258]]
    	'color: #000; ' ..
    	'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 key|shift]]'] = '⇧ [[Shift key|Shift]]',
    	['enter'] = '↵ Enter',
    	['[[enter key|enter]]'] = '↵ [[Enter key|Enter]]',
    	['cmd'] = '⌘ Cmd',
    	['[[command key|cmd]]'] = '⌘ [[Command key|Cmd]]',
    	['command'] = '⌘ Command',
    	['[[command key|command]]'] = '⌘ [[Command key|Command]]',
    	['opt'] = '⌥ Opt',
    	['[[option key|opt]]'] = '⌥ [[Option key|Opt]]',
    	['option'] = '⌥ Option',
    	['[[option key|option]]'] = '⌥ [[Option key|Option]]',
    	['tab'] = 'Tab ↹',
    	['[[tab key|tab]]'] = '[[Tab key|Tab]] ↹',
    	['backspace'] = '← Backspace',
    	['[[backspace]]'] = '← [[Backspace]]',
    	['win'] = '⊞ Win',
    	['[[windows key|win]]'] = '⊞ [[Windows key|Win]]',
    	['menu'] = '≣ Menu',
    	['[[menu key|menu]]'] = '≣ [[Menu key|Menu]]',
    	['up'] = '↑',
    	['[[arrow keys|up]]'] = '[[Arrow keys|↑]]',
    	['down'] = '↓',
    	['[[arrow keys|down]]'] = '[[Arrow keys|↓]]',
    	['left'] = '←',
    	['[[arrow keys|left]]'] = '[[Arrow keys|←]]',
    	['right'] = '→',
    	['[[arrow keys|right]]'] = '[[Arrow keys|→]]',
    	['asterisk'] = '&#42;',
    	['hash'] = '&#35;',
    	['[[#]]'] = '[[Number sign|#]]',
    	['colon'] = '&#58;',
    	['[[:]]'] = '[[Colon (punctuation)|:]]',
    	['pipe'] = '&#124;',
    	['[[|]]'] = '[[Pipe symbol|&#124;]]',
    	['semicolon'] = '&#59;',
    	['[[;]]'] = '[[Semi-colon|&#59;]]',
    	['equals'] = '&#61;',
    
    	-- 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 key|cmd]]'] = '[[command key|cmd]]',
    	['[[cmd key|command]]'] = '[[command key|command]]',
    	['[[opt key|opt]]'] = '[[option key|opt]]',
    	['[[option key]]'] = '[[option key|option]]',
    	['[[opt key|option]]'] = '[[option key|option]]',
    	['[[win key|win]]'] = '[[windows key|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
    			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 = {
    		'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(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,
    }