Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
bb04e412
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,发现更多精彩内容 >>
未验证
提交
bb04e412
编写于
2月 17, 2020
作者:
A
Alex Dima
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fixes #90391: Split lines into spans of at most 16384 characters
上级
2e3bbc2d
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
25 addition
and
11 deletion
+25
-11
src/vs/editor/browser/view/domLineBreaksComputer.ts
src/vs/editor/browser/view/domLineBreaksComputer.ts
+25
-11
未找到文件。
src/vs/editor/browser/view/domLineBreaksComputer.ts
浏览文件 @
bb04e412
...
...
@@ -149,6 +149,10 @@ function createLineBreaks(requests: string[], fontInfo: FontInfo, tabSize: numbe
return
result
;
}
const
enum
Constants
{
SPAN_MODULO_LIMIT
=
16384
}
function
renderLine
(
lineContent
:
string
,
initialVisibleColumn
:
number
,
tabSize
:
number
,
width
:
number
,
sb
:
IStringBuilder
):
[
number
[],
number
[]]
{
sb
.
appendASCIIString
(
'
<div style="width:
'
);
sb
.
appendASCIIString
(
String
(
width
));
...
...
@@ -164,7 +168,11 @@ function renderLine(lineContent: string, initialVisibleColumn: number, tabSize:
let
visibleColumns
:
number
[]
=
[];
let
nextCharCode
=
(
0
<
len
?
lineContent
.
charCodeAt
(
0
)
:
CharCode
.
Null
);
sb
.
appendASCIIString
(
'
<span>
'
);
for
(
let
charIndex
=
0
;
charIndex
<
len
;
charIndex
++
)
{
if
(
charIndex
!==
0
&&
charIndex
%
Constants
.
SPAN_MODULO_LIMIT
===
0
)
{
sb
.
appendASCIIString
(
'
</span><span>
'
);
}
charOffsets
[
charIndex
]
=
charOffset
;
visibleColumns
[
charIndex
]
=
visibleColumn
;
const
charCode
=
nextCharCode
;
...
...
@@ -227,6 +235,7 @@ function renderLine(lineContent: string, initialVisibleColumn: number, tabSize:
charOffset
+=
producedCharacters
;
visibleColumn
+=
charWidth
;
}
sb
.
appendASCIIString
(
'
</span>
'
);
charOffsets
[
lineContent
.
length
]
=
charOffset
;
visibleColumns
[
lineContent
.
length
]
=
visibleColumn
;
...
...
@@ -240,10 +249,15 @@ function readLineBreaks(range: Range, lineDomNode: HTMLDivElement, lineContent:
if
(
lineContent
.
length
<=
1
)
{
return
null
;
}
const
textContentNode
=
lineDomNode
.
firstChild
!
;
const
spans
=
<
HTMLSpanElement
[]
>
Array
.
prototype
.
slice
.
call
(
lineDomNode
.
children
,
0
)
;
const
breakOffsets
:
number
[]
=
[];
discoverBreaks
(
range
,
textContentNode
,
charOffsets
,
0
,
null
,
lineContent
.
length
-
1
,
null
,
breakOffsets
);
try
{
discoverBreaks
(
range
,
spans
,
charOffsets
,
0
,
null
,
lineContent
.
length
-
1
,
null
,
breakOffsets
);
}
catch
(
err
)
{
console
.
log
(
err
);
return
null
;
}
if
(
breakOffsets
.
length
===
0
)
{
return
null
;
...
...
@@ -255,13 +269,13 @@ function readLineBreaks(range: Range, lineDomNode: HTMLDivElement, lineContent:
type
MaybeRects
=
ClientRectList
|
DOMRectList
|
null
;
function
discoverBreaks
(
range
:
Range
,
textContentNode
:
Node
,
charOffsets
:
number
[],
low
:
number
,
lowRects
:
MaybeRects
,
high
:
number
,
highRects
:
MaybeRects
,
result
:
number
[]):
void
{
function
discoverBreaks
(
range
:
Range
,
spans
:
HTMLSpanElement
[]
,
charOffsets
:
number
[],
low
:
number
,
lowRects
:
MaybeRects
,
high
:
number
,
highRects
:
MaybeRects
,
result
:
number
[]):
void
{
if
(
low
===
high
)
{
return
;
}
lowRects
=
lowRects
||
readClientRect
(
range
,
textContentNode
,
charOffsets
[
low
],
charOffsets
[
low
+
1
]);
highRects
=
highRects
||
readClientRect
(
range
,
textContentNode
,
charOffsets
[
high
],
charOffsets
[
high
+
1
]);
lowRects
=
lowRects
||
readClientRect
(
range
,
spans
,
charOffsets
[
low
],
charOffsets
[
low
+
1
]);
highRects
=
highRects
||
readClientRect
(
range
,
spans
,
charOffsets
[
high
],
charOffsets
[
high
+
1
]);
if
(
Math
.
abs
(
lowRects
[
0
].
top
-
highRects
[
0
].
top
)
<=
0.1
)
{
// same line
...
...
@@ -276,13 +290,13 @@ function discoverBreaks(range: Range, textContentNode: Node, charOffsets: number
}
const
mid
=
low
+
((
high
-
low
)
/
2
)
|
0
;
const
midRects
=
readClientRect
(
range
,
textContentNode
,
charOffsets
[
mid
],
charOffsets
[
mid
+
1
]);
discoverBreaks
(
range
,
textContentNode
,
charOffsets
,
low
,
lowRects
,
mid
,
midRects
,
result
);
discoverBreaks
(
range
,
textContentNode
,
charOffsets
,
mid
,
midRects
,
high
,
highRects
,
result
);
const
midRects
=
readClientRect
(
range
,
spans
,
charOffsets
[
mid
],
charOffsets
[
mid
+
1
]);
discoverBreaks
(
range
,
spans
,
charOffsets
,
low
,
lowRects
,
mid
,
midRects
,
result
);
discoverBreaks
(
range
,
spans
,
charOffsets
,
mid
,
midRects
,
high
,
highRects
,
result
);
}
function
readClientRect
(
range
:
Range
,
textContentNode
:
Node
,
startOffset
:
number
,
endOffset
:
number
):
ClientRectList
|
DOMRectList
{
range
.
setStart
(
textContentNode
,
startOffset
);
range
.
setEnd
(
textContentNode
,
endOffset
);
function
readClientRect
(
range
:
Range
,
spans
:
HTMLSpanElement
[]
,
startOffset
:
number
,
endOffset
:
number
):
ClientRectList
|
DOMRectList
{
range
.
setStart
(
spans
[(
startOffset
/
Constants
.
SPAN_MODULO_LIMIT
)
|
0
].
firstChild
!
,
startOffset
%
Constants
.
SPAN_MODULO_LIMIT
);
range
.
setEnd
(
spans
[(
endOffset
/
Constants
.
SPAN_MODULO_LIMIT
)
|
0
].
firstChild
!
,
endOffset
%
Constants
.
SPAN_MODULO_LIMIT
);
return
range
.
getClientRects
();
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录