-
Notifications
You must be signed in to change notification settings - Fork 1.3k
/
Copy pathcoffeescript.ts
104 lines (94 loc) · 2.37 KB
/
coffeescript.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import { insertBefore } from '../shared/language-util';
import javascript from './javascript';
import type { LanguageProto } from '../types';
export default {
id: 'coffeescript',
require: javascript,
alias: 'coffee',
grammar ({ extend }) {
// Ignore comments starting with { to privilege string interpolation highlighting
const comment = /#(?!\{).+/;
const interpolation = {
pattern: /#\{[^}]+\}/,
alias: 'variable',
};
const coffeescript = extend('javascript', {
'comment': comment,
'string': [
// Strings are multiline
{
pattern: /'(?:\\[\s\S]|[^\\'])*'/,
greedy: true,
},
{
// Strings are multiline
pattern: /"(?:\\[\s\S]|[^\\"])*"/,
greedy: true,
inside: {
'interpolation': interpolation,
},
},
],
'keyword':
/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,
'class-member': {
pattern: /@(?!\d)\w+/,
alias: 'variable',
},
});
insertBefore(coffeescript, 'comment', {
'multiline-comment': {
pattern: /###[\s\S]+?###/,
alias: 'comment',
},
// Block regexp can contain comments and interpolation
'block-regex': {
pattern: /\/{3}[\s\S]*?\/{3}/,
alias: 'regex',
inside: {
'comment': comment,
'interpolation': interpolation,
},
},
});
insertBefore(coffeescript, 'string', {
'inline-javascript': {
pattern: /`(?:\\[\s\S]|[^\\`])*`/,
inside: {
'delimiter': {
pattern: /^`|`$/,
alias: 'punctuation',
},
'script': {
pattern: /[\s\S]+/,
alias: 'language-javascript',
inside: 'javascript',
},
},
},
// Block strings
'multiline-string': [
{
pattern: /'''[\s\S]*?'''/,
greedy: true,
alias: 'string',
},
{
pattern: /"""[\s\S]*?"""/,
greedy: true,
alias: 'string',
inside: {
'interpolation': interpolation,
},
},
],
});
insertBefore(coffeescript, 'keyword', {
// Object property
'property': /(?!\d)\w+(?=\s*:(?!:))/,
});
delete coffeescript['doc-comment'];
delete coffeescript['template-string'];
return coffeescript;
},
} as LanguageProto<'coffeescript'>;