From 6561634c687cad2d1b7041b45b618d1c336f2e68 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 31 Dec 2019 02:21:57 +0100 Subject: Remove trivial helpers --- editors/code/src/scopes.ts | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) (limited to 'editors/code/src/scopes.ts') diff --git a/editors/code/src/scopes.ts b/editors/code/src/scopes.ts index cb250b853..465556333 100644 --- a/editors/code/src/scopes.ts +++ b/editors/code/src/scopes.ts @@ -82,9 +82,9 @@ function loadThemeNamed(themeName: string) { function loadThemeFile(themePath: string) { const themeContent = [themePath] - .filter(isFile) - .map(readFileText) - .map(parseJSON) + .filter(it => fs.statSync(it).isFile()) + .map(it => fs.readFileSync(it, 'utf8')) + .map(it => jsonc.parse(it)) .filter(theme => theme); themeContent @@ -132,15 +132,3 @@ function loadColors(textMateRules: TextMateRule[]): void { } }); } - -function isFile(filePath: string): boolean { - return [filePath].map(fs.statSync).every(stat => stat.isFile()); -} - -function readFileText(filePath: string): string { - return fs.readFileSync(filePath, 'utf8'); -} - -function parseJSON(content: string): any { - return jsonc.parse(content); -} -- cgit v1.2.3 From 96de8076ff50096a0ae62c5eb7a2e9c77971b552 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 31 Dec 2019 02:27:26 +0100 Subject: Use optional value shortcut --- editors/code/src/scopes.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'editors/code/src/scopes.ts') diff --git a/editors/code/src/scopes.ts b/editors/code/src/scopes.ts index 465556333..f98b57452 100644 --- a/editors/code/src/scopes.ts +++ b/editors/code/src/scopes.ts @@ -9,9 +9,9 @@ export interface TextMateRule { } export interface TextMateRuleSettings { - foreground: string | undefined; - background: string | undefined; - fontStyle: string | undefined; + foreground?: string; + background?: string; + fontStyle?: string; } // Current theme colors -- cgit v1.2.3 From cfb086592995a54828f23734a260d387db9ea926 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 31 Dec 2019 02:30:43 +0100 Subject: Reduce scope --- editors/code/src/scopes.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) (limited to 'editors/code/src/scopes.ts') diff --git a/editors/code/src/scopes.ts b/editors/code/src/scopes.ts index f98b57452..1229f0fb9 100644 --- a/editors/code/src/scopes.ts +++ b/editors/code/src/scopes.ts @@ -42,18 +42,20 @@ export function load() { } } -function filterThemeExtensions(extension: vscode.Extension): boolean { - return ( - extension.extensionKind === vscode.ExtensionKind.UI && - extension.packageJSON.contributes && - extension.packageJSON.contributes.themes - ); -} + // Find current theme on disk function loadThemeNamed(themeName: string) { + function isTheme(extension: vscode.Extension): boolean { + return ( + extension.extensionKind === vscode.ExtensionKind.UI && + extension.packageJSON.contributes && + extension.packageJSON.contributes.themes + ); + } + const themePaths = vscode.extensions.all - .filter(filterThemeExtensions) + .filter(isTheme) .reduce((list, extension) => { return extension.packageJSON.contributes.themes .filter( -- cgit v1.2.3 From f984ef26528eca686abbb946b3b363dfe6d74822 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 31 Dec 2019 03:33:00 +0100 Subject: Switch impure functional style to pure imperative --- editors/code/src/scopes.ts | 150 ++++++++++++++++++--------------------------- 1 file changed, 61 insertions(+), 89 deletions(-) (limited to 'editors/code/src/scopes.ts') diff --git a/editors/code/src/scopes.ts b/editors/code/src/scopes.ts index 1229f0fb9..73fabbf54 100644 --- a/editors/code/src/scopes.ts +++ b/editors/code/src/scopes.ts @@ -3,28 +3,14 @@ import * as jsonc from 'jsonc-parser'; import * as path from 'path'; import * as vscode from 'vscode'; -export interface TextMateRule { - scope: string | string[]; - settings: TextMateRuleSettings; -} - export interface TextMateRuleSettings { foreground?: string; background?: string; fontStyle?: string; } -// Current theme colors -const rules = new Map(); - -export function find(scope: string): TextMateRuleSettings | undefined { - return rules.get(scope); -} - // Load all textmate scopes in the currently active theme -export function load() { - // Remove any previous theme - rules.clear(); +export function loadThemeColors(): Map { // Find out current color theme const themeName = vscode.workspace .getConfiguration('workbench') @@ -32,20 +18,12 @@ export function load() { if (typeof themeName !== 'string') { // console.warn('workbench.colorTheme is', themeName) - return; - } - // Try to load colors from that theme - try { - loadThemeNamed(themeName); - } catch (e) { - // console.warn('failed to load theme', themeName, e) + return new Map(); } + return loadThemeNamed(themeName); } - - -// Find current theme on disk -function loadThemeNamed(themeName: string) { +function loadThemeNamed(themeName: string): Map { function isTheme(extension: vscode.Extension): boolean { return ( extension.extensionKind === vscode.ExtensionKind.UI && @@ -54,83 +32,77 @@ function loadThemeNamed(themeName: string) { ); } - const themePaths = vscode.extensions.all + let themePaths = vscode.extensions.all .filter(isTheme) - .reduce((list, extension) => { - return extension.packageJSON.contributes.themes - .filter( - (element: any) => - (element.id || element.label) === themeName, - ) - .map((element: any) => - path.join(extension.extensionPath, element.path), - ) - .concat(list); - }, Array()); - - themePaths.forEach(loadThemeFile); + .flatMap(ext => { + return ext.packageJSON.contributes.themes + .filter((it: any) => (it.id || it.label) === themeName) + .map((it: any) => path.join(ext.extensionPath, it.path)); + }) + + const res = new Map(); + for (const themePath of themePaths) { + mergeInto(res, loadThemeFile(themePath)) + } - const tokenColorCustomizations: [any] = [ - vscode.workspace - .getConfiguration('editor') - .get('tokenColorCustomizations'), - ]; + const customizations: any = vscode.workspace.getConfiguration('editor').get('tokenColorCustomizations'); + mergeInto(res, loadColors(customizations?.textMateRules ?? [])) - tokenColorCustomizations - .filter(custom => custom && custom.textMateRules) - .map(custom => custom.textMateRules) - .forEach(loadColors); + return res; } -function loadThemeFile(themePath: string) { - const themeContent = [themePath] - .filter(it => fs.statSync(it).isFile()) - .map(it => fs.readFileSync(it, 'utf8')) - .map(it => jsonc.parse(it)) - .filter(theme => theme); +function loadThemeFile(themePath: string): Map { + let text; + try { + text = fs.readFileSync(themePath, 'utf8') + } catch { + return new Map(); + } + const obj = jsonc.parse(text); + const tokenColors = obj?.tokenColors ?? []; + const res = loadColors(tokenColors); + + for (const include in obj?.include ?? []) { + const includePath = path.join(path.dirname(themePath), include); + const tmp = loadThemeFile(includePath); + mergeInto(res, tmp); + } + + return res; +} - themeContent - .filter(theme => theme.tokenColors) - .map(theme => theme.tokenColors) - .forEach(loadColors); +interface TextMateRule { + scope: string | string[]; + settings: TextMateRuleSettings; +} - themeContent - .filter(theme => theme.include) - .map(theme => path.join(path.dirname(themePath), theme.include)) - .forEach(loadThemeFile); +function loadColors(textMateRules: TextMateRule[]): Map { + const res = new Map(); + for (const rule of textMateRules) { + const scopes = typeof rule.scope === 'string' + ? [rule.scope] + : rule.scope; + for (const scope of scopes) { + res.set(scope, rule.settings) + } + } + return res } function mergeRuleSettings( defaultSetting: TextMateRuleSettings | undefined, override: TextMateRuleSettings, ): TextMateRuleSettings { - if (defaultSetting === undefined) { - return override; + return { + foreground: defaultSetting?.foreground ?? override.foreground, + background: defaultSetting?.background ?? override.background, + fontStyle: defaultSetting?.fontStyle ?? override.fontStyle, } - const mergedRule = defaultSetting; - - mergedRule.background = override.background || defaultSetting.background; - mergedRule.foreground = override.foreground || defaultSetting.foreground; - mergedRule.fontStyle = override.fontStyle || defaultSetting.foreground; - - return mergedRule; } -function updateRules( - scope: string, - updatedSettings: TextMateRuleSettings, -): void { - [rules.get(scope)] - .map(settings => mergeRuleSettings(settings, updatedSettings)) - .forEach(settings => rules.set(scope, settings)); -} - -function loadColors(textMateRules: TextMateRule[]): void { - textMateRules.forEach(rule => { - if (typeof rule.scope === 'string') { - updateRules(rule.scope, rule.settings); - } else if (rule.scope instanceof Array) { - rule.scope.forEach(scope => updateRules(scope, rule.settings)); - } - }); +function mergeInto(dst: Map, addition: Map) { + addition.forEach((value, key) => { + const merged = mergeRuleSettings(dst.get(key), value) + dst.set(key, merged) + }) } -- cgit v1.2.3