| 
									
										
										
										
											2018-01-21 10:33:32 -05:00
										 |  |  | // CodeMirror, copyright (c) by Marijn Haverbeke and others
 | 
					
						
							| 
									
										
										
										
											2022-10-15 12:22:09 +02:00
										 |  |  | // Distributed under an MIT license: https://codemirror.net/5/LICENSE
 | 
					
						
							| 
									
										
										
										
											2018-01-21 10:33:32 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | (function(mod) { | 
					
						
							|  |  |  |   if (typeof exports == "object" && typeof module == "object") | 
					
						
							|  |  |  |     mod(require("../../lib/codemirror")); | 
					
						
							|  |  |  |   else if (typeof define == "function" && define.amd) | 
					
						
							|  |  |  |     define(["../../lib/codemirror"], mod); | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     mod(CodeMirror); | 
					
						
							|  |  |  | })(function(CodeMirror) { | 
					
						
							|  |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | CodeMirror.defineMode("cmake", function () { | 
					
						
							|  |  |  |   var variable_regex = /({)?[a-zA-Z0-9_]+(})?/; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   function tokenString(stream, state) { | 
					
						
							|  |  |  |     var current, prev, found_var = false; | 
					
						
							|  |  |  |     while (!stream.eol() && (current = stream.next()) != state.pending) { | 
					
						
							|  |  |  |       if (current === '$' && prev != '\\' && state.pending == '"') { | 
					
						
							|  |  |  |         found_var = true; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       prev = current; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (found_var) { | 
					
						
							|  |  |  |       stream.backUp(1); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (current == state.pending) { | 
					
						
							|  |  |  |       state.continueString = false; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       state.continueString = true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return "string"; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   function tokenize(stream, state) { | 
					
						
							|  |  |  |     var ch = stream.next(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Have we found a variable?
 | 
					
						
							|  |  |  |     if (ch === '$') { | 
					
						
							|  |  |  |       if (stream.match(variable_regex)) { | 
					
						
							|  |  |  |         return 'variable-2'; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       return 'variable'; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     // Should we still be looking for the end of a string?
 | 
					
						
							|  |  |  |     if (state.continueString) { | 
					
						
							|  |  |  |       // If so, go through the loop again
 | 
					
						
							|  |  |  |       stream.backUp(1); | 
					
						
							|  |  |  |       return tokenString(stream, state); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     // Do we just have a function on our hands?
 | 
					
						
							|  |  |  |     // In 'cmake_minimum_required (VERSION 2.8.8)', 'cmake_minimum_required' is matched
 | 
					
						
							|  |  |  |     if (stream.match(/(\s+)?\w+\(/) || stream.match(/(\s+)?\w+\ \(/)) { | 
					
						
							|  |  |  |       stream.backUp(1); | 
					
						
							|  |  |  |       return 'def'; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (ch == "#") { | 
					
						
							|  |  |  |       stream.skipToEnd(); | 
					
						
							|  |  |  |       return "comment"; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     // Have we found a string?
 | 
					
						
							|  |  |  |     if (ch == "'" || ch == '"') { | 
					
						
							|  |  |  |       // Store the type (single or double)
 | 
					
						
							|  |  |  |       state.pending = ch; | 
					
						
							|  |  |  |       // Perform the looping function to find the end
 | 
					
						
							|  |  |  |       return tokenString(stream, state); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (ch == '(' || ch == ')') { | 
					
						
							|  |  |  |       return 'bracket'; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (ch.match(/[0-9]/)) { | 
					
						
							|  |  |  |       return 'number'; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     stream.eatWhile(/[\w-]/); | 
					
						
							|  |  |  |     return null; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return { | 
					
						
							|  |  |  |     startState: function () { | 
					
						
							|  |  |  |       var state = {}; | 
					
						
							|  |  |  |       state.inDefinition = false; | 
					
						
							|  |  |  |       state.inInclude = false; | 
					
						
							|  |  |  |       state.continueString = false; | 
					
						
							|  |  |  |       state.pending = false; | 
					
						
							|  |  |  |       return state; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     token: function (stream, state) { | 
					
						
							|  |  |  |       if (stream.eatSpace()) return null; | 
					
						
							|  |  |  |       return tokenize(stream, state); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | CodeMirror.defineMIME("text/x-cmake", "cmake"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }); |