20
);
21
}
23
>
private readonly classifier: WrappingCharacterClassifier;
24
>
25
>
constructor(breakBeforeChars: string, breakAfterChars: string) {
26
>
this.classifier = new WrappingCharacterClassifier(breakBeforeChars, breakAfterChars);
27
>
}
28
>
29
>
public createLineBreaksComputer(context: ILineBreaksComputerContext, fontInfo: FontInfo, tabSize: number, wrappingColumn: number, wrappingIndent: WrappingIndent, wordBreak: 'normal' | 'keepAll', wrapOnEscapedLineFeeds: boolean): ILineBreaksComputer {
30
>
const lineNumbers: number[] = [];
31
>
const previousBreakingData: (ModelLineProjectionData | null)[] = [];
32
>
return {
33
>
addRequest: (lineNumber: number, previousLineBreakData: ModelLineProjectionData | null) => {
34
>
lineNumbers.push(lineNumber);
35
>
previousBreakingData.push(previousLineBreakData);
36
>
},
37
>
finalize: () => {
38
>
const columnsForFullWidthChar = fontInfo.typicalFullwidthCharacterWidth / fontInfo.typicalHalfwidthCharacterWidth;
39
>
const result: (ModelLineProjectionData | null)[] = [];
40
>
for (let i = 0, len = lineNumbers.length; i < len; i++) {
41
>
const lineNumber = lineNumbers[i];
42
>
const injectedText = context.getLineInjectedText(lineNumber);
43
>
const lineText = context.getLineContent(lineNumber);
44
>
const previousLineBreakData = previousBreakingData[i];
45
>
const isLineFeedWrappingEnabled = wrapOnEscapedLineFeeds && lineText.includes('"') && lineText.includes('\\n');
46
>
if (previousLineBreakData && !previousLineBreakData.injectionOptions && !injectedText && !isLineFeedWrappingEnabled) {
47
result[i] = createLineBreaksFromPreviousLineBreaks(this.classifier, previousLineBreakData, lineText, tabSize, wrappingColumn, columnsForFullWidthChar, wrappingIndent, wordBreak);
49
>
result[i] = createLineBreaks(this.classifier, lineText, injectedText, tabSize, wrappingColumn, columnsForFullWidthChar, wrappingIndent, wordBreak, isLineFeedWrappingEnabled);
50
>
}
51
>
}
52
>
arrPool1.length = 0;
53
>
arrPool2.length = 0;
54
>
return result;
55
>
}
56
>
};
57
>
}
58
>
}
59
>
60
>
const enum CharacterClass {
61
>
NONE = 0,
62
>
BREAK_BEFORE = 1,
63
>
BREAK_AFTER = 2,
64
>
BREAK_IDEOGRAPHIC = 3 // for Han and Kana.
65
>
}
66
>
67
>
class WrappingCharacterClassifier extends CharacterClassifier<CharacterClass> {
68
>
69
>
constructor(BREAK_BEFORE: string, BREAK_AFTER: string) {
70
>
super(CharacterClass.NONE);
71
>
72
>
for (let i = 0; i < BREAK_BEFORE.length; i++) {
73
this.set(BREAK_BEFORE.charCodeAt(i), CharacterClass.BREAK_BEFORE);
74
}
76
>
for (let i = 0; i < BREAK_AFTER.length; i++) {
77
>
this.set(BREAK_AFTER.charCodeAt(i), CharacterClass.BREAK_AFTER);
78
>
}
79
>
}
80
>
81
>
public override get(charCode: number): CharacterClass {
82
>
if (charCode >= 0 && charCode < 256) {
83
return <CharacterClass>this._asciiMap[charCode];
85
// Initialize CharacterClass.BREAK_IDEOGRAPHIC for these Unicode ranges:
86
// 1. CJK Unified Ideographs (0x4E00 -- 0x9FFF)