From 658b44fe50ba7995eb58e2b24fd2aa01e1c72a83 Mon Sep 17 00:00:00 2001 From: CismonX Date: Thu, 11 Mar 2021 21:35:44 +0800 Subject: [PATCH] Add GNU Texinfo version indicator in status bar. --- src/extension.ts | 4 ++- src/indicator.ts | 63 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 src/indicator.ts diff --git a/src/extension.ts b/src/extension.ts index ffcd100..66e7da9 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -8,6 +8,7 @@ import * as vscode from 'vscode'; import ContextMapping from './context_mapping'; import Diagnosis from './diagnosis'; +import Indicator from './indicator'; import Logger from './logger'; import Options from './options'; import PreviewContext from './contexts/preview'; @@ -18,7 +19,8 @@ import FoldingRangeProvider from './providers/folding_range'; export function activate(context: vscode.ExtensionContext) { context.subscriptions.push( - ContextMapping.instance, Diagnosis.instance, Logger.instance, Options.instance, + ContextMapping.instance, Diagnosis.instance, Indicator.instance, Logger.instance, Options.instance, + vscode.window.onDidChangeActiveTextEditor(Indicator.onTextEditorChange), vscode.workspace.onDidChangeTextDocument(ContextMapping.onDocumentUpdate), vscode.workspace.onDidSaveTextDocument(ContextMapping.onDocumentSave), vscode.workspace.onDidCloseTextDocument(ContextMapping.onDocumentClose), diff --git a/src/indicator.ts b/src/indicator.ts new file mode 100644 index 0000000..91e6968 --- /dev/null +++ b/src/indicator.ts @@ -0,0 +1,63 @@ +/** + * indicator.ts + * + * @author CismonX + * @license MIT + */ + +import * as vscode from 'vscode'; +import Options from './options'; +import { exec } from './utils/misc'; + +export default class Indicator implements vscode.Disposable { + + private static singleton?: Indicator; + + private statusBarItem: vscode.StatusBarItem; + + private refresh(editor?: vscode.TextEditor) { + if (editor === undefined || editor.document.languageId != 'texinfo') { + this.statusBarItem.hide(); + } else { + this.statusBarItem.show(); + } + } + + public async updateStatus() { + const output = await exec(Options.makeinfo, ['--version'], Options.maxSize); + const result = output.data?.match(/\(GNU texinfo\) (.*)\n/); + let tooltip = '', icon: string, version = ''; + if (result && result[1]) { + version = result[1]; + if (!isNaN(+version) && +version < 6.7) { + icon = '$(warning)'; + tooltip = `GNU Texinfo (${Options.makeinfo}) is outdated.\n` + + 'Please upgrade to the latest version (6.7).'; + } else { + icon = '$(check)'; + } + } else { + icon = '$(close)'; + tooltip = `GNU Texinfo (${Options.makeinfo}) is not correctly installed or configured.`; + } + this.statusBarItem.text = `${icon} GNU Texinfo ${version}`; + this.statusBarItem.tooltip = tooltip; + } + + public static onTextEditorChange(editor?: vscode.TextEditor) { + Indicator.instance.refresh(editor); + } + + static get instance() { + return this.singleton ??= new Indicator(); + } + + private constructor() { + this.statusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, 100); + this.updateStatus().then(() => this.refresh(vscode.window.activeTextEditor)); + } + + dispose() { + this.statusBarItem.dispose(); + } +}