2016-10-05 8 views
1

Я работаю над пользовательским синтаксисом, выделяя и копируя несколько фрагментов из синтаксиса HTML, так как эта часть очень похожа. Я застрял, пытаясь понять, как выделить текст внутри тегов. Вот мое определение:Подсветка выделенного синтаксиса Sublime Text

- match: "(</?)([a-zA-Z0-9:]+)" 
    captures: 
    1: punctuation.definition.tag.begin.html 
    2: entity.name.tag.other.html 
    push: 
    - meta_scope: meta.tag.other.html 
    - match: '>' 
     scope: punctuation.definition.tag.end.html 
     pop: true 
    - match: '.' 
     scope: string.quoted.single.html 

выборочного текст:

<file bash> 
Some bash code block 
Some bash code block 
</file> 

Мой код выделяет скобку <>, в file и bash ключевые словах, но я не могу понять, как добавить цвета к блоку внутри , В конце концов, я хочу, чтобы это было как комментарий блока или что-то подобное, так что это будет выделяться. Какие-либо предложения?

Мне нужно решение, которое позволяет добавить комментарий, выделяющий теги, которые не имеют закрывающего тега. Например, в разметке, с которой я работаю, есть определенные теги, которые не используют закрытие, например <tag without close>, у которых нет </tag>. Любой способ добавить исключение в регулярное выражение только для работы, если есть открытые и закрытые теги, но не когда есть только открытый тег?

<tag without close> 
This should not be a comment. 

<file bash> 
This should be a comment. 
</file> 

This also should not be a comment. 

только небольшой выбор тегов будет использоваться как <tag> выше, в основном для метаданных.

ответ

1

Один из способов, основанный на принципе interiors of both <style> and <script> are managed, заключается в использовании with_prototype, который имеет pop.

- match: '(?:^\s+)?(<)([a-zA-Z0-9:]+)\b(?![^>]*/>)' 
    captures: 
    1: punctuation.definition.tag.begin.html 
    2: entity.name.tag.other.html 
    push: 
    - match: '(</)(\2)(>)' 
     captures: 
     1: punctuation.definition.tag.begin.html 
     2: entity.name.tag.other.html 
     3: punctuation.definition.tag.end.html 
     pop: true 
    - match: '>' 
     scope: punctuation.definition.tag.end.html 
     push: 
     - match: '.' 
      scope: comment.block.html 
     with_prototype: 
     - match: (?=</\2) 
      pop: true 
     - include: main 
    - match: '.' 
     scope: string.quoted.single.html 

Обратите внимание, что ([a-zA-Z0-9:]+) здесь соответствие любого допустимого имени тега, как вы были в вашем вопросе, и \2 используются, чтобы соответствовать этой группе позже, как в непосредственной развязке match состояния и в состоянии with_prototype. with_protoype определяет шаблоны, которые применяются ко всему в текущем контексте, поэтому мы используем его, чтобы удостовериться, что выделение комментария -экспекта после того, как мы достигнем </file>, вместо того, чтобы рассматриваться как часть комментария.

В with_prototype инструкция - include: main гарантирует, что любые теги в вашем комментарии похожи на внешние теги <file>. Например, <hello> ниже действует так же, как <file>.

<file bash> 
Some bash code block 
<hello stuff> 
Some bash code block 
</hello> 
Some bash code block 
</file> 

Если у вас есть теги, которые не имеют соответствия конечных тегов, вы можете переопределить это поведение, определяя специфическое поведение для этих тегов выше в стеке, например, так:

- match: '(?:^\s+)?(<)(hello)\b(?![^>]*/>)' 
    captures: 
    1: punctuation.definition.tag.begin.html 
    2: entity.name.tag.other.html 
    push: 
    - match: '>' 
     scope: punctuation.definition.tag.end.html 
     pop: true 
    - match: '.' 
     scope: string.quoted.single.html 

Если это раньше, чем строка match: '(?:^\s+)?(<)([a-zA-Z0-9:]+)\b(?![^>]*/>)', любые теги <hello> не будут вызывать подсветку комментария.

Этот текст не является комментатором.block.html. Некоторого Баш блок код Некоторые блоки коды Баша Некоторого Баш блока кода

+0

Вау, это фантастика и путь более продвинутый, чем то, что я искал! Также оцените объяснение, это помогает учиться. Этот код отлично работает в 99% случаев, за исключением случаев, когда закрывающий тег отсутствует. – user1781482

+0

В каком сценарии вы хотели бы выделить блок, как если бы это комментарий без наличия закрывающего тега? @ user1781482 –

+0

Я предполагаю, что идея заключается в том, чтобы угрожать всем, что существует между тегом open и close в качестве блока. Если есть только открытый тег, но не тег close, то не будет никакого блока. – user1781482