Skip to content

Commit f075288

Browse files
committed
wip
Remove remaining Twig references, add config setting, general refactor
1 parent 71bbba1 commit f075288

File tree

3 files changed

+98
-98
lines changed

3 files changed

+98
-98
lines changed

package.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,11 @@
110110
"default": true,
111111
"description": "Show popups for errors."
112112
},
113+
"Laravel.blade.autoSpaceTags": {
114+
"type": "boolean",
115+
"default": true,
116+
"description": "Automatically add spacing around Blade echo and comment tags."
117+
},
113118
"Laravel.appBinding.diagnostics": {
114119
"type": "boolean",
115120
"default": true,

src/blade/bladeSpacer.ts

Lines changed: 91 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -1,134 +1,128 @@
1+
import { config } from "@src/support/config";
12
import {
2-
SnippetString,
3+
Position,
34
Range,
4-
TextEditor,
5+
SnippetString,
56
TextDocument,
7+
TextDocumentChangeEvent,
68
TextDocumentContentChangeEvent,
7-
commands,
8-
TextDocumentChangeEvent
9-
} from 'vscode';
9+
TextEditor,
10+
} from "vscode";
1011

1112
const TAG_DOUBLE = 0;
1213
const TAG_UNESCAPED = 1;
1314
const TAG_COMMENT = 2;
1415

