Hi,
I am working on the language grammar of my bundle and I am running into problems for the following case:
Given:
===== Heading =====
I want to be able to assign a style to the over and underlines and another style to the Heading part.
- "Heading" can be any character (but is always on one line). - The over line is not required and is usually used to indicate the highest level of a heading (but it can be left out completely).
Characters for the over/under lines can be any non alphabet letter but usually one of the following is used:
.,-=+~*"'ยด|
The goal is to at least be able to style the "Heading" text and to include the "Heading" in the symbol list. Also this is used at the top scope definition level so that I can chop up the text into heading sections and text body sections. I would therefore include repository rules for heading sections and other repository rules for the text body sections.
Because TextMate can't handle multiline regexes I found this problem to be unusually hard.
I am also unclear on questions of order within the top level scope definition. If two grammar patterns apply to one text section equally which one is used?
e.g. if I have a patterns array in the top level:
patterns = ( rule1 = { name = 'scope1', match = ... }; rule2 = { name = 'scope2', match = ... }; )
and both apply equally to some text is rule1 used and then overwritten by rule2 so that the text is under scope 'scope2' ?
The help seems to discuss ambiguities like this for theme scope selectors but not for language grammars.
I am also unclear how you can make a regex backreference from an end pattern to a capture group in begin pattern or vice versa. (below I assume it is backslash-1 but I'm not sure).
Also is it possible to define rules for one scope, rules for another and then say everything else is some third scope without needing to define match rules?
Here's what I have so far:
{ scopeName = 'source.sphinx.doc'; fileTypes = ( 'rst', 'rest', 'txt' ); patterns = ( { contentName = 'meta.doctitle.sphinx'; begin = '^((?:=|-|_|~|`|#|"|^|+|*){3,})$'; end = '^(\1)$'; beginCaptures = { 0 = { name = 'markup.doctitle.overline.sphinx'; }; }; endCaptures = { 0 = { name = 'markup.doctitle.underline.sphinx'; }; }; }, { name = 'meta.heading.sphinx'; begin = '^([A-Za-z][^\n]+)$'; end = '^(=|-|_|~|`|#|"|^|+|*{3,})$'; beginCaptures = { 0 = { name = 'markup.heading.sphinx'; }; }; endCaptures = { 0 = { name = 'markup.heading.underline.sphinx'; }; }; }, { contentName = 'meta.paragraph.restructuredtext'; begin = '^(?!=|-|~|`|#|"|^|+|*)([ \t]*)(?=\S)'; end = '^(?!\1(?=\S))'; }, ); };
meta.heading.sphinx is used for
Heading ---------
and meta.doctitle.sphinx should be used for the over/under line Heading case.
A meta.paragraph should then capture everything that isn't meta.heading or meta.doctitle but this has proved problematic to say the least.
I would appreciate it if anyone could share a trick to make this possible or an answer if this is even possible at the moment or not.
Thank you very much for reading!
Andre