github.com/elliott5/community@v0.14.1-0.20160709191136-823126fb026a/app/public/codemirror/mode/asterisk/asterisk.js (about)

     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  });