@@ -26,7 +26,7 @@ export class MonospaceLineBreaksComputerFactory implements ILineBreaksComputerFa
26
26
this . classifier = new WrappingCharacterClassifier ( breakBeforeChars , breakAfterChars ) ;
27
27
}
28
28
29
- 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 {
30
30
const requests : string [ ] = [ ] ;
31
31
const injectedTexts : ( LineInjectedText [ ] | null ) [ ] = [ ] ;
32
32
const previousBreakingData : ( ModelLineProjectionData | null ) [ ] = [ ] ;
@@ -43,9 +43,9 @@ export class MonospaceLineBreaksComputerFactory implements ILineBreaksComputerFa
43
43
const injectedText = injectedTexts [ i ] ;
44
44
const previousLineBreakData = previousBreakingData [ i ] ;
45
45
if ( previousLineBreakData && ! previousLineBreakData . injectionOptions && ! injectedText ) {
46
- 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 ) ;
47
47
} else {
48
- 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 ) ;
49
49
}
50
50
}
51
51
arrPool1 . length = 0 ;
@@ -101,7 +101,7 @@ class WrappingCharacterClassifier extends CharacterClassifier<CharacterClass> {
101
101
let arrPool1 : number [ ] = [ ] ;
102
102
let arrPool2 : number [ ] = [ ] ;
103
103
104
- 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 {
105
105
if ( firstLineBreakColumn === - 1 ) {
106
106
return null ;
107
107
}
@@ -111,6 +111,8 @@ function createLineBreaksFromPreviousLineBreaks(classifier: WrappingCharacterCla
111
111
return null ;
112
112
}
113
113
114
+ const isKeepAll = ( wordBreak === 'keepAll' ) ;
115
+
114
116
const prevBreakingOffsets = previousBreakingData . breakOffsets ;
115
117
const prevBreakingOffsetsVisibleColumn = previousBreakingData . breakOffsetsVisibleColumn ;
116
118
@@ -176,7 +178,7 @@ function createLineBreaksFromPreviousLineBreaks(classifier: WrappingCharacterCla
176
178
charWidth = computeCharWidth ( charCode , visibleColumn , tabSize , columnsForFullWidthChar ) ;
177
179
}
178
180
179
- if ( charStartOffset > lastBreakingOffset && canBreak ( prevCharCode , prevCharCodeClass , charCode , charCodeClass ) ) {
181
+ if ( charStartOffset > lastBreakingOffset && canBreak ( prevCharCode , prevCharCodeClass , charCode , charCodeClass , isKeepAll ) ) {
180
182
breakOffset = charStartOffset ;
181
183
breakOffsetVisibleColumn = visibleColumn ;
182
184
}
@@ -260,7 +262,7 @@ function createLineBreaksFromPreviousLineBreaks(classifier: WrappingCharacterCla
260
262
break ;
261
263
}
262
264
263
- if ( canBreak ( prevCharCode , prevCharCodeClass , charCode , charCodeClass ) ) {
265
+ if ( canBreak ( prevCharCode , prevCharCodeClass , charCode , charCodeClass , isKeepAll ) ) {
264
266
breakOffset = charStartOffset ;
265
267
breakOffsetVisibleColumn = visibleColumn ;
266
268
break ;
@@ -353,7 +355,7 @@ function createLineBreaksFromPreviousLineBreaks(classifier: WrappingCharacterCla
353
355
return previousBreakingData ;
354
356
}
355
357
356
- 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 {
357
359
const lineText = LineInjectedText . applyInjectedText ( _lineText , injectedTexts ) ;
358
360
359
361
let injectionOptions : InjectedTextOptions [ ] | null ;
@@ -385,6 +387,7 @@ function createLineBreaks(classifier: WrappingCharacterClassifier, _lineText: st
385
387
return new ModelLineProjectionData ( injectionOffsets , injectionOptions , [ lineText . length ] , [ ] , 0 ) ;
386
388
}
387
389
390
+ const isKeepAll = ( wordBreak === 'keepAll' ) ;
388
391
const wrappedTextIndentLength = computeWrappedTextIndentLength ( lineText , tabSize , firstLineBreakColumn , columnsForFullWidthChar , wrappingIndent ) ;
389
392
const wrappedLineBreakColumn = firstLineBreakColumn - wrappedTextIndentLength ;
390
393
@@ -424,7 +427,7 @@ function createLineBreaks(classifier: WrappingCharacterClassifier, _lineText: st
424
427
charWidth = computeCharWidth ( charCode , visibleColumn , tabSize , columnsForFullWidthChar ) ;
425
428
}
426
429
427
- if ( canBreak ( prevCharCode , prevCharCodeClass , charCode , charCodeClass ) ) {
430
+ if ( canBreak ( prevCharCode , prevCharCodeClass , charCode , charCodeClass , isKeepAll ) ) {
428
431
breakOffset = charStartOffset ;
429
432
breakOffsetVisibleColumn = visibleColumn ;
430
433
}
@@ -485,14 +488,14 @@ function tabCharacterWidth(visibleColumn: number, tabSize: number): number {
485
488
* Kinsoku Shori : Don't break after a leading character, like an open bracket
486
489
* Kinsoku Shori : Don't break before a trailing character, like a period
487
490
*/
488
- 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 {
489
492
return (
490
493
charCode !== CharCode . Space
491
494
&& (
492
495
( prevCharCodeClass === CharacterClass . BREAK_AFTER && charCodeClass !== CharacterClass . BREAK_AFTER ) // break at the end of multiple BREAK_AFTER
493
496
|| ( prevCharCodeClass !== CharacterClass . BREAK_BEFORE && charCodeClass === CharacterClass . BREAK_BEFORE ) // break at the start of multiple BREAK_BEFORE
494
- || ( prevCharCodeClass === CharacterClass . BREAK_IDEOGRAPHIC && charCodeClass !== CharacterClass . BREAK_AFTER )
495
- || ( 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 )
496
499
)
497
500
) ;
498
501
}
0 commit comments