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