monaco-editor-core
Version:
A browser based code editor
109 lines • 6.37 kB
JavaScript
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { Range } from '../../../common/core/range.js';
import * as nls from '../../../../nls.js';
export class SimplePagedScreenReaderStrategy {
_getPageOfLine(lineNumber, linesPerPage) {
return Math.floor((lineNumber - 1) / linesPerPage);
}
_getRangeForPage(page, linesPerPage) {
const offset = page * linesPerPage;
const startLineNumber = offset + 1;
const endLineNumber = offset + linesPerPage;
return new Range(startLineNumber, 1, endLineNumber + 1, 1);
}
fromEditorSelection(model, selection, linesPerPage, trimLongText) {
// Chromium handles very poorly text even of a few thousand chars
// Cut text to avoid stalling the entire UI
const LIMIT_CHARS = 500;
const selectionStartPage = this._getPageOfLine(selection.startLineNumber, linesPerPage);
const selectionStartPageRange = this._getRangeForPage(selectionStartPage, linesPerPage);
const selectionEndPage = this._getPageOfLine(selection.endLineNumber, linesPerPage);
const selectionEndPageRange = this._getRangeForPage(selectionEndPage, linesPerPage);
let pretextRange = selectionStartPageRange.intersectRanges(new Range(1, 1, selection.startLineNumber, selection.startColumn));
if (trimLongText && model.getValueLengthInRange(pretextRange, 1 /* EndOfLinePreference.LF */) > LIMIT_CHARS) {
const pretextStart = model.modifyPosition(pretextRange.getEndPosition(), -LIMIT_CHARS);
pretextRange = Range.fromPositions(pretextStart, pretextRange.getEndPosition());
}
const pretext = model.getValueInRange(pretextRange, 1 /* EndOfLinePreference.LF */);
const lastLine = model.getLineCount();
const lastLineMaxColumn = model.getLineMaxColumn(lastLine);
let posttextRange = selectionEndPageRange.intersectRanges(new Range(selection.endLineNumber, selection.endColumn, lastLine, lastLineMaxColumn));
if (trimLongText && model.getValueLengthInRange(posttextRange, 1 /* EndOfLinePreference.LF */) > LIMIT_CHARS) {
const posttextEnd = model.modifyPosition(posttextRange.getStartPosition(), LIMIT_CHARS);
posttextRange = Range.fromPositions(posttextRange.getStartPosition(), posttextEnd);
}
const posttext = model.getValueInRange(posttextRange, 1 /* EndOfLinePreference.LF */);
let text;
if (selectionStartPage === selectionEndPage || selectionStartPage + 1 === selectionEndPage) {
// take full selection
text = model.getValueInRange(selection, 1 /* EndOfLinePreference.LF */);
}
else {
const selectionRange1 = selectionStartPageRange.intersectRanges(selection);
const selectionRange2 = selectionEndPageRange.intersectRanges(selection);
text = (model.getValueInRange(selectionRange1, 1 /* EndOfLinePreference.LF */)
+ String.fromCharCode(8230)
+ model.getValueInRange(selectionRange2, 1 /* EndOfLinePreference.LF */));
}
if (trimLongText && text.length > 2 * LIMIT_CHARS) {
text = text.substring(0, LIMIT_CHARS) + String.fromCharCode(8230) + text.substring(text.length - LIMIT_CHARS, text.length);
}
let selectionStart;
let selectionEnd;
if (selection.getDirection() === 0 /* SelectionDirection.LTR */) {
selectionStart = pretext.length;
selectionEnd = pretext.length + text.length;
}
else {
selectionEnd = pretext.length;
selectionStart = pretext.length + text.length;
}
return {
value: pretext + text + posttext,
selection: selection,
selectionStart,
selectionEnd,
startPositionWithinEditor: pretextRange.getStartPosition(),
newlineCountBeforeSelection: pretextRange.endLineNumber - pretextRange.startLineNumber,
};
}
}
export function ariaLabelForScreenReaderContent(options, keybindingService) {
const accessibilitySupport = options.get(2 /* EditorOption.accessibilitySupport */);
if (accessibilitySupport === 1 /* AccessibilitySupport.Disabled */) {
const toggleKeybindingLabel = keybindingService.lookupKeybinding('editor.action.toggleScreenReaderAccessibilityMode')?.getAriaLabel();
const runCommandKeybindingLabel = keybindingService.lookupKeybinding('workbench.action.showCommands')?.getAriaLabel();
const keybindingEditorKeybindingLabel = keybindingService.lookupKeybinding('workbench.action.openGlobalKeybindings')?.getAriaLabel();
const editorNotAccessibleMessage = nls.localize(61, "The editor is not accessible at this time.");
if (toggleKeybindingLabel) {
return nls.localize(62, "{0} To enable screen reader optimized mode, use {1}", editorNotAccessibleMessage, toggleKeybindingLabel);
}
else if (runCommandKeybindingLabel) {
return nls.localize(63, "{0} To enable screen reader optimized mode, open the quick pick with {1} and run the command Toggle Screen Reader Accessibility Mode, which is currently not triggerable via keyboard.", editorNotAccessibleMessage, runCommandKeybindingLabel);
}
else if (keybindingEditorKeybindingLabel) {
return nls.localize(64, "{0} Please assign a keybinding for the command Toggle Screen Reader Accessibility Mode by accessing the keybindings editor with {1} and run it.", editorNotAccessibleMessage, keybindingEditorKeybindingLabel);
}
else {
// SOS
return editorNotAccessibleMessage;
}
}
return options.get(8 /* EditorOption.ariaLabel */);
}
export function newlinecount(text) {
let result = 0;
let startIndex = -1;
do {
startIndex = text.indexOf('\n', startIndex + 1);
if (startIndex === -1) {
break;
}
result++;
} while (true);
return result;
}
//# sourceMappingURL=screenReaderUtils.js.map