Allow selection in the a11y tree and sync the selection to terminal

This commit is contained in:
Jason Lin
2023-10-11 16:23:03 +11:00
parent 34017f32fb
commit 1b940de0bf
5 changed files with 239 additions and 53 deletions
+21 -3
View File
@@ -508,16 +508,34 @@ export class BufferLine implements IBufferLine {
}
}
public translateToString(trimRight: boolean = false, startCol: number = 0, endCol: number = this.length): string {
/**
* If outColumns is specified, it will be filled with column numbers such that
* returnedString[i] is display at outColumns[i] column. When a single cell is
* translated to multiple UTF-16 code units (e.g. surrogate pair) in the
* returned string, the corresponding entries in outColumns will have the same
* column number.
*/
public translateToString(trimRight?: boolean, startCol?: number, endCol?: number, outColumns?: number[]): string {
startCol = startCol ?? 0;
endCol = endCol ?? this.length;
if (trimRight) {
endCol = Math.min(endCol, this.getTrimmedLength());
}
if (outColumns) {
outColumns.length = 0;
}
let result = '';
while (startCol < endCol) {
const content = this._data[startCol * CELL_SIZE + Cell.CONTENT];
const cp = content & Content.CODEPOINT_MASK;
result += (content & Content.IS_COMBINED_MASK) ? this._combined[startCol] : (cp) ? stringFromCodePoint(cp) : WHITESPACE_CELL_CHAR;
startCol += (content >> Content.WIDTH_SHIFT) || 1; // always advance by 1
const chars = (content & Content.IS_COMBINED_MASK) ? this._combined[startCol] : (cp) ? stringFromCodePoint(cp) : WHITESPACE_CELL_CHAR;
result += chars;
if (outColumns) {
for (let i = 0; i < chars.length; ++i) {
outColumns.push(startCol);
}
}
startCol += (content >> Content.WIDTH_SHIFT) || 1; // always advance by at least 1
}
return result;
}