Refactor & bugfix.
This commit is contained in:
parent
5ee1e16cd8
commit
9e717a1e7e
|
@ -11,12 +11,12 @@ Texinfo language support for Visual Studio Code.
|
||||||
* Provided by the same [TextMate grammar](https://github.com/Alhadis/language-texinfo/blob/v1.0.0/grammars/texinfo.cson) as [used in GitHub](https://github.com/github/linguist/pull/4589).
|
* Provided by the same [TextMate grammar](https://github.com/Alhadis/language-texinfo/blob/v1.0.0/grammars/texinfo.cson) as [used in GitHub](https://github.com/github/linguist/pull/4589).
|
||||||
* **Code Completion**
|
* **Code Completion**
|
||||||
* Completion for most @\-commands.
|
* Completion for most @\-commands.
|
||||||
* Code snippets for blocks and brace commands.
|
* Code snippets for block and brace commands.
|
||||||
* **Folding**
|
* **Folding**
|
||||||
* Fold on blocks, headers and multiline comments.
|
* Fold on blocks, headers and multiline comments.
|
||||||
* **Preview**
|
* **Preview**
|
||||||
* Display HTML preview in a webview.
|
* Display HTML preview in a webview.
|
||||||
* Texinfo to HTML conversion is provided by [GNU Texinfo](https://www.gnu.org/software/texinfo/).
|
* Texinfo to HTML conversion is provided by [GNU Texinfo](https://www.gnu.org/software/texinfo).
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>Screenshots:</summary>
|
<summary>Screenshots:</summary>
|
||||||
|
@ -40,4 +40,4 @@ See `File -> Preferences -> Settings -> Extensions -> Texinfo` for details. The
|
||||||
|
|
||||||
## Future Plans
|
## Future Plans
|
||||||
|
|
||||||
* Implement [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) for the Texinfo language, preferably by extending GNU Texinfo, to alleviate the limitations of the current implementaion.
|
* Implement [Language Server Protocol](https://microsoft.github.io/language-server-protocol) for the Texinfo language, preferably by extending GNU Texinfo, to alleviate the limitations of the current implementaion.
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import Options from './options';
|
import Options from './options';
|
||||||
import * as utils from './utils';
|
import { exec } from './utils';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Texinfo to HTML converter.
|
* Texinfo to HTML converter.
|
||||||
|
@ -38,6 +38,6 @@ export default class Converter {
|
||||||
|
|
||||||
private async convert(path: string) {
|
private async convert(path: string) {
|
||||||
const maxBuffer = Options.maxSize * 1024 * 1024;
|
const maxBuffer = Options.maxSize * 1024 * 1024;
|
||||||
return await utils.exec(Options.makeinfo, this.options.concat(path), maxBuffer);
|
return await exec(Options.makeinfo, this.options.concat(path), maxBuffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@ export function activate(context: vscode.ExtensionContext) {
|
||||||
vscode.workspace.onDidChangeTextDocument(Document.update),
|
vscode.workspace.onDidChangeTextDocument(Document.update),
|
||||||
vscode.workspace.onDidSaveTextDocument(Document.save),
|
vscode.workspace.onDidSaveTextDocument(Document.save),
|
||||||
vscode.workspace.onDidCloseTextDocument(Document.close),
|
vscode.workspace.onDidCloseTextDocument(Document.close),
|
||||||
|
vscode.workspace.onDidChangeConfiguration(Options.clear),
|
||||||
vscode.commands.registerTextEditorCommand('texinfo.showPreview', Preview.show),
|
vscode.commands.registerTextEditorCommand('texinfo.showPreview', Preview.show),
|
||||||
vscode.languages.registerCompletionItemProvider('texinfo', new CompletionItemProvider(), '@'),
|
vscode.languages.registerCompletionItemProvider('texinfo', new CompletionItemProvider(), '@'),
|
||||||
vscode.languages.registerFoldingRangeProvider('texinfo', new FoldingRangeProvider()),
|
vscode.languages.registerFoldingRangeProvider('texinfo', new FoldingRangeProvider()),
|
||||||
|
|
|
@ -62,15 +62,15 @@ export default class Options {
|
||||||
this.configuration = vscode.workspace.getConfiguration(section);
|
this.configuration = vscode.workspace.getConfiguration(section);
|
||||||
}
|
}
|
||||||
|
|
||||||
private getString(section: string): string {
|
private getString(section: string) {
|
||||||
return this.configuration.get(section) ?? '';
|
return this.configuration.get(section, '');
|
||||||
}
|
}
|
||||||
|
|
||||||
private getBoolean(section: string): boolean {
|
private getBoolean(section: string) {
|
||||||
return this.configuration.get(section) ?? false;
|
return this.configuration.get(section, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private getNumber(section: string): number {
|
private getNumber(section: string) {
|
||||||
return this.configuration.get(section) ?? 0;
|
return this.configuration.get(section, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,8 +9,9 @@ import * as path from 'path';
|
||||||
import * as vscode from 'vscode';
|
import * as vscode from 'vscode';
|
||||||
import Converter from './converter';
|
import Converter from './converter';
|
||||||
import Document from './document';
|
import Document from './document';
|
||||||
|
import Logger from './logger';
|
||||||
import Options from './options';
|
import Options from './options';
|
||||||
import * as utils from './utils';
|
import { prompt, transformHtmlImageUri } from './utils';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Texinfo document preview.
|
* Texinfo document preview.
|
||||||
|
@ -25,11 +26,11 @@ export default class Preview {
|
||||||
static async show(editor: vscode.TextEditor) {
|
static async show(editor: vscode.TextEditor) {
|
||||||
const document = editor.document;
|
const document = editor.document;
|
||||||
const documentContext = Document.get(document);
|
const documentContext = Document.get(document);
|
||||||
if (documentContext === undefined) {
|
if (documentContext === undefined) return;
|
||||||
return;
|
// Only show preview for saved files, as we're not gonna send document content to `makeinfo` via STDIN.
|
||||||
}
|
// Instead, the file will be loaded from disk.
|
||||||
if (document.isUntitled) {
|
if (document.isUntitled) {
|
||||||
if (!await utils.prompt('Save this document to display preview.', 'Save')) return;
|
if (!await prompt('Save this document to display preview.', 'Save')) return;
|
||||||
if (!await document.save()) return;
|
if (!await document.save()) return;
|
||||||
}
|
}
|
||||||
documentContext.initPreview().panel.reveal();
|
documentContext.initPreview().panel.reveal();
|
||||||
|
@ -54,6 +55,7 @@ export default class Preview {
|
||||||
constructor(private readonly documentContext: Document) {
|
constructor(private readonly documentContext: Document) {
|
||||||
this.panel = vscode.window.createWebviewPanel('texinfo.preview', '', vscode.ViewColumn.Beside);
|
this.panel = vscode.window.createWebviewPanel('texinfo.preview', '', vscode.ViewColumn.Beside);
|
||||||
this.disposables.push(this.panel.onDidDispose(() => this.close()));
|
this.disposables.push(this.panel.onDidDispose(() => this.close()));
|
||||||
|
this.updateTitle();
|
||||||
this.updateWebview();
|
this.updateWebview();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -76,8 +78,8 @@ export default class Preview {
|
||||||
}
|
}
|
||||||
this.updating = true;
|
this.updating = true;
|
||||||
this.pendingUpdate = false;
|
this.pendingUpdate = false;
|
||||||
this.updateTitle();
|
// Inform the user that the preview is updating if `makeinfo` takes too long.
|
||||||
|
setTimeout(() => this.updating && this.updateTitle(), 500);
|
||||||
let htmlCode = await Converter.convertToHtml(this.document.fileName);
|
let htmlCode = await Converter.convertToHtml(this.document.fileName);
|
||||||
if (htmlCode === undefined) {
|
if (htmlCode === undefined) {
|
||||||
prompt(`Failed to show preview for ${this.document.fileName}.`, 'Show log', true)
|
prompt(`Failed to show preview for ${this.document.fileName}.`, 'Show log', true)
|
||||||
|
@ -86,7 +88,7 @@ export default class Preview {
|
||||||
if (Options.displayImage) {
|
if (Options.displayImage) {
|
||||||
const pathName = path.dirname(this.document.fileName);
|
const pathName = path.dirname(this.document.fileName);
|
||||||
// To display images in webviews, image URIs in HTML should be converted to VSCode-recognizable ones.
|
// To display images in webviews, image URIs in HTML should be converted to VSCode-recognizable ones.
|
||||||
htmlCode = utils.transformHtmlImageUri(htmlCode, src => {
|
htmlCode = transformHtmlImageUri(htmlCode, src => {
|
||||||
const srcUri = vscode.Uri.file(pathName + '/' + src);
|
const srcUri = vscode.Uri.file(pathName + '/' + src);
|
||||||
return this.panel.webview.asWebviewUri(srcUri).toString();
|
return this.panel.webview.asWebviewUri(srcUri).toString();
|
||||||
});
|
});
|
||||||
|
@ -95,7 +97,6 @@ export default class Preview {
|
||||||
}
|
}
|
||||||
this.updating = false;
|
this.updating = false;
|
||||||
this.updateTitle();
|
this.updateTitle();
|
||||||
|
|
||||||
this.pendingUpdate && this.updateWebview();
|
this.pendingUpdate && this.updateWebview();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,7 @@ export async function prompt(message: string, confirm: string, error = false) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Execute command and get output.
|
* Execute command and fetch output.
|
||||||
*
|
*
|
||||||
* @param path Path to the executable file.
|
* @param path Path to the executable file.
|
||||||
* @param args Arguments to be passed to the command.
|
* @param args Arguments to be passed to the command.
|
||||||
|
@ -32,7 +32,7 @@ export async function prompt(message: string, confirm: string, error = false) {
|
||||||
* @returns The output data, or `undefined` if execution fails.
|
* @returns The output data, or `undefined` if execution fails.
|
||||||
*/
|
*/
|
||||||
export function exec(path: string, args: string[], maxBuffer: number) {
|
export function exec(path: string, args: string[], maxBuffer: number) {
|
||||||
return new Promise<string | undefined>(resolve => {
|
return new Promise<Optional<string>>(resolve => {
|
||||||
child_process.execFile(path, args, { maxBuffer: maxBuffer }, (error, stdout, stderr) => {
|
child_process.execFile(path, args, { maxBuffer: maxBuffer }, (error, stdout, stderr) => {
|
||||||
if (error) {
|
if (error) {
|
||||||
Logger.log(stderr ? stderr : error.message);
|
Logger.log(stderr ? stderr : error.message);
|
||||||
|
@ -62,3 +62,7 @@ export function transformHtmlImageUri(htmlCode: string, transformer: (src: strin
|
||||||
// If nothing is transformed, return the original HTML code, for better performance.
|
// If nothing is transformed, return the original HTML code, for better performance.
|
||||||
return elements.length === 0 ? htmlCode : dom.outerHTML;
|
return elements.length === 0 ? htmlCode : dom.outerHTML;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type Optional<T> = T | undefined;
|
||||||
|
|
||||||
|
export type Range = { start: number, end: number };
|
||||||
|
|
Loading…
Reference in New Issue