Fix: merge conflict
[myslice.git] / to-be-integrated / third-party / codemirror-3.15 / mode / asterisk / asterisk.js
1 /*
2  * =====================================================================================
3  *
4  *       Filename:  mode/asterisk/asterisk.js
5  *
6  *    Description:  CodeMirror mode for Asterisk dialplan
7  *
8  *        Created:  05/17/2012 09:20:25 PM
9  *       Revision:  none
10  *
11  *         Author:  Stas Kobzar (stas@modulis.ca),
12  *        Company:  Modulis.ca Inc.
13  *
14  * =====================================================================================
15  */
16
17 CodeMirror.defineMode("asterisk", function() {
18   var atoms    = ["exten", "same", "include","ignorepat","switch"],
19       dpcmd    = ["#include","#exec"],
20       apps     = [
21                   "addqueuemember","adsiprog","aelsub","agentlogin","agentmonitoroutgoing","agi",
22                   "alarmreceiver","amd","answer","authenticate","background","backgrounddetect",
23                   "bridge","busy","callcompletioncancel","callcompletionrequest","celgenuserevent",
24                   "changemonitor","chanisavail","channelredirect","chanspy","clearhash","confbridge",
25                   "congestion","continuewhile","controlplayback","dahdiacceptr2call","dahdibarge",
26                   "dahdiras","dahdiscan","dahdisendcallreroutingfacility","dahdisendkeypadfacility",
27                   "datetime","dbdel","dbdeltree","deadagi","dial","dictate","directory","disa",
28                   "dumpchan","eagi","echo","endwhile","exec","execif","execiftime","exitwhile","extenspy",
29                   "externalivr","festival","flash","followme","forkcdr","getcpeid","gosub","gosubif",
30                   "goto","gotoif","gotoiftime","hangup","iax2provision","ices","importvar","incomplete",
31                   "ivrdemo","jabberjoin","jabberleave","jabbersend","jabbersendgroup","jabberstatus",
32                   "jack","log","macro","macroexclusive","macroexit","macroif","mailboxexists","meetme",
33                   "meetmeadmin","meetmechanneladmin","meetmecount","milliwatt","minivmaccmess","minivmdelete",
34                   "minivmgreet","minivmmwi","minivmnotify","minivmrecord","mixmonitor","monitor","morsecode",
35                   "mp3player","mset","musiconhold","nbscat","nocdr","noop","odbc","odbc","odbcfinish",
36                   "originate","ospauth","ospfinish","osplookup","ospnext","page","park","parkandannounce",
37                   "parkedcall","pausemonitor","pausequeuemember","pickup","pickupchan","playback","playtones",
38                   "privacymanager","proceeding","progress","queue","queuelog","raiseexception","read","readexten",
39                   "readfile","receivefax","receivefax","receivefax","record","removequeuemember",
40                   "resetcdr","retrydial","return","ringing","sayalpha","saycountedadj","saycountednoun",
41                   "saycountpl","saydigits","saynumber","sayphonetic","sayunixtime","senddtmf","sendfax",
42                   "sendfax","sendfax","sendimage","sendtext","sendurl","set","setamaflags",
43                   "setcallerpres","setmusiconhold","sipaddheader","sipdtmfmode","sipremoveheader","skel",
44                   "slastation","slatrunk","sms","softhangup","speechactivategrammar","speechbackground",
45                   "speechcreate","speechdeactivategrammar","speechdestroy","speechloadgrammar","speechprocessingsound",
46                   "speechstart","speechunloadgrammar","stackpop","startmusiconhold","stopmixmonitor","stopmonitor",
47                   "stopmusiconhold","stopplaytones","system","testclient","testserver","transfer","tryexec",
48                   "trysystem","unpausemonitor","unpausequeuemember","userevent","verbose","vmauthenticate",
49                   "vmsayname","voicemail","voicemailmain","wait","waitexten","waitfornoise","waitforring",
50                   "waitforsilence","waitmusiconhold","waituntil","while","zapateller"
51                  ];
52
53   function basicToken(stream,state){
54     var cur = '';
55     var ch  = '';
56     ch = stream.next();
57     // comment
58     if(ch == ";") {
59       stream.skipToEnd();
60       return "comment";
61     }
62     // context
63     if(ch == '[') {
64       stream.skipTo(']');
65       stream.eat(']');
66       return "header";
67     }
68     // string
69     if(ch == '"') {
70       stream.skipTo('"');
71       return "string";
72     }
73     if(ch == "'") {
74       stream.skipTo("'");
75       return "string-2";
76     }
77     // dialplan commands
78     if(ch == '#') {
79       stream.eatWhile(/\w/);
80       cur = stream.current();
81       if(dpcmd.indexOf(cur) !== -1) {
82         stream.skipToEnd();
83         return "strong";
84       }
85     }
86     // application args
87     if(ch == '$'){
88       var ch1 = stream.peek();
89       if(ch1 == '{'){
90         stream.skipTo('}');
91         stream.eat('}');
92         return "variable-3";
93       }
94     }
95     // extension
96     stream.eatWhile(/\w/);
97     cur = stream.current();
98     if(atoms.indexOf(cur) !== -1) {
99       state.extenStart = true;
100       switch(cur) {
101         case 'same': state.extenSame = true; break;
102         case 'include':
103         case 'switch':
104         case 'ignorepat':
105           state.extenInclude = true;break;
106         default:break;
107       }
108       return "atom";
109     }
110   }
111
112   return {
113     startState: function() {
114       return {
115         extenStart: false,
116         extenSame:  false,
117         extenInclude: false,
118         extenExten: false,
119         extenPriority: false,
120         extenApplication: false
121       };
122     },
123     token: function(stream, state) {
124
125       var cur = '';
126       var ch  = '';
127       if(stream.eatSpace()) return null;
128       // extension started
129       if(state.extenStart){
130         stream.eatWhile(/[^\s]/);
131         cur = stream.current();
132         if(/^=>?$/.test(cur)){
133           state.extenExten = true;
134           state.extenStart = false;
135           return "strong";
136         } else {
137           state.extenStart = false;
138           stream.skipToEnd();
139           return "error";
140         }
141       } else if(state.extenExten) {
142         // set exten and priority
143         state.extenExten = false;
144         state.extenPriority = true;
145         stream.eatWhile(/[^,]/);
146         if(state.extenInclude) {
147           stream.skipToEnd();
148           state.extenPriority = false;
149           state.extenInclude = false;
150         }
151         if(state.extenSame) {
152           state.extenPriority = false;
153           state.extenSame = false;
154           state.extenApplication = true;
155         }
156         return "tag";
157       } else if(state.extenPriority) {
158         state.extenPriority = false;
159         state.extenApplication = true;
160         ch = stream.next(); // get comma
161         if(state.extenSame) return null;
162         stream.eatWhile(/[^,]/);
163         return "number";
164       } else if(state.extenApplication) {
165         stream.eatWhile(/,/);
166         cur = stream.current();
167         if(cur === ',') return null;
168         stream.eatWhile(/\w/);
169         cur = stream.current().toLowerCase();
170         state.extenApplication = false;
171         if(apps.indexOf(cur) !== -1){
172           return "def strong";
173         }
174       } else{
175         return basicToken(stream,state);
176       }
177
178       return null;
179     }
180   };
181 });
182
183 CodeMirror.defineMIME("text/x-asterisk", "asterisk");