2 * =====================================================================================
4 * Filename: mode/asterisk/asterisk.js
6 * Description: CodeMirror mode for Asterisk dialplan
8 * Created: 05/17/2012 09:20:25 PM
11 * Author: Stas Kobzar (stas@modulis.ca),
12 * Company: Modulis.ca Inc.
14 * =====================================================================================
17 CodeMirror.defineMode("asterisk", function() {
18 var atoms = ["exten", "same", "include","ignorepat","switch"],
19 dpcmd = ["#include","#exec"],
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"
53 function basicToken(stream,state){
79 stream.eatWhile(/\w/);
80 cur = stream.current();
81 if(dpcmd.indexOf(cur) !== -1) {
88 var ch1 = stream.peek();
96 stream.eatWhile(/\w/);
97 cur = stream.current();
98 if(atoms.indexOf(cur) !== -1) {
99 state.extenStart = true;
101 case 'same': state.extenSame = true; break;
105 state.extenInclude = true;break;
113 startState: function() {
119 extenPriority: false,
120 extenApplication: false
123 token: function(stream, state) {
127 if(stream.eatSpace()) return null;
129 if(state.extenStart){
130 stream.eatWhile(/[^\s]/);
131 cur = stream.current();
132 if(/^=>?$/.test(cur)){
133 state.extenExten = true;
134 state.extenStart = false;
137 state.extenStart = false;
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) {
148 state.extenPriority = false;
149 state.extenInclude = false;
151 if(state.extenSame) {
152 state.extenPriority = false;
153 state.extenSame = false;
154 state.extenApplication = true;
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(/[^,]/);
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){
175 return basicToken(stream,state);
183 CodeMirror.defineMIME("text/x-asterisk", "asterisk");