Mercurial
comparison .cms/lib/codemirror/mode/webidl/webidl.js @ 0:78edf6b517a0 draft
24.10
author | Coffee CMS <info@coffee-cms.ru> |
---|---|
date | Fri, 11 Oct 2024 22:40:23 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:78edf6b517a0 |
---|---|
1 // CodeMirror, copyright (c) by Marijn Haverbeke and others | |
2 // Distributed under an MIT license: https://codemirror.net/5/LICENSE | |
3 | |
4 (function(mod) { | |
5 if (typeof exports == "object" && typeof module == "object") // CommonJS | |
6 mod(require("../../lib/codemirror")); | |
7 else if (typeof define == "function" && define.amd) // AMD | |
8 define(["../../lib/codemirror"], mod); | |
9 else // Plain browser env | |
10 mod(CodeMirror); | |
11 })(function(CodeMirror) { | |
12 "use strict"; | |
13 | |
14 function wordRegexp(words) { | |
15 return new RegExp("^((" + words.join(")|(") + "))\\b"); | |
16 }; | |
17 | |
18 var builtinArray = [ | |
19 "Clamp", | |
20 "Constructor", | |
21 "EnforceRange", | |
22 "Exposed", | |
23 "ImplicitThis", | |
24 "Global", "PrimaryGlobal", | |
25 "LegacyArrayClass", | |
26 "LegacyUnenumerableNamedProperties", | |
27 "LenientThis", | |
28 "NamedConstructor", | |
29 "NewObject", | |
30 "NoInterfaceObject", | |
31 "OverrideBuiltins", | |
32 "PutForwards", | |
33 "Replaceable", | |
34 "SameObject", | |
35 "TreatNonObjectAsNull", | |
36 "TreatNullAs", | |
37 "EmptyString", | |
38 "Unforgeable", | |
39 "Unscopeable" | |
40 ]; | |
41 var builtins = wordRegexp(builtinArray); | |
42 | |
43 var typeArray = [ | |
44 "unsigned", "short", "long", // UnsignedIntegerType | |
45 "unrestricted", "float", "double", // UnrestrictedFloatType | |
46 "boolean", "byte", "octet", // Rest of PrimitiveType | |
47 "Promise", // PromiseType | |
48 "ArrayBuffer", "DataView", "Int8Array", "Int16Array", "Int32Array", | |
49 "Uint8Array", "Uint16Array", "Uint32Array", "Uint8ClampedArray", | |
50 "Float32Array", "Float64Array", // BufferRelatedType | |
51 "ByteString", "DOMString", "USVString", "sequence", "object", "RegExp", | |
52 "Error", "DOMException", "FrozenArray", // Rest of NonAnyType | |
53 "any", // Rest of SingleType | |
54 "void" // Rest of ReturnType | |
55 ]; | |
56 var types = wordRegexp(typeArray); | |
57 | |
58 var keywordArray = [ | |
59 "attribute", "callback", "const", "deleter", "dictionary", "enum", "getter", | |
60 "implements", "inherit", "interface", "iterable", "legacycaller", "maplike", | |
61 "partial", "required", "serializer", "setlike", "setter", "static", | |
62 "stringifier", "typedef", // ArgumentNameKeyword except | |
63 // "unrestricted" | |
64 "optional", "readonly", "or" | |
65 ]; | |
66 var keywords = wordRegexp(keywordArray); | |
67 | |
68 var atomArray = [ | |
69 "true", "false", // BooleanLiteral | |
70 "Infinity", "NaN", // FloatLiteral | |
71 "null" // Rest of ConstValue | |
72 ]; | |
73 var atoms = wordRegexp(atomArray); | |
74 | |
75 CodeMirror.registerHelper("hintWords", "webidl", | |
76 builtinArray.concat(typeArray).concat(keywordArray).concat(atomArray)); | |
77 | |
78 var startDefArray = ["callback", "dictionary", "enum", "interface"]; | |
79 var startDefs = wordRegexp(startDefArray); | |
80 | |
81 var endDefArray = ["typedef"]; | |
82 var endDefs = wordRegexp(endDefArray); | |
83 | |
84 var singleOperators = /^[:<=>?]/; | |
85 var integers = /^-?([1-9][0-9]*|0[Xx][0-9A-Fa-f]+|0[0-7]*)/; | |
86 var floats = /^-?(([0-9]+\.[0-9]*|[0-9]*\.[0-9]+)([Ee][+-]?[0-9]+)?|[0-9]+[Ee][+-]?[0-9]+)/; | |
87 var identifiers = /^_?[A-Za-z][0-9A-Z_a-z-]*/; | |
88 var identifiersEnd = /^_?[A-Za-z][0-9A-Z_a-z-]*(?=\s*;)/; | |
89 var strings = /^"[^"]*"/; | |
90 var multilineComments = /^\/\*.*?\*\//; | |
91 var multilineCommentsStart = /^\/\*.*/; | |
92 var multilineCommentsEnd = /^.*?\*\//; | |
93 | |
94 function readToken(stream, state) { | |
95 // whitespace | |
96 if (stream.eatSpace()) return null; | |
97 | |
98 // comment | |
99 if (state.inComment) { | |
100 if (stream.match(multilineCommentsEnd)) { | |
101 state.inComment = false; | |
102 return "comment"; | |
103 } | |
104 stream.skipToEnd(); | |
105 return "comment"; | |
106 } | |
107 if (stream.match("//")) { | |
108 stream.skipToEnd(); | |
109 return "comment"; | |
110 } | |
111 if (stream.match(multilineComments)) return "comment"; | |
112 if (stream.match(multilineCommentsStart)) { | |
113 state.inComment = true; | |
114 return "comment"; | |
115 } | |
116 | |
117 // integer and float | |
118 if (stream.match(/^-?[0-9\.]/, false)) { | |
119 if (stream.match(integers) || stream.match(floats)) return "number"; | |
120 } | |
121 | |
122 // string | |
123 if (stream.match(strings)) return "string"; | |
124 | |
125 // identifier | |
126 if (state.startDef && stream.match(identifiers)) return "def"; | |
127 | |
128 if (state.endDef && stream.match(identifiersEnd)) { | |
129 state.endDef = false; | |
130 return "def"; | |
131 } | |
132 | |
133 if (stream.match(keywords)) return "keyword"; | |
134 | |
135 if (stream.match(types)) { | |
136 var lastToken = state.lastToken; | |
137 var nextToken = (stream.match(/^\s*(.+?)\b/, false) || [])[1]; | |
138 | |
139 if (lastToken === ":" || lastToken === "implements" || | |
140 nextToken === "implements" || nextToken === "=") { | |
141 // Used as identifier | |
142 return "builtin"; | |
143 } else { | |
144 // Used as type | |
145 return "variable-3"; | |
146 } | |
147 } | |
148 | |
149 if (stream.match(builtins)) return "builtin"; | |
150 if (stream.match(atoms)) return "atom"; | |
151 if (stream.match(identifiers)) return "variable"; | |
152 | |
153 // other | |
154 if (stream.match(singleOperators)) return "operator"; | |
155 | |
156 // unrecognized | |
157 stream.next(); | |
158 return null; | |
159 }; | |
160 | |
161 CodeMirror.defineMode("webidl", function() { | |
162 return { | |
163 startState: function() { | |
164 return { | |
165 // Is in multiline comment | |
166 inComment: false, | |
167 // Last non-whitespace, matched token | |
168 lastToken: "", | |
169 // Next token is a definition | |
170 startDef: false, | |
171 // Last token of the statement is a definition | |
172 endDef: false | |
173 }; | |
174 }, | |
175 token: function(stream, state) { | |
176 var style = readToken(stream, state); | |
177 | |
178 if (style) { | |
179 var cur = stream.current(); | |
180 state.lastToken = cur; | |
181 if (style === "keyword") { | |
182 state.startDef = startDefs.test(cur); | |
183 state.endDef = state.endDef || endDefs.test(cur); | |
184 } else { | |
185 state.startDef = false; | |
186 } | |
187 } | |
188 | |
189 return style; | |
190 } | |
191 }; | |
192 }); | |
193 | |
194 CodeMirror.defineMIME("text/x-webidl", "webidl"); | |
195 }); |