diff --git a/package.json b/package.json index 5a57eadd..1d740299 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,110 @@ } ], "contributes": { + "commands": [ + { + "command": "laravel.wrapHelpers", + "title": "Laravel: Wrap selection with helpers" + }, + { + "command": "laravel.wrapHelpers.unwrap", + "title": "Laravel: Unwrap selection" + }, + { + "command": "laravel.wrapHelpers.dd", + "title": "with dd(...)" + }, + { + "command": "laravel.wrapHelpers.dump", + "title": "with dump(...)" + }, + { + "command": "laravel.wrapHelpers.collect", + "title": "with collect(...)" + }, + { + "command": "laravel.wrapHelpers.str", + "title": "with str(...)" + } + ], + "keybindings": [ + { + "command": "laravel.wrapHelpers.dd", + "key": "shift+alt+d", + "when": "editorHasSelection" + }, + { + "command": "laravel.wrapHelpers.unwrap", + "key": "shift+alt+u", + "when": "editorHasSelection" + } + ], + "submenus": [ + { + "id": "laravel.wrapHelpers.submenu", + "label": "Laravel: Wrap selection with helpers" + } + ], + "menus": { + "commandPalette": [ + { + "command": "laravel.wrapHelpers", + "when": "editorHasSelection", + "group": "laravel" + }, + { + "command": "laravel.wrapHelpers.unwrap", + "when": "editorHasSelection", + "group": "laravel" + }, + { + "command": "laravel.wrapHelpers.dd", + "when": "false", + "group": "laravel" + }, + { + "command": "laravel.wrapHelpers.dump", + "when": "false", + "group": "laravel" + }, + { + "command": "laravel.wrapHelpers.collect", + "when": "false", + "group": "laravel" + }, + { + "command": "laravel.wrapHelpers.str", + "when": "false", + "group": "laravel" + } + ], + "editor/context": [ + { + "submenu": "laravel.wrapHelpers.submenu", + "when": "editorHasSelection", + "group": "laravel" + }, + { + "command": "laravel.wrapHelpers.unwrap", + "when": "editorHasSelection", + "group": "laravel" + } + ], + "laravel.wrapHelpers.submenu": [ + { + "command": "laravel.wrapHelpers.dd" + }, + { + "command": "laravel.wrapHelpers.dump" + }, + { + "command": "laravel.wrapHelpers.collect" + }, + { + "command": "laravel.wrapHelpers.str" + } + ] + }, "languages": [ { "id": "blade", diff --git a/src/commands/wrapHelpers.ts b/src/commands/wrapHelpers.ts new file mode 100644 index 00000000..8cb8d2f2 --- /dev/null +++ b/src/commands/wrapHelpers.ts @@ -0,0 +1,74 @@ +import * as vscode from "vscode"; + +export const helpers = ['dd', 'dump', 'collect', 'str']; + +export const openSubmenuCommand = async () => { + const choice = await vscode.window.showQuickPick( + helpers.map((helper: string) => { + return { + label: `with ${helper}(...)`, + command: `laravel.wrapHelpers.${helper}` + }; + }), + { + placeHolder: 'Choose a wrap' + } + ); + + if (choice) { + vscode.commands.executeCommand(choice.command); + } +}; + +export const wrapSelectionCommand = (wrapper: string) => { + const editor = vscode.window.activeTextEditor; + + if (!editor) { + return; + } + + const selection = editor.selection; + let selectedText = editor.document.getText(selection); + const hasSemicolon = selectedText.at(-1) === ';'; + + if (hasSemicolon) { + selectedText = selectedText.slice(0, -1); + } + + let transformed = `${wrapper}(${selectedText})`; + + if (hasSemicolon) { + transformed += ';'; + } + + editor.edit(editBuilder => { + editBuilder.replace(selection, transformed); + }); +}; + +export const unwrapSelectionCommand = () => { + const editor = vscode.window.activeTextEditor; + + if (!editor) { + return; + } + + const selection = editor.selection; + const selectedText = editor.document.getText(selection); + + const match = selectedText.match(/^([a-zA-Z0-9_]+)\(/); + + if (!match) { + return; + } + + if (!helpers.includes(match[1])) { + return; + } + + const transformed = selectedText.replace(/[a-zA-Z0-9_]+\(([\s\S]+)\)(?!\))/, '$1'); + + editor.edit(editBuilder => { + editBuilder.replace(selection, transformed); + }); +}; \ No newline at end of file diff --git a/src/extension.ts b/src/extension.ts index 0cb41b68..ec466f53 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -7,6 +7,7 @@ import { LanguageClient } from "vscode-languageclient/node"; import { bladeSpacer } from "./blade/bladeSpacer"; import { initClient } from "./blade/client"; import { openFileCommand } from "./commands"; +import { helpers, openSubmenuCommand, unwrapSelectionCommand, wrapSelectionCommand } from "./commands/wrapHelpers"; import { configAffected } from "./support/config"; import { collectDebugInfo } from "./support/debug"; import { @@ -188,6 +189,11 @@ export async function activate(context: vscode.ExtensionContext) { }, ), vscode.commands.registerCommand("laravel.open", openFileCommand), + vscode.commands.registerCommand("laravel.wrapHelpers", openSubmenuCommand), + vscode.commands.registerCommand("laravel.wrapHelpers.unwrap", unwrapSelectionCommand), + ...helpers.map((helper: string) => { + return vscode.commands.registerCommand(`laravel.wrapHelpers.${helper}`, () => wrapSelectionCommand(helper)); + }) ); collectDebugInfo();