| |
| |
|
|
|
|
| import * as vscode from 'vscode';
|
| import { subscribeToDocumentChanges, EMOJI_MENTION } from './diagnostics';
|
|
|
| const COMMAND = 'code-actions-sample.command';
|
|
|
| export function activate(context: vscode.ExtensionContext) {
|
| context.subscriptions.push(
|
| vscode.languages.registerCodeActionsProvider('markdown', new Emojizer(), {
|
| providedCodeActionKinds: Emojizer.providedCodeActionKinds
|
| }));
|
|
|
| const emojiDiagnostics = vscode.languages.createDiagnosticCollection("emoji");
|
| context.subscriptions.push(emojiDiagnostics);
|
|
|
| subscribeToDocumentChanges(context, emojiDiagnostics);
|
|
|
| context.subscriptions.push(
|
| vscode.languages.registerCodeActionsProvider('markdown', new Emojinfo(), {
|
| providedCodeActionKinds: Emojinfo.providedCodeActionKinds
|
| })
|
| );
|
|
|
| context.subscriptions.push(
|
| vscode.commands.registerCommand(COMMAND, () => vscode.env.openExternal(vscode.Uri.parse('https://unicode.org/emoji/charts-12.0/full-emoji-list.html')))
|
| );
|
| }
|
|
|
| |
| |
|
|
| export class Emojizer implements vscode.CodeActionProvider {
|
|
|
| public static readonly providedCodeActionKinds = [
|
| vscode.CodeActionKind.QuickFix
|
| ];
|
|
|
| public provideCodeActions(document: vscode.TextDocument, range: vscode.Range): vscode.CodeAction[] | undefined {
|
| if (!this.isAtStartOfSmiley(document, range)) {
|
| return;
|
| }
|
|
|
| const replaceWithSmileyCatFix = this.createFix(document, range, '๐บ');
|
|
|
| const replaceWithSmileyFix = this.createFix(document, range, '๐');
|
|
|
|
|
| replaceWithSmileyFix.isPreferred = true;
|
|
|
| const replaceWithSmileyHankyFix = this.createFix(document, range, '๐ฉ');
|
|
|
| const commandAction = this.createCommand();
|
|
|
| return [
|
| replaceWithSmileyCatFix,
|
| replaceWithSmileyFix,
|
| replaceWithSmileyHankyFix,
|
| commandAction
|
| ];
|
| }
|
|
|
| private isAtStartOfSmiley(document: vscode.TextDocument, range: vscode.Range) {
|
| const start = range.start;
|
| const line = document.lineAt(start.line);
|
| return line.text[start.character] === ':' && line.text[start.character + 1] === ')';
|
| }
|
|
|
| private createFix(document: vscode.TextDocument, range: vscode.Range, emoji: string): vscode.CodeAction {
|
| const fix = new vscode.CodeAction(`Convert to ${emoji}`, vscode.CodeActionKind.QuickFix);
|
| fix.edit = new vscode.WorkspaceEdit();
|
| fix.edit.replace(document.uri, new vscode.Range(range.start, range.start.translate(0, 2)), emoji);
|
| return fix;
|
| }
|
|
|
| private createCommand(): vscode.CodeAction {
|
| const action = new vscode.CodeAction('Learn more...', vscode.CodeActionKind.Empty);
|
| action.command = { command: COMMAND, title: 'Learn more about emojis', tooltip: 'This will open the unicode emoji page.' };
|
| return action;
|
| }
|
| }
|
|
|
| |
| |
|
|
| export class Emojinfo implements vscode.CodeActionProvider {
|
|
|
| public static readonly providedCodeActionKinds = [
|
| vscode.CodeActionKind.QuickFix
|
| ];
|
|
|
| provideCodeActions(_document: vscode.TextDocument, _range: vscode.Range | vscode.Selection, context: vscode.CodeActionContext, _token: vscode.CancellationToken): vscode.CodeAction[] {
|
|
|
| return context.diagnostics
|
| .filter(diagnostic => diagnostic.code === EMOJI_MENTION)
|
| .map(diagnostic => this.createCommandCodeAction(diagnostic));
|
| }
|
|
|
| private createCommandCodeAction(diagnostic: vscode.Diagnostic): vscode.CodeAction {
|
| const action = new vscode.CodeAction('Learn more...', vscode.CodeActionKind.QuickFix);
|
| action.command = { command: COMMAND, title: 'Learn more about emojis', tooltip: 'This will open the unicode emoji page.' };
|
| action.diagnostics = [diagnostic];
|
| action.isPreferred = true;
|
| return action;
|
| }
|
| } |