mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-28 18:18:55 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			205 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
		
			Vendored
		
	
	
	
			
		
		
	
	
			205 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
		
			Vendored
		
	
	
	
| // Source: https://github.com/codemirror/codemirror5/pull/7080/files
 | |
| 
 | |
| // CodeMirror, copyright (c) by Marijn Haverbeke and others
 | |
| // Distributed under an MIT license: https://codemirror.net/5/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";
 | |
| 
 | |
|     CodeMirror.defineMode("hcl", function (config) {
 | |
|         var indentUnit = config.indentUnit;
 | |
| 
 | |
|         var keywords = {
 | |
|             "resource": true,
 | |
|             "variable": true,
 | |
|             "output": true,
 | |
|             "module": true,
 | |
|             "provider": true,
 | |
|             "data": true,
 | |
|             "locals": true,
 | |
|             "terraform": true,
 | |
|             "if": true,
 | |
|             "else": true,
 | |
|             "for": true,
 | |
|             "foreach": true,
 | |
|             "in": true,
 | |
|             "true": true,
 | |
|             "false": true,
 | |
|             "null": true,
 | |
|         };
 | |
| 
 | |
|         var atoms = {
 | |
|             "true": true,
 | |
|             "false": true,
 | |
|             "null": true,
 | |
|         };
 | |
| 
 | |
|         var isOperatorChar = /[+\-*&^%:=<>!|\/]/;
 | |
| 
 | |
|         var curPunc;
 | |
| 
 | |
|         function tokenBase(stream, state) {
 | |
|             var ch = stream.next();
 | |
|             if (ch == '"' || ch == "'" || ch == "`") {
 | |
|                 state.tokenize = tokenString(ch);
 | |
|                 return state.tokenize(stream, state);
 | |
|             }
 | |
|             if (/[\d\.]/.test(ch)) {
 | |
|                 if (ch == ".") {
 | |
|                     stream.match(/^[0-9_]+([eE][\-+]?[0-9_]+)?/);
 | |
|                 } else {
 | |
|                     stream.match(/^[0-9_]*\.?[0-9_]*([eE][\-+]?[0-9_]+)?/);
 | |
|                 }
 | |
|                 return "number";
 | |
|             }
 | |
|             if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
 | |
|                 curPunc = ch;
 | |
|                 return null;
 | |
|             }
 | |
|             if (ch == "/") {
 | |
|                 if (stream.eat("*")) {
 | |
|                     state.tokenize = tokenComment;
 | |
|                     return tokenComment(stream, state);
 | |
|                 }
 | |
|                 if (stream.eat("/")) {
 | |
|                     stream.skipToEnd();
 | |
|                     return "comment";
 | |
|                 }
 | |
|             }
 | |
|             if (isOperatorChar.test(ch)) {
 | |
|                 stream.eatWhile(isOperatorChar);
 | |
|                 return "operator";
 | |
|             }
 | |
|             stream.eatWhile(/[\w\$_\xa1-\uffff]/);
 | |
|             var cur = stream.current();
 | |
|             if (keywords.propertyIsEnumerable(cur)) {
 | |
|                 return "keyword";
 | |
|             }
 | |
|             if (atoms.propertyIsEnumerable(cur)) return "atom";
 | |
|             return "variable";
 | |
|         }
 | |
| 
 | |
|         function tokenString(quote) {
 | |
|             return function (stream, state) {
 | |
|                 var escaped = false,
 | |
|                     next,
 | |
|                     end = false;
 | |
|                 while ((next = stream.next()) != null) {
 | |
|                     if (next == quote && !escaped) {
 | |
|                         end = true;
 | |
|                         break;
 | |
|                     }
 | |
|                     escaped = !escaped && quote != "`" && next == "\\";
 | |
|                 }
 | |
|                 if (end || !(escaped || quote == "`"))
 | |
|                     state.tokenize = tokenBase;
 | |
|                 return "string";
 | |
|             };
 | |
|         }
 | |
| 
 | |
|         function tokenComment(stream, state) {
 | |
|             var maybeEnd = false,
 | |
|                 ch;
 | |
|             while (ch = stream.next()) {
 | |
|                 if (ch == "/" && maybeEnd) {
 | |
|                     state.tokenize = tokenBase;
 | |
|                     break;
 | |
|                 }
 | |
|                 maybeEnd = (ch == "*");
 | |
|             }
 | |
|             return "comment";
 | |
|         }
 | |
| 
 | |
|         function Context(indented, column, type, align, prev) {
 | |
|             this.indented = indented;
 | |
|             this.column = column;
 | |
|             this.type = type;
 | |
|             this.align = align;
 | |
|             this.prev = prev;
 | |
|         }
 | |
|         function pushContext(state, col, type) {
 | |
|             return state.context = new Context(state.indented, col, type, null, state.context);
 | |
|         }
 | |
|         function popContext(state) {
 | |
|             if (!state.context.prev) return;
 | |
|             var t = state.context.type;
 | |
|             if (t == ")" || t == "]" || t == "}")
 | |
|                 state.indented = state.context.indented;
 | |
|             return state.context = state.context.prev;
 | |
|         }
 | |
| 
 | |
|         // Interface
 | |
| 
 | |
|         return {
 | |
|             startState: function (basecolumn) {
 | |
|                 return {
 | |
|                     tokenize: null,
 | |
|                     context: new Context((basecolumn || 0) - indentUnit, 0, "top", false),
 | |
|                     indented: 0,
 | |
|                     startOfLine: true
 | |
|                 };
 | |
|             },
 | |
| 
 | |
|             token: function (stream, state) {
 | |
|                 var ctx = state.context;
 | |
|                 if (stream.sol()) {
 | |
|                     if (ctx.align == null) ctx.align = false;
 | |
|                     state.indented = stream.indentation();
 | |
|                     state.startOfLine = true;
 | |
|                 }
 | |
|                 if (stream.eatSpace()) return null;
 | |
|                 curPunc = null;
 | |
|                 var style = (state.tokenize || tokenBase)(stream, state);
 | |
|                 if (style == "comment") return style;
 | |
|                 if (ctx.align == null) ctx.align = true;
 | |
| 
 | |
|                 if (curPunc == "{") pushContext(state, stream.column(), "}");
 | |
|                 else if (curPunc == "[") pushContext(state, stream.column(), "]");
 | |
|                 else if (curPunc == "(") pushContext(state, stream.column(), ")");
 | |
|                 else if (curPunc == "}" && ctx.type == "}") popContext(state);
 | |
|                 else if (curPunc == ctx.type) popContext(state);
 | |
|                 state.startOfLine = false;
 | |
|                 return style;
 | |
|             },
 | |
| 
 | |
|             indent: function (state, textAfter) {
 | |
|                 if (state.tokenize != tokenBase && state.tokenize != null) return CodeMirror.Pass;
 | |
|                 var ctx = state.context, firstChar = textAfter && textAfter.charAt(0);
 | |
|                 if (firstChar == "#" || firstChar == ";") return 0;
 | |
|                 if (stream.sol()) {
 | |
|                     if (ctx.type == "case" && /^(?:case|default)\b/.test(textAfter)) {
 | |
|                         state.context.type = "}";
 | |
|                         return ctx.indented;
 | |
|                     }
 | |
|                     var closing = firstChar == ctx.type;
 | |
|                     if (ctx.align) return ctx.column + (closing ? 0 : 1);
 | |
|                     else return ctx.indented + (closing ? 0 : indentUnit);
 | |
|                 }
 | |
|             },
 | |
| 
 | |
|             electricChars: "{}):",
 | |
|             closeBrackets: "()[]{}''\"\"``",
 | |
|             fold: "brace",
 | |
|             blockCommentStart: "/*",
 | |
|             blockCommentEnd: "*/",
 | |
|             lineComment: "//"
 | |
|         };
 | |
|     });
 | |
| 
 | |
|     CodeMirror.defineMIME("text/x-hcl", "hcl");
 | |
|     CodeMirror.modeInfo.push({
 | |
|         ext: [ "hcl " ],
 | |
|         mime: "text/x-hcl",
 | |
|         mode: "hcl",
 | |
|         name: "Terraform (HCL)"
 | |
|     });
 | |
| 
 | |
| });
 | 
