Я являюсь автором и автором статьи WoW Bundle for Visual Studio Code.Правильно скопированные цитаты (строки) констант в tmLanguage?
В API-интерфейсе Blizzard World of Warcraft многие константы, такие как имена событий, обработчики сценариев виджетов или некоторые параметры функции, являются строками. Эти строки могут быть одно- или двухцилиндровыми, а некоторые (не все) из них нечувствительны к регистру. Например:
local myFrame = CreateFrame('Button', nil, UIParent)
myFrame:SetPoint('CENTER', 0, 0)
MyFrame:RegisterEvent('PLAYER_ENTERING_WORLD')
myFrame:SetScript('OnEvent', myEventHandler)
размаху эти специальные строки в моем файле tmLanguage, я объявляю их в хранилище:
<!-- This is only an excerpt, there are many more of these :) -->
<key>repository</key>
<dict>
<key>string-parameters</key>
<dict>
<key>match</key>
<string>(?i)(Button|Frame|Slider|StatusBar|TOP|LEFT|BOTTOM|RIGHT|BACKGROUND|ARTWORK|LOW|MEDIUM|HIGH)</string>
<key>name</key>
<string>support.constant.wow.parameter.lua</string>
</dict>
<key>event-names</key>
<dict>
<key>match</key>
<string>(PLAYER_ENTERING_WORLD|ADDON_LOADED)</string>
<key>name</key>
<string>support.constant.wow.event.lua</string>
</dict>
<key>script-handlers</key>
<dict>
<key>match</key>
<string>(OnLoad|OnShow|OnEvent)</string>
<key>name</key>
<string>support.constant.wow.hander.lua</string>
</dict>
</dict>
и я включил их в окружающий объем:
<dict>
<key>name</key>
<string>support.constant.wow.quoted.single.lua</string>
<key>begin</key>
<string>'</string>
<key>beginCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.constant.begin.lua</string>
</dict>
</dict>
<key>end</key>
<string>'</string>
<key>endCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.constant.end.lua</string>
</dict>
</dict>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#string-parameters</string>
</dict>
<dict>
<key>include</key>
<string>#event-names</string>
</dict>
<dict>
<key>include</key>
<string>#script-handlers</string>
</dict>
</array>
</dict>
Конечно, у меня есть два из этих блоков (один для одинарных кавычек, один для двойных кавычек), и они объявляются до регулярных блоков строк, чтобы сделать su они имеют преимущество.
Итак, это работает ... почти.
В декларациях, как:
local myFrame = CreateFrame(' Frame ', nil, UIParent) -- Notice the spaces around Frame
или, что еще хуже:
local myFrame = CreateFrame('Frame Type That Does Not Exist', nil, UIParent)
вся строка еще обрабатывается как действует (так как он содержит слово Frame
от #string-parameters
репо), когда он, очевидно, должно не.
Как я могу убедиться, что только одно слово, без пробелов, из репозиториев сопоставлено? Я пытался модифицировать регулярные выражения разными способами, но безрезультатно.
Из-за отсутствия ответов :) Я, наконец, взял другой путь и сумел правильно раскрасить мою строку. Я оставлю вопрос открытым для любого, чтобы в конечном итоге дать ответ. –