0
|
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("ttcn-cfg", function(config, parserConfig) {
|
|
15 var indentUnit = config.indentUnit,
|
|
16 keywords = parserConfig.keywords || {},
|
|
17 fileNCtrlMaskOptions = parserConfig.fileNCtrlMaskOptions || {},
|
|
18 externalCommands = parserConfig.externalCommands || {},
|
|
19 multiLineStrings = parserConfig.multiLineStrings,
|
|
20 indentStatements = parserConfig.indentStatements !== false;
|
|
21 var isOperatorChar = /[\|]/;
|
|
22 var curPunc;
|
|
23
|
|
24 function tokenBase(stream, state) {
|
|
25 var ch = stream.next();
|
|
26 if (ch == '"' || ch == "'") {
|
|
27 state.tokenize = tokenString(ch);
|
|
28 return state.tokenize(stream, state);
|
|
29 }
|
|
30 if (/[:=]/.test(ch)) {
|
|
31 curPunc = ch;
|
|
32 return "punctuation";
|
|
33 }
|
|
34 if (ch == "#"){
|
|
35 stream.skipToEnd();
|
|
36 return "comment";
|
|
37 }
|
|
38 if (/\d/.test(ch)) {
|
|
39 stream.eatWhile(/[\w\.]/);
|
|
40 return "number";
|
|
41 }
|
|
42 if (isOperatorChar.test(ch)) {
|
|
43 stream.eatWhile(isOperatorChar);
|
|
44 return "operator";
|
|
45 }
|
|
46 if (ch == "["){
|
|
47 stream.eatWhile(/[\w_\]]/);
|
|
48 return "number sectionTitle";
|
|
49 }
|
|
50
|
|
51 stream.eatWhile(/[\w\$_]/);
|
|
52 var cur = stream.current();
|
|
53 if (keywords.propertyIsEnumerable(cur)) return "keyword";
|
|
54 if (fileNCtrlMaskOptions.propertyIsEnumerable(cur))
|
|
55 return "negative fileNCtrlMaskOptions";
|
|
56 if (externalCommands.propertyIsEnumerable(cur)) return "negative externalCommands";
|
|
57
|
|
58 return "variable";
|
|
59 }
|
|
60
|
|
61 function tokenString(quote) {
|
|
62 return function(stream, state) {
|
|
63 var escaped = false, next, end = false;
|
|
64 while ((next = stream.next()) != null) {
|
|
65 if (next == quote && !escaped){
|
|
66 var afterNext = stream.peek();
|
|
67 //look if the character if the quote is like the B in '10100010'B
|
|
68 if (afterNext){
|
|
69 afterNext = afterNext.toLowerCase();
|
|
70 if(afterNext == "b" || afterNext == "h" || afterNext == "o")
|
|
71 stream.next();
|
|
72 }
|
|
73 end = true; break;
|
|
74 }
|
|
75 escaped = !escaped && next == "\\";
|
|
76 }
|
|
77 if (end || !(escaped || multiLineStrings))
|
|
78 state.tokenize = null;
|
|
79 return "string";
|
|
80 };
|
|
81 }
|
|
82
|
|
83 function Context(indented, column, type, align, prev) {
|
|
84 this.indented = indented;
|
|
85 this.column = column;
|
|
86 this.type = type;
|
|
87 this.align = align;
|
|
88 this.prev = prev;
|
|
89 }
|
|
90 function pushContext(state, col, type) {
|
|
91 var indent = state.indented;
|
|
92 if (state.context && state.context.type == "statement")
|
|
93 indent = state.context.indented;
|
|
94 return state.context = new Context(indent, col, type, null, state.context);
|
|
95 }
|
|
96 function popContext(state) {
|
|
97 var t = state.context.type;
|
|
98 if (t == ")" || t == "]" || t == "}")
|
|
99 state.indented = state.context.indented;
|
|
100 return state.context = state.context.prev;
|
|
101 }
|
|
102
|
|
103 //Interface
|
|
104 return {
|
|
105 startState: function(basecolumn) {
|
|
106 return {
|
|
107 tokenize: null,
|
|
108 context: new Context((basecolumn || 0) - indentUnit, 0, "top", false),
|
|
109 indented: 0,
|
|
110 startOfLine: true
|
|
111 };
|
|
112 },
|
|
113
|
|
114 token: function(stream, state) {
|
|
115 var ctx = state.context;
|
|
116 if (stream.sol()) {
|
|
117 if (ctx.align == null) ctx.align = false;
|
|
118 state.indented = stream.indentation();
|
|
119 state.startOfLine = true;
|
|
120 }
|
|
121 if (stream.eatSpace()) return null;
|
|
122 curPunc = null;
|
|
123 var style = (state.tokenize || tokenBase)(stream, state);
|
|
124 if (style == "comment") return style;
|
|
125 if (ctx.align == null) ctx.align = true;
|
|
126
|
|
127 if ((curPunc == ";" || curPunc == ":" || curPunc == ",")
|
|
128 && ctx.type == "statement"){
|
|
129 popContext(state);
|
|
130 }
|
|
131 else if (curPunc == "{") pushContext(state, stream.column(), "}");
|
|
132 else if (curPunc == "[") pushContext(state, stream.column(), "]");
|
|
133 else if (curPunc == "(") pushContext(state, stream.column(), ")");
|
|
134 else if (curPunc == "}") {
|
|
135 while (ctx.type == "statement") ctx = popContext(state);
|
|
136 if (ctx.type == "}") ctx = popContext(state);
|
|
137 while (ctx.type == "statement") ctx = popContext(state);
|
|
138 }
|
|
139 else if (curPunc == ctx.type) popContext(state);
|
|
140 else if (indentStatements && (((ctx.type == "}" || ctx.type == "top")
|
|
141 && curPunc != ';') || (ctx.type == "statement"
|
|
142 && curPunc == "newstatement")))
|
|
143 pushContext(state, stream.column(), "statement");
|
|
144 state.startOfLine = false;
|
|
145 return style;
|
|
146 },
|
|
147
|
|
148 electricChars: "{}",
|
|
149 lineComment: "#",
|
|
150 fold: "brace"
|
|
151 };
|
|
152 });
|
|
153
|
|
154 function words(str) {
|
|
155 var obj = {}, words = str.split(" ");
|
|
156 for (var i = 0; i < words.length; ++i)
|
|
157 obj[words[i]] = true;
|
|
158 return obj;
|
|
159 }
|
|
160
|
|
161 CodeMirror.defineMIME("text/x-ttcn-cfg", {
|
|
162 name: "ttcn-cfg",
|
|
163 keywords: words("Yes No LogFile FileMask ConsoleMask AppendFile" +
|
|
164 " TimeStampFormat LogEventTypes SourceInfoFormat" +
|
|
165 " LogEntityName LogSourceInfo DiskFullAction" +
|
|
166 " LogFileNumber LogFileSize MatchingHints Detailed" +
|
|
167 " Compact SubCategories Stack Single None Seconds" +
|
|
168 " DateTime Time Stop Error Retry Delete TCPPort KillTimer" +
|
|
169 " NumHCs UnixSocketsEnabled LocalAddress"),
|
|
170 fileNCtrlMaskOptions: words("TTCN_EXECUTOR TTCN_ERROR TTCN_WARNING" +
|
|
171 " TTCN_PORTEVENT TTCN_TIMEROP TTCN_VERDICTOP" +
|
|
172 " TTCN_DEFAULTOP TTCN_TESTCASE TTCN_ACTION" +
|
|
173 " TTCN_USER TTCN_FUNCTION TTCN_STATISTICS" +
|
|
174 " TTCN_PARALLEL TTCN_MATCHING TTCN_DEBUG" +
|
|
175 " EXECUTOR ERROR WARNING PORTEVENT TIMEROP" +
|
|
176 " VERDICTOP DEFAULTOP TESTCASE ACTION USER" +
|
|
177 " FUNCTION STATISTICS PARALLEL MATCHING DEBUG" +
|
|
178 " LOG_ALL LOG_NOTHING ACTION_UNQUALIFIED" +
|
|
179 " DEBUG_ENCDEC DEBUG_TESTPORT" +
|
|
180 " DEBUG_UNQUALIFIED DEFAULTOP_ACTIVATE" +
|
|
181 " DEFAULTOP_DEACTIVATE DEFAULTOP_EXIT" +
|
|
182 " DEFAULTOP_UNQUALIFIED ERROR_UNQUALIFIED" +
|
|
183 " EXECUTOR_COMPONENT EXECUTOR_CONFIGDATA" +
|
|
184 " EXECUTOR_EXTCOMMAND EXECUTOR_LOGOPTIONS" +
|
|
185 " EXECUTOR_RUNTIME EXECUTOR_UNQUALIFIED" +
|
|
186 " FUNCTION_RND FUNCTION_UNQUALIFIED" +
|
|
187 " MATCHING_DONE MATCHING_MCSUCCESS" +
|
|
188 " MATCHING_MCUNSUCC MATCHING_MMSUCCESS" +
|
|
189 " MATCHING_MMUNSUCC MATCHING_PCSUCCESS" +
|
|
190 " MATCHING_PCUNSUCC MATCHING_PMSUCCESS" +
|
|
191 " MATCHING_PMUNSUCC MATCHING_PROBLEM" +
|
|
192 " MATCHING_TIMEOUT MATCHING_UNQUALIFIED" +
|
|
193 " PARALLEL_PORTCONN PARALLEL_PORTMAP" +
|
|
194 " PARALLEL_PTC PARALLEL_UNQUALIFIED" +
|
|
195 " PORTEVENT_DUALRECV PORTEVENT_DUALSEND" +
|
|
196 " PORTEVENT_MCRECV PORTEVENT_MCSEND" +
|
|
197 " PORTEVENT_MMRECV PORTEVENT_MMSEND" +
|
|
198 " PORTEVENT_MQUEUE PORTEVENT_PCIN" +
|
|
199 " PORTEVENT_PCOUT PORTEVENT_PMIN" +
|
|
200 " PORTEVENT_PMOUT PORTEVENT_PQUEUE" +
|
|
201 " PORTEVENT_STATE PORTEVENT_UNQUALIFIED" +
|
|
202 " STATISTICS_UNQUALIFIED STATISTICS_VERDICT" +
|
|
203 " TESTCASE_FINISH TESTCASE_START" +
|
|
204 " TESTCASE_UNQUALIFIED TIMEROP_GUARD" +
|
|
205 " TIMEROP_READ TIMEROP_START TIMEROP_STOP" +
|
|
206 " TIMEROP_TIMEOUT TIMEROP_UNQUALIFIED" +
|
|
207 " USER_UNQUALIFIED VERDICTOP_FINAL" +
|
|
208 " VERDICTOP_GETVERDICT VERDICTOP_SETVERDICT" +
|
|
209 " VERDICTOP_UNQUALIFIED WARNING_UNQUALIFIED"),
|
|
210 externalCommands: words("BeginControlPart EndControlPart BeginTestCase" +
|
|
211 " EndTestCase"),
|
|
212 multiLineStrings: true
|
|
213 });
|
|
214 }); |