@@ -8,66 +8,35 @@ import * as strings from 'vs/base/common/strings';
88import { WrappingIndent } from 'vs/editor/common/editorCommon' ;
99import { PrefixSumComputer } from 'vs/editor/common/viewModel/prefixSumComputer' ;
1010import { ILineMapperFactory , ILineMapping , OutputPosition } from 'vs/editor/common/viewModel/splitLinesCollection' ;
11+ import { CharacterClassifier } from 'vs/editor/common/core/characterClassifier' ;
1112
12- enum CharacterClass {
13+ const enum CharacterClass {
1314 NONE = 0 ,
1415 BREAK_BEFORE = 1 ,
1516 BREAK_AFTER = 2 ,
1617 BREAK_OBTRUSIVE = 3 ,
1718 BREAK_IDEOGRAPHIC = 4 // for Han and Kana.
1819}
1920
20- class CharacterClassifier {
21-
22- /**
23- * Maintain a compact (fully initialized ASCII map for quickly classifying ASCII characters - used more often in code).
24- */
25- private _asciiMap : CharacterClass [ ] ;
26-
27- /**
28- * The entire map (sparse array).
29- */
30- private _map : CharacterClass [ ] ;
21+ class WrappingCharacterClassifier extends CharacterClassifier < CharacterClass > {
3122
3223 constructor ( BREAK_BEFORE :string , BREAK_AFTER :string , BREAK_OBTRUSIVE :string ) {
33-
34- this . _asciiMap = [ ] ;
35- for ( let i = 0 ; i < 256 ; i ++ ) {
36- this . _asciiMap [ i ] = CharacterClass . NONE ;
37- }
38-
39- this . _map = [ ] ;
24+ super ( CharacterClass . NONE ) ;
4025
4126 for ( let i = 0 ; i < BREAK_BEFORE . length ; i ++ ) {
42- this . _set ( BREAK_BEFORE . charCodeAt ( i ) , CharacterClass . BREAK_BEFORE ) ;
27+ this . set ( BREAK_BEFORE . charCodeAt ( i ) , CharacterClass . BREAK_BEFORE ) ;
4328 }
4429
4530 for ( let i = 0 ; i < BREAK_AFTER . length ; i ++ ) {
46- this . _set ( BREAK_AFTER . charCodeAt ( i ) , CharacterClass . BREAK_AFTER ) ;
31+ this . set ( BREAK_AFTER . charCodeAt ( i ) , CharacterClass . BREAK_AFTER ) ;
4732 }
4833
4934 for ( let i = 0 ; i < BREAK_OBTRUSIVE . length ; i ++ ) {
50- this . _set ( BREAK_OBTRUSIVE . charCodeAt ( i ) , CharacterClass . BREAK_OBTRUSIVE ) ;
51- }
52- }
53-
54- private _set ( charCode :number , charClass :CharacterClass ) : void {
55- if ( charCode < 256 ) {
56- this . _asciiMap [ charCode ] = charClass ;
35+ this . set ( BREAK_OBTRUSIVE . charCodeAt ( i ) , CharacterClass . BREAK_OBTRUSIVE ) ;
5736 }
58- this . _map [ charCode ] = charClass ;
5937 }
6038
61- public classify ( charCode :number ) : CharacterClass {
62- if ( charCode < 256 ) {
63- return this . _asciiMap [ charCode ] ;
64- }
65-
66- let charClass = this . _map [ charCode ] ;
67- if ( charClass ) {
68- return charClass ;
69- }
70-
39+ public get ( charCode :number ) : CharacterClass {
7140 // Initialize CharacterClass.BREAK_IDEOGRAPHIC for these Unicode ranges:
7241 // 1. CJK Unified Ideographs (0x4E00 -- 0x9FFF)
7342 // 2. CJK Unified Ideographs Extension A (0x3400 -- 0x4DBF)
@@ -80,16 +49,16 @@ class CharacterClassifier {
8049 return CharacterClass . BREAK_IDEOGRAPHIC ;
8150 }
8251
83- return CharacterClass . NONE ;
52+ return super . get ( charCode ) ;
8453 }
8554}
8655
8756export class CharacterHardWrappingLineMapperFactory implements ILineMapperFactory {
8857
89- private classifier :CharacterClassifier ;
58+ private classifier :WrappingCharacterClassifier ;
9059
9160 constructor ( breakBeforeChars :string , breakAfterChars :string , breakObtrusiveChars :string ) {
92- this . classifier = new CharacterClassifier ( breakBeforeChars , breakAfterChars , breakObtrusiveChars ) ;
61+ this . classifier = new WrappingCharacterClassifier ( breakBeforeChars , breakAfterChars , breakObtrusiveChars ) ;
9362 }
9463
9564 // TODO@Alex -> duplicated in lineCommentCommand
@@ -157,7 +126,7 @@ export class CharacterHardWrappingLineMapperFactory implements ILineMapperFactor
157126
158127 let charCode = lineText . charCodeAt ( i ) ;
159128 let charCodeIsTab = ( charCode === TAB_CHAR_CODE ) ;
160- let charCodeClass = classifier . classify ( charCode ) ;
129+ let charCodeClass = classifier . get ( charCode ) ;
161130
162131 if ( charCodeClass === CharacterClass . BREAK_BEFORE ) {
163132 // This is a character that indicates that a break should happen before it
@@ -170,7 +139,7 @@ export class CharacterHardWrappingLineMapperFactory implements ILineMapperFactor
170139 // CJK breaking : before break
171140 if ( charCodeClass === CharacterClass . BREAK_IDEOGRAPHIC && i > 0 ) {
172141 let prevCode = lineText . charCodeAt ( i - 1 ) ;
173- let prevClass = classifier . classify ( prevCode ) ;
142+ let prevClass = classifier . get ( prevCode ) ;
174143 if ( prevClass !== CharacterClass . BREAK_BEFORE ) { // Kinsoku Shori: Don't break after a leading character, like an open bracket
175144 niceBreakOffset = i ;
176145 niceBreakVisibleColumn = 0 ;
@@ -245,7 +214,7 @@ export class CharacterHardWrappingLineMapperFactory implements ILineMapperFactor
245214 // CJK breaking : after break
246215 if ( charCodeClass === CharacterClass . BREAK_IDEOGRAPHIC && i < len - 1 ) {
247216 let nextCode = lineText . charCodeAt ( i + 1 ) ;
248- let nextClass = classifier . classify ( nextCode ) ;
217+ let nextClass = classifier . get ( nextCode ) ;
249218 if ( nextClass !== CharacterClass . BREAK_AFTER ) { // Kinsoku Shori: Don't break before a trailing character, like a period
250219 niceBreakOffset = i + 1 ;
251220 niceBreakVisibleColumn = wrappedTextIndentVisibleColumn ;
0 commit comments