5
5
6
6
import { CharCode } from 'vs/base/common/charCode' ;
7
7
import * as strings from 'vs/base/common/strings' ;
8
- import { WrappingIndent , IComputedEditorOptions , EditorOption , IEditorOptions } from 'vs/editor/common/config/editorOptions' ;
8
+ import { WrappingIndent , IComputedEditorOptions , EditorOption } from 'vs/editor/common/config/editorOptions' ;
9
9
import { CharacterClassifier } from 'vs/editor/common/core/characterClassifier' ;
10
10
import { FontInfo } from 'vs/editor/common/config/fontInfo' ;
11
11
import { LineInjectedText } from 'vs/editor/common/textModelEvents' ;
@@ -16,18 +16,17 @@ export class MonospaceLineBreaksComputerFactory implements ILineBreaksComputerFa
16
16
public static create ( options : IComputedEditorOptions ) : MonospaceLineBreaksComputerFactory {
17
17
return new MonospaceLineBreaksComputerFactory (
18
18
options . get ( EditorOption . wordWrapBreakBeforeCharacters ) ,
19
- options . get ( EditorOption . wordWrapBreakAfterCharacters ) ,
20
- options . get ( EditorOption . wordBreak )
19
+ options . get ( EditorOption . wordWrapBreakAfterCharacters )
21
20
) ;
22
21
}
23
22
24
23
private readonly classifier : WrappingCharacterClassifier ;
25
24
26
- constructor ( breakBeforeChars : string , breakAfterChars : string , wordBreakMode : IEditorOptions [ 'wordBreak' ] ) {
27
- this . classifier = new WrappingCharacterClassifier ( breakBeforeChars , breakAfterChars , wordBreakMode ) ;
25
+ constructor ( breakBeforeChars : string , breakAfterChars : string ) {
26
+ this . classifier = new WrappingCharacterClassifier ( breakBeforeChars , breakAfterChars ) ;
28
27
}
29
28
30
- public createLineBreaksComputer ( fontInfo : FontInfo , tabSize : number , wrappingColumn : number , wrappingIndent : WrappingIndent ) : ILineBreaksComputer {
29
+ public createLineBreaksComputer ( fontInfo : FontInfo , tabSize : number , wrappingColumn : number , wrappingIndent : WrappingIndent , wordBreak : 'normal' | 'keepAll' ) : ILineBreaksComputer {
31
30
const requests : string [ ] = [ ] ;
32
31
const injectedTexts : ( LineInjectedText [ ] | null ) [ ] = [ ] ;
33
32
const previousBreakingData : ( ModelLineProjectionData | null ) [ ] = [ ] ;
@@ -44,9 +43,9 @@ export class MonospaceLineBreaksComputerFactory implements ILineBreaksComputerFa
44
43
const injectedText = injectedTexts [ i ] ;
45
44
const previousLineBreakData = previousBreakingData [ i ] ;
46
45
if ( previousLineBreakData && ! previousLineBreakData . injectionOptions && ! injectedText ) {
47
- result [ i ] = createLineBreaksFromPreviousLineBreaks ( this . classifier , previousLineBreakData , requests [ i ] , tabSize , wrappingColumn , columnsForFullWidthChar , wrappingIndent ) ;
46
+ result [ i ] = createLineBreaksFromPreviousLineBreaks ( this . classifier , previousLineBreakData , requests [ i ] , tabSize , wrappingColumn , columnsForFullWidthChar , wrappingIndent , wordBreak ) ;
48
47
} else {
49
- result [ i ] = createLineBreaks ( this . classifier , requests [ i ] , injectedText , tabSize , wrappingColumn , columnsForFullWidthChar , wrappingIndent ) ;
48
+ result [ i ] = createLineBreaks ( this . classifier , requests [ i ] , injectedText , tabSize , wrappingColumn , columnsForFullWidthChar , wrappingIndent , wordBreak ) ;
50
49
}
51
50
}
52
51
arrPool1 . length = 0 ;
@@ -66,8 +65,7 @@ const enum CharacterClass {
66
65
67
66
class WrappingCharacterClassifier extends CharacterClassifier < CharacterClass > {
68
67
69
- private readonly isKeepAll : boolean ;
70
- constructor ( BREAK_BEFORE : string , BREAK_AFTER : string , wordBreakMode : IEditorOptions [ 'wordBreak' ] ) {
68
+ constructor ( BREAK_BEFORE : string , BREAK_AFTER : string ) {
71
69
super ( CharacterClass . NONE ) ;
72
70
73
71
for ( let i = 0 ; i < BREAK_BEFORE . length ; i ++ ) {
@@ -77,7 +75,6 @@ class WrappingCharacterClassifier extends CharacterClassifier<CharacterClass> {
77
75
for ( let i = 0 ; i < BREAK_AFTER . length ; i ++ ) {
78
76
this . set ( BREAK_AFTER . charCodeAt ( i ) , CharacterClass . BREAK_AFTER ) ;
79
77
}
80
- this . isKeepAll = wordBreakMode === 'keepAll' ;
81
78
}
82
79
83
80
public override get ( charCode : number ) : CharacterClass {
@@ -88,13 +85,10 @@ class WrappingCharacterClassifier extends CharacterClassifier<CharacterClass> {
88
85
// 1. CJK Unified Ideographs (0x4E00 -- 0x9FFF)
89
86
// 2. CJK Unified Ideographs Extension A (0x3400 -- 0x4DBF)
90
87
// 3. Hiragana and Katakana (0x3040 -- 0x30FF)
91
- // Except for the case where wordBreak is set to keepAll
92
88
if (
93
- ! this . isKeepAll && (
94
- ( charCode >= 0x3040 && charCode <= 0x30FF )
95
- || ( charCode >= 0x3400 && charCode <= 0x4DBF )
96
- || ( charCode >= 0x4E00 && charCode <= 0x9FFF )
97
- )
89
+ ( charCode >= 0x3040 && charCode <= 0x30FF )
90
+ || ( charCode >= 0x3400 && charCode <= 0x4DBF )
91
+ || ( charCode >= 0x4E00 && charCode <= 0x9FFF )
98
92
) {
99
93
return CharacterClass . BREAK_IDEOGRAPHIC ;
100
94
}
@@ -107,7 +101,7 @@ class WrappingCharacterClassifier extends CharacterClassifier<CharacterClass> {
107
101
let arrPool1 : number [ ] = [ ] ;
108
102
let arrPool2 : number [ ] = [ ] ;
109
103
110
- function createLineBreaksFromPreviousLineBreaks ( classifier : WrappingCharacterClassifier , previousBreakingData : ModelLineProjectionData , lineText : string , tabSize : number , firstLineBreakColumn : number , columnsForFullWidthChar : number , wrappingIndent : WrappingIndent ) : ModelLineProjectionData | null {
104
+ function createLineBreaksFromPreviousLineBreaks ( classifier : WrappingCharacterClassifier , previousBreakingData : ModelLineProjectionData , lineText : string , tabSize : number , firstLineBreakColumn : number , columnsForFullWidthChar : number , wrappingIndent : WrappingIndent , wordBreak : 'normal' | 'keepAll' ) : ModelLineProjectionData | null {
111
105
if ( firstLineBreakColumn === - 1 ) {
112
106
return null ;
113
107
}
@@ -117,6 +111,8 @@ function createLineBreaksFromPreviousLineBreaks(classifier: WrappingCharacterCla
117
111
return null ;
118
112
}
119
113
114
+ const isKeepAll = ( wordBreak === 'keepAll' ) ;
115
+
120
116
const prevBreakingOffsets = previousBreakingData . breakOffsets ;
121
117
const prevBreakingOffsetsVisibleColumn = previousBreakingData . breakOffsetsVisibleColumn ;
122
118
@@ -182,7 +178,7 @@ function createLineBreaksFromPreviousLineBreaks(classifier: WrappingCharacterCla
182
178
charWidth = computeCharWidth ( charCode , visibleColumn , tabSize , columnsForFullWidthChar ) ;
183
179
}
184
180
185
- if ( charStartOffset > lastBreakingOffset && canBreak ( prevCharCode , prevCharCodeClass , charCode , charCodeClass ) ) {
181
+ if ( charStartOffset > lastBreakingOffset && canBreak ( prevCharCode , prevCharCodeClass , charCode , charCodeClass , isKeepAll ) ) {
186
182
breakOffset = charStartOffset ;
187
183
breakOffsetVisibleColumn = visibleColumn ;
188
184
}
@@ -266,7 +262,7 @@ function createLineBreaksFromPreviousLineBreaks(classifier: WrappingCharacterCla
266
262
break ;
267
263
}
268
264
269
- if ( canBreak ( prevCharCode , prevCharCodeClass , charCode , charCodeClass ) ) {
265
+ if ( canBreak ( prevCharCode , prevCharCodeClass , charCode , charCodeClass , isKeepAll ) ) {
270
266
breakOffset = charStartOffset ;
271
267
breakOffsetVisibleColumn = visibleColumn ;
272
268
break ;
@@ -359,7 +355,7 @@ function createLineBreaksFromPreviousLineBreaks(classifier: WrappingCharacterCla
359
355
return previousBreakingData ;
360
356
}
361
357
362
- function createLineBreaks ( classifier : WrappingCharacterClassifier , _lineText : string , injectedTexts : LineInjectedText [ ] | null , tabSize : number , firstLineBreakColumn : number , columnsForFullWidthChar : number , wrappingIndent : WrappingIndent ) : ModelLineProjectionData | null {
358
+ function createLineBreaks ( classifier : WrappingCharacterClassifier , _lineText : string , injectedTexts : LineInjectedText [ ] | null , tabSize : number , firstLineBreakColumn : number , columnsForFullWidthChar : number , wrappingIndent : WrappingIndent , wordBreak : 'normal' | 'keepAll' ) : ModelLineProjectionData | null {
363
359
const lineText = LineInjectedText . applyInjectedText ( _lineText , injectedTexts ) ;
364
360
365
361
let injectionOptions : InjectedTextOptions [ ] | null ;
@@ -391,6 +387,7 @@ function createLineBreaks(classifier: WrappingCharacterClassifier, _lineText: st
391
387
return new ModelLineProjectionData ( injectionOffsets , injectionOptions , [ lineText . length ] , [ ] , 0 ) ;
392
388
}
393
389
390
+ const isKeepAll = ( wordBreak === 'keepAll' ) ;
394
391
const wrappedTextIndentLength = computeWrappedTextIndentLength ( lineText , tabSize , firstLineBreakColumn , columnsForFullWidthChar , wrappingIndent ) ;
395
392
const wrappedLineBreakColumn = firstLineBreakColumn - wrappedTextIndentLength ;
396
393
@@ -430,7 +427,7 @@ function createLineBreaks(classifier: WrappingCharacterClassifier, _lineText: st
430
427
charWidth = computeCharWidth ( charCode , visibleColumn , tabSize , columnsForFullWidthChar ) ;
431
428
}
432
429
433
- if ( canBreak ( prevCharCode , prevCharCodeClass , charCode , charCodeClass ) ) {
430
+ if ( canBreak ( prevCharCode , prevCharCodeClass , charCode , charCodeClass , isKeepAll ) ) {
434
431
breakOffset = charStartOffset ;
435
432
breakOffsetVisibleColumn = visibleColumn ;
436
433
}
@@ -491,14 +488,14 @@ function tabCharacterWidth(visibleColumn: number, tabSize: number): number {
491
488
* Kinsoku Shori : Don't break after a leading character, like an open bracket
492
489
* Kinsoku Shori : Don't break before a trailing character, like a period
493
490
*/
494
- function canBreak ( prevCharCode : number , prevCharCodeClass : CharacterClass , charCode : number , charCodeClass : CharacterClass ) : boolean {
491
+ function canBreak ( prevCharCode : number , prevCharCodeClass : CharacterClass , charCode : number , charCodeClass : CharacterClass , isKeepAll : boolean ) : boolean {
495
492
return (
496
493
charCode !== CharCode . Space
497
494
&& (
498
495
( prevCharCodeClass === CharacterClass . BREAK_AFTER && charCodeClass !== CharacterClass . BREAK_AFTER ) // break at the end of multiple BREAK_AFTER
499
496
|| ( prevCharCodeClass !== CharacterClass . BREAK_BEFORE && charCodeClass === CharacterClass . BREAK_BEFORE ) // break at the start of multiple BREAK_BEFORE
500
- || ( prevCharCodeClass === CharacterClass . BREAK_IDEOGRAPHIC && charCodeClass !== CharacterClass . BREAK_AFTER )
501
- || ( charCodeClass === CharacterClass . BREAK_IDEOGRAPHIC && prevCharCodeClass !== CharacterClass . BREAK_BEFORE )
497
+ || ( ! isKeepAll && prevCharCodeClass === CharacterClass . BREAK_IDEOGRAPHIC && charCodeClass !== CharacterClass . BREAK_AFTER )
498
+ || ( ! isKeepAll && charCodeClass === CharacterClass . BREAK_IDEOGRAPHIC && prevCharCodeClass !== CharacterClass . BREAK_BEFORE )
502
499
)
503
500
) ;
504
501
}
0 commit comments