2023年政策修订增补工作正在进行中,欢迎参与!
  • Moegirl.ICU:萌娘百科流亡社群 581077156(QQ),欢迎对萌娘百科运营感到失望的编辑者加入
  • Moegirl.ICU:账号认领正在试运行,有意者请参照账号认领流程

Module:Key

萌娘百科,万物皆可萌的百科全书!转载请标注来源页面的网页链接,并声明引自萌娘百科。内容不可商用。
跳转到导航 跳转到搜索
Template-info.svg 模块文档  [查看] [编辑] [历史] [刷新]

通常用于指示游戏中的操作按键。

基本使用

单一按键

一般按键

{{keypress|A}},效果为A
{{keypress|1}},效果为1
{{keypress|;}},效果为;
{{keypress|F1}},效果为F1
{{keypress|Ctrl}},效果为Ctrl
注意:对于按键“|”和“=”,因为它们同时作为Wiki语言标记符号,若需要使用该模板显示这些符号,有以下解决方法:
  • 使用{{!}}、{{=}}模板代替:
{{keypress|{{!}}}},效果为|
{{keypress|{{=}}}},效果为=
  • 替换为对应HTML代码:| → |、&#61 → =;
  • 字符两侧加上<nowiki></nowiki>

特殊按键

{{keypress|Tab}},效果为Tab ↹
{{keypress|Caps Lock}},效果为⇪ Caps Lock
{{keypress|Shift}},效果为⇧ Shift
{{keypress|Backspace}},效果为← Backspace
{{keypress|Enter}},效果为↵ Enter
{{keypress|Up}},效果为
{{keypress|Down}},效果为
{{keypress|Left}},效果为
{{keypress|Right}},效果为
{{keypress|Win}},效果为⊞ Win
{{keypress|Menu}},效果为≣ Menu
{{keypress|Cmd}},效果为⌘ Cmd
{{keypress|Opt}},效果为⌥ Opt

按键组合

|将各按键隔开即可表示组合键,如:

{{keypress|Ctrl|V}},效果为Ctrl+V
{{keypress|Win|Tab}},效果为⊞ Win+Tab ↹
{{keypress|Win|Ctrl|F}},效果为⊞ Win+Ctrl+F

使用chain参数可自定义各按键间分隔符(默认为“+”),如:

{{keypress|Ctrl|F|chain=&}},效果为Ctrl&F
{{keypress|Win|Shift|S|chain=,}},效果为⊞ Win,⇧ Shift,S

类似地,有chain firstchain secondchain third等参数用于单独更换特定位置的分隔符,如:

{{keypress|Alt|Shift|Del|chain first=,}},效果为Alt,⇧ Shift+Del
{{keypress|Alt|Shift|Del|chain second=?}},效果为Alt+⇧ Shift?Del
{{keypress|Ctrl|Alt|Shift|D|chain first=或|chain second=按住|chain third=+}},效果为CtrlAlt按住⇧ Shift+D

混合使用:

{{keypress|Ctrl|0}}{{keypress|1}}{{keypress|2}}{{keypress|3}},效果为Ctrl+0123

其他按键

用于特殊设备按键。

{{keypress|l-down}},效果为L↓
{{keypress|c-left}},效果为C←
{{keypress|r-up}},效果为R↑
{{keypress|l-nw}},效果为L↖
{{keypress|c-se}},效果为C↘
{{keypress|r-ne}},效果为R↗
{{keypress|ex}},效果为×
{{keypress|circle}},效果为
{{keypress|triangle}},效果为
{{keypress|square}},效果为

其他用途

该模板支持添加链接,如:

{{keypress|[[0]]}},效果为0
{{keypress|[[No.7|7]]}},效果为7
{{keypress|[https://zh.moegirl.org.cn/Mainpage 主页]}},效果为主页

与其他模板混用,如:

{{keypress|{{color|orange|测试文字}}}},效果为测试文字
-- 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}}
	'-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); ' ..
	-- 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,
}