提交 dabbf52a 编写于 作者: A Alex Dima

Adopt CharacterClassifier in CharacterHardWrappingLineMapping

上级 841ef459
...@@ -209,9 +209,8 @@ function renderLineActual(lineText: string, lineTextLength: number, tabSize: num ...@@ -209,9 +209,8 @@ function renderLineActual(lineText: string, lineTextLength: number, tabSize: num
break; break;
default: default:
let characterCode = lineText.charCodeAt(charIndex); if (renderControlCharacters && isControlCharacter(charCode)) {
if (renderControlCharacters && isControlCharacter(characterCode)) { out += controlCharacterToPrintable(charCode);
out += controlCharacterToPrintable(characterCode);
} else { } else {
out += lineText.charAt(charIndex); out += lineText.charAt(charIndex);
} }
......
...@@ -8,8 +8,9 @@ import * as strings from 'vs/base/common/strings'; ...@@ -8,8 +8,9 @@ import * as strings from 'vs/base/common/strings';
import {WrappingIndent} from 'vs/editor/common/editorCommon'; import {WrappingIndent} from 'vs/editor/common/editorCommon';
import {PrefixSumComputer} from 'vs/editor/common/viewModel/prefixSumComputer'; import {PrefixSumComputer} from 'vs/editor/common/viewModel/prefixSumComputer';
import {ILineMapperFactory, ILineMapping, OutputPosition} from 'vs/editor/common/viewModel/splitLinesCollection'; import {ILineMapperFactory, ILineMapping, OutputPosition} from 'vs/editor/common/viewModel/splitLinesCollection';
import {CharacterClassifier} from 'vs/editor/common/core/characterClassifier';
enum CharacterClass { const enum CharacterClass {
NONE = 0, NONE = 0,
BREAK_BEFORE = 1, BREAK_BEFORE = 1,
BREAK_AFTER = 2, BREAK_AFTER = 2,
...@@ -17,57 +18,25 @@ enum CharacterClass { ...@@ -17,57 +18,25 @@ enum CharacterClass {
BREAK_IDEOGRAPHIC = 4 // for Han and Kana. BREAK_IDEOGRAPHIC = 4 // for Han and Kana.
} }
class CharacterClassifier { class WrappingCharacterClassifier extends CharacterClassifier<CharacterClass> {
/**
* Maintain a compact (fully initialized ASCII map for quickly classifying ASCII characters - used more often in code).
*/
private _asciiMap: CharacterClass[];
/**
* The entire map (sparse array).
*/
private _map: CharacterClass[];
constructor(BREAK_BEFORE:string, BREAK_AFTER:string, BREAK_OBTRUSIVE:string) { constructor(BREAK_BEFORE:string, BREAK_AFTER:string, BREAK_OBTRUSIVE:string) {
super(CharacterClass.NONE);
this._asciiMap = [];
for (let i = 0; i < 256; i++) {
this._asciiMap[i] = CharacterClass.NONE;
}
this._map = [];
for (let i = 0; i < BREAK_BEFORE.length; i++) { for (let i = 0; i < BREAK_BEFORE.length; i++) {
this._set(BREAK_BEFORE.charCodeAt(i), CharacterClass.BREAK_BEFORE); this.set(BREAK_BEFORE.charCodeAt(i), CharacterClass.BREAK_BEFORE);
} }
for (let i = 0; i < BREAK_AFTER.length; i++) { for (let i = 0; i < BREAK_AFTER.length; i++) {
this._set(BREAK_AFTER.charCodeAt(i), CharacterClass.BREAK_AFTER); this.set(BREAK_AFTER.charCodeAt(i), CharacterClass.BREAK_AFTER);
} }
for (let i = 0; i < BREAK_OBTRUSIVE.length; i++) { for (let i = 0; i < BREAK_OBTRUSIVE.length; i++) {
this._set(BREAK_OBTRUSIVE.charCodeAt(i), CharacterClass.BREAK_OBTRUSIVE); this.set(BREAK_OBTRUSIVE.charCodeAt(i), CharacterClass.BREAK_OBTRUSIVE);
}
}
private _set(charCode:number, charClass:CharacterClass): void {
if (charCode < 256) {
this._asciiMap[charCode] = charClass;
} }
this._map[charCode] = charClass;
} }
public classify(charCode:number): CharacterClass { public get(charCode:number): CharacterClass {
if (charCode < 256) {
return this._asciiMap[charCode];
}
let charClass = this._map[charCode];
if (charClass) {
return charClass;
}
// Initialize CharacterClass.BREAK_IDEOGRAPHIC for these Unicode ranges: // Initialize CharacterClass.BREAK_IDEOGRAPHIC for these Unicode ranges:
// 1. CJK Unified Ideographs (0x4E00 -- 0x9FFF) // 1. CJK Unified Ideographs (0x4E00 -- 0x9FFF)
// 2. CJK Unified Ideographs Extension A (0x3400 -- 0x4DBF) // 2. CJK Unified Ideographs Extension A (0x3400 -- 0x4DBF)
...@@ -80,16 +49,16 @@ class CharacterClassifier { ...@@ -80,16 +49,16 @@ class CharacterClassifier {
return CharacterClass.BREAK_IDEOGRAPHIC; return CharacterClass.BREAK_IDEOGRAPHIC;
} }
return CharacterClass.NONE; return super.get(charCode);
} }
} }
export class CharacterHardWrappingLineMapperFactory implements ILineMapperFactory { export class CharacterHardWrappingLineMapperFactory implements ILineMapperFactory {
private classifier:CharacterClassifier; private classifier:WrappingCharacterClassifier;
constructor(breakBeforeChars:string, breakAfterChars:string, breakObtrusiveChars:string) { constructor(breakBeforeChars:string, breakAfterChars:string, breakObtrusiveChars:string) {
this.classifier = new CharacterClassifier(breakBeforeChars, breakAfterChars, breakObtrusiveChars); this.classifier = new WrappingCharacterClassifier(breakBeforeChars, breakAfterChars, breakObtrusiveChars);
} }
// TODO@Alex -> duplicated in lineCommentCommand // TODO@Alex -> duplicated in lineCommentCommand
...@@ -157,7 +126,7 @@ export class CharacterHardWrappingLineMapperFactory implements ILineMapperFactor ...@@ -157,7 +126,7 @@ export class CharacterHardWrappingLineMapperFactory implements ILineMapperFactor
let charCode = lineText.charCodeAt(i); let charCode = lineText.charCodeAt(i);
let charCodeIsTab = (charCode === TAB_CHAR_CODE); let charCodeIsTab = (charCode === TAB_CHAR_CODE);
let charCodeClass = classifier.classify(charCode); let charCodeClass = classifier.get(charCode);
if (charCodeClass === CharacterClass.BREAK_BEFORE) { if (charCodeClass === CharacterClass.BREAK_BEFORE) {
// This is a character that indicates that a break should happen before it // This is a character that indicates that a break should happen before it
...@@ -170,7 +139,7 @@ export class CharacterHardWrappingLineMapperFactory implements ILineMapperFactor ...@@ -170,7 +139,7 @@ export class CharacterHardWrappingLineMapperFactory implements ILineMapperFactor
// CJK breaking : before break // CJK breaking : before break
if (charCodeClass === CharacterClass.BREAK_IDEOGRAPHIC && i > 0) { if (charCodeClass === CharacterClass.BREAK_IDEOGRAPHIC && i > 0) {
let prevCode = lineText.charCodeAt(i - 1); let prevCode = lineText.charCodeAt(i - 1);
let prevClass = classifier.classify(prevCode); let prevClass = classifier.get(prevCode);
if (prevClass !== CharacterClass.BREAK_BEFORE) { // Kinsoku Shori: Don't break after a leading character, like an open bracket if (prevClass !== CharacterClass.BREAK_BEFORE) { // Kinsoku Shori: Don't break after a leading character, like an open bracket
niceBreakOffset = i; niceBreakOffset = i;
niceBreakVisibleColumn = 0; niceBreakVisibleColumn = 0;
...@@ -245,7 +214,7 @@ export class CharacterHardWrappingLineMapperFactory implements ILineMapperFactor ...@@ -245,7 +214,7 @@ export class CharacterHardWrappingLineMapperFactory implements ILineMapperFactor
// CJK breaking : after break // CJK breaking : after break
if (charCodeClass === CharacterClass.BREAK_IDEOGRAPHIC && i < len - 1) { if (charCodeClass === CharacterClass.BREAK_IDEOGRAPHIC && i < len - 1) {
let nextCode = lineText.charCodeAt(i + 1); let nextCode = lineText.charCodeAt(i + 1);
let nextClass = classifier.classify(nextCode); let nextClass = classifier.get(nextCode);
if (nextClass !== CharacterClass.BREAK_AFTER) { // Kinsoku Shori: Don't break before a trailing character, like a period if (nextClass !== CharacterClass.BREAK_AFTER) { // Kinsoku Shori: Don't break before a trailing character, like a period
niceBreakOffset = i + 1; niceBreakOffset = i + 1;
niceBreakVisibleColumn = wrappedTextIndentVisibleColumn; niceBreakVisibleColumn = wrappedTextIndentVisibleColumn;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册