15-
const charsForChange = (doc: TextDocument, change: TextDocumentContentChangeEvent) => {
16-
if (change.text === '!') {
17-
return 2;
18-
} else if (change.text === '-') {
19-
let start = change.range.start;
20-
let end = change.range.start;
21-
22-
try {
23-
start = start.translate(0, -2);
24-
end = end.translate(0, -1);
25-
} catch (error) {
26-
// VS Code doesn't like negative numbers passed
27-
// to translate (even though it works fine), so
28-
// this block prevents debug console errors
29-
}
16+
const snippets: Record<number, string> = {
17+
[TAG_DOUBLE]: "{{ ${1:${TM_SELECTED_TEXT/[{}]//g}} }}$0",
18+
[TAG_UNESCAPED]: "{!! ${1:${TM_SELECTED_TEXT/[{} !]//g}} !!}$0",
19+
[TAG_COMMENT]: "{{-- ${1:${TM_SELECTED_TEXT/(--)|[{} ]//g}} --}}$0",
20+
};
3021

31-
let textRange = doc.getText(new Range(start, end));
32-
if (textRange === ' ') {
33-
return 4;
34-
}
35-
return 3;
22+
const triggers = ["{}", "!", "-", "{"];
23+
24+
const regexes = [
25+
/({{(?!\s|-))(.*?)(}})/,
26+
/({!!(?!\s))(.*?)?(}?)/,
27+
/({{[\s]?--)(.*?)?(}})/,
28+
];
29+
30+
const translate = (position: Position, offset: number) => {
31+
try {
32+
return position.translate(0, offset);
33+
} catch (error) {
34+
// VS Code doesn't like negative numbers passed
35+
// to translate (even though it works fine), so
36+
// this block prevents debug console errors
3637
}
37-
return 1;
38+
39+
return position;
3840
};
3941

40-
const spaceReplace = (editor: TextEditor, tagType: number, ranges: Array<Range>) => {
41-
const snippets: Record<number, string> = {
42-
[TAG_DOUBLE]: '{{ ${1:${TM_SELECTED_TEXT/[{}]//g}} }}$0',
43-
[TAG_UNESCAPED]: '{!! ${1:${TM_SELECTED_TEXT/[{} !]//g}} !!}$0',
44-
[TAG_COMMENT]: '{{-- ${1:${TM_SELECTED_TEXT/(--)|[{} ]//g}} --}}$0',
45-
};
46-
47-
const snippet = snippets[tagType];
48-
if (snippet) {
49-
return editor.insertSnippet(new SnippetString(snippet), ranges);
42+
const charsForChange = (
43+
doc: TextDocument,
44+
change: TextDocumentContentChangeEvent,
45+
) => {
46+
if (change.text === "!") {
47+
return 2;
48+
}
49+
50+
if (change.text !== "-") {
51+
return 1;
5052
}
51-
};
5253

54+
const start = translate(change.range.start, -2);
55+
const end = translate(change.range.start, -1);
5356

54-
export const bladeSpacer = async (e: TextDocumentChangeEvent, editor?: TextEditor) => {
55-
if (!editor) {
57+
return doc.getText(new Range(start, end)) === " " ? 4 : 3;
58+
};
59+
60+
export const bladeSpacer = async (
61+
e: TextDocumentChangeEvent,
62+
editor?: TextEditor,
63+
) => {
64+
if (
65+
!config("blade.autoSpaceTags", true) ||
66+
!editor ||
67+
editor.document.fileName.indexOf(".blade.php") === -1
68+
) {
5669
return;
5770
}
5871

59-
const triggers = ['{}', '!', '-', '{', '%', '#'];
60-
const expressions = [
61-
/({{(?!\s|-))(.*?)(}})/,
62-
/({!!(?!\s))(.*?)?(}?)/,
63-
/({{[\s]?--)(.*?)?(}})/,
64-
/({%(?!\s))(.*?)?(}?)/,
65-
/({#(?!\s))(.*?)?(}?)/
66-
];
6772
let tagType: number = -1;
73+
let ranges: Range[] = [];
74+
let offsets: number[] = [];
6875

69-
let ranges: Array<Range> = [];
70-
let offsets: Array<number> = [];
71-
72-
// changes (per line) come in right-to-left when we need them left-to-right
76+
// Changes (per line) come in right-to-left when we need them left-to-right
7377
const changes = e.contentChanges.slice().reverse();
7478

7579
changes.forEach((change) => {
76-
if (triggers.indexOf(change.text) !== -1) {
77-
if (!offsets[change.range.start.line]) {
78-
offsets[change.range.start.line] = 0;
79-
}
80+
if (triggers.indexOf(change.text) === -1) {
81+
return;
82+
}
8083

81-
let startOffset = offsets[change.range.start.line] - charsForChange(e.document, change);
82-
let start = change.range.start;
83-
try {
84-
start = start.translate(0, startOffset);
85-
} catch (error) {
86-
// VS Code doesn't like negative numbers passed
87-
// to translate (even though it works fine), so
88-
// this block prevents debug console errors
89-
}
84+
if (!offsets[change.range.start.line]) {
85+
offsets[change.range.start.line] = 0;
86+
}
87+
88+
const startOffset =
89+
offsets[change.range.start.line] -
90+
charsForChange(e.document, change);
9091

91-
let lineEnd = e.document.lineAt(start.line).range.end;
92+
const start = translate(change.range.start, startOffset);
93+
const lineEnd = e.document.lineAt(start.line).range.end;
9294

93-
for (let i = 0; i < expressions.length; i++) {
94-
// if we typed a - or a !, don't consider the "double" tag type
95-
if (i === TAG_DOUBLE && ['-', '!'].indexOf(change.text) !== -1) {
96-
continue;
97-
}
95+
for (let i = 0; i < regexes.length; i++) {
96+
// If we typed a - or a !, don't consider the "double" tag type
97+
if (i === TAG_DOUBLE && ["-", "!"].indexOf(change.text) !== -1) {
98+
continue;
99+
}
98100

99-
// Only look at unescaped tags if we need to
100-
if (i === TAG_UNESCAPED && change.text !== '!') {
101-
continue;
102-
}
101+
// Only look at unescaped tags if we need to
102+
if (i === TAG_UNESCAPED && change.text !== "!") {
103+
continue;
104+
}
103105

104-
// Only look at unescaped tags if we need to
105-
if (i === TAG_COMMENT && change.text !== '-') {
106-
continue;
107-
}
106+
// Only look at comment tags if we need to
107+
if (i === TAG_COMMENT && change.text !== "-") {
108+
continue;
109+
}
108110

109-
let tag = expressions[i].exec(e.document.getText(new Range(start, lineEnd)));
111+
const tag = regexes[i].exec(
112+
e.document.getText(new Range(start, lineEnd)),
113+
);
110114

111-
if (tag) {
112-
tagType = i;
113-
ranges.push(new Range(start, start.translate(0, tag[0].length)));
114-
offsets[start.line] += tag[1].length;
115-
}
115+
if (tag) {
116+
tagType = i;
117+
ranges.push(
118+
new Range(start, start.translate(0, tag[0].length)),
119+
);
120+
offsets[start.line] += tag[1].length;
116121
}
117122
}
118123
});
119124

120-
if (ranges.length > 0) {
121-
await spaceReplace(editor, tagType, ranges)?.then(async () => {
122-
try {
123-
await commands.executeCommand('extension.vim_escape');
124-
await commands.executeCommand('extension.vim_right');
125-
await commands.executeCommand('extension.vim_insert');
126-
} catch (error) {
127-
// We don't care if this fails, because it means the user
128-
// does NOT have the VSCodeVim extension installed
129-
}
130-
});
131-
ranges = [];
132-
tagType = -1;
125+
if (ranges.length > 0 && snippets[tagType]) {
126+
editor.insertSnippet(new SnippetString(snippets[tagType]), ranges);
133127
}
134128
};

src/support/config.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ type ConfigKey =
99
| "tests.docker.enabled"
1010
| "tests.ssh.enabled"
1111
| "tests.suiteSuffix"
12-
| "showErrorPopups";
12+
| "showErrorPopups"
13+
| "blade.autoSpaceTags";
1314

1415
export const config = <T>(key: ConfigKey, fallback: T): T =>
1516
vscode.workspace.getConfiguration("Laravel").get<T>(key, fallback);

0 commit comments

Comments
 (0)