mirror of
https://github.com/Microsoft/vscode
synced 2024-09-13 21:55:38 +00:00
* added the workspace symbol provider for markdown 46406 * fixed the review comments 46406
This commit is contained in:
parent
9e7763ccdb
commit
5e993f7160
|
@ -14,6 +14,7 @@ import { loadDefaultTelemetryReporter } from './telemetryReporter';
|
|||
import { getMarkdownExtensionContributions } from './markdownExtensions';
|
||||
import LinkProvider from './features/documentLinkProvider';
|
||||
import MDDocumentSymbolProvider from './features/documentSymbolProvider';
|
||||
import MarkdownWorkspaceSymbolProvider from './features/workspaceSymbolProvider';
|
||||
import { MarkdownContentProvider } from './features/previewContentProvider';
|
||||
import { MarkdownPreviewManager } from './features/previewManager';
|
||||
import MarkdownFoldingProvider from './features/foldingProvider';
|
||||
|
@ -32,13 +33,14 @@ export function activate(context: vscode.ExtensionContext) {
|
|||
const selector = 'markdown';
|
||||
|
||||
const contentProvider = new MarkdownContentProvider(engine, context, cspArbiter, contributions, logger);
|
||||
|
||||
const symbolProvider = new MDDocumentSymbolProvider(engine);
|
||||
const previewManager = new MarkdownPreviewManager(contentProvider, logger, contributions);
|
||||
context.subscriptions.push(previewManager);
|
||||
|
||||
context.subscriptions.push(vscode.languages.registerDocumentSymbolProvider(selector, new MDDocumentSymbolProvider(engine)));
|
||||
context.subscriptions.push(vscode.languages.registerDocumentSymbolProvider(selector, symbolProvider));
|
||||
context.subscriptions.push(vscode.languages.registerDocumentLinkProvider(selector, new LinkProvider()));
|
||||
context.subscriptions.push(vscode.languages.registerFoldingProvider(selector, new MarkdownFoldingProvider(engine)));
|
||||
context.subscriptions.push(vscode.languages.registerWorkspaceSymbolProvider(new MarkdownWorkspaceSymbolProvider(symbolProvider)));
|
||||
|
||||
const previewSecuritySelector = new PreviewSecuritySelector(cspArbiter, previewManager);
|
||||
|
||||
|
|
|
@ -0,0 +1,61 @@
|
|||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { workspace, WorkspaceSymbolProvider, SymbolInformation, TextDocument, Disposable } from 'vscode';
|
||||
import { isMarkdownFile } from '../util/file';
|
||||
import MDDocumentSymbolProvider from './documentSymbolProvider';
|
||||
import { Dictionary, flatMap } from 'lodash';
|
||||
|
||||
export default class MarkdownWorkspaceSymbolProvider implements WorkspaceSymbolProvider {
|
||||
private symbolProvider: MDDocumentSymbolProvider;
|
||||
private symbolCache: Dictionary<SymbolInformation[]> = {};
|
||||
private symbolCachePopulated: boolean;
|
||||
private deRegisterOnSaveEvent: Disposable;
|
||||
|
||||
public constructor(symbolProvider: MDDocumentSymbolProvider) {
|
||||
this.symbolProvider = symbolProvider;
|
||||
this.symbolCachePopulated = false;
|
||||
this.deRegisterOnSaveEvent = this.registerOnSaveEvent();
|
||||
}
|
||||
|
||||
public async provideWorkspaceSymbols(query: string): Promise<SymbolInformation[]> {
|
||||
if (!this.symbolCachePopulated) {
|
||||
await this.populateSymbolCache();
|
||||
this.symbolCachePopulated = true;
|
||||
}
|
||||
|
||||
return flatMap(this.symbolCache)
|
||||
.filter(symbolInformation => symbolInformation.name.toLowerCase().indexOf(query.toLowerCase()) !== -1);
|
||||
}
|
||||
|
||||
public async populateSymbolCache(): Promise<void> {
|
||||
const markDownDocumentUris = await workspace.findFiles('**/*.md');
|
||||
for (const uri of markDownDocumentUris) {
|
||||
const document = await workspace.openTextDocument(uri);
|
||||
if (isMarkdownFile(document)) {
|
||||
const symbols = await this.getSymbol(document);
|
||||
this.symbolCache[document.fileName] = symbols;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public dispose(): void {
|
||||
this.deRegisterOnSaveEvent.dispose();
|
||||
}
|
||||
|
||||
private async getSymbol(document: TextDocument): Promise<SymbolInformation[]> {
|
||||
return this.symbolProvider.provideDocumentSymbols(document);
|
||||
}
|
||||
|
||||
private registerOnSaveEvent(): Disposable {
|
||||
return workspace.onDidSaveTextDocument(async document => {
|
||||
if (isMarkdownFile(document)) {
|
||||
const symbols = await this.getSymbol(document);
|
||||
this.symbolCache[document.fileName] = symbols;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in a new issue