-
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
-
105
-
106
-
107
-
108
-
109
-
110
-
111
-
112
-
113
-
114
-
115
-
116
-
117
-
118
-
119
-
120
-
121
-
122
-
123
-
124
-
125
-
126
-
127
-
128
-
129
-
130
-
131
-
132
-
133
-
134
-
135
-
136
-
137
-
138
-
139
-
140
-
141
-
142
-
143
-
144
-
145
-
146
-
147
-
148
-
149
-
150
-
151
-
152
-
153
-
154
-
155
-
156
-
157
-
158
-
159
-
160
-
161
-
162
-
163
-
164
-
165
-
166
-
167
-
168
-
169
-
170
-
171
-
172
-
173
-
174
-
175
-
176
-
177
-
178
-
179
-
180
-
181
-
182
-
183
-
184
-
185
-
186
-
187
-
188
-
189
-
190
-
191
-
192
-
193
-
194
-
195
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE
(function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror"));
else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror"], mod);
else // Plain browser env
mod(CodeMirror);
})(function(CodeMirror) {
"use strict";
function wordRegexp(words) {
return new RegExp("^((" + words.join(")|(") + "))\\b");
};
var builtinArray = [
"Clamp",
"Constructor",
"EnforceRange",
"Exposed",
"ImplicitThis",
"Global", "PrimaryGlobal",
"LegacyArrayClass",
"LegacyUnenumerableNamedProperties",
"LenientThis",
"NamedConstructor",
"NewObject",
"NoInterfaceObject",
"OverrideBuiltins",
"PutForwards",
"Replaceable",
"SameObject",
"TreatNonObjectAsNull",
"TreatNullAs",
"EmptyString",
"Unforgeable",
"Unscopeable"
];
var builtins = wordRegexp(builtinArray);
var typeArray = [
"unsigned", "short", "long", // UnsignedIntegerType
"unrestricted", "float", "double", // UnrestrictedFloatType
"boolean", "byte", "octet", // Rest of PrimitiveType
"Promise", // PromiseType
"ArrayBuffer", "DataView", "Int8Array", "Int16Array", "Int32Array",
"Uint8Array", "Uint16Array", "Uint32Array", "Uint8ClampedArray",
"Float32Array", "Float64Array", // BufferRelatedType
"ByteString", "DOMString", "USVString", "sequence", "object", "RegExp",
"Error", "DOMException", "FrozenArray", // Rest of NonAnyType
"any", // Rest of SingleType
"void" // Rest of ReturnType
];
var types = wordRegexp(typeArray);
var keywordArray = [
"attribute", "callback", "const", "deleter", "dictionary", "enum", "getter",
"implements", "inherit", "interface", "iterable", "legacycaller", "maplike",
"partial", "required", "serializer", "setlike", "setter", "static",
"stringifier", "typedef", // ArgumentNameKeyword except
// "unrestricted"
"optional", "readonly", "or"
];
var keywords = wordRegexp(keywordArray);
var atomArray = [
"true", "false", // BooleanLiteral
"Infinity", "NaN", // FloatLiteral
"null" // Rest of ConstValue
];
var atoms = wordRegexp(atomArray);
CodeMirror.registerHelper("hintWords", "webidl",
builtinArray.concat(typeArray).concat(keywordArray).concat(atomArray));
var startDefArray = ["callback", "dictionary", "enum", "interface"];
var startDefs = wordRegexp(startDefArray);
var endDefArray = ["typedef"];
var endDefs = wordRegexp(endDefArray);
var singleOperators = /^[:<=>?]/;
var integers = /^-?([1-9][0-9]*|0[Xx][0-9A-Fa-f]+|0[0-7]*)/;
var floats = /^-?(([0-9]+\.[0-9]*|[0-9]*\.[0-9]+)([Ee][+-]?[0-9]+)?|[0-9]+[Ee][+-]?[0-9]+)/;
var identifiers = /^_?[A-Za-z][0-9A-Z_a-z-]*/;
var identifiersEnd = /^_?[A-Za-z][0-9A-Z_a-z-]*(?=\s*;)/;
var strings = /^"[^"]*"/;
var multilineComments = /^\/\*.*?\*\//;
var multilineCommentsStart = /^\/\*.*/;
var multilineCommentsEnd = /^.*?\*\//;
function readToken(stream, state) {
// whitespace
if (stream.eatSpace()) return null;
// comment
if (state.inComment) {
if (stream.match(multilineCommentsEnd)) {
state.inComment = false;
return "comment";
}
stream.skipToEnd();
return "comment";
}
if (stream.match("//")) {
stream.skipToEnd();
return "comment";
}
if (stream.match(multilineComments)) return "comment";
if (stream.match(multilineCommentsStart)) {
state.inComment = true;
return "comment";
}
// integer and float
if (stream.match(/^-?[0-9\.]/, false)) {
if (stream.match(integers) || stream.match(floats)) return "number";
}
// string
if (stream.match(strings)) return "string";
// identifier
if (state.startDef && stream.match(identifiers)) return "def";
if (state.endDef && stream.match(identifiersEnd)) {
state.endDef = false;
return "def";
}
if (stream.match(keywords)) return "keyword";
if (stream.match(types)) {
var lastToken = state.lastToken;
var nextToken = (stream.match(/^\s*(.+?)\b/, false) || [])[1];
if (lastToken === ":" || lastToken === "implements" ||
nextToken === "implements" || nextToken === "=") {
// Used as identifier
return "builtin";
} else {
// Used as type
return "variable-3";
}
}
if (stream.match(builtins)) return "builtin";
if (stream.match(atoms)) return "atom";
if (stream.match(identifiers)) return "variable";
// other
if (stream.match(singleOperators)) return "operator";
// unrecognized
stream.next();
return null;
};
CodeMirror.defineMode("webidl", function() {
return {
startState: function() {
return {
// Is in multiline comment
inComment: false,
// Last non-whitespace, matched token
lastToken: "",
// Next token is a definition
startDef: false,
// Last token of the statement is a definition
endDef: false
};
},
token: function(stream, state) {
var style = readToken(stream, state);
if (style) {
var cur = stream.current();
state.lastToken = cur;
if (style === "keyword") {
state.startDef = startDefs.test(cur);
state.endDef = state.endDef || endDefs.test(cur);
} else {
state.startDef = false;
}
}
return style;
}
};
});
CodeMirror.defineMIME("text/x-webidl", "webidl");
});