| 
									
										
										
										
											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") // 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("eiffel", function() { | 
					
						
							|  |  |  |   function wordObj(words) { | 
					
						
							|  |  |  |     var o = {}; | 
					
						
							|  |  |  |     for (var i = 0, e = words.length; i < e; ++i) o[words[i]] = true; | 
					
						
							|  |  |  |     return o; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   var keywords = wordObj([ | 
					
						
							|  |  |  |     'note', | 
					
						
							|  |  |  |     'across', | 
					
						
							|  |  |  |     'when', | 
					
						
							|  |  |  |     'variant', | 
					
						
							|  |  |  |     'until', | 
					
						
							|  |  |  |     'unique', | 
					
						
							|  |  |  |     'undefine', | 
					
						
							|  |  |  |     'then', | 
					
						
							|  |  |  |     'strip', | 
					
						
							|  |  |  |     'select', | 
					
						
							|  |  |  |     'retry', | 
					
						
							|  |  |  |     'rescue', | 
					
						
							|  |  |  |     'require', | 
					
						
							|  |  |  |     'rename', | 
					
						
							|  |  |  |     'reference', | 
					
						
							|  |  |  |     'redefine', | 
					
						
							|  |  |  |     'prefix', | 
					
						
							|  |  |  |     'once', | 
					
						
							|  |  |  |     'old', | 
					
						
							|  |  |  |     'obsolete', | 
					
						
							|  |  |  |     'loop', | 
					
						
							|  |  |  |     'local', | 
					
						
							|  |  |  |     'like', | 
					
						
							|  |  |  |     'is', | 
					
						
							|  |  |  |     'inspect', | 
					
						
							|  |  |  |     'infix', | 
					
						
							|  |  |  |     'include', | 
					
						
							|  |  |  |     'if', | 
					
						
							|  |  |  |     'frozen', | 
					
						
							|  |  |  |     'from', | 
					
						
							|  |  |  |     'external', | 
					
						
							|  |  |  |     'export', | 
					
						
							|  |  |  |     'ensure', | 
					
						
							|  |  |  |     'end', | 
					
						
							|  |  |  |     'elseif', | 
					
						
							|  |  |  |     'else', | 
					
						
							|  |  |  |     'do', | 
					
						
							|  |  |  |     'creation', | 
					
						
							|  |  |  |     'create', | 
					
						
							|  |  |  |     'check', | 
					
						
							|  |  |  |     'alias', | 
					
						
							|  |  |  |     'agent', | 
					
						
							|  |  |  |     'separate', | 
					
						
							|  |  |  |     'invariant', | 
					
						
							|  |  |  |     'inherit', | 
					
						
							|  |  |  |     'indexing', | 
					
						
							|  |  |  |     'feature', | 
					
						
							|  |  |  |     'expanded', | 
					
						
							|  |  |  |     'deferred', | 
					
						
							|  |  |  |     'class', | 
					
						
							|  |  |  |     'Void', | 
					
						
							|  |  |  |     'True', | 
					
						
							|  |  |  |     'Result', | 
					
						
							|  |  |  |     'Precursor', | 
					
						
							|  |  |  |     'False', | 
					
						
							|  |  |  |     'Current', | 
					
						
							|  |  |  |     'create', | 
					
						
							|  |  |  |     'attached', | 
					
						
							|  |  |  |     'detachable', | 
					
						
							|  |  |  |     'as', | 
					
						
							|  |  |  |     'and', | 
					
						
							|  |  |  |     'implies', | 
					
						
							|  |  |  |     'not', | 
					
						
							|  |  |  |     'or' | 
					
						
							|  |  |  |   ]); | 
					
						
							|  |  |  |   var operators = wordObj([":=", "and then","and", "or","<<",">>"]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   function chain(newtok, stream, state) { | 
					
						
							|  |  |  |     state.tokenize.push(newtok); | 
					
						
							|  |  |  |     return newtok(stream, state); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   function tokenBase(stream, state) { | 
					
						
							|  |  |  |     if (stream.eatSpace()) return null; | 
					
						
							|  |  |  |     var ch = stream.next(); | 
					
						
							|  |  |  |     if (ch == '"'||ch == "'") { | 
					
						
							|  |  |  |       return chain(readQuoted(ch, "string"), stream, state); | 
					
						
							|  |  |  |     } else if (ch == "-"&&stream.eat("-")) { | 
					
						
							|  |  |  |       stream.skipToEnd(); | 
					
						
							|  |  |  |       return "comment"; | 
					
						
							|  |  |  |     } else if (ch == ":"&&stream.eat("=")) { | 
					
						
							|  |  |  |       return "operator"; | 
					
						
							|  |  |  |     } else if (/[0-9]/.test(ch)) { | 
					
						
							|  |  |  |       stream.eatWhile(/[xXbBCc0-9\.]/); | 
					
						
							|  |  |  |       stream.eat(/[\?\!]/); | 
					
						
							|  |  |  |       return "ident"; | 
					
						
							|  |  |  |     } else if (/[a-zA-Z_0-9]/.test(ch)) { | 
					
						
							|  |  |  |       stream.eatWhile(/[a-zA-Z_0-9]/); | 
					
						
							|  |  |  |       stream.eat(/[\?\!]/); | 
					
						
							|  |  |  |       return "ident"; | 
					
						
							|  |  |  |     } else if (/[=+\-\/*^%<>~]/.test(ch)) { | 
					
						
							|  |  |  |       stream.eatWhile(/[=+\-\/*^%<>~]/); | 
					
						
							|  |  |  |       return "operator"; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       return null; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   function readQuoted(quote, style,  unescaped) { | 
					
						
							|  |  |  |     return function(stream, state) { | 
					
						
							|  |  |  |       var escaped = false, ch; | 
					
						
							|  |  |  |       while ((ch = stream.next()) != null) { | 
					
						
							|  |  |  |         if (ch == quote && (unescaped || !escaped)) { | 
					
						
							|  |  |  |           state.tokenize.pop(); | 
					
						
							|  |  |  |           break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         escaped = !escaped && ch == "%"; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       return style; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return { | 
					
						
							|  |  |  |     startState: function() { | 
					
						
							|  |  |  |       return {tokenize: [tokenBase]}; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     token: function(stream, state) { | 
					
						
							|  |  |  |       var style = state.tokenize[state.tokenize.length-1](stream, state); | 
					
						
							|  |  |  |       if (style == "ident") { | 
					
						
							|  |  |  |         var word = stream.current(); | 
					
						
							|  |  |  |         style = keywords.propertyIsEnumerable(stream.current()) ? "keyword" | 
					
						
							|  |  |  |           : operators.propertyIsEnumerable(stream.current()) ? "operator" | 
					
						
							|  |  |  |           : /^[A-Z][A-Z_0-9]*$/g.test(word) ? "tag" | 
					
						
							|  |  |  |           : /^0[bB][0-1]+$/g.test(word) ? "number" | 
					
						
							|  |  |  |           : /^0[cC][0-7]+$/g.test(word) ? "number" | 
					
						
							|  |  |  |           : /^0[xX][a-fA-F0-9]+$/g.test(word) ? "number" | 
					
						
							|  |  |  |           : /^([0-9]+\.[0-9]*)|([0-9]*\.[0-9]+)$/g.test(word) ? "number" | 
					
						
							|  |  |  |           : /^[0-9]+$/g.test(word) ? "number" | 
					
						
							|  |  |  |           : "variable"; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       return style; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     lineComment: "--" | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | CodeMirror.defineMIME("text/x-eiffel", "eiffel"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }); |