Skip to content

Commit 841a2cd

Browse files
committed
feat(emmet): exclude simple uppercase suggestions when strict emmet is enabled (disabled by default)
1 parent 9828689 commit 841a2cd

File tree

2 files changed

+34
-24
lines changed

2 files changed

+34
-24
lines changed

src/configurationType.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ export type Configuration = {
211211
* We already change sorting of suggestions, but enabling this option will also make:
212212
* - removing `id` from input suggestions
213213
* - simplify textarea
214+
* - removes uppercase suggestions e.g. `Foo` (write React component name after `<` for proper completions)
214215
* Doesn't change preview text for now!
215216
* @default false
216217
*/

src/emmet.ts

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { compact } from '@zardoy/utils'
12
import * as vscode from 'vscode'
23
import { getExtensionSetting, registerExtensionCommand } from 'vscode-framework'
34
import { EmmetResult } from '../typescript/src/ipcTypes'
@@ -61,14 +62,16 @@ export const registerEmmet = async () => {
6162
})
6263
return {
6364
items:
64-
improveEmmetCompletions<any>(normalizedCompletions)?.map(({ label, insertText, rangeLength, documentation, sortText }) => ({
65-
label: { label, description: 'EMMET' },
66-
// sortText is overrided if its a number
67-
sortText: Number.isNaN(+sortText) ? '075' : sortText,
68-
insertText: new vscode.SnippetString(insertText),
69-
range: new vscode.Range(position.translate(0, -rangeLength), position),
70-
documentation: documentation as string,
71-
})) ?? [],
65+
improveEmmetCompletions<any>(normalizedCompletions, sendToEmmet)?.map(
66+
({ label, insertText, rangeLength, documentation, sortText }) => ({
67+
label: { label, description: 'EMMET' },
68+
// sortText is overrided if its a number
69+
sortText: Number.isNaN(+sortText) ? '075' : sortText,
70+
insertText: new vscode.SnippetString(insertText),
71+
range: new vscode.Range(position.translate(0, -rangeLength), position),
72+
documentation: documentation as string,
73+
}),
74+
) ?? [],
7275
isIncomplete: true,
7376
}
7477
},
@@ -124,27 +127,33 @@ function getEmmetConfiguration() {
124127
}
125128
}
126129

127-
const improveEmmetCompletions = <T extends Record<'label' | 'insertText' | 'sortText', string>>(items: T[] | undefined) => {
130+
const improveEmmetCompletions = <T extends Record<'label' | 'insertText' | 'sortText', string>>(items: T[] | undefined, sendedText: string) => {
128131
if (!items) return
129132
// TODO-low make to tw= by default when twin.macro is installed?
130133
const dotSnippetOverride = getExtensionSetting('jsxEmmet.dotOverride')
131134
const modernEmmet = getExtensionSetting('jsxEmmet.modernize')
132135

133-
return items.map(item => {
134-
const { label } = item
135-
if (label === '.' && typeof dotSnippetOverride === 'string') item.insertText = dotSnippetOverride
136-
// change sorting to most used
137-
if (['div', 'b'].includes(label)) item.sortText = '070'
138-
if (label.startsWith('btn')) item.sortText = '073'
139-
if (modernEmmet) {
140-
// remove id from input suggestions
141-
if (label === 'inp' || label.startsWith('input:password')) {
142-
item.insertText = item.insertText.replace(/ id="\${\d}"/, '')
143-
}
136+
return compact(
137+
items.map(item => {
138+
const { label } = item
139+
if (label === '.' && typeof dotSnippetOverride === 'string') item.insertText = dotSnippetOverride
140+
// change sorting to most used
141+
if (['div', 'b'].includes(label)) item.sortText = '070'
142+
if (label.startsWith('btn')) item.sortText = '073'
143+
if (modernEmmet) {
144+
// note that it still allows to use Item* pattern
145+
if (sendedText[0] && sendedText[0] !== sendedText[0].toLowerCase() && item.insertText === `<${sendedText}>\${0}</${sendedText}>`) {
146+
return undefined
147+
}
148+
// remove id from input suggestions
149+
if (label === 'inp' || label.startsWith('input:password')) {
150+
item.insertText = item.insertText.replace(/ id="\${\d}"/, '')
151+
}
144152

145-
if (label === 'textarea') item.insertText = `<textarea>$1</textarea>`
146-
}
153+
if (label === 'textarea') item.insertText = `<textarea>$1</textarea>`
154+
}
147155

148-
return item
149-
})
156+
return item
157+
}),
158+
)
150159
}

0 commit comments

Comments
 (0)