mirror of
				https://github.com/TriliumNext/Notes.git
				synced 2025-11-04 15:11:31 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			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: 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");
 | 
						|
});
 |