@@ -0,0 +1,306 @@
1+%YAML 1.2
2+---
3+# http://www.sublimetext.com/docs/syntax.html
4+name: Ruby Slim
5+file_extensions:
6+ - slim
7+ - skim
8+scope: text.slim
9+contexts:
10+ main:
11+ - match: ^(\s*)(ruby):$
12+ captures:
13+ 2: constant.language.name.ruby.filter.slim
14+ push:
15+ - meta_scope: text.ruby.filter.slim
16+ - match: ^(?!(\1\s)|\s*$)
17+ pop: true
18+ - include: scope:source.ruby
19+ - match: ^(\s*)(javascript):$
20+ captures:
21+ 2: constant.language.name.javascript.filter.slim
22+ push:
23+ - meta_scope: source.js.filter.slim
24+ - match: ^(?!(\1\s)|\s*$)
25+ pop: true
26+ - include: scope:source.js
27+ - match: ^(---)\s*\n
28+ captures:
29+ 1: storage.frontmatter.slim
30+ push:
31+ - meta_scope: source.yaml.meta.slim
32+ - match: ^(---)\s*\n
33+ captures:
34+ 1: storage.frontmatter.slim
35+ pop: true
36+ - include: scope:source.yaml
37+ - match: ^(\s*)(coffee):$
38+ captures:
39+ 2: constant.language.name.coffeescript.filter.slim
40+ push:
41+ - meta_scope: text.coffeescript.filter.slim
42+ - match: ^(?!(\1\s)|\s*$)
43+ pop: true
44+ - include: scope:source.coffee
45+ - match: ^(\s*)(markdown):$
46+ captures:
47+ 2: constant.language.name.markdown.filter.slim
48+ push:
49+ - meta_scope: text.markdown.filter.slim
50+ - match: ^(?!(\1\s)|\s*$)
51+ pop: true
52+ - include: scope:text.html.markdown
53+ - match: ^(\s*)(css):$
54+ captures:
55+ 2: constant.language.name.css.filter.slim
56+ push:
57+ - meta_scope: text.css.filter.slim
58+ - match: ^(?!(\1\s)|\s*$)
59+ pop: true
60+ - include: scope:source.css
61+ - match: ^(\s*)(sass):$
62+ captures:
63+ 2: constant.language.name.sass.filter.slim
64+ push:
65+ - meta_scope: text.sass.filter.slim
66+ - match: ^(?!(\1\s)|\s*$)
67+ pop: true
68+ - include: scope:source.sass
69+ - match: ^(\s*)(scss):$
70+ captures:
71+ 2: constant.language.name.scss.filter.slim
72+ push:
73+ - meta_scope: text.scss.filter.slim
74+ - match: ^(?!(\1\s)|\s*$)
75+ pop: true
76+ - include: scope:source.scss
77+ - match: ^(\s*)(less):$
78+ captures:
79+ 2: constant.language.name.less.filter.slim
80+ push:
81+ - meta_scope: text.less.filter.slim
82+ - match: ^(?!(\1\s)|\s*$)
83+ pop: true
84+ - include: scope:source.less
85+ - match: ^(\s*)(erb):$
86+ captures:
87+ 2: constant.language.name.erb.filter.slim
88+ push:
89+ - meta_scope: text.erb.filter.slim
90+ - match: ^(?!(\1\s)|\s*$)
91+ pop: true
92+ - include: scope:source.erb
93+ - match: ^(! )($|\s.*)
94+ scope: meta.prolog.slim
95+ captures:
96+ 1: punctuation.definition.prolog.slim
97+ - match: ^(\s*)(/)\s*.*$
98+ captures:
99+ 2: comment.line.slash.slim
100+ push:
101+ - meta_scope: comment.block.slim
102+ - match: ^(?!(\1\s)|\s*$)
103+ pop: true
104+ - match: ^\s*(?=-)
105+ push:
106+ - match: $
107+ pop: true
108+ - include: rubyline
109+ - match: (?==+|~)
110+ push:
111+ - match: $
112+ pop: true
113+ - include: rubyline
114+ - include: tag-attribute
115+ - include: embedded-ruby
116+ - match: ^(\s*)(\||')\s*
117+ comment: Verbatim text (can include HTML tags and copied lines)
118+ push:
119+ - match: ^(?!(\1\s)|\s*$)
120+ pop: true
121+ - include: scope:text.html.basic
122+ - include: embedded-ruby
123+ - match: '^\s*(\.|#|[-a-zA-Z0-9]+)([\w-]+)?'
124+ comment: '1 - dot OR hash OR any combination of word, number; 2 - OPTIONAL any combination of word, number, dash or underscore (following a . or'
125+ captures:
126+ 1: entity.name.tag.slim
127+ 2: entity.other.attribute-name.event.slim
128+ push:
129+ - meta_scope: meta.tag
130+ - match: '$|(?!\.|#|:|-|~|/|\}|\]|\*|\s?[\*\{])'
131+ captures:
132+ 1: entity.name.tag.slim
133+ 2: entity.other.attribute-name.event.slim
134+ pop: true
135+ - match: '(:[\w\d]+)+'
136+ comment: XML
137+ push:
138+ - meta_scope: entity.name.tag.slim
139+ - match: $|\s
140+ pop: true
141+ - match: '(:\s)(\.|#|[a-zA-Z0-9]+)([\w-]+)?'
142+ comment: Inline HTML / 1 - colon; 2 - dot OR hash OR any combination of word, number; 3 - OPTIONAL any combination of word, number, dash or underscore (following a . or
143+ captures:
144+ 1: punctuation.definition.tag.end.slim
145+ 2: entity.name.tag.slim
146+ 3: entity.other.attribute-name.event.slim
147+ push:
148+ - match: '$|(?!\.|#|=|-|~|/|\}|\]|\*|\s?[\*\{])'
149+ captures:
150+ 1: punctuation.definition.tag.end.slim
151+ 2: entity.name.tag.slim
152+ 3: entity.other.attribute-name.event.slim
153+ pop: true
154+ - include: root-class-id-tag
155+ - include: tag-attribute
156+ - match: '(\*\{)(?=.*\}|.*\|\s*$)'
157+ comment: Splat attributes
158+ captures:
159+ 1: punctuation.section.embedded.ruby
160+ push:
161+ - meta_scope: source.ruby.embedded.slim
162+ - match: '(\})|$|^(?!.*\|\s*$)'
163+ captures:
164+ 1: punctuation.section.embedded.ruby
165+ pop: true
166+ - include: embedded-ruby
167+ - include: root-class-id-tag
168+ - include: rubyline
169+ - match: /
170+ scope: punctuation.terminator.tag.slim
171+ - match: ^\s*(\\.)
172+ captures:
173+ 1: meta.escape.slim
174+ - match: ^\s*(?=\||')
175+ push:
176+ - match: $
177+ pop: true
178+ - include: embedded-ruby
179+ - include: scope:text.html.basic
180+ - match: '(?=<[\w\d\:]+)'
181+ comment: Inline and root-level HTML tags
182+ push:
183+ - match: $|\/\>
184+ pop: true
185+ - include: scope:text.html.basic
186+ continuation:
187+ - match: '([\\,])\s*\n'
188+ captures:
189+ 1: punctuation.separator.continuation.slim
190+ delimited-ruby-a:
191+ - match: '=\('
192+ push:
193+ - meta_scope: source.ruby.embedded.slim
194+ - match: \)(?=( \w|$))
195+ pop: true
196+ - include: scope:source.ruby.rails
197+ delimited-ruby-b:
198+ - match: '=\['
199+ push:
200+ - meta_scope: source.ruby.embedded.slim
201+ - match: '\](?=( \w|$))'
202+ pop: true
203+ - include: scope:source.ruby.rails
204+ delimited-ruby-c:
205+ - match: '=\{'
206+ push:
207+ - meta_scope: source.ruby.embedded.slim
208+ - match: '\}(?=( \w|$))'
209+ pop: true
210+ - include: scope:source.ruby.rails
211+ embedded-ruby:
212+ - match: '(?<!\\)#\{{1,2}'
213+ captures:
214+ 0: punctuation.section.embedded.ruby
215+ push:
216+ - meta_scope: source.ruby.embedded.html
217+ - match: '\}{1,2}'
218+ captures:
219+ 0: punctuation.section.embedded.ruby
220+ pop: true
221+ - include: scope:source.ruby.rails
222+ entities:
223+ - match: '(&)([a-zA-Z0-9]+|#[0-9]+|#x[0-9a-fA-F]+)(;)'
224+ scope: constant.character.entity.html
225+ captures:
226+ 1: punctuation.definition.entity.html
227+ 3: punctuation.definition.entity.html
228+ - match: '&'
229+ scope: invalid.illegal.bad-ampersand.html
230+ interpolated-ruby:
231+ - match: '=(?=\b)'
232+ push:
233+ - meta_scope: source.ruby.embedded.html
234+ - match: \s|\w$
235+ pop: true
236+ root-class-id-tag:
237+ - match: '(\.|#)([\w\d\-]+)'
238+ captures:
239+ 1: punctuation.separator.key-value.html
240+ 2: entity.other.attribute-name.html
241+ rubyline:
242+ - match: (==|=)(<>|><|<'|'<|<|>)?|-
243+ comment: Hack to thwart Sublime's Ruby highlighter. It thinks do without a variable continues the next line (this can be muted with a / at the end of the line). For things like yields, do is unnecessary without an argument, so this hack will suffice
244+ push:
245+ - meta_scope: meta.line.ruby.slim
246+ - meta_content_scope: source.ruby.embedded.slim
247+ - match: (do\s*\n$)|(?<!\\|,|,\n|\\\n)$
248+ captures:
249+ 1: keyword.control.start-block.ruby
250+ pop: true
251+ - match: '#.*$'
252+ comment: Hack to let ruby comments work in this context properly
253+ scope: comment.line.number-sign.ruby
254+ - include: continuation
255+ - include: scope:source.ruby.rails
256+ string-double-quoted:
257+ - match: (")(?=.*")
258+ captures:
259+ 0: punctuation.definition.string.begin.html
260+ push:
261+ - meta_scope: string.quoted.double.html
262+ - meta_content_scope: meta.toc-list.id.html
263+ - match: '"'
264+ captures:
265+ 0: punctuation.definition.string.end.html
266+ pop: true
267+ - include: embedded-ruby
268+ - include: entities
269+ string-single-quoted:
270+ - match: (')(?=.*')
271+ captures:
272+ 0: punctuation.definition.string.begin.html
273+ push:
274+ - meta_scope: string.quoted.single.html
275+ - meta_content_scope: meta.toc-list.id.html
276+ - match: "'"
277+ captures:
278+ 0: punctuation.definition.string.end.html
279+ pop: true
280+ - include: embedded-ruby
281+ - include: entities
282+ tag-attribute:
283+ - match: '([\w.#_-]+)(=)(?!\s)(true|false|nil)?(\s*\(|\{)?'
284+ captures:
285+ 1: entity.other.attribute-name.event.slim
286+ 2: punctuation.separator.key-value.html
287+ 3: constant.language.slim
288+ push:
289+ - meta_scope: meta.attribute-with-value.slim
290+ - match: '\}|\)|$'
291+ captures:
292+ 1: entity.other.attribute-name.event.slim
293+ 2: punctuation.separator.key-value.html
294+ 3: constant.language.slim
295+ pop: true
296+ - include: tag-stuff
297+ - include: string-double-quoted
298+ - include: string-single-quoted
299+ tag-stuff:
300+ - include: tag-attribute
301+ - include: interpolated-ruby
302+ - include: delimited-ruby-a
303+ - include: delimited-ruby-b
304+ - include: delimited-ruby-c
305+ - include: rubyline
306+ - include: embedded-ruby