I'm updating my Markdown bundle to better handle GitHub-style fenced code blocks like so:
```ruby foo = { bar: true } ```
The grammar is simple enough for one language:
ruby_block = { begin = '^```ruby.*$'; end = '^```.*$'; patterns = ( { include = 'source.ruby'; } ); };
However, I'd like to support any language. I tried the following, but it doesn't appear to work (and I'm not sure why):
code_block = { begin = '^```(\w+).*$'; end = '^```.*$'; patterns = ( { include = 'source.\1'; } ); };
Is something similar possible / supported?
Thanks!
-Tyson
Can you send me the updated grammar/bundle when finished? :)
Here's the answer: (from: http://blog.macromates.com/2011/format-strings/)
The Case for Replacements
Another form of Format Strings allows you to change the case of a variable reference. If you combine that with the fact that scope nameelements in TextMate 2's Language Grammars are now Format Strings, this allows for nice dynamic scoping tricks.
For example, say we rework Ruby's "here-document" (heredoc) syntax rule to look something like this (simplified) example:
begin = '<<-?(\w+)'; name = 'string.unquoted.${1:/downcase}.ruby'; …
That would mean that a heredoc definition like this:
<<-CSS body { margin: 10px auto; } CSS
would be scoped as meta.here-doc.css.ruby. This allows the injection of the CSS Grammar and automations into the scope meta.here-doc.css. That would mean that you get the proper syntax highlighting of these heredocs and you could trigger CSS Bundle commands while editing them.
As I write this, the ruby grammar still has a dozen rules with a dozen different tokens that include a dozen different languages, so the above is a planned simplification that would allow us to avoid having to upgrade the ruby grammar for new potential here-doc tokens.
The supported case transformations are /upcase, /downcase, and/capitalize. There's also a special /asciify transformation that will transliterate things like "æ" and "ø" into "ae" and "o" respectively as well as remove any remaining non-ASCII characters. The latter is particularly useful when deriving an identifier or label, that needs to be accepted by a language parser, from a heading or comment, which is free-form prose. These transformations can be combined.
Elia
— ☁ @elia http://twitter.com/elia (twitter) ✎ elia@schito.me (gtalk) ☎ (+39) 348/9051393 perlelia@gmail.com (FaceTime)
On Wed, May 9, 2012 at 12:08 AM, Tyson Tate tyson@tysontate.com wrote:
I'm updating my Markdown bundle to better handle GitHub-style fenced code blocks like so:
```ruby foo = { bar: true } ```
The grammar is simple enough for one language:
ruby_block = { begin = '^```ruby.*$'; end = '^```.*$'; patterns = ( { include = 'source.ruby'; } ); };
However, I'd like to support any language. I tried the following, but it doesn't appear to work (and I'm not sure why):
code_block = { begin = '^```(\w+).*$'; end = '^```.*$'; patterns = ( { include = 'source.\1'; } ); };
Is something similar possible / supported?
Thanks!
-Tyson
textmate mailing list textmate@lists.macromates.com http://lists.macromates.com/listinfo/textmate