You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
196 lines
5.6 KiB
JavaScript
196 lines
5.6 KiB
JavaScript
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|
// Distributed under an MIT license: http://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");
|
|
});
|