monaco-editor
Version:
A browser based code editor
996 lines (995 loc) • 67.3 kB
JavaScript
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
import * as nls from '../../../nls.js';
import * as arrays from '../../../base/common/arrays.js';
import * as objects from '../../../base/common/objects.js';
import * as platform from '../../../base/common/platform.js';
import { USUAL_WORD_SEPARATORS } from '../model/wordHelper.js';
/**
* @internal
*/
export function blinkingStyleToString(blinkingStyle) {
if (blinkingStyle === 1 /* Blink */) {
return 'blink';
}
else if (blinkingStyle === 4 /* Expand */) {
return 'expand';
}
else if (blinkingStyle === 3 /* Phase */) {
return 'phase';
}
else if (blinkingStyle === 2 /* Smooth */) {
return 'smooth';
}
else if (blinkingStyle === 5 /* Solid */) {
return 'solid';
}
else {
throw new Error('blinkingStyleToString: Unknown blinkingStyle');
}
}
/**
* The style in which the editor's cursor should be rendered.
*/
export var TextEditorCursorStyle;
(function (TextEditorCursorStyle) {
/**
* As a vertical line (sitting between two characters).
*/
TextEditorCursorStyle[TextEditorCursorStyle["Line"] = 1] = "Line";
/**
* As a block (sitting on top of a character).
*/
TextEditorCursorStyle[TextEditorCursorStyle["Block"] = 2] = "Block";
/**
* As a horizontal line (sitting under a character).
*/
TextEditorCursorStyle[TextEditorCursorStyle["Underline"] = 3] = "Underline";
/**
* As a thin vertical line (sitting between two characters).
*/
TextEditorCursorStyle[TextEditorCursorStyle["LineThin"] = 4] = "LineThin";
/**
* As an outlined block (sitting on top of a character).
*/
TextEditorCursorStyle[TextEditorCursorStyle["BlockOutline"] = 5] = "BlockOutline";
/**
* As a thin horizontal line (sitting under a character).
*/
TextEditorCursorStyle[TextEditorCursorStyle["UnderlineThin"] = 6] = "UnderlineThin";
})(TextEditorCursorStyle || (TextEditorCursorStyle = {}));
/**
* @internal
*/
export function cursorStyleToString(cursorStyle) {
if (cursorStyle === TextEditorCursorStyle.Line) {
return 'line';
}
else if (cursorStyle === TextEditorCursorStyle.Block) {
return 'block';
}
else if (cursorStyle === TextEditorCursorStyle.Underline) {
return 'underline';
}
else if (cursorStyle === TextEditorCursorStyle.LineThin) {
return 'line-thin';
}
else if (cursorStyle === TextEditorCursorStyle.BlockOutline) {
return 'block-outline';
}
else if (cursorStyle === TextEditorCursorStyle.UnderlineThin) {
return 'underline-thin';
}
else {
throw new Error('cursorStyleToString: Unknown cursorStyle');
}
}
function _cursorStyleFromString(cursorStyle, defaultValue) {
if (typeof cursorStyle !== 'string') {
return defaultValue;
}
if (cursorStyle === 'line') {
return TextEditorCursorStyle.Line;
}
else if (cursorStyle === 'block') {
return TextEditorCursorStyle.Block;
}
else if (cursorStyle === 'underline') {
return TextEditorCursorStyle.Underline;
}
else if (cursorStyle === 'line-thin') {
return TextEditorCursorStyle.LineThin;
}
else if (cursorStyle === 'block-outline') {
return TextEditorCursorStyle.BlockOutline;
}
else if (cursorStyle === 'underline-thin') {
return TextEditorCursorStyle.UnderlineThin;
}
return TextEditorCursorStyle.Line;
}
/**
* Internal configuration options (transformed or computed) for the editor.
*/
var InternalEditorOptions = /** @class */ (function () {
/**
* @internal
*/
function InternalEditorOptions(source) {
this.canUseLayerHinting = source.canUseLayerHinting;
this.pixelRatio = source.pixelRatio;
this.editorClassName = source.editorClassName;
this.lineHeight = source.lineHeight | 0;
this.readOnly = source.readOnly;
this.accessibilitySupport = source.accessibilitySupport;
this.multiCursorModifier = source.multiCursorModifier;
this.multiCursorMergeOverlapping = source.multiCursorMergeOverlapping;
this.wordSeparators = source.wordSeparators;
this.autoClosingBrackets = source.autoClosingBrackets;
this.autoClosingQuotes = source.autoClosingQuotes;
this.autoSurround = source.autoSurround;
this.autoIndent = source.autoIndent;
this.useTabStops = source.useTabStops;
this.tabFocusMode = source.tabFocusMode;
this.dragAndDrop = source.dragAndDrop;
this.emptySelectionClipboard = source.emptySelectionClipboard;
this.copyWithSyntaxHighlighting = source.copyWithSyntaxHighlighting;
this.layoutInfo = source.layoutInfo;
this.fontInfo = source.fontInfo;
this.viewInfo = source.viewInfo;
this.wrappingInfo = source.wrappingInfo;
this.contribInfo = source.contribInfo;
this.showUnused = source.showUnused;
}
/**
* @internal
*/
InternalEditorOptions.prototype.equals = function (other) {
return (this.canUseLayerHinting === other.canUseLayerHinting
&& this.pixelRatio === other.pixelRatio
&& this.editorClassName === other.editorClassName
&& this.lineHeight === other.lineHeight
&& this.readOnly === other.readOnly
&& this.accessibilitySupport === other.accessibilitySupport
&& this.multiCursorModifier === other.multiCursorModifier
&& this.multiCursorMergeOverlapping === other.multiCursorMergeOverlapping
&& this.wordSeparators === other.wordSeparators
&& this.autoClosingBrackets === other.autoClosingBrackets
&& this.autoClosingQuotes === other.autoClosingQuotes
&& this.autoSurround === other.autoSurround
&& this.autoIndent === other.autoIndent
&& this.useTabStops === other.useTabStops
&& this.tabFocusMode === other.tabFocusMode
&& this.dragAndDrop === other.dragAndDrop
&& this.showUnused === other.showUnused
&& this.emptySelectionClipboard === other.emptySelectionClipboard
&& this.copyWithSyntaxHighlighting === other.copyWithSyntaxHighlighting
&& InternalEditorOptions._equalsLayoutInfo(this.layoutInfo, other.layoutInfo)
&& this.fontInfo.equals(other.fontInfo)
&& InternalEditorOptions._equalsViewOptions(this.viewInfo, other.viewInfo)
&& InternalEditorOptions._equalsWrappingInfo(this.wrappingInfo, other.wrappingInfo)
&& InternalEditorOptions._equalsContribOptions(this.contribInfo, other.contribInfo));
};
/**
* @internal
*/
InternalEditorOptions.prototype.createChangeEvent = function (newOpts) {
return {
canUseLayerHinting: (this.canUseLayerHinting !== newOpts.canUseLayerHinting),
pixelRatio: (this.pixelRatio !== newOpts.pixelRatio),
editorClassName: (this.editorClassName !== newOpts.editorClassName),
lineHeight: (this.lineHeight !== newOpts.lineHeight),
readOnly: (this.readOnly !== newOpts.readOnly),
accessibilitySupport: (this.accessibilitySupport !== newOpts.accessibilitySupport),
multiCursorModifier: (this.multiCursorModifier !== newOpts.multiCursorModifier),
multiCursorMergeOverlapping: (this.multiCursorMergeOverlapping !== newOpts.multiCursorMergeOverlapping),
wordSeparators: (this.wordSeparators !== newOpts.wordSeparators),
autoClosingBrackets: (this.autoClosingBrackets !== newOpts.autoClosingBrackets),
autoClosingQuotes: (this.autoClosingQuotes !== newOpts.autoClosingQuotes),
autoSurround: (this.autoSurround !== newOpts.autoSurround),
autoIndent: (this.autoIndent !== newOpts.autoIndent),
useTabStops: (this.useTabStops !== newOpts.useTabStops),
tabFocusMode: (this.tabFocusMode !== newOpts.tabFocusMode),
dragAndDrop: (this.dragAndDrop !== newOpts.dragAndDrop),
emptySelectionClipboard: (this.emptySelectionClipboard !== newOpts.emptySelectionClipboard),
copyWithSyntaxHighlighting: (this.copyWithSyntaxHighlighting !== newOpts.copyWithSyntaxHighlighting),
layoutInfo: (!InternalEditorOptions._equalsLayoutInfo(this.layoutInfo, newOpts.layoutInfo)),
fontInfo: (!this.fontInfo.equals(newOpts.fontInfo)),
viewInfo: (!InternalEditorOptions._equalsViewOptions(this.viewInfo, newOpts.viewInfo)),
wrappingInfo: (!InternalEditorOptions._equalsWrappingInfo(this.wrappingInfo, newOpts.wrappingInfo)),
contribInfo: (!InternalEditorOptions._equalsContribOptions(this.contribInfo, newOpts.contribInfo))
};
};
/**
* @internal
*/
InternalEditorOptions._equalsLayoutInfo = function (a, b) {
return (a.width === b.width
&& a.height === b.height
&& a.glyphMarginLeft === b.glyphMarginLeft
&& a.glyphMarginWidth === b.glyphMarginWidth
&& a.glyphMarginHeight === b.glyphMarginHeight
&& a.lineNumbersLeft === b.lineNumbersLeft
&& a.lineNumbersWidth === b.lineNumbersWidth
&& a.lineNumbersHeight === b.lineNumbersHeight
&& a.decorationsLeft === b.decorationsLeft
&& a.decorationsWidth === b.decorationsWidth
&& a.decorationsHeight === b.decorationsHeight
&& a.contentLeft === b.contentLeft
&& a.contentWidth === b.contentWidth
&& a.contentHeight === b.contentHeight
&& a.renderMinimap === b.renderMinimap
&& a.minimapLeft === b.minimapLeft
&& a.minimapWidth === b.minimapWidth
&& a.viewportColumn === b.viewportColumn
&& a.verticalScrollbarWidth === b.verticalScrollbarWidth
&& a.horizontalScrollbarHeight === b.horizontalScrollbarHeight
&& this._equalsOverviewRuler(a.overviewRuler, b.overviewRuler));
};
/**
* @internal
*/
InternalEditorOptions._equalsOverviewRuler = function (a, b) {
return (a.width === b.width
&& a.height === b.height
&& a.top === b.top
&& a.right === b.right);
};
/**
* @internal
*/
InternalEditorOptions._equalsViewOptions = function (a, b) {
return (a.extraEditorClassName === b.extraEditorClassName
&& a.disableMonospaceOptimizations === b.disableMonospaceOptimizations
&& arrays.equals(a.rulers, b.rulers)
&& a.ariaLabel === b.ariaLabel
&& a.renderLineNumbers === b.renderLineNumbers
&& a.renderCustomLineNumbers === b.renderCustomLineNumbers
&& a.selectOnLineNumbers === b.selectOnLineNumbers
&& a.glyphMargin === b.glyphMargin
&& a.revealHorizontalRightPadding === b.revealHorizontalRightPadding
&& a.roundedSelection === b.roundedSelection
&& a.overviewRulerLanes === b.overviewRulerLanes
&& a.overviewRulerBorder === b.overviewRulerBorder
&& a.cursorBlinking === b.cursorBlinking
&& a.mouseWheelZoom === b.mouseWheelZoom
&& a.cursorStyle === b.cursorStyle
&& a.cursorWidth === b.cursorWidth
&& a.hideCursorInOverviewRuler === b.hideCursorInOverviewRuler
&& a.scrollBeyondLastLine === b.scrollBeyondLastLine
&& a.scrollBeyondLastColumn === b.scrollBeyondLastColumn
&& a.smoothScrolling === b.smoothScrolling
&& a.stopRenderingLineAfter === b.stopRenderingLineAfter
&& a.renderWhitespace === b.renderWhitespace
&& a.renderControlCharacters === b.renderControlCharacters
&& a.fontLigatures === b.fontLigatures
&& a.renderIndentGuides === b.renderIndentGuides
&& a.highlightActiveIndentGuide === b.highlightActiveIndentGuide
&& a.renderLineHighlight === b.renderLineHighlight
&& this._equalsScrollbarOptions(a.scrollbar, b.scrollbar)
&& this._equalsMinimapOptions(a.minimap, b.minimap)
&& a.fixedOverflowWidgets === b.fixedOverflowWidgets);
};
/**
* @internal
*/
InternalEditorOptions._equalsScrollbarOptions = function (a, b) {
return (a.arrowSize === b.arrowSize
&& a.vertical === b.vertical
&& a.horizontal === b.horizontal
&& a.useShadows === b.useShadows
&& a.verticalHasArrows === b.verticalHasArrows
&& a.horizontalHasArrows === b.horizontalHasArrows
&& a.handleMouseWheel === b.handleMouseWheel
&& a.horizontalScrollbarSize === b.horizontalScrollbarSize
&& a.horizontalSliderSize === b.horizontalSliderSize
&& a.verticalScrollbarSize === b.verticalScrollbarSize
&& a.verticalSliderSize === b.verticalSliderSize
&& a.mouseWheelScrollSensitivity === b.mouseWheelScrollSensitivity);
};
/**
* @internal
*/
InternalEditorOptions._equalsMinimapOptions = function (a, b) {
return (a.enabled === b.enabled
&& a.side === b.side
&& a.showSlider === b.showSlider
&& a.renderCharacters === b.renderCharacters
&& a.maxColumn === b.maxColumn);
};
/**
* @internal
*/
InternalEditorOptions._equalFindOptions = function (a, b) {
return (a.seedSearchStringFromSelection === b.seedSearchStringFromSelection
&& a.autoFindInSelection === b.autoFindInSelection
&& a.globalFindClipboard === b.globalFindClipboard);
};
/**
* @internal
*/
InternalEditorOptions._equalsParameterHintOptions = function (a, b) {
return (a.enabled === b.enabled
&& a.cycle === b.cycle);
};
/**
* @internal
*/
InternalEditorOptions._equalsHoverOptions = function (a, b) {
return (a.enabled === b.enabled
&& a.delay === b.delay
&& a.sticky === b.sticky);
};
/**
* @internal
*/
InternalEditorOptions._equalsSuggestOptions = function (a, b) {
if (a === b) {
return true;
}
else if (!a || !b) {
return false;
}
else {
return a.filterGraceful === b.filterGraceful
&& a.snippets === b.snippets
&& a.snippetsPreventQuickSuggestions === b.snippetsPreventQuickSuggestions
&& a.localityBonus === b.localityBonus;
}
};
/**
* @internal
*/
InternalEditorOptions._equalsWrappingInfo = function (a, b) {
return (a.inDiffEditor === b.inDiffEditor
&& a.isDominatedByLongLines === b.isDominatedByLongLines
&& a.isWordWrapMinified === b.isWordWrapMinified
&& a.isViewportWrapping === b.isViewportWrapping
&& a.wrappingColumn === b.wrappingColumn
&& a.wrappingIndent === b.wrappingIndent
&& a.wordWrapBreakBeforeCharacters === b.wordWrapBreakBeforeCharacters
&& a.wordWrapBreakAfterCharacters === b.wordWrapBreakAfterCharacters
&& a.wordWrapBreakObtrusiveCharacters === b.wordWrapBreakObtrusiveCharacters);
};
/**
* @internal
*/
InternalEditorOptions._equalsContribOptions = function (a, b) {
return (a.selectionClipboard === b.selectionClipboard
&& this._equalsHoverOptions(a.hover, b.hover)
&& a.links === b.links
&& a.contextmenu === b.contextmenu
&& InternalEditorOptions._equalsQuickSuggestions(a.quickSuggestions, b.quickSuggestions)
&& a.quickSuggestionsDelay === b.quickSuggestionsDelay
&& this._equalsParameterHintOptions(a.parameterHints, b.parameterHints)
&& a.iconsInSuggestions === b.iconsInSuggestions
&& a.formatOnType === b.formatOnType
&& a.formatOnPaste === b.formatOnPaste
&& a.suggestOnTriggerCharacters === b.suggestOnTriggerCharacters
&& a.acceptSuggestionOnEnter === b.acceptSuggestionOnEnter
&& a.acceptSuggestionOnCommitCharacter === b.acceptSuggestionOnCommitCharacter
&& a.wordBasedSuggestions === b.wordBasedSuggestions
&& a.suggestSelection === b.suggestSelection
&& a.suggestFontSize === b.suggestFontSize
&& a.suggestLineHeight === b.suggestLineHeight
&& a.tabCompletion === b.tabCompletion
&& this._equalsSuggestOptions(a.suggest, b.suggest)
&& a.selectionHighlight === b.selectionHighlight
&& a.occurrencesHighlight === b.occurrencesHighlight
&& a.codeLens === b.codeLens
&& a.folding === b.folding
&& a.foldingStrategy === b.foldingStrategy
&& a.showFoldingControls === b.showFoldingControls
&& a.matchBrackets === b.matchBrackets
&& this._equalFindOptions(a.find, b.find)
&& a.colorDecorators === b.colorDecorators
&& objects.equals(a.codeActionsOnSave, b.codeActionsOnSave)
&& a.codeActionsOnSaveTimeout === b.codeActionsOnSaveTimeout
&& a.lightbulbEnabled === b.lightbulbEnabled);
};
InternalEditorOptions._equalsQuickSuggestions = function (a, b) {
if (typeof a === 'boolean') {
if (typeof b !== 'boolean') {
return false;
}
return a === b;
}
if (typeof b === 'boolean') {
return false;
}
return (a.comments === b.comments
&& a.other === b.other
&& a.strings === b.strings);
};
return InternalEditorOptions;
}());
export { InternalEditorOptions };
function _boolean(value, defaultValue) {
if (typeof value === 'undefined') {
return defaultValue;
}
if (value === 'false') {
// treat the string 'false' as false
return false;
}
return Boolean(value);
}
function _booleanMap(value, defaultValue) {
if (!value) {
return defaultValue;
}
var out = Object.create(null);
for (var _i = 0, _a = Object.keys(value); _i < _a.length; _i++) {
var k = _a[_i];
var v = value[k];
if (typeof v === 'boolean') {
out[k] = v;
}
}
return out;
}
function _string(value, defaultValue) {
if (typeof value !== 'string') {
return defaultValue;
}
return value;
}
function _stringSet(value, defaultValue, allowedValues) {
if (typeof value !== 'string') {
return defaultValue;
}
if (allowedValues.indexOf(value) === -1) {
return defaultValue;
}
return value;
}
function _clampedInt(value, defaultValue, minimum, maximum) {
var r;
if (typeof value === 'undefined') {
r = defaultValue;
}
else {
r = parseInt(value, 10);
if (isNaN(r)) {
r = defaultValue;
}
}
r = Math.max(minimum, r);
r = Math.min(maximum, r);
return r | 0;
}
function _float(value, defaultValue) {
var r = parseFloat(value);
if (isNaN(r)) {
r = defaultValue;
}
return r;
}
function _wrappingIndentFromString(wrappingIndent, defaultValue) {
if (typeof wrappingIndent !== 'string') {
return defaultValue;
}
if (wrappingIndent === 'same') {
return 1 /* Same */;
}
else if (wrappingIndent === 'indent') {
return 2 /* Indent */;
}
else if (wrappingIndent === 'deepIndent') {
return 3 /* DeepIndent */;
}
else {
return 0 /* None */;
}
}
function _cursorBlinkingStyleFromString(cursorBlinkingStyle, defaultValue) {
if (typeof cursorBlinkingStyle !== 'string') {
return defaultValue;
}
switch (cursorBlinkingStyle) {
case 'blink':
return 1 /* Blink */;
case 'smooth':
return 2 /* Smooth */;
case 'phase':
return 3 /* Phase */;
case 'expand':
return 4 /* Expand */;
case 'visible': // maintain compatibility
case 'solid':
return 5 /* Solid */;
}
return 1 /* Blink */;
}
function _scrollbarVisibilityFromString(visibility, defaultValue) {
if (typeof visibility !== 'string') {
return defaultValue;
}
switch (visibility) {
case 'hidden':
return 2 /* Hidden */;
case 'visible':
return 3 /* Visible */;
default:
return 1 /* Auto */;
}
}
/**
* @internal
*/
var EditorOptionsValidator = /** @class */ (function () {
function EditorOptionsValidator() {
}
/**
* Validate raw editor options.
* i.e. since they can be defined by the user, they might be invalid.
*/
EditorOptionsValidator.validate = function (opts, defaults) {
var wordWrap = opts.wordWrap;
{
// Compatibility with old true or false values
if (wordWrap === true) {
wordWrap = 'on';
}
else if (wordWrap === false) {
wordWrap = 'off';
}
wordWrap = _stringSet(wordWrap, defaults.wordWrap, ['off', 'on', 'wordWrapColumn', 'bounded']);
}
var viewInfo = this._sanitizeViewInfo(opts, defaults.viewInfo);
var contribInfo = this._sanitizeContribInfo(opts, defaults.contribInfo);
var configuredMulticursorModifier = undefined;
if (typeof opts.multiCursorModifier === 'string') {
if (opts.multiCursorModifier === 'ctrlCmd') {
configuredMulticursorModifier = platform.isMacintosh ? 'metaKey' : 'ctrlKey';
}
else {
configuredMulticursorModifier = 'altKey';
}
}
var multiCursorModifier = _stringSet(configuredMulticursorModifier, defaults.multiCursorModifier, ['altKey', 'metaKey', 'ctrlKey']);
var autoClosingBrackets;
var autoClosingQuotes;
var autoSurround;
if (typeof opts.autoClosingBrackets === 'boolean' && opts.autoClosingBrackets === false) {
// backwards compatibility: disable all on boolean false
autoClosingBrackets = 'never';
autoClosingQuotes = 'never';
autoSurround = 'never';
}
else {
autoClosingBrackets = _stringSet(opts.autoClosingBrackets, defaults.autoClosingBrackets, ['always', 'languageDefined', 'beforeWhitespace', 'never']);
autoClosingQuotes = _stringSet(opts.autoClosingQuotes, defaults.autoClosingQuotes, ['always', 'languageDefined', 'beforeWhitespace', 'never']);
autoSurround = _stringSet(opts.autoSurround, defaults.autoSurround, ['languageDefined', 'brackets', 'quotes', 'never']);
}
return {
inDiffEditor: _boolean(opts.inDiffEditor, defaults.inDiffEditor),
wordSeparators: _string(opts.wordSeparators, defaults.wordSeparators),
lineNumbersMinChars: _clampedInt(opts.lineNumbersMinChars, defaults.lineNumbersMinChars, 1, 10),
lineDecorationsWidth: (typeof opts.lineDecorationsWidth === 'undefined' ? defaults.lineDecorationsWidth : opts.lineDecorationsWidth),
readOnly: _boolean(opts.readOnly, defaults.readOnly),
mouseStyle: _stringSet(opts.mouseStyle, defaults.mouseStyle, ['text', 'default', 'copy']),
disableLayerHinting: _boolean(opts.disableLayerHinting, defaults.disableLayerHinting),
automaticLayout: _boolean(opts.automaticLayout, defaults.automaticLayout),
wordWrap: wordWrap,
wordWrapColumn: _clampedInt(opts.wordWrapColumn, defaults.wordWrapColumn, 1, 1073741824 /* MAX_SAFE_SMALL_INTEGER */),
wordWrapMinified: _boolean(opts.wordWrapMinified, defaults.wordWrapMinified),
wrappingIndent: _wrappingIndentFromString(opts.wrappingIndent, defaults.wrappingIndent),
wordWrapBreakBeforeCharacters: _string(opts.wordWrapBreakBeforeCharacters, defaults.wordWrapBreakBeforeCharacters),
wordWrapBreakAfterCharacters: _string(opts.wordWrapBreakAfterCharacters, defaults.wordWrapBreakAfterCharacters),
wordWrapBreakObtrusiveCharacters: _string(opts.wordWrapBreakObtrusiveCharacters, defaults.wordWrapBreakObtrusiveCharacters),
autoClosingBrackets: autoClosingBrackets,
autoClosingQuotes: autoClosingQuotes,
autoSurround: autoSurround,
autoIndent: _boolean(opts.autoIndent, defaults.autoIndent),
dragAndDrop: _boolean(opts.dragAndDrop, defaults.dragAndDrop),
emptySelectionClipboard: _boolean(opts.emptySelectionClipboard, defaults.emptySelectionClipboard),
copyWithSyntaxHighlighting: _boolean(opts.copyWithSyntaxHighlighting, defaults.copyWithSyntaxHighlighting),
useTabStops: _boolean(opts.useTabStops, defaults.useTabStops),
multiCursorModifier: multiCursorModifier,
multiCursorMergeOverlapping: _boolean(opts.multiCursorMergeOverlapping, defaults.multiCursorMergeOverlapping),
accessibilitySupport: _stringSet(opts.accessibilitySupport, defaults.accessibilitySupport, ['auto', 'on', 'off']),
showUnused: _boolean(opts.showUnused, defaults.showUnused),
viewInfo: viewInfo,
contribInfo: contribInfo,
};
};
EditorOptionsValidator._sanitizeScrollbarOpts = function (opts, defaults, mouseWheelScrollSensitivity) {
if (typeof opts !== 'object') {
return defaults;
}
var horizontalScrollbarSize = _clampedInt(opts.horizontalScrollbarSize, defaults.horizontalScrollbarSize, 0, 1000);
var verticalScrollbarSize = _clampedInt(opts.verticalScrollbarSize, defaults.verticalScrollbarSize, 0, 1000);
return {
vertical: _scrollbarVisibilityFromString(opts.vertical, defaults.vertical),
horizontal: _scrollbarVisibilityFromString(opts.horizontal, defaults.horizontal),
arrowSize: _clampedInt(opts.arrowSize, defaults.arrowSize, 0, 1000),
useShadows: _boolean(opts.useShadows, defaults.useShadows),
verticalHasArrows: _boolean(opts.verticalHasArrows, defaults.verticalHasArrows),
horizontalHasArrows: _boolean(opts.horizontalHasArrows, defaults.horizontalHasArrows),
horizontalScrollbarSize: horizontalScrollbarSize,
horizontalSliderSize: _clampedInt(opts.horizontalSliderSize, horizontalScrollbarSize, 0, 1000),
verticalScrollbarSize: verticalScrollbarSize,
verticalSliderSize: _clampedInt(opts.verticalSliderSize, verticalScrollbarSize, 0, 1000),
handleMouseWheel: _boolean(opts.handleMouseWheel, defaults.handleMouseWheel),
mouseWheelScrollSensitivity: mouseWheelScrollSensitivity
};
};
EditorOptionsValidator._sanitizeMinimapOpts = function (opts, defaults) {
if (typeof opts !== 'object') {
return defaults;
}
return {
enabled: _boolean(opts.enabled, defaults.enabled),
side: _stringSet(opts.side, defaults.side, ['right', 'left']),
showSlider: _stringSet(opts.showSlider, defaults.showSlider, ['always', 'mouseover']),
renderCharacters: _boolean(opts.renderCharacters, defaults.renderCharacters),
maxColumn: _clampedInt(opts.maxColumn, defaults.maxColumn, 1, 10000),
};
};
EditorOptionsValidator._santizeFindOpts = function (opts, defaults) {
if (typeof opts !== 'object') {
return defaults;
}
return {
seedSearchStringFromSelection: _boolean(opts.seedSearchStringFromSelection, defaults.seedSearchStringFromSelection),
autoFindInSelection: _boolean(opts.autoFindInSelection, defaults.autoFindInSelection),
globalFindClipboard: _boolean(opts.globalFindClipboard, defaults.globalFindClipboard)
};
};
EditorOptionsValidator._sanitizeParameterHintOpts = function (opts, defaults) {
if (typeof opts !== 'object') {
return defaults;
}
return {
enabled: _boolean(opts.enabled, defaults.enabled),
cycle: _boolean(opts.cycle, defaults.cycle)
};
};
EditorOptionsValidator._santizeHoverOpts = function (_opts, defaults) {
var opts;
if (typeof _opts === 'boolean') {
opts = {
enabled: _opts
};
}
else if (typeof _opts === 'object') {
opts = _opts;
}
else {
return defaults;
}
return {
enabled: _boolean(opts.enabled, defaults.enabled),
delay: _clampedInt(opts.delay, defaults.delay, 0, 10000),
sticky: _boolean(opts.sticky, defaults.sticky)
};
};
EditorOptionsValidator._sanitizeSuggestOpts = function (opts, defaults) {
var suggestOpts = opts.suggest || {};
return {
filterGraceful: _boolean(suggestOpts.filterGraceful, defaults.filterGraceful),
snippets: _stringSet(opts.snippetSuggestions, defaults.snippets, ['top', 'bottom', 'inline', 'none']),
snippetsPreventQuickSuggestions: _boolean(suggestOpts.snippetsPreventQuickSuggestions, defaults.filterGraceful),
localityBonus: _boolean(suggestOpts.localityBonus, defaults.localityBonus),
};
};
EditorOptionsValidator._sanitizeTabCompletionOpts = function (opts, defaults) {
if (opts === false) {
return 'off';
}
else if (opts === true) {
return 'onlySnippets';
}
else {
return _stringSet(opts, defaults, ['on', 'off', 'onlySnippets']);
}
};
EditorOptionsValidator._sanitizeViewInfo = function (opts, defaults) {
var rulers = [];
if (Array.isArray(opts.rulers)) {
for (var i = 0, len = opts.rulers.length; i < len; i++) {
rulers.push(_clampedInt(opts.rulers[i], 0, 0, 10000));
}
rulers.sort();
}
var renderLineNumbers = defaults.renderLineNumbers;
var renderCustomLineNumbers = defaults.renderCustomLineNumbers;
if (typeof opts.lineNumbers !== 'undefined') {
var lineNumbers = opts.lineNumbers;
// Compatibility with old true or false values
if (lineNumbers === true) {
lineNumbers = 'on';
}
else if (lineNumbers === false) {
lineNumbers = 'off';
}
if (typeof lineNumbers === 'function') {
renderLineNumbers = 4 /* Custom */;
renderCustomLineNumbers = lineNumbers;
}
else if (lineNumbers === 'interval') {
renderLineNumbers = 3 /* Interval */;
}
else if (lineNumbers === 'relative') {
renderLineNumbers = 2 /* Relative */;
}
else if (lineNumbers === 'on') {
renderLineNumbers = 1 /* On */;
}
else {
renderLineNumbers = 0 /* Off */;
}
}
var fontLigatures = _boolean(opts.fontLigatures, defaults.fontLigatures);
var disableMonospaceOptimizations = _boolean(opts.disableMonospaceOptimizations, defaults.disableMonospaceOptimizations) || fontLigatures;
var renderWhitespace = opts.renderWhitespace;
{
// Compatibility with old true or false values
if (renderWhitespace === true) {
renderWhitespace = 'boundary';
}
else if (renderWhitespace === false) {
renderWhitespace = 'none';
}
renderWhitespace = _stringSet(opts.renderWhitespace, defaults.renderWhitespace, ['none', 'boundary', 'all']);
}
var renderLineHighlight = opts.renderLineHighlight;
{
// Compatibility with old true or false values
if (renderLineHighlight === true) {
renderLineHighlight = 'line';
}
else if (renderLineHighlight === false) {
renderLineHighlight = 'none';
}
renderLineHighlight = _stringSet(opts.renderLineHighlight, defaults.renderLineHighlight, ['none', 'gutter', 'line', 'all']);
}
var mouseWheelScrollSensitivity = _float(opts.mouseWheelScrollSensitivity, defaults.scrollbar.mouseWheelScrollSensitivity);
if (mouseWheelScrollSensitivity === 0) {
// Disallow 0, as it would prevent/block scrolling
mouseWheelScrollSensitivity = 1;
}
var scrollbar = this._sanitizeScrollbarOpts(opts.scrollbar, defaults.scrollbar, mouseWheelScrollSensitivity);
var minimap = this._sanitizeMinimapOpts(opts.minimap, defaults.minimap);
return {
extraEditorClassName: _string(opts.extraEditorClassName, defaults.extraEditorClassName),
disableMonospaceOptimizations: disableMonospaceOptimizations,
rulers: rulers,
ariaLabel: _string(opts.ariaLabel, defaults.ariaLabel),
renderLineNumbers: renderLineNumbers,
renderCustomLineNumbers: renderCustomLineNumbers,
selectOnLineNumbers: _boolean(opts.selectOnLineNumbers, defaults.selectOnLineNumbers),
glyphMargin: _boolean(opts.glyphMargin, defaults.glyphMargin),
revealHorizontalRightPadding: _clampedInt(opts.revealHorizontalRightPadding, defaults.revealHorizontalRightPadding, 0, 1000),
roundedSelection: _boolean(opts.roundedSelection, defaults.roundedSelection),
overviewRulerLanes: _clampedInt(opts.overviewRulerLanes, defaults.overviewRulerLanes, 0, 3),
overviewRulerBorder: _boolean(opts.overviewRulerBorder, defaults.overviewRulerBorder),
cursorBlinking: _cursorBlinkingStyleFromString(opts.cursorBlinking, defaults.cursorBlinking),
mouseWheelZoom: _boolean(opts.mouseWheelZoom, defaults.mouseWheelZoom),
cursorStyle: _cursorStyleFromString(opts.cursorStyle, defaults.cursorStyle),
cursorWidth: _clampedInt(opts.cursorWidth, defaults.cursorWidth, 0, Number.MAX_VALUE),
hideCursorInOverviewRuler: _boolean(opts.hideCursorInOverviewRuler, defaults.hideCursorInOverviewRuler),
scrollBeyondLastLine: _boolean(opts.scrollBeyondLastLine, defaults.scrollBeyondLastLine),
scrollBeyondLastColumn: _clampedInt(opts.scrollBeyondLastColumn, defaults.scrollBeyondLastColumn, 0, 1073741824 /* MAX_SAFE_SMALL_INTEGER */),
smoothScrolling: _boolean(opts.smoothScrolling, defaults.smoothScrolling),
stopRenderingLineAfter: _clampedInt(opts.stopRenderingLineAfter, defaults.stopRenderingLineAfter, -1, 1073741824 /* MAX_SAFE_SMALL_INTEGER */),
renderWhitespace: renderWhitespace,
renderControlCharacters: _boolean(opts.renderControlCharacters, defaults.renderControlCharacters),
fontLigatures: fontLigatures,
renderIndentGuides: _boolean(opts.renderIndentGuides, defaults.renderIndentGuides),
highlightActiveIndentGuide: _boolean(opts.highlightActiveIndentGuide, defaults.highlightActiveIndentGuide),
renderLineHighlight: renderLineHighlight,
scrollbar: scrollbar,
minimap: minimap,
fixedOverflowWidgets: _boolean(opts.fixedOverflowWidgets, defaults.fixedOverflowWidgets),
};
};
EditorOptionsValidator._sanitizeContribInfo = function (opts, defaults) {
var quickSuggestions;
if (typeof opts.quickSuggestions === 'object') {
quickSuggestions = __assign({ other: true }, opts.quickSuggestions);
}
else {
quickSuggestions = _boolean(opts.quickSuggestions, defaults.quickSuggestions);
}
// Compatibility support for acceptSuggestionOnEnter
if (typeof opts.acceptSuggestionOnEnter === 'boolean') {
opts.acceptSuggestionOnEnter = opts.acceptSuggestionOnEnter ? 'on' : 'off';
}
var find = this._santizeFindOpts(opts.find, defaults.find);
return {
selectionClipboard: _boolean(opts.selectionClipboard, defaults.selectionClipboard),
hover: this._santizeHoverOpts(opts.hover, defaults.hover),
links: _boolean(opts.links, defaults.links),
contextmenu: _boolean(opts.contextmenu, defaults.contextmenu),
quickSuggestions: quickSuggestions,
quickSuggestionsDelay: _clampedInt(opts.quickSuggestionsDelay, defaults.quickSuggestionsDelay, -1073741824 /* MIN_SAFE_SMALL_INTEGER */, 1073741824 /* MAX_SAFE_SMALL_INTEGER */),
parameterHints: this._sanitizeParameterHintOpts(opts.parameterHints, defaults.parameterHints),
iconsInSuggestions: _boolean(opts.iconsInSuggestions, defaults.iconsInSuggestions),
formatOnType: _boolean(opts.formatOnType, defaults.formatOnType),
formatOnPaste: _boolean(opts.formatOnPaste, defaults.formatOnPaste),
suggestOnTriggerCharacters: _boolean(opts.suggestOnTriggerCharacters, defaults.suggestOnTriggerCharacters),
acceptSuggestionOnEnter: _stringSet(opts.acceptSuggestionOnEnter, defaults.acceptSuggestionOnEnter, ['on', 'smart', 'off']),
acceptSuggestionOnCommitCharacter: _boolean(opts.acceptSuggestionOnCommitCharacter, defaults.acceptSuggestionOnCommitCharacter),
wordBasedSuggestions: _boolean(opts.wordBasedSuggestions, defaults.wordBasedSuggestions),
suggestSelection: _stringSet(opts.suggestSelection, defaults.suggestSelection, ['first', 'recentlyUsed', 'recentlyUsedByPrefix']),
suggestFontSize: _clampedInt(opts.suggestFontSize, defaults.suggestFontSize, 0, 1000),
suggestLineHeight: _clampedInt(opts.suggestLineHeight, defaults.suggestLineHeight, 0, 1000),
tabCompletion: this._sanitizeTabCompletionOpts(opts.tabCompletion, defaults.tabCompletion),
suggest: this._sanitizeSuggestOpts(opts, defaults.suggest),
selectionHighlight: _boolean(opts.selectionHighlight, defaults.selectionHighlight),
occurrencesHighlight: _boolean(opts.occurrencesHighlight, defaults.occurrencesHighlight),
codeLens: _boolean(opts.codeLens, defaults.codeLens),
folding: _boolean(opts.folding, defaults.folding),
foldingStrategy: _stringSet(opts.foldingStrategy, defaults.foldingStrategy, ['auto', 'indentation']),
showFoldingControls: _stringSet(opts.showFoldingControls, defaults.showFoldingControls, ['always', 'mouseover']),
matchBrackets: _boolean(opts.matchBrackets, defaults.matchBrackets),
find: find,
colorDecorators: _boolean(opts.colorDecorators, defaults.colorDecorators),
lightbulbEnabled: _boolean(opts.lightbulb ? opts.lightbulb.enabled : false, defaults.lightbulbEnabled),
codeActionsOnSave: _booleanMap(opts.codeActionsOnSave, {}),
codeActionsOnSaveTimeout: _clampedInt(opts.codeActionsOnSaveTimeout, defaults.codeActionsOnSaveTimeout, 1, 10000)
};
};
return EditorOptionsValidator;
}());
export { EditorOptionsValidator };
/**
* @internal
*/
var InternalEditorOptionsFactory = /** @class */ (function () {
function InternalEditorOptionsFactory() {
}
InternalEditorOptionsFactory._tweakValidatedOptions = function (opts, accessibilitySupport) {
var accessibilityIsOn = (accessibilitySupport === 2 /* Enabled */);
var accessibilityIsOff = (accessibilitySupport === 1 /* Disabled */);
return {
inDiffEditor: opts.inDiffEditor,
wordSeparators: opts.wordSeparators,
lineNumbersMinChars: opts.lineNumbersMinChars,
lineDecorationsWidth: opts.lineDecorationsWidth,
readOnly: opts.readOnly,
mouseStyle: opts.mouseStyle,
disableLayerHinting: opts.disableLayerHinting,
automaticLayout: opts.automaticLayout,
wordWrap: opts.wordWrap,
wordWrapColumn: opts.wordWrapColumn,
wordWrapMinified: opts.wordWrapMinified,
wrappingIndent: opts.wrappingIndent,
wordWrapBreakBeforeCharacters: opts.wordWrapBreakBeforeCharacters,
wordWrapBreakAfterCharacters: opts.wordWrapBreakAfterCharacters,
wordWrapBreakObtrusiveCharacters: opts.wordWrapBreakObtrusiveCharacters,
autoClosingBrackets: opts.autoClosingBrackets,
autoClosingQuotes: opts.autoClosingQuotes,
autoSurround: opts.autoSurround,
autoIndent: opts.autoIndent,
dragAndDrop: opts.dragAndDrop,
emptySelectionClipboard: opts.emptySelectionClipboard,
copyWithSyntaxHighlighting: opts.copyWithSyntaxHighlighting,
useTabStops: opts.useTabStops,
multiCursorModifier: opts.multiCursorModifier,
multiCursorMergeOverlapping: opts.multiCursorMergeOverlapping,
accessibilitySupport: opts.accessibilitySupport,
showUnused: opts.showUnused,
viewInfo: {
extraEditorClassName: opts.viewInfo.extraEditorClassName,
disableMonospaceOptimizations: opts.viewInfo.disableMonospaceOptimizations,
rulers: opts.viewInfo.rulers,
ariaLabel: (accessibilityIsOff ? nls.localize('accessibilityOffAriaLabel', "The editor is not accessible at this time. Press Alt+F1 for options.") : opts.viewInfo.ariaLabel),
renderLineNumbers: opts.viewInfo.renderLineNumbers,
renderCustomLineNumbers: opts.viewInfo.renderCustomLineNumbers,
selectOnLineNumbers: opts.viewInfo.selectOnLineNumbers,
glyphMargin: opts.viewInfo.glyphMargin,
revealHorizontalRightPadding: opts.viewInfo.revealHorizontalRightPadding,
roundedSelection: (accessibilityIsOn ? false : opts.viewInfo.roundedSelection),
overviewRulerLanes: opts.viewInfo.overviewRulerLanes,
overviewRulerBorder: opts.viewInfo.overviewRulerBorder,
cursorBlinking: opts.viewInfo.cursorBlinking,
mouseWheelZoom: opts.viewInfo.mouseWheelZoom,
cursorStyle: opts.viewInfo.cursorStyle,
cursorWidth: opts.viewInfo.cursorWidth,
hideCursorInOverviewRuler: opts.viewInfo.hideCursorInOverviewRuler,
scrollBeyondLastLine: opts.viewInfo.scrollBeyondLastLine,
scrollBeyondLastColumn: opts.viewInfo.scrollBeyondLastColumn,
smoothScrolling: opts.viewInfo.smoothScrolling,
stopRenderingLineAfter: opts.viewInfo.stopRenderingLineAfter,
renderWhitespace: (accessibilityIsOn ? 'none' : opts.viewInfo.renderWhitespace),
renderControlCharacters: (accessibilityIsOn ? false : opts.viewInfo.renderControlCharacters),
fontLigatures: (accessibilityIsOn ? false : opts.viewInfo.fontLigatures),
renderIndentGuides: (accessibilityIsOn ? false : opts.viewInfo.renderIndentGuides),
highlightActiveIndentGuide: opts.viewInfo.highlightActiveIndentGuide,
renderLineHighlight: opts.viewInfo.renderLineHighlight,
scrollbar: opts.viewInfo.scrollbar,
minimap: {
enabled: (accessibilityIsOn ? false : opts.viewInfo.minimap.enabled),
side: opts.viewInfo.minimap.side,
renderCharacters: opts.viewInfo.minimap.renderCharacters,
showSlider: opts.viewInfo.minimap.showSlider,
maxColumn: opts.viewInfo.minimap.maxColumn
},
fixedOverflowWidgets: opts.viewInfo.fixedOverflowWidgets
},
contribInfo: {
selectionClipboard: opts.contribInfo.selectionClipboard,
hover: opts.contribInfo.hover,
links: (accessibilityIsOn ? false : opts.contribInfo.links),
contextmenu: opts.contribInfo.contextmenu,
quickSuggestions: opts.contribInfo.quickSuggestions,
quickSuggestionsDelay: opts.contribInfo.quickSuggestionsDelay,
parameterHints: opts.contribInfo.parameterHints,
iconsInSuggestions: opts.contribInfo.iconsInSuggestions,
formatOnType: opts.contribInfo.formatOnType,
formatOnPaste: opts.contribInfo.formatOnPaste,
suggestOnTriggerCharacters: opts.contribInfo.suggestOnTriggerCharacters,
acceptSuggestionOnEnter: opts.contribInfo.acceptSuggestionOnEnter,
acceptSuggestionOnCommitCharacter: opts.contribInfo.acceptSuggestionOnCommitCharacter,
wordBasedSuggestions: opts.contribInfo.wordBasedSuggestions,
suggestSelection: opts.contribInfo.suggestSelection,
suggestFontSize: opts.contribInfo.suggestFontSize,
suggestLineHeight: opts.contribInfo.suggestLineHeight,
tabCompletion: opts.contribInfo.tabCompletion,
suggest: opts.contribInfo.suggest,
selectionHighlight: (accessibilityIsOn ? false : opts.contribInfo.selectionHighlight),
occurrencesHighlight: (accessibilityIsOn ? false : opts.contribInfo.occurrencesHighlight),
codeLens: (accessibilityIsOn ? false : opts.contribInfo.codeLens),
folding: (accessibilityIsOn ? false : opts.contribInfo.folding),
foldingStrategy: opts.contribInfo.foldingStrategy,
showFoldingControls: opts.contribInfo.showFoldingControls,
matchBrackets: (accessibilityIsOn ? false : opts.contribInfo.matchBrackets),
find: opts.contribInfo.find,
colorDecorators: opts.contribInfo.colorDecorators,
lightbulbEnabled: opts.contribInfo.lightbulbEnabled,
codeActionsOnSave: opts.contribInfo.codeActionsOnSave,
codeActionsOnSaveTimeout: opts.contribInfo.codeActionsOnSaveTimeout
}
};
};
InternalEditorOptionsFactory.createInternalEditorOptions = function (env, _opts) {
var accessibilitySupport;
if (_opts.accessibilitySupport === 'auto') {
// The editor reads the `accessibilitySupport` from the environment
accessibilitySupport = env.accessibilitySupport;
}
else if (_opts.accessibilitySupport === 'on') {
accessibilitySupport = 2 /* Enabled */;
}
else {
accessibilitySupport = 1 /* Disabled */;
}
// Disable some non critical features to get as best performance as possible
// See https://github.com/Microsoft/vscode/issues/26730
var opts = this._tweakValidatedOptions(_opts, accessibilitySupport);
var lineDecorationsWidth;
if (typeof opts.lineDecorationsWidth === 'string' && /^\d+(\.\d+)?ch$/.test(opts.lineDecorationsWidth)) {
var multiple = parseFloat(opts.lineDecorationsWidth.substr(0, opts.lineDecorationsWidth.length - 2));
lineDecorationsWidth = multiple * env.fontInfo.typicalHalfwidthCharacterWidth;
}
else {
lineDecorationsWidth = _clampedInt(opts.lineDecorationsWidth, 0, 0, 1000);
}
if (opts.contribInfo.folding) {
lineDecorationsWidth += 16;
}
var layoutInfo = EditorLayoutProvider.compute({
outerWidth: env.outerWidth,
outerHeight: env.outerHeight,
showGlyphMargin: opts.viewInfo.glyphMargin,
lineHeight: env.fontInfo.lineHeight,
showLineNumbers: (opts.viewInfo.renderLineNumbers !== 0 /* Off */),
lineNumbersMinChars: opts.lineNumbersMinChars,
lineNumbersDigitCount: env.lineNumbersDigitCount,
lineDecorationsWidth: lineDecorationsWidth,