Mercurial
comparison .cms/lib/codemirror/mode/eiffel/eiffel.js @ 0:78edf6b517a0 draft
24.10
author | Coffee CMS <info@coffee-cms.ru> |
---|---|
date | Fri, 11 Oct 2024 22:40:23 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:78edf6b517a0 |
---|---|
1 // CodeMirror, copyright (c) by Marijn Haverbeke and others | |
2 // Distributed under an MIT license: https://codemirror.net/5/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 }); |