webidl.js
195 lines
| 5.6 KiB
| application/javascript
|
JavascriptLexer
r4105 | // 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"); | ||||
}); | ||||