Path: blob/main/extensions/markdown-language-features/src/preview/previewConfig.ts
3292 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import * as vscode from 'vscode';6import { equals } from '../util/arrays';78export class MarkdownPreviewConfiguration {9public static getForResource(resource: vscode.Uri | null) {10return new MarkdownPreviewConfiguration(resource);11}1213public readonly scrollBeyondLastLine: boolean;14public readonly wordWrap: boolean;1516public readonly previewLineBreaks: boolean;17public readonly previewLinkify: boolean;18public readonly previewTypographer: boolean;1920public readonly doubleClickToSwitchToEditor: boolean;21public readonly scrollEditorWithPreview: boolean;22public readonly scrollPreviewWithEditor: boolean;23public readonly markEditorSelection: boolean;2425public readonly lineHeight: number;26public readonly fontSize: number;27public readonly fontFamily: string | undefined;28public readonly styles: readonly string[];2930private constructor(resource: vscode.Uri | null) {31const editorConfig = vscode.workspace.getConfiguration('editor', resource);32const markdownConfig = vscode.workspace.getConfiguration('markdown', resource);33const markdownEditorConfig = vscode.workspace.getConfiguration('[markdown]', resource);3435this.scrollBeyondLastLine = editorConfig.get<boolean>('scrollBeyondLastLine', false);3637this.wordWrap = editorConfig.get<string>('wordWrap', 'off') !== 'off';38if (markdownEditorConfig?.['editor.wordWrap']) {39this.wordWrap = markdownEditorConfig['editor.wordWrap'] !== 'off';40}4142this.scrollPreviewWithEditor = !!markdownConfig.get<boolean>('preview.scrollPreviewWithEditor', true);43this.scrollEditorWithPreview = !!markdownConfig.get<boolean>('preview.scrollEditorWithPreview', true);4445this.previewLineBreaks = !!markdownConfig.get<boolean>('preview.breaks', false);46this.previewLinkify = !!markdownConfig.get<boolean>('preview.linkify', true);47this.previewTypographer = !!markdownConfig.get<boolean>('preview.typographer', false);4849this.doubleClickToSwitchToEditor = !!markdownConfig.get<boolean>('preview.doubleClickToSwitchToEditor', true);50this.markEditorSelection = !!markdownConfig.get<boolean>('preview.markEditorSelection', true);5152this.fontFamily = markdownConfig.get<string | undefined>('preview.fontFamily', undefined);53this.fontSize = Math.max(8, +markdownConfig.get<number>('preview.fontSize', NaN));54this.lineHeight = Math.max(0.6, +markdownConfig.get<number>('preview.lineHeight', NaN));5556this.styles = markdownConfig.get<string[]>('styles', []);57}5859public isEqualTo(otherConfig: MarkdownPreviewConfiguration) {60for (const key in this) {61if (this.hasOwnProperty(key) && key !== 'styles') {62if (this[key] !== otherConfig[key]) {63return false;64}65}66}6768return equals(this.styles, otherConfig.styles);69}7071readonly [key: string]: any;72}7374export class MarkdownPreviewConfigurationManager {75private readonly _previewConfigurationsForWorkspaces = new Map<string, MarkdownPreviewConfiguration>();7677public loadAndCacheConfiguration(78resource: vscode.Uri79): MarkdownPreviewConfiguration {80const config = MarkdownPreviewConfiguration.getForResource(resource);81this._previewConfigurationsForWorkspaces.set(this._getKey(resource), config);82return config;83}8485public hasConfigurationChanged(resource: vscode.Uri): boolean {86const key = this._getKey(resource);87const currentConfig = this._previewConfigurationsForWorkspaces.get(key);88const newConfig = MarkdownPreviewConfiguration.getForResource(resource);89return !currentConfig?.isEqualTo(newConfig);90}9192private _getKey(93resource: vscode.Uri94): string {95const folder = vscode.workspace.getWorkspaceFolder(resource);96return folder ? folder.uri.toString() : '';97}98}99100101