File modules/editor/codemirror/mode/eiffel/eiffel.js

Last commit: Sun Dec 17 01:14:09 2017 +0100	Jan Dankert	Integration eines weiteren Code-Editors: Codemirror. Demnächst müssen wir hier mal aufräumen und andere Editoren rauswerfen.
1 // CodeMirror, copyright (c) by Marijn Haverbeke and others 2 // Distributed under an MIT license: http://codemirror.net/LICENSE 3 4 (function(mod) { 5 if (typeof exports == "object" && typeof module == "object") // CommonJS 6 mod(require("../../lib/codemirror")); 7 else if (typeof define == "function" && define.amd) // AMD 8 define(["../../lib/codemirror"], mod); 9 else // Plain browser env 10 mod(CodeMirror); 11 })(function(CodeMirror) { 12 "use strict"; 13 14 CodeMirror.defineMode("eiffel", function() { 15 function wordObj(words) { 16 var o = {}; 17 for (var i = 0, e = words.length; i < e; ++i) o[words[i]] = true; 18 return o; 19 } 20 var keywords = wordObj([ 21 'note', 22 'across', 23 'when', 24 'variant', 25 'until', 26 'unique', 27 'undefine', 28 'then', 29 'strip', 30 'select', 31 'retry', 32 'rescue', 33 'require', 34 'rename', 35 'reference', 36 'redefine', 37 'prefix', 38 'once', 39 'old', 40 'obsolete', 41 'loop', 42 'local', 43 'like', 44 'is', 45 'inspect', 46 'infix', 47 'include', 48 'if', 49 'frozen', 50 'from', 51 'external', 52 'export', 53 'ensure', 54 'end', 55 'elseif', 56 'else', 57 'do', 58 'creation', 59 'create', 60 'check', 61 'alias', 62 'agent', 63 'separate', 64 'invariant', 65 'inherit', 66 'indexing', 67 'feature', 68 'expanded', 69 'deferred', 70 'class', 71 'Void', 72 'True', 73 'Result', 74 'Precursor', 75 'False', 76 'Current', 77 'create', 78 'attached', 79 'detachable', 80 'as', 81 'and', 82 'implies', 83 'not', 84 'or' 85 ]); 86 var operators = wordObj([":=", "and then","and", "or","<<",">>"]); 87 88 function chain(newtok, stream, state) { 89 state.tokenize.push(newtok); 90 return newtok(stream, state); 91 } 92 93 function tokenBase(stream, state) { 94 if (stream.eatSpace()) return null; 95 var ch = stream.next(); 96 if (ch == '"'||ch == "'") { 97 return chain(readQuoted(ch, "string"), stream, state); 98 } else if (ch == "-"&&stream.eat("-")) { 99 stream.skipToEnd(); 100 return "comment"; 101 } else if (ch == ":"&&stream.eat("=")) { 102 return "operator"; 103 } else if (/[0-9]/.test(ch)) { 104 stream.eatWhile(/[xXbBCc0-9\.]/); 105 stream.eat(/[\?\!]/); 106 return "ident"; 107 } else if (/[a-zA-Z_0-9]/.test(ch)) { 108 stream.eatWhile(/[a-zA-Z_0-9]/); 109 stream.eat(/[\?\!]/); 110 return "ident"; 111 } else if (/[=+\-\/*^%<>~]/.test(ch)) { 112 stream.eatWhile(/[=+\-\/*^%<>~]/); 113 return "operator"; 114 } else { 115 return null; 116 } 117 } 118 119 function readQuoted(quote, style, unescaped) { 120 return function(stream, state) { 121 var escaped = false, ch; 122 while ((ch = stream.next()) != null) { 123 if (ch == quote && (unescaped || !escaped)) { 124 state.tokenize.pop(); 125 break; 126 } 127 escaped = !escaped && ch == "%"; 128 } 129 return style; 130 }; 131 } 132 133 return { 134 startState: function() { 135 return {tokenize: [tokenBase]}; 136 }, 137 138 token: function(stream, state) { 139 var style = state.tokenize[state.tokenize.length-1](stream, state); 140 if (style == "ident") { 141 var word = stream.current(); 142 style = keywords.propertyIsEnumerable(stream.current()) ? "keyword" 143 : operators.propertyIsEnumerable(stream.current()) ? "operator" 144 : /^[A-Z][A-Z_0-9]*$/g.test(word) ? "tag" 145 : /^0[bB][0-1]+$/g.test(word) ? "number" 146 : /^0[cC][0-7]+$/g.test(word) ? "number" 147 : /^0[xX][a-fA-F0-9]+$/g.test(word) ? "number" 148 : /^([0-9]+\.[0-9]*)|([0-9]*\.[0-9]+)$/g.test(word) ? "number" 149 : /^[0-9]+$/g.test(word) ? "number" 150 : "variable"; 151 } 152 return style; 153 }, 154 lineComment: "--" 155 }; 156 }); 157 158 CodeMirror.defineMIME("text/x-eiffel", "eiffel"); 159 160 });
Download modules/editor/codemirror/mode/eiffel/eiffel.js
History Sun, 17 Dec 2017 01:14:09 +0100 Jan Dankert Integration eines weiteren Code-Editors: Codemirror. Demnächst müssen wir hier mal aufräumen und andere Editoren rauswerfen.