Yang UI - new features and fixes
[dlux.git] / modules / yangui-resources / src / main / resources / yangui / assets / js / codemirror / mode / sieve / sieve.js
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("sieve", function(config) {
15   function words(str) {
16     var obj = {}, words = str.split(" ");
17     for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
18     return obj;
19   }
20
21   var keywords = words("if elsif else stop require");
22   var atoms = words("true false not");
23   var indentUnit = config.indentUnit;
24
25   function tokenBase(stream, state) {
26
27     var ch = stream.next();
28     if (ch == "/" && stream.eat("*")) {
29       state.tokenize = tokenCComment;
30       return tokenCComment(stream, state);
31     }
32
33     if (ch === '#') {
34       stream.skipToEnd();
35       return "comment";
36     }
37
38     if (ch == "\"") {
39       state.tokenize = tokenString(ch);
40       return state.tokenize(stream, state);
41     }
42
43     if (ch == "(") {
44       state._indent.push("(");
45       // add virtual angel wings so that editor behaves...
46       // ...more sane incase of broken brackets
47       state._indent.push("{");
48       return null;
49     }
50
51     if (ch === "{") {
52       state._indent.push("{");
53       return null;
54     }
55
56     if (ch == ")")  {
57       state._indent.pop();
58       state._indent.pop();
59     }
60
61     if (ch === "}") {
62       state._indent.pop();
63       return null;
64     }
65
66     if (ch == ",")
67       return null;
68
69     if (ch == ";")
70       return null;
71
72
73     if (/[{}\(\),;]/.test(ch))
74       return null;
75
76     // 1*DIGIT "K" / "M" / "G"
77     if (/\d/.test(ch)) {
78       stream.eatWhile(/[\d]/);
79       stream.eat(/[KkMmGg]/);
80       return "number";
81     }
82
83     // ":" (ALPHA / "_") *(ALPHA / DIGIT / "_")
84     if (ch == ":") {
85       stream.eatWhile(/[a-zA-Z_]/);
86       stream.eatWhile(/[a-zA-Z0-9_]/);
87
88       return "operator";
89     }
90
91     stream.eatWhile(/\w/);
92     var cur = stream.current();
93
94     // "text:" *(SP / HTAB) (hash-comment / CRLF)
95     // *(multiline-literal / multiline-dotstart)
96     // "." CRLF
97     if ((cur == "text") && stream.eat(":"))
98     {
99       state.tokenize = tokenMultiLineString;
100       return "string";
101     }
102
103     if (keywords.propertyIsEnumerable(cur))
104       return "keyword";
105
106     if (atoms.propertyIsEnumerable(cur))
107       return "atom";
108
109     return null;
110   }
111
112   function tokenMultiLineString(stream, state)
113   {
114     state._multiLineString = true;
115     // the first line is special it may contain a comment
116     if (!stream.sol()) {
117       stream.eatSpace();
118
119       if (stream.peek() == "#") {
120         stream.skipToEnd();
121         return "comment";
122       }
123
124       stream.skipToEnd();
125       return "string";
126     }
127
128     if ((stream.next() == ".")  && (stream.eol()))
129     {
130       state._multiLineString = false;
131       state.tokenize = tokenBase;
132     }
133
134     return "string";
135   }
136
137   function tokenCComment(stream, state) {
138     var maybeEnd = false, ch;
139     while ((ch = stream.next()) != null) {
140       if (maybeEnd && ch == "/") {
141         state.tokenize = tokenBase;
142         break;
143       }
144       maybeEnd = (ch == "*");
145     }
146     return "comment";
147   }
148
149   function tokenString(quote) {
150     return function(stream, state) {
151       var escaped = false, ch;
152       while ((ch = stream.next()) != null) {
153         if (ch == quote && !escaped)
154           break;
155         escaped = !escaped && ch == "\\";
156       }
157       if (!escaped) state.tokenize = tokenBase;
158       return "string";
159     };
160   }
161
162   return {
163     startState: function(base) {
164       return {tokenize: tokenBase,
165               baseIndent: base || 0,
166               _indent: []};
167     },
168
169     token: function(stream, state) {
170       if (stream.eatSpace())
171         return null;
172
173       return (state.tokenize || tokenBase)(stream, state);;
174     },
175
176     indent: function(state, _textAfter) {
177       var length = state._indent.length;
178       if (_textAfter && (_textAfter[0] == "}"))
179         length--;
180
181       if (length <0)
182         length = 0;
183
184       return length * indentUnit;
185     },
186
187     electricChars: "}"
188   };
189 });
190
191 CodeMirror.defineMIME("application/sieve", "sieve");
192
193 });