openrat-cms

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

asterisk.js (7437B)


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