File modules/editor/codemirror/mode/modelica/modelica.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 // Modelica support for CodeMirror, copyright (c) by Lennart Ochel 5 6 (function(mod) { 7 if (typeof exports == "object" && typeof module == "object") // CommonJS 8 mod(require("../../lib/codemirror")); 9 else if (typeof define == "function" && define.amd) // AMD 10 define(["../../lib/codemirror"], mod); 11 else // Plain browser env 12 mod(CodeMirror); 13 }) 14 15 (function(CodeMirror) { 16 "use strict"; 17 18 CodeMirror.defineMode("modelica", function(config, parserConfig) { 19 20 var indentUnit = config.indentUnit; 21 var keywords = parserConfig.keywords || {}; 22 var builtin = parserConfig.builtin || {}; 23 var atoms = parserConfig.atoms || {}; 24 25 var isSingleOperatorChar = /[;=\(:\),{}.*<>+\-\/^\[\]]/; 26 var isDoubleOperatorChar = /(:=|<=|>=|==|<>|\.\+|\.\-|\.\*|\.\/|\.\^)/; 27 var isDigit = /[0-9]/; 28 var isNonDigit = /[_a-zA-Z]/; 29 30 function tokenLineComment(stream, state) { 31 stream.skipToEnd(); 32 state.tokenize = null; 33 return "comment"; 34 } 35 36 function tokenBlockComment(stream, state) { 37 var maybeEnd = false, ch; 38 while (ch = stream.next()) { 39 if (maybeEnd && ch == "/") { 40 state.tokenize = null; 41 break; 42 } 43 maybeEnd = (ch == "*"); 44 } 45 return "comment"; 46 } 47 48 function tokenString(stream, state) { 49 var escaped = false, ch; 50 while ((ch = stream.next()) != null) { 51 if (ch == '"' && !escaped) { 52 state.tokenize = null; 53 state.sol = false; 54 break; 55 } 56 escaped = !escaped && ch == "\\"; 57 } 58 59 return "string"; 60 } 61 62 function tokenIdent(stream, state) { 63 stream.eatWhile(isDigit); 64 while (stream.eat(isDigit) || stream.eat(isNonDigit)) { } 65 66 67 var cur = stream.current(); 68 69 if(state.sol && (cur == "package" || cur == "model" || cur == "when" || cur == "connector")) state.level++; 70 else if(state.sol && cur == "end" && state.level > 0) state.level--; 71 72 state.tokenize = null; 73 state.sol = false; 74 75 if (keywords.propertyIsEnumerable(cur)) return "keyword"; 76 else if (builtin.propertyIsEnumerable(cur)) return "builtin"; 77 else if (atoms.propertyIsEnumerable(cur)) return "atom"; 78 else return "variable"; 79 } 80 81 function tokenQIdent(stream, state) { 82 while (stream.eat(/[^']/)) { } 83 84 state.tokenize = null; 85 state.sol = false; 86 87 if(stream.eat("'")) 88 return "variable"; 89 else 90 return "error"; 91 } 92 93 function tokenUnsignedNuber(stream, state) { 94 stream.eatWhile(isDigit); 95 if (stream.eat('.')) { 96 stream.eatWhile(isDigit); 97 } 98 if (stream.eat('e') || stream.eat('E')) { 99 if (!stream.eat('-')) 100 stream.eat('+'); 101 stream.eatWhile(isDigit); 102 } 103 104 state.tokenize = null; 105 state.sol = false; 106 return "number"; 107 } 108 109 // Interface 110 return { 111 startState: function() { 112 return { 113 tokenize: null, 114 level: 0, 115 sol: true 116 }; 117 }, 118 119 token: function(stream, state) { 120 if(state.tokenize != null) { 121 return state.tokenize(stream, state); 122 } 123 124 if(stream.sol()) { 125 state.sol = true; 126 } 127 128 // WHITESPACE 129 if(stream.eatSpace()) { 130 state.tokenize = null; 131 return null; 132 } 133 134 var ch = stream.next(); 135 136 // LINECOMMENT 137 if(ch == '/' && stream.eat('/')) { 138 state.tokenize = tokenLineComment; 139 } 140 // BLOCKCOMMENT 141 else if(ch == '/' && stream.eat('*')) { 142 state.tokenize = tokenBlockComment; 143 } 144 // TWO SYMBOL TOKENS 145 else if(isDoubleOperatorChar.test(ch+stream.peek())) { 146 stream.next(); 147 state.tokenize = null; 148 return "operator"; 149 } 150 // SINGLE SYMBOL TOKENS 151 else if(isSingleOperatorChar.test(ch)) { 152 state.tokenize = null; 153 return "operator"; 154 } 155 // IDENT 156 else if(isNonDigit.test(ch)) { 157 state.tokenize = tokenIdent; 158 } 159 // Q-IDENT 160 else if(ch == "'" && stream.peek() && stream.peek() != "'") { 161 state.tokenize = tokenQIdent; 162 } 163 // STRING 164 else if(ch == '"') { 165 state.tokenize = tokenString; 166 } 167 // UNSIGNED_NUBER 168 else if(isDigit.test(ch)) { 169 state.tokenize = tokenUnsignedNuber; 170 } 171 // ERROR 172 else { 173 state.tokenize = null; 174 return "error"; 175 } 176 177 return state.tokenize(stream, state); 178 }, 179 180 indent: function(state, textAfter) { 181 if (state.tokenize != null) return CodeMirror.Pass; 182 183 var level = state.level; 184 if(/(algorithm)/.test(textAfter)) level--; 185 if(/(equation)/.test(textAfter)) level--; 186 if(/(initial algorithm)/.test(textAfter)) level--; 187 if(/(initial equation)/.test(textAfter)) level--; 188 if(/(end)/.test(textAfter)) level--; 189 190 if(level > 0) 191 return indentUnit*level; 192 else 193 return 0; 194 }, 195 196 blockCommentStart: "/*", 197 blockCommentEnd: "*/", 198 lineComment: "//" 199 }; 200 }); 201 202 function words(str) { 203 var obj = {}, words = str.split(" "); 204 for (var i=0; i<words.length; ++i) 205 obj[words[i]] = true; 206 return obj; 207 } 208 209 var modelicaKeywords = "algorithm and annotation assert block break class connect connector constant constrainedby der discrete each else elseif elsewhen encapsulated end enumeration equation expandable extends external false final flow for function if import impure in initial inner input loop model not operator or outer output package parameter partial protected public pure record redeclare replaceable return stream then true type when while within"; 210 var modelicaBuiltin = "abs acos actualStream asin atan atan2 cardinality ceil cos cosh delay div edge exp floor getInstanceName homotopy inStream integer log log10 mod pre reinit rem semiLinear sign sin sinh spatialDistribution sqrt tan tanh"; 211 var modelicaAtoms = "Real Boolean Integer String"; 212 213 function def(mimes, mode) { 214 if (typeof mimes == "string") 215 mimes = [mimes]; 216 217 var words = []; 218 219 function add(obj) { 220 if (obj) 221 for (var prop in obj) 222 if (obj.hasOwnProperty(prop)) 223 words.push(prop); 224 } 225 226 add(mode.keywords); 227 add(mode.builtin); 228 add(mode.atoms); 229 230 if (words.length) { 231 mode.helperType = mimes[0]; 232 CodeMirror.registerHelper("hintWords", mimes[0], words); 233 } 234 235 for (var i=0; i<mimes.length; ++i) 236 CodeMirror.defineMIME(mimes[i], mode); 237 } 238 239 def(["text/x-modelica"], { 240 name: "modelica", 241 keywords: words(modelicaKeywords), 242 builtin: words(modelicaBuiltin), 243 atoms: words(modelicaAtoms) 244 }); 245 });
Downloadmodules/editor/codemirror/mode/modelica/modelica.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.