Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Avatar for KuCalc : devops.
Download
50650 views
1
// CodeMirror, copyright (c) by Marijn Haverbeke and others
2
// Distributed under an MIT license: http://codemirror.net/LICENSE
3
// derived from https://github.com/notepadqq/CodeMirror/blob/d790fc39c1a5f06aa66415110b8ebe3026df665a/mode/makefile/makefile.js
4
5
CodeMirror.defineMode('makefile', function() {
6
7
var words = {};
8
9
function tokenBase(stream, state) {
10
if (stream.eatSpace()) return null;
11
12
var sol = stream.sol();
13
var ch = stream.next();
14
var cur = stream.current();
15
16
if (ch === '@') { return "atom"; }
17
18
if (sol) {
19
20
if (ch === '#') {
21
if (stream.eat('!')) {
22
stream.skipToEnd();
23
return 'meta';
24
}
25
stream.skipToEnd();
26
return 'tag';
27
}
28
29
// if, ifdef, ifndef, ifeq, ifneq
30
if (ch === 'i' && (stream.match('f ') || stream.match('fdef ') || stream.match('fndef ') || stream.match('feq (') || stream.match('fneq ('))) {
31
stream.skipToEnd();
32
return "bracket";
33
}
34
// else, endif
35
if (ch === 'e' && (stream.match('lse') || stream.match('ndif'))) { return "bracket"; }
36
// include
37
if (ch === 'i' && stream.match('nclude ')) { return "string"; }
38
// -include
39
if (ch === '-' && stream.match('include ')) { return "string"; }
40
// vpath
41
if (ch === 'v' && stream.match('path ')) { return "string"; }
42
43
// makros
44
if ((stream.match(/^[\w]+[\s]+/) || stream.match(/^[\w]+/)) &&
45
(stream.peek() === '=' ||
46
((stream.match('?') || stream.match('+') || stream.match('-')) && stream.peek() === '='))
47
) { return "variable-2"; }
48
49
// Makefile targets
50
if ( stream.eat(':') || stream.match(/^[\w]+:/) || stream.match(/^(.)+[\w]+:/) ||
51
(ch === '$' && stream.match(/^\(+[\w]+\)+/) && stream.eat(':'))
52
) {
53
if (stream.peek() === '=') {
54
return "variable-2";
55
} else {
56
return "header";
57
}
58
}
59
60
} else {
61
62
if (ch === '*') { return "quote"; }
63
if (ch === '%') { return 'atom'; }
64
if (ch === '\\' && stream.eol()) { return "comment"; }
65
if (ch === '#') {
66
stream.skipToEnd();
67
return 'tag';
68
}
69
70
if ((stream.eat(':') || stream.eat('+')) && stream.peek('=')) { return "variable-2"; }
71
72
if (ch === '$' && stream.eat('$') && stream.match(/^[\w]+/)) { return "variable-2"; }
73
if (ch === '$' && stream.eat('(')) {
74
state.tokens.unshift(tokenDollar);
75
return tokenize(stream, state);
76
}
77
if (ch === '$' && stream.eat('{')) {
78
state.tokens.unshift(tokenDollarB);
79
return tokenize(stream, state);
80
}
81
if (ch === '$' && (stream.eat('@') || stream.eat('<') || stream.eat('^'))) { return "quote"; }
82
83
if (ch === '\'' || ch === '"' || ch === '`') {
84
state.tokens.unshift(tokenString(ch));
85
return tokenize(stream, state);
86
}
87
}
88
89
stream.eatWhile(/[\w-]/);
90
return words.hasOwnProperty(cur) ? words[cur] : null;
91
}
92
93
function tokenString(quote) {
94
return function(stream, state) {
95
var next, end = false, escaped = false;
96
while ((next = stream.next()) != null) {
97
if (next === quote && !escaped) {
98
end = true;
99
break;
100
}
101
}
102
if (end || !escaped) {
103
state.tokens.shift();
104
}
105
return ((quote === ')' || quote === '}') ? 'variable-2' : 'string');
106
};
107
};
108
109
var tokenDollar = function(stream, state) {
110
if (state.tokens.length > 1) stream.eat('$');
111
state.tokens[0] = tokenString(')');
112
return tokenize(stream, state);
113
};
114
var tokenDollarB = function(stream, state) {
115
if (state.tokens.length > 1) stream.eat('$');
116
state.tokens[0] = tokenString('}');
117
return tokenize(stream, state);
118
};
119
120
function tokenize(stream, state) {
121
return (state.tokens[0] || tokenBase) (stream, state);
122
};
123
124
return {
125
startState: function() {return {tokens:[]};},
126
token: function(stream, state) {
127
return tokenize(stream, state);
128
},
129
lineComment: "#"
130
};
131
});
132
133
CodeMirror.defineMIME('text/x-makefile', 'makefile');
134
135
136