123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- // 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)
- // Plain browser env
- else 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')
- })
|