Subversion-Projekte lars-tiefland.ci

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
776 lars 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
});