Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
d93c8c49
V
vscode
项目概览
xxadev
/
vscode
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
V
vscode
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
d93c8c49
编写于
8月 09, 2019
作者:
S
SteVen Batten
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fixes #69655
上级
98680599
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
46 addition
and
27 deletion
+46
-27
src/vs/base/browser/ui/menu/menu.ts
src/vs/base/browser/ui/menu/menu.ts
+21
-21
src/vs/base/browser/ui/menu/menubar.ts
src/vs/base/browser/ui/menu/menubar.ts
+25
-6
未找到文件。
src/vs/base/browser/ui/menu/menu.ts
浏览文件 @
d93c8c49
...
...
@@ -20,22 +20,8 @@ import { Event, Emitter } from 'vs/base/common/event';
import
{
AnchorAlignment
}
from
'
vs/base/browser/ui/contextview/contextview
'
;
import
{
isLinux
,
isMacintosh
}
from
'
vs/base/common/platform
'
;
function
createMenuMnemonicRegExp
()
{
try
{
return
new
RegExp
(
'
\\
(&([^
\\
s&])
\\
)|(?<!&)&([^
\\
s&])
'
);
}
catch
(
err
)
{
return
new
RegExp
(
'
\
uFFFF
'
);
// never match please
}
}
export
const
MENU_MNEMONIC_REGEX
=
createMenuMnemonicRegExp
();
function
createMenuEscapedMnemonicRegExp
()
{
try
{
return
new
RegExp
(
'
(?<!&)(?:&)([^
\\
s&])
'
);
}
catch
(
err
)
{
return
new
RegExp
(
'
\
uFFFF
'
);
// never match please
}
}
export
const
MENU_ESCAPED_MNEMONIC_REGEX
:
RegExp
=
createMenuEscapedMnemonicRegExp
();
export
const
MENU_MNEMONIC_REGEX
=
/
\(
&
([^\s
&
])\)
|
(
^|
[^
&
])
&
([^\s
&
])
/
;
export
const
MENU_ESCAPED_MNEMONIC_REGEX
=
/
(
&
)?(
&
)([^\s
&
])
/g
;
export
interface
IMenuOptions
{
context
?:
any
;
...
...
@@ -391,7 +377,7 @@ class BaseMenuActionViewItem extends BaseActionViewItem {
if
(
label
)
{
let
matches
=
MENU_MNEMONIC_REGEX
.
exec
(
label
);
if
(
matches
)
{
this
.
mnemonic
=
(
!!
matches
[
1
]
?
matches
[
1
]
:
matches
[
2
]).
toLocaleLowerCase
();
this
.
mnemonic
=
(
!!
matches
[
1
]
?
matches
[
1
]
:
matches
[
3
]).
toLocaleLowerCase
();
}
}
}
...
...
@@ -480,9 +466,23 @@ class BaseMenuActionViewItem extends BaseActionViewItem {
const
matches
=
MENU_MNEMONIC_REGEX
.
exec
(
label
);
if
(
matches
)
{
label
=
strings
.
escape
(
label
).
replace
(
MENU_ESCAPED_MNEMONIC_REGEX
,
'
<u aria-hidden="true">$1</u>
'
);
label
=
strings
.
escape
(
label
);
// This is global, reset it
MENU_ESCAPED_MNEMONIC_REGEX
.
lastIndex
=
0
;
let
escMatch
=
MENU_ESCAPED_MNEMONIC_REGEX
.
exec
(
label
);
// We can't use negative lookbehind so if we match our negative and skip
while
(
escMatch
&&
escMatch
[
1
])
{
escMatch
=
MENU_ESCAPED_MNEMONIC_REGEX
.
exec
(
label
);
}
if
(
escMatch
)
{
label
=
`
${
label
.
substr
(
0
,
escMatch
.
index
)}
<u aria-hidden="true">
${
escMatch
[
3
]}
</u>
${
label
.
substr
(
escMatch
.
index
+
escMatch
[
0
].
length
)}
`
;
}
label
=
label
.
replace
(
/&&/g
,
'
&
'
);
this
.
item
.
setAttribute
(
'
aria-keyshortcuts
'
,
(
!!
matches
[
1
]
?
matches
[
1
]
:
matches
[
2
]).
toLocaleLowerCase
());
this
.
item
.
setAttribute
(
'
aria-keyshortcuts
'
,
(
!!
matches
[
1
]
?
matches
[
1
]
:
matches
[
3
]).
toLocaleLowerCase
());
}
else
{
label
=
label
.
replace
(
/&&/g
,
'
&
'
);
}
...
...
@@ -815,7 +815,7 @@ export function cleanMnemonic(label: string): string {
return
label
;
}
const
mnemonicInText
=
matches
[
0
].
charAt
(
0
)
===
'
&
'
;
const
mnemonicInText
=
!
matches
[
1
]
;
return
label
.
replace
(
regex
,
mnemonicInText
?
'
$2
'
:
''
).
trim
();
return
label
.
replace
(
regex
,
mnemonicInText
?
'
$2
$3
'
:
''
).
trim
();
}
src/vs/base/browser/ui/menu/menubar.ts
浏览文件 @
d93c8c49
...
...
@@ -209,7 +209,7 @@ export class MenuBar extends Disposable {
// Register mnemonics
if
(
mnemonicMatches
)
{
let
mnemonic
=
!!
mnemonicMatches
[
1
]
?
mnemonicMatches
[
1
]
:
mnemonicMatches
[
2
];
let
mnemonic
=
!!
mnemonicMatches
[
1
]
?
mnemonicMatches
[
1
]
:
mnemonicMatches
[
3
];
this
.
registerMnemonic
(
this
.
menuCache
.
length
,
mnemonic
);
}
...
...
@@ -472,15 +472,34 @@ export class MenuBar extends Disposable {
const
cleanMenuLabel
=
cleanMnemonic
(
label
);
// Update the button label to reflect mnemonics
titleElement
.
innerHTML
=
this
.
options
.
enableMnemonics
?
strings
.
escape
(
label
).
replace
(
MENU_ESCAPED_MNEMONIC_REGEX
,
'
<mnemonic aria-hidden="true">$1</mnemonic>
'
).
replace
(
/&&/g
,
'
&
'
)
:
cleanMenuLabel
.
replace
(
/&&/g
,
'
&
'
);
if
(
this
.
options
.
enableMnemonics
)
{
let
innerHtml
=
strings
.
escape
(
label
);
// This is global so reset it
MENU_ESCAPED_MNEMONIC_REGEX
.
lastIndex
=
0
;
let
escMatch
=
MENU_ESCAPED_MNEMONIC_REGEX
.
exec
(
innerHtml
);
// We can't use negative lookbehind so we match our negative and skip
while
(
escMatch
&&
escMatch
[
1
])
{
escMatch
=
MENU_ESCAPED_MNEMONIC_REGEX
.
exec
(
innerHtml
);
}
if
(
escMatch
)
{
innerHtml
=
`
${
innerHtml
.
substr
(
0
,
escMatch
.
index
)}
<mnemonic aria-hidden="true">
${
escMatch
[
3
]}
</mnemonic>
${
innerHtml
.
substr
(
escMatch
.
index
+
escMatch
[
0
].
length
)}
`
;
}
innerHtml
=
innerHtml
.
replace
(
/&&/g
,
'
&
'
);
titleElement
.
innerHTML
=
innerHtml
;
}
else
{
titleElement
.
innerHTML
=
cleanMenuLabel
.
replace
(
/&&/g
,
'
&
'
);
}
let
mnemonicMatches
=
MENU_MNEMONIC_REGEX
.
exec
(
label
);
// Register mnemonics
if
(
mnemonicMatches
)
{
let
mnemonic
=
!!
mnemonicMatches
[
1
]
?
mnemonicMatches
[
1
]
:
mnemonicMatches
[
2
];
let
mnemonic
=
!!
mnemonicMatches
[
1
]
?
mnemonicMatches
[
1
]
:
mnemonicMatches
[
3
];
if
(
this
.
options
.
enableMnemonics
)
{
buttonElement
.
setAttribute
(
'
aria-keyshortcuts
'
,
'
Alt+
'
+
mnemonic
.
toLocaleLowerCase
());
...
...
@@ -1012,4 +1031,4 @@ class ModifierKeyEmitter extends Emitter<IModifierKeyStatus> {
super
.
dispose
();
this
.
_subscriptions
.
dispose
();
}
}
\ No newline at end of file
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录