2016-10-14 7 views
0

Я являюсь автором и автором статьи 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 репо), когда он, очевидно, должно не.

Как я могу убедиться, что только одно слово, без пробелов, из репозиториев сопоставлено? Я пытался модифицировать регулярные выражения разными способами, но безрезультатно.

+0

Из-за отсутствия ответов :) Я, наконец, взял другой путь и сумел правильно раскрасить мою строку. Я оставлю вопрос открытым для любого, чтобы в конечном итоге дать ответ. –

ответ

0

Я считаю, что здесь есть недоразумение. Правила сопоставляются в том порядке, в котором они определены, а более поздние правила переопределяют выходящий стиль, если они соответствуют одной и той же строке (части) в качестве более раннего правила. Следовательно, попробуйте изменить порядок своих правил таким образом, чтобы на первом месте появилось более общее правило (правило строки), а затем раскрашивание правил вашего ключевого слова.

Кстати, знаете ли вы, что вы также можете использовать JSON для определения своих правил, что гораздо проще для чтения, чем для XML? Например, см. my syntax file here.