Skip to content

Commit b44a664

Browse files
Transform haml
1 parent 0f2d476 commit b44a664

File tree

1 file changed

+40
-43
lines changed

1 file changed

+40
-43
lines changed

src/languages/haml.js

Lines changed: 40 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { insertBefore } from '../util/language-util.js';
21
import ruby from './ruby.js';
32

43
/** @type {import('../types.d.ts').LanguageProto<'haml'>} */
@@ -13,7 +12,43 @@ export default {
1312
code |
1413
*/
1514

16-
const haml = {
15+
const filter_pattern =
16+
'((?:^|\\r?\\n|\\r)([\\t ]*)):{{filter_name}}(?:(?:\\r?\\n|\\r)(?:\\2[\\t ].+|\\s*?(?=\\r?\\n|\\r)))+';
17+
18+
// Non exhaustive list of available filters and associated languages
19+
const filters = [
20+
'css',
21+
{ filter: 'coffee', language: 'coffeescript' },
22+
'erb',
23+
'javascript',
24+
'less',
25+
'markdown',
26+
'ruby',
27+
'scss',
28+
'textile',
29+
];
30+
31+
const all_filters = /** @type {import('../types.d.ts').GrammarTokens} */ ({});
32+
for (const f of filters) {
33+
const { filter, language } = typeof f === 'string' ? { filter: f, language: f } : f;
34+
all_filters['filter-' + filter] = {
35+
pattern: RegExp(filter_pattern.replace('{{filter_name}}', () => filter)),
36+
lookbehind: true,
37+
inside: {
38+
'filter-name': {
39+
pattern: /^:[\w-]+/,
40+
alias: 'symbol',
41+
},
42+
'text': {
43+
pattern: /[\s\S]+/,
44+
alias: [language, 'language-' + language],
45+
inside: language,
46+
},
47+
},
48+
};
49+
}
50+
51+
return {
1752
// Multiline stuff should appear before the rest
1853

1954
'multiline-comment': {
@@ -115,47 +150,9 @@ export default {
115150
pattern: /((?:^|\r?\n|\r)[\t ]*)[~=\-&!]+/,
116151
lookbehind: true,
117152
},
153+
$insertBefore: {
154+
'filter': all_filters,
155+
},
118156
};
119-
120-
const filter_pattern =
121-
'((?:^|\\r?\\n|\\r)([\\t ]*)):{{filter_name}}(?:(?:\\r?\\n|\\r)(?:\\2[\\t ].+|\\s*?(?=\\r?\\n|\\r)))+';
122-
123-
// Non exhaustive list of available filters and associated languages
124-
const filters = [
125-
'css',
126-
{ filter: 'coffee', language: 'coffeescript' },
127-
'erb',
128-
'javascript',
129-
'less',
130-
'markdown',
131-
'ruby',
132-
'scss',
133-
'textile',
134-
];
135-
136-
/** @type {import('../types.d.ts').Grammar} */
137-
const all_filters = {};
138-
for (const f of filters) {
139-
const { filter, language } = typeof f === 'string' ? { filter: f, language: f } : f;
140-
all_filters['filter-' + filter] = {
141-
pattern: RegExp(filter_pattern.replace('{{filter_name}}', () => filter)),
142-
lookbehind: true,
143-
inside: {
144-
'filter-name': {
145-
pattern: /^:[\w-]+/,
146-
alias: 'symbol',
147-
},
148-
'text': {
149-
pattern: /[\s\S]+/,
150-
alias: [language, 'language-' + language],
151-
inside: language,
152-
},
153-
},
154-
};
155-
}
156-
157-
insertBefore(haml, 'filter', all_filters);
158-
159-
return haml;
160157
},
161158
};

0 commit comments

Comments
 (0)