Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
徽霖
Vscode
提交
ff3c4035
V
Vscode
项目概览
徽霖
/
Vscode
通知
9
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
V
Vscode
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
ff3c4035
编写于
3月 15, 2018
作者:
M
Martin Aeschlimann
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[html] folding for self-closing tags
上级
294337b0
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
43 addition
and
13 deletion
+43
-13
extensions/html/server/src/modes/htmlFolding.ts
extensions/html/server/src/modes/htmlFolding.ts
+11
-0
extensions/html/server/src/test/folding.test.ts
extensions/html/server/src/test/folding.test.ts
+14
-13
extensions/html/server/src/utils/arrays.ts
extensions/html/server/src/utils/arrays.ts
+18
-0
未找到文件。
extensions/html/server/src/modes/htmlFolding.ts
浏览文件 @
ff3c4035
...
...
@@ -8,6 +8,7 @@ import { LanguageService as HTMLLanguageService, TokenType, Range } from 'vscode
import
{
FoldingRangeType
,
FoldingRange
,
FoldingRangeList
}
from
'
../protocol/foldingProvider.proposed
'
;
import
{
LanguageModes
}
from
'
./languageModes
'
;
import
{
binarySearch
}
from
'
../utils/arrays
'
;
export
function
getFoldingRegions
(
languageModes
:
LanguageModes
,
document
:
TextDocument
,
maxRanges
:
number
|
undefined
,
cancellationToken
:
CancellationToken
|
null
):
FoldingRangeList
{
let
htmlMode
=
languageModes
.
getMode
(
'
html
'
);
...
...
@@ -90,6 +91,11 @@ function limitRanges(ranges: FoldingRange[], maxRanges: number) {
return
ranges
.
filter
((
r
,
index
)
=>
(
typeof
nestingLevels
[
index
]
===
'
number
'
)
&&
nestingLevels
[
index
]
<
maxLevel
);
}
export
const
EMPTY_ELEMENTS
:
string
[]
=
[
'
area
'
,
'
base
'
,
'
br
'
,
'
col
'
,
'
embed
'
,
'
hr
'
,
'
img
'
,
'
input
'
,
'
keygen
'
,
'
link
'
,
'
menuitem
'
,
'
meta
'
,
'
param
'
,
'
source
'
,
'
track
'
,
'
wbr
'
];
export
function
isEmptyElement
(
e
:
string
):
boolean
{
return
!!
e
&&
binarySearch
(
EMPTY_ELEMENTS
,
e
.
toLowerCase
(),
(
s1
:
string
,
s2
:
string
)
=>
s1
.
localeCompare
(
s2
))
>=
0
;
}
export
function
getHTMLFoldingRegions
(
htmlLanguageService
:
HTMLLanguageService
,
document
:
TextDocument
,
range
:
Range
):
FoldingRange
[]
{
const
scanner
=
htmlLanguageService
.
createScanner
(
document
.
getText
());
...
...
@@ -121,6 +127,11 @@ export function getHTMLFoldingRegions(htmlLanguageService: HTMLLanguageService,
lastTagName
=
scanner
.
getTokenText
();
break
;
}
case
TokenType
.
StartTagClose
:
if
(
!
isEmptyElement
(
lastTagName
))
{
break
;
}
// fallthrough
case
TokenType
.
EndTagClose
:
case
TokenType
.
StartTagSelfClose
:
{
let
name
=
elementNames
.
pop
();
...
...
extensions/html/server/src/test/folding.test.ts
浏览文件 @
ff3c4035
...
...
@@ -69,19 +69,20 @@ suite('Object Folding', () => {
assertRanges
(
input
,
[
r
(
0
,
6
),
r
(
1
,
2
),
r
(
4
,
5
)]);
});
// test('Fold self-closing tags', () => {
// let input = [
// /*0*/'<div>',
// /*1*/'<a src="top">',
// /*2*/'<img ',
// /*3*/'</head>',
// /*4*/'<body class="f">',
// /*5*/'Body',
// /*6*/'</body>',
// /*7*/'</html>'
// ];
// assertRanges(input, [r(0, 6), r(1, 2), r(4, 5)]);
// });
test
(
'
Fold self-closing tags
'
,
()
=>
{
let
input
=
[
/*0*/
'
<div>
'
,
/*1*/
'
<a href="top"/>
'
,
/*2*/
'
<img src="s">
'
,
/*3*/
'
<br/>
'
,
/*4*/
'
<br>
'
,
/*5*/
'
<img class="c"
'
,
/*6*/
'
src="top"
'
,
/*7*/
'
>
'
,
/*8*/
'
</div>
'
];
assertRanges
(
input
,
[
r
(
0
,
7
),
r
(
5
,
6
)]);
});
// test('Fold commment', () => {
// let input = [
...
...
extensions/html/server/src/utils/arrays.ts
浏览文件 @
ff3c4035
...
...
@@ -57,3 +57,21 @@ function _divideAndMerge<T>(data: T[], compare: (a: T, b: T) => number): void {
data
[
i
++
]
=
right
[
rightIdx
++
];
}
}
export
function
binarySearch
<
T
>
(
array
:
T
[],
key
:
T
,
comparator
:
(
op1
:
T
,
op2
:
T
)
=>
number
):
number
{
let
low
=
0
,
high
=
array
.
length
-
1
;
while
(
low
<=
high
)
{
let
mid
=
((
low
+
high
)
/
2
)
|
0
;
let
comp
=
comparator
(
array
[
mid
],
key
);
if
(
comp
<
0
)
{
low
=
mid
+
1
;
}
else
if
(
comp
>
0
)
{
high
=
mid
-
1
;
}
else
{
return
mid
;
}
}
return
-
(
low
+
1
);
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录