From a9b46ddd92629790458541501e167de5bbd37ffe Mon Sep 17 00:00:00 2001 From: Vigilans Date: Sat, 6 Apr 2019 14:40:19 +0800 Subject: [PATCH 1/4] apply markdown settings to MdEngine --- src/webview/leetCodeResultProvider.ts | 2 +- src/webview/leetCodeSolutionProvider.ts | 2 +- src/webview/markdownEngine.ts | 79 ++++++++++++++++++++----- 3 files changed, 65 insertions(+), 18 deletions(-) diff --git a/src/webview/leetCodeResultProvider.ts b/src/webview/leetCodeResultProvider.ts index a6574ff2..1b6d2a54 100644 --- a/src/webview/leetCodeResultProvider.ts +++ b/src/webview/leetCodeResultProvider.ts @@ -42,7 +42,7 @@ class LeetCodeResultProvider implements Disposable { - ${markdownEngine.getStylesHTML()} + ${markdownEngine.getStyles()}
${result.trim()}
diff --git a/src/webview/leetCodeSolutionProvider.ts b/src/webview/leetCodeSolutionProvider.ts index 6243af02..8a378208 100644 --- a/src/webview/leetCodeSolutionProvider.ts +++ b/src/webview/leetCodeSolutionProvider.ts @@ -53,7 +53,7 @@ class LeetCodeSolutionProvider implements Disposable { } private getWebViewContent(solution: Solution): string { - const styles: string = markdownEngine.getStylesHTML(); + const styles: string = markdownEngine.getStyles(); const { title, url, lang, author, votes } = solution; const head: string = markdownEngine.render(`# [${title}](${url})`); const auth: string = `[${author}](https://leetcode.com/${author}/)`; diff --git a/src/webview/markdownEngine.ts b/src/webview/markdownEngine.ts index b3a45a4a..21295485 100644 --- a/src/webview/markdownEngine.ts +++ b/src/webview/markdownEngine.ts @@ -8,38 +8,68 @@ import * as path from "path"; import * as vscode from "vscode"; import { leetCodeChannel } from "../leetCodeChannel"; -class MarkdownEngine { +class MarkdownEngine implements vscode.Disposable { - private readonly engine: MarkdownIt; - private readonly extRoot: string; // root path of vscode built-in markdown extension + private engine: MarkdownIt; + private config: MarkdownConfiguration; + private listener: vscode.Disposable; public constructor() { - this.engine = this.initEngine(); - this.extRoot = path.join(vscode.env.appRoot, "extensions", "markdown-language-features"); + this.reload(); + this.listener = vscode.workspace.onDidChangeConfiguration((event: vscode.ConfigurationChangeEvent) => { + if (event.affectsConfiguration("markdown")) { + this.reload(); + } + }, this); } public get localResourceRoots(): vscode.Uri[] { - return [vscode.Uri.file(path.join(this.extRoot, "media"))]; + return [vscode.Uri.file(path.join(this.config.extRoot, "media"))]; } - public get styles(): vscode.Uri[] { - try { - const stylePaths: string[] = require(path.join(this.extRoot, "package.json"))["contributes"]["markdown.previewStyles"]; - return stylePaths.map((p: string) => vscode.Uri.file(path.join(this.extRoot, p)).with({ scheme: "vscode-resource" })); - } catch (error) { - leetCodeChannel.appendLine("[Error] Fail to load built-in markdown style file."); - return []; - } + public dispose(): void { + this.listener.dispose(); } - public getStylesHTML(): string { - return this.styles.map((style: vscode.Uri) => ``).join(os.EOL); + public reload(): void { + this.engine = this.initEngine(); + this.config = new MarkdownConfiguration(); } public render(md: string, env?: any): string { return this.engine.render(md, env); } + public getStyles(): string { + return [ + this.getBuiltinStyles(), + this.getSettingsStyles(), + ].join(os.EOL); + } + + private getBuiltinStyles(): string { + let styles: vscode.Uri[] = []; + try { + const stylePaths: string[] = require(path.join(this.config.extRoot, "package.json"))["contributes"]["markdown.previewStyles"]; + styles = stylePaths.map((p: string) => vscode.Uri.file(path.join(this.config.extRoot, p)).with({ scheme: "vscode-resource" })); + } catch (error) { + leetCodeChannel.appendLine("[Error] Fail to load built-in markdown style file."); + } + return styles.map((style: vscode.Uri) => ``).join(os.EOL); + } + + private getSettingsStyles(): string { + return [ + ``, + ].join(os.EOL); + } + private initEngine(): MarkdownIt { const md: MarkdownIt = new MarkdownIt({ linkify: true, @@ -107,4 +137,21 @@ class MarkdownEngine { } } +// tslint:disable-next-line: max-classes-per-file +class MarkdownConfiguration { + + public readonly extRoot: string; // root path of vscode built-in markdown extension + public readonly lineHeight: number; + public readonly fontSize: number; + public readonly fontFamily: string | undefined; + + public constructor() { + const markdownConfig: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("markdown"); + 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.extRoot = path.join(vscode.env.appRoot, "extensions", "markdown-language-features"); + } +} + export const markdownEngine: MarkdownEngine = new MarkdownEngine(); From 4f211a928bcc43a85d460838b545e1e023d71ca4 Mon Sep 17 00:00:00 2001 From: Vigilans Date: Sat, 6 Apr 2019 15:55:43 +0800 Subject: [PATCH 2/4] Resolve font family in windows --- src/webview/markdownEngine.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/webview/markdownEngine.ts b/src/webview/markdownEngine.ts index 21295485..464c0bfa 100644 --- a/src/webview/markdownEngine.ts +++ b/src/webview/markdownEngine.ts @@ -7,6 +7,7 @@ import * as os from "os"; import * as path from "path"; import * as vscode from "vscode"; import { leetCodeChannel } from "../leetCodeChannel"; +import { isWindows } from "../utils/osUtils"; class MarkdownEngine implements vscode.Disposable { @@ -147,10 +148,18 @@ class MarkdownConfiguration { public constructor() { const markdownConfig: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("markdown"); - 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.extRoot = path.join(vscode.env.appRoot, "extensions", "markdown-language-features"); + this.lineHeight = Math.max(0.6, +markdownConfig.get("preview.lineHeight", NaN)); + this.fontSize = Math.max(8, +markdownConfig.get("preview.fontSize", NaN)); + this.fontFamily = this.resolveFontFamily(markdownConfig); + } + + private resolveFontFamily(config: vscode.WorkspaceConfiguration): string | undefined { + let fontFamily: string | undefined = config.get("preview.fontFamily", undefined); + if (isWindows() && fontFamily && fontFamily === config.inspect("preview.fontFamily")!.defaultValue) { + fontFamily = `${fontFamily}, 'Microsoft Yahei UI'`; + } + return fontFamily; } } From 8b790123963d789764ae09bd59cdef66fc7f4095 Mon Sep 17 00:00:00 2001 From: Vigilans Date: Mon, 8 Apr 2019 11:26:24 +0800 Subject: [PATCH 3/4] Address comment in review --- src/webview/markdownEngine.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/webview/markdownEngine.ts b/src/webview/markdownEngine.ts index 464c0bfa..8584662c 100644 --- a/src/webview/markdownEngine.ts +++ b/src/webview/markdownEngine.ts @@ -155,8 +155,8 @@ class MarkdownConfiguration { } private resolveFontFamily(config: vscode.WorkspaceConfiguration): string | undefined { - let fontFamily: string | undefined = config.get("preview.fontFamily", undefined); - if (isWindows() && fontFamily && fontFamily === config.inspect("preview.fontFamily")!.defaultValue) { + let fontFamily: string = config.get("preview.fontFamily", ""); + if (isWindows() && fontFamily === config.inspect("preview.fontFamily")!.defaultValue) { fontFamily = `${fontFamily}, 'Microsoft Yahei UI'`; } return fontFamily; From 1a3cb57cf5afeada5ddbd0d5642433ecc3f96e13 Mon Sep 17 00:00:00 2001 From: Vigilans Date: Mon, 8 Apr 2019 20:05:17 +0800 Subject: [PATCH 4/4] Remove redundant type info --- src/webview/markdownEngine.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/webview/markdownEngine.ts b/src/webview/markdownEngine.ts index 8584662c..8ebada23 100644 --- a/src/webview/markdownEngine.ts +++ b/src/webview/markdownEngine.ts @@ -144,7 +144,7 @@ class MarkdownConfiguration { public readonly extRoot: string; // root path of vscode built-in markdown extension public readonly lineHeight: number; public readonly fontSize: number; - public readonly fontFamily: string | undefined; + public readonly fontFamily: string; public constructor() { const markdownConfig: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("markdown"); @@ -154,7 +154,7 @@ class MarkdownConfiguration { this.fontFamily = this.resolveFontFamily(markdownConfig); } - private resolveFontFamily(config: vscode.WorkspaceConfiguration): string | undefined { + private resolveFontFamily(config: vscode.WorkspaceConfiguration): string { let fontFamily: string = config.get("preview.fontFamily", ""); if (isWindows() && fontFamily === config.inspect("preview.fontFamily")!.defaultValue) { fontFamily = `${fontFamily}, 'Microsoft Yahei UI'`;