UNPKG

monaco-editor-core

Version:
109 lines 6.37 kB
/*--------------------------------------------------------------------------------------------- * 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