#regex #visual-studio-code
Вопрос:
Я пытаюсь отобразить миниатюру, когда идентификатор актива зависает над расширением VS-кода.
let disposable = vscode.languages.registerHoverProvider(['lua', 'luau'], { async provideHover(document, position, token) { const range = document.getWordRangeAtPosition(position, /rbxassetid://d /); const word = document.getText(range); const id = /rbxassetid://(d )/.exec(word)?.[1]; console.log(`Found ${id}, fetching thumbnail info...`); const response = await fetch(`lt;roblox-thumbnail-apigt;`); const data = await response.json() as RobloxThumbnailResponse; const image = data.data?.[0]?.imageUrl; console.log(image); const mdString = new vscode.MarkdownString(`Asset: ${id}nlt;img src="${image}" height="150px"gt;`); mdString.supportHtml = true; return new vscode.Hover(mdString); } });
Это работает в основном, но при наведении курсора на что-то, что не соответствует чему-то, например rbxassetid://1818
, все равно будет отображаться миниатюра.
Я использую этот небольшой luautest.luau
скрипт для тестирования своего расширения.
-- some random stuff that isn't using asset ids for i=1, 10 do print(i) end print("rbxassetid://1818") -- an asset id -- some more stuff that isn't using asset ids for i=10, 1, -1 do print(i) end print("rbxassetid://7200003285") -- another asset id -- some more random stuff that isn't using asset ids for i=1, 10 do print(i) end
Зависание над rbxassetid://1818
работами, как и ожидалось. наведение строки на строку 5
Наведение указателя мыши на другой идентификатор актива также работает, как и ожидалось. наведение строки на строку 10
Проблема в том, что при наведении курсора на что-либо еще всегда будет отображаться актив 1818
. зависаю
print
на строке 8
Я не уверен, как исправить это регулярное выражение, чтобы наведение курсора на что-то, что не является идентификатором ресурса, не совпадало с первым идентификатором ресурса в файле.
Комментарии:
1.
rbxassetid://1818
соответствует вашему регулярному выражению.2. Но как бы я сделал так, чтобы он совпадал только в том случае, если он зависает над идентификатором актива? Зависание других вещей все еще совпадает
rbxassetid://1818
, и я не знаю, как это предотвратить.
Ответ №1:
По-видимому document.getWordRangeAtPosition()
, может возвращать неопределенное значение, что, по-видимому, приводит document.getText()
к совпадению всего документа. Я смог решить эту проблему, добавив это после вызова document.getWordRangeAtPosition
.
if (!range) { return; }