/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; import { equals } from '../util/arrays'; export class MarkdownPreviewConfiguration { public static getForResource(resource: vscode.Uri) { return new MarkdownPreviewConfiguration(resource); } public readonly scrollBeyondLastLine: boolean; public readonly wordWrap: boolean; public readonly lineBreaks: boolean; public readonly doubleClickToSwitchToEditor: boolean; public readonly scrollEditorWithPreview: boolean; public readonly scrollPreviewWithEditor: boolean; public readonly markEditorSelection: boolean; public readonly lineHeight: number; public readonly fontSize: number; public readonly fontFamily: string | undefined; public readonly styles: readonly string[]; private constructor(resource: vscode.Uri) { const editorConfig = vscode.workspace.getConfiguration('editor', resource); const markdownConfig = vscode.workspace.getConfiguration('markdown', resource); const markdownEditorConfig = vscode.workspace.getConfiguration('[markdown]', resource); this.scrollBeyondLastLine = editorConfig.get('scrollBeyondLastLine', false); this.wordWrap = editorConfig.get('wordWrap', 'off') !== 'off'; if (markdownEditorConfig && markdownEditorConfig['editor.wordWrap']) { this.wordWrap = markdownEditorConfig['editor.wordWrap'] !== 'off'; } this.scrollPreviewWithEditor = !!markdownConfig.get('preview.scrollPreviewWithEditor', true); this.scrollEditorWithPreview = !!markdownConfig.get('preview.scrollEditorWithPreview', true); this.lineBreaks = !!markdownConfig.get('preview.breaks', false); this.doubleClickToSwitchToEditor = !!markdownConfig.get('preview.doubleClickToSwitchToEditor', true); this.markEditorSelection = !!markdownConfig.get('preview.markEditorSelection', true); this.fontFamily = markdownConfig.get('preview.fontFamily', undefined); this.fontSize = Math.max(8, +markdownConfig.get('preview.fontSize', NaN)); this.lineHeight = Math.max(0.6, +markdownConfig.get('preview.lineHeight', NaN)); this.styles = markdownConfig.get('styles', []); } public isEqualTo(otherConfig: MarkdownPreviewConfiguration) { for (const key in this) { if (this.hasOwnProperty(key) && key !== 'styles') { if (this[key] !== otherConfig[key]) { return false; } } } return equals(this.styles, otherConfig.styles); } [key: string]: any; } export class MarkdownPreviewConfigurationManager { private readonly previewConfigurationsForWorkspaces = new Map(); public loadAndCacheConfiguration( resource: vscode.Uri ): MarkdownPreviewConfiguration { const config = MarkdownPreviewConfiguration.getForResource(resource); this.previewConfigurationsForWorkspaces.set(this.getKey(resource), config); return config; } public hasConfigurationChanged( resource: vscode.Uri ): boolean { const key = this.getKey(resource); const currentConfig = this.previewConfigurationsForWorkspaces.get(key); const newConfig = MarkdownPreviewConfiguration.getForResource(resource); return (!currentConfig || !currentConfig.isEqualTo(newConfig)); } private getKey( resource: vscode.Uri ): string { const folder = vscode.workspace.getWorkspaceFolder(resource); return folder ? folder.uri.toString() : ''; } }