-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
98 lines (92 loc) · 2.42 KB
/
index.js
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
import CodeMirror from "codemirror";
CodeMirror.defineMode("zig", function () {
var keywords = {
const: true,
var: true,
extern: true,
packed: true,
export: true,
pub: true,
noalias: true,
inline: true,
comptime: true,
test: true,
fn: true,
usingnamespace: true,
struct: true,
enum: true,
union: true,
if: true,
else: true,
switch: true,
while: true,
for: true,
break: true,
continue: true,
return: true,
defer: true,
errdefer: true,
as: true,
null: true,
};
var isOperatorChar = /[+\-*&%=<>!?|]/;
function tokenBase(stream, state) {
var ch = stream.next();
if (ch == '"') {
state.tokenize = tokenString(ch);
return state.tokenize(stream, state);
}
if (/[\d]/.test(ch)) {
stream.eatWhile(/[\w\.]/);
return "number";
}
if (/[\w_]/.test(ch)) {
stream.eatWhile(/[\w_]/);
var cur = stream.current();
if (keywords.propertyIsEnumerable(cur)) {
return "keyword";
}
return "variable";
}
if (isOperatorChar.test(ch)) {
stream.eatWhile(isOperatorChar);
return "operator";
}
if (ch == "/" && stream.eat("/")) {
stream.skipToEnd();
return "comment";
}
return null;
}
function tokenString(quote) {
return function (stream, state) {
var escaped = false,
next,
end = false;
while ((next = stream.next()) != null) {
if (next == quote && !escaped) {
end = true;
break;
}
escaped = !escaped && next == "\\";
}
if (end || !escaped) {
state.tokenize = tokenBase;
}
return "string";
};
}
return {
startState: function () {
return { tokenize: tokenBase };
},
token: function (stream, state) {
if (stream.eatSpace()) {
return null;
}
var style = state.tokenize(stream, state);
return style;
},
};
});
CodeMirror.defineMIME("text/x-zig", "zig");