/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; import * as nls from 'vscode-nls'; import { CommandManager } from '../commandManager'; const localize = nls.loadMessageBundle(); // Copied from markdown language service export enum DiagnosticCode { link_noSuchReferences = 'link.no-such-reference', link_noSuchHeaderInOwnFile = 'link.no-such-header-in-own-file', link_noSuchFile = 'link.no-such-file', link_noSuchHeaderInFile = 'link.no-such-header-in-file', } class AddToIgnoreLinksQuickFixProvider implements vscode.CodeActionProvider { private static readonly _addToIgnoreLinksCommandId = '_markdown.addToIgnoreLinks'; private static readonly metadata: vscode.CodeActionProviderMetadata = { providedCodeActionKinds: [ vscode.CodeActionKind.QuickFix ], }; public static register(selector: vscode.DocumentSelector, commandManager: CommandManager): vscode.Disposable { const reg = vscode.languages.registerCodeActionsProvider(selector, new AddToIgnoreLinksQuickFixProvider(), AddToIgnoreLinksQuickFixProvider.metadata); const commandReg = commandManager.register({ id: AddToIgnoreLinksQuickFixProvider._addToIgnoreLinksCommandId, execute(resource: vscode.Uri, path: string) { const settingId = 'experimental.validate.ignoreLinks'; const config = vscode.workspace.getConfiguration('markdown', resource); const paths = new Set(config.get(settingId, [])); paths.add(path); config.update(settingId, [...paths], vscode.ConfigurationTarget.WorkspaceFolder); } }); return vscode.Disposable.from(reg, commandReg); } provideCodeActions(document: vscode.TextDocument, _range: vscode.Range | vscode.Selection, context: vscode.CodeActionContext, _token: vscode.CancellationToken): vscode.ProviderResult<(vscode.CodeAction | vscode.Command)[]> { const fixes: vscode.CodeAction[] = []; for (const diagnostic of context.diagnostics) { switch (diagnostic.code) { case DiagnosticCode.link_noSuchReferences: case DiagnosticCode.link_noSuchHeaderInOwnFile: case DiagnosticCode.link_noSuchFile: case DiagnosticCode.link_noSuchHeaderInFile: { const hrefText = (diagnostic as any).data?.hrefText; if (hrefText) { const fix = new vscode.CodeAction( localize('ignoreLinksQuickFix.title', "Exclude '{0}' from link validation.", hrefText), vscode.CodeActionKind.QuickFix); fix.command = { command: AddToIgnoreLinksQuickFixProvider._addToIgnoreLinksCommandId, title: '', arguments: [document.uri, hrefText], }; fixes.push(fix); } break; } } } return fixes; } } export function registerDiagnosticSupport( selector: vscode.DocumentSelector, commandManager: CommandManager, ): vscode.Disposable { return AddToIgnoreLinksQuickFixProvider.register(selector, commandManager); }