Skip to content

Commit d177d94

Browse files
Merge pull request #432 from N1ebieski/Add-a-command-to-refactor-a-class-attribute-in-blade-files-#52
Add commands that refactor class attributes in blade files
2 parents be2466f + 954dadf commit d177d94

File tree

3 files changed

+112
-0
lines changed

3 files changed

+112
-0
lines changed

package.json

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,32 @@
4242
}
4343
],
4444
"contributes": {
45+
"menus": {
46+
"commandPalette": [
47+
{
48+
"command": "laravel.refactorSelectedHtmlClassToBladeDirective",
49+
"when": "editorHasSelection && resourceLangId == blade",
50+
"group": "laravel"
51+
},
52+
{
53+
"command": "laravel.refactorAllHtmlClassesToBladeDirectives",
54+
"when": "resourceLangId == blade",
55+
"group": "laravel"
56+
}
57+
],
58+
"editor/context": [
59+
{
60+
"command": "laravel.refactorSelectedHtmlClassToBladeDirective",
61+
"when": "editorHasSelection && resourceLangId == blade",
62+
"group": "laravel"
63+
},
64+
{
65+
"command": "laravel.refactorAllHtmlClassesToBladeDirectives",
66+
"when": "resourceLangId == blade",
67+
"group": "laravel"
68+
}
69+
]
70+
},
4571
"languages": [
4672
{
4773
"id": "blade",
@@ -82,6 +108,16 @@
82108
"command": "laravel.runPintOnCurrentFile",
83109
"title": "Run Pint on Current File",
84110
"category": "Laravel"
111+
},
112+
{
113+
"command": "laravel.refactorSelectedHtmlClassToBladeDirective",
114+
"title": "Refactor selected HTML class attribute to Blade directive",
115+
"category": "Laravel"
116+
},
117+
{
118+
"command": "laravel.refactorAllHtmlClassesToBladeDirectives",
119+
"title": "Refactor all HTML class attributes to Blade directives",
120+
"category": "Laravel"
85121
}
86122
],
87123
"configuration": {

src/commands/refactorClass.ts

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import * as vscode from "vscode";
2+
3+
const transformClass = (classList: string) => {
4+
const classes = classList
5+
.trim()
6+
.split(/\s+/)
7+
.map((cls) => `'${cls}'`)
8+
.join(", ");
9+
10+
return `@class([${classes}])`;
11+
};
12+
13+
export const refactorAllHtmlClassesToBladeDirectives = () => {
14+
const editor = vscode.window.activeTextEditor;
15+
16+
if (!editor) {
17+
return;
18+
}
19+
20+
const document = editor.document;
21+
const fullText = document.getText();
22+
23+
const transformed = fullText.replace(
24+
/(?<!:)class="(.+?)"/g,
25+
(_, classList) => {
26+
return transformClass(classList);
27+
},
28+
);
29+
30+
const entireRange = new vscode.Range(
31+
document.positionAt(0),
32+
document.positionAt(fullText.length),
33+
);
34+
35+
editor.edit((editBuilder) => {
36+
editBuilder.replace(entireRange, transformed);
37+
});
38+
};
39+
40+
export const refactorSelectedHtmlClassToBladeDirective = () => {
41+
const editor = vscode.window.activeTextEditor;
42+
43+
if (!editor) {
44+
return;
45+
}
46+
47+
const selection = editor.selection;
48+
const selectedText = editor.document.getText(selection);
49+
50+
const match = selectedText.match(/(?<!:)class="(.+?)"/);
51+
52+
if (!match) {
53+
return;
54+
}
55+
56+
const transformed = selectedText.replace(
57+
/(?<!:)class="(.+?)"/,
58+
transformClass(match[1]),
59+
);
60+
61+
editor.edit((editBuilder) => {
62+
editBuilder.replace(selection, transformed);
63+
});
64+
};

src/extension.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ import {
1414
runPintOnDirtyFiles,
1515
runPintOnSave,
1616
} from "./commands";
17+
import {
18+
refactorAllHtmlClassesToBladeDirectives,
19+
refactorSelectedHtmlClassToBladeDirective,
20+
} from "./commands/refactorClass";
1721
import { configAffected } from "./support/config";
1822
import { collectDebugInfo } from "./support/debug";
1923
import {
@@ -213,6 +217,14 @@ export async function activate(context: vscode.ExtensionContext) {
213217
providedCodeActionKinds: [vscode.CodeActionKind.QuickFix],
214218
},
215219
),
220+
vscode.commands.registerCommand(
221+
"laravel.refactorSelectedHtmlClassToBladeDirective",
222+
refactorSelectedHtmlClassToBladeDirective,
223+
),
224+
vscode.commands.registerCommand(
225+
"laravel.refactorAllHtmlClassesToBladeDirectives",
226+
refactorAllHtmlClassesToBladeDirectives,
227+
),
216228
);
217229

218230
collectDebugInfo();

0 commit comments

Comments
 (0)