Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/markdown-language-features/src/preview/previewConfig.ts
3292 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import * as vscode from 'vscode';
7
import { equals } from '../util/arrays';
8
9
export class MarkdownPreviewConfiguration {
10
public static getForResource(resource: vscode.Uri | null) {
11
return new MarkdownPreviewConfiguration(resource);
12
}
13
14
public readonly scrollBeyondLastLine: boolean;
15
public readonly wordWrap: boolean;
16
17
public readonly previewLineBreaks: boolean;
18
public readonly previewLinkify: boolean;
19
public readonly previewTypographer: boolean;
20
21
public readonly doubleClickToSwitchToEditor: boolean;
22
public readonly scrollEditorWithPreview: boolean;
23
public readonly scrollPreviewWithEditor: boolean;
24
public readonly markEditorSelection: boolean;
25
26
public readonly lineHeight: number;
27
public readonly fontSize: number;
28
public readonly fontFamily: string | undefined;
29
public readonly styles: readonly string[];
30
31
private constructor(resource: vscode.Uri | null) {
32
const editorConfig = vscode.workspace.getConfiguration('editor', resource);
33
const markdownConfig = vscode.workspace.getConfiguration('markdown', resource);
34
const markdownEditorConfig = vscode.workspace.getConfiguration('[markdown]', resource);
35
36
this.scrollBeyondLastLine = editorConfig.get<boolean>('scrollBeyondLastLine', false);
37
38
this.wordWrap = editorConfig.get<string>('wordWrap', 'off') !== 'off';
39
if (markdownEditorConfig?.['editor.wordWrap']) {
40
this.wordWrap = markdownEditorConfig['editor.wordWrap'] !== 'off';
41
}
42
43
this.scrollPreviewWithEditor = !!markdownConfig.get<boolean>('preview.scrollPreviewWithEditor', true);
44
this.scrollEditorWithPreview = !!markdownConfig.get<boolean>('preview.scrollEditorWithPreview', true);
45
46
this.previewLineBreaks = !!markdownConfig.get<boolean>('preview.breaks', false);
47
this.previewLinkify = !!markdownConfig.get<boolean>('preview.linkify', true);
48
this.previewTypographer = !!markdownConfig.get<boolean>('preview.typographer', false);
49
50
this.doubleClickToSwitchToEditor = !!markdownConfig.get<boolean>('preview.doubleClickToSwitchToEditor', true);
51
this.markEditorSelection = !!markdownConfig.get<boolean>('preview.markEditorSelection', true);
52
53
this.fontFamily = markdownConfig.get<string | undefined>('preview.fontFamily', undefined);
54
this.fontSize = Math.max(8, +markdownConfig.get<number>('preview.fontSize', NaN));
55
this.lineHeight = Math.max(0.6, +markdownConfig.get<number>('preview.lineHeight', NaN));
56
57
this.styles = markdownConfig.get<string[]>('styles', []);
58
}
59
60
public isEqualTo(otherConfig: MarkdownPreviewConfiguration) {
61
for (const key in this) {
62
if (this.hasOwnProperty(key) && key !== 'styles') {
63
if (this[key] !== otherConfig[key]) {
64
return false;
65
}
66
}
67
}
68
69
return equals(this.styles, otherConfig.styles);
70
}
71
72
readonly [key: string]: any;
73
}
74
75
export class MarkdownPreviewConfigurationManager {
76
private readonly _previewConfigurationsForWorkspaces = new Map<string, MarkdownPreviewConfiguration>();
77
78
public loadAndCacheConfiguration(
79
resource: vscode.Uri
80
): MarkdownPreviewConfiguration {
81
const config = MarkdownPreviewConfiguration.getForResource(resource);
82
this._previewConfigurationsForWorkspaces.set(this._getKey(resource), config);
83
return config;
84
}
85
86
public hasConfigurationChanged(resource: vscode.Uri): boolean {
87
const key = this._getKey(resource);
88
const currentConfig = this._previewConfigurationsForWorkspaces.get(key);
89
const newConfig = MarkdownPreviewConfiguration.getForResource(resource);
90
return !currentConfig?.isEqualTo(newConfig);
91
}
92
93
private _getKey(
94
resource: vscode.Uri
95
): string {
96
const folder = vscode.workspace.getWorkspaceFolder(resource);
97
return folder ? folder.uri.toString() : '';
98
}
99
}
100
101