|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- // CodeMirror, copyright (c) by Marijn Haverbeke and others
- // Distributed under an MIT license: https://codemirror.net/LICENSE
-
- /*
- * =====================================================================================
- *
- * Filename: mode/asterisk/asterisk.js
- *
- * Description: CodeMirror mode for Asterisk dialplan
- *
- * Created: 05/17/2012 09:20:25 PM
- * Revision: 08/05/2019 AstLinux Project: Support block-comments
- *
- * Author: Stas Kobzar (stas@modulis.ca),
- * Company: Modulis.ca Inc.
- *
- * =====================================================================================
- */
-
- (function(mod) {
- if (typeof exports == "object" && typeof module == "object") // CommonJS
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd) // AMD
- define(["../../lib/codemirror"], mod);
- else // Plain browser env
- mod(CodeMirror);
- })(function(CodeMirror) {
- "use strict";
-
- CodeMirror.defineMode("asterisk", function() {
- var atoms = ["exten", "same", "include","ignorepat","switch"],
- dpcmd = ["#include","#exec"],
- apps = [
- "addqueuemember","adsiprog","aelsub","agentlogin","agentmonitoroutgoing","agi",
- "alarmreceiver","amd","answer","authenticate","background","backgrounddetect",
- "bridge","busy","callcompletioncancel","callcompletionrequest","celgenuserevent",
- "changemonitor","chanisavail","channelredirect","chanspy","clearhash","confbridge",
- "congestion","continuewhile","controlplayback","dahdiacceptr2call","dahdibarge",
- "dahdiras","dahdiscan","dahdisendcallreroutingfacility","dahdisendkeypadfacility",
- "datetime","dbdel","dbdeltree","deadagi","dial","dictate","directory","disa",
- "dumpchan","eagi","echo","endwhile","exec","execif","execiftime","exitwhile","extenspy",
- "externalivr","festival","flash","followme","forkcdr","getcpeid","gosub","gosubif",
- "goto","gotoif","gotoiftime","hangup","iax2provision","ices","importvar","incomplete",
- "ivrdemo","jabberjoin","jabberleave","jabbersend","jabbersendgroup","jabberstatus",
- "jack","log","macro","macroexclusive","macroexit","macroif","mailboxexists","meetme",
- "meetmeadmin","meetmechanneladmin","meetmecount","milliwatt","minivmaccmess","minivmdelete",
- "minivmgreet","minivmmwi","minivmnotify","minivmrecord","mixmonitor","monitor","morsecode",
- "mp3player","mset","musiconhold","nbscat","nocdr","noop","odbc","odbc","odbcfinish",
- "originate","ospauth","ospfinish","osplookup","ospnext","page","park","parkandannounce",
- "parkedcall","pausemonitor","pausequeuemember","pickup","pickupchan","playback","playtones",
- "privacymanager","proceeding","progress","queue","queuelog","raiseexception","read","readexten",
- "readfile","receivefax","receivefax","receivefax","record","removequeuemember",
- "resetcdr","retrydial","return","ringing","sayalpha","saycountedadj","saycountednoun",
- "saycountpl","saydigits","saynumber","sayphonetic","sayunixtime","senddtmf","sendfax",
- "sendfax","sendfax","sendimage","sendtext","sendurl","set","setamaflags",
- "setcallerpres","setmusiconhold","sipaddheader","sipdtmfmode","sipremoveheader","skel",
- "slastation","slatrunk","sms","softhangup","speechactivategrammar","speechbackground",
- "speechcreate","speechdeactivategrammar","speechdestroy","speechloadgrammar","speechprocessingsound",
- "speechstart","speechunloadgrammar","stackpop","startmusiconhold","stopmixmonitor","stopmonitor",
- "stopmusiconhold","stopplaytones","system","testclient","testserver","transfer","tryexec",
- "trysystem","unpausemonitor","unpausequeuemember","userevent","verbose","vmauthenticate",
- "vmsayname","voicemail","voicemailmain","wait","waitexten","waitfornoise","waitforring",
- "waitforsilence","waitmusiconhold","waituntil","while","zapateller"
- ];
-
- function basicToken(stream,state){
- var cur = '';
- var ch = stream.next();
- // comment
- if (state.blockComment) {
- if (ch == "-" && stream.match("-;", true)) {
- state.blockComment = false;
- } else if (stream.skipTo("--;")) {
- stream.next();
- stream.next();
- stream.next();
- state.blockComment = false;
- } else {
- stream.skipToEnd();
- }
- return "comment";
- }
- if(ch == ";") {
- if (stream.match("--", true)) {
- if (!stream.match("-", false)) { // Except ;--- is not a block comment
- state.blockComment = true;
- return "comment";
- }
- }
- stream.skipToEnd();
- return "comment";
- }
- // context
- if(ch == '[') {
- stream.skipTo(']');
- stream.eat(']');
- return "header";
- }
- // string
- if(ch == '"') {
- stream.skipTo('"');
- return "string";
- }
- if(ch == "'") {
- stream.skipTo("'");
- return "string-2";
- }
- // dialplan commands
- if(ch == '#') {
- stream.eatWhile(/\w/);
- cur = stream.current();
- if(dpcmd.indexOf(cur) !== -1) {
- stream.skipToEnd();
- return "strong";
- }
- }
- // application args
- if(ch == '$'){
- var ch1 = stream.peek();
- if(ch1 == '{'){
- stream.skipTo('}');
- stream.eat('}');
- return "variable-3";
- }
- }
- // extension
- stream.eatWhile(/\w/);
- cur = stream.current();
- if(atoms.indexOf(cur) !== -1) {
- state.extenStart = true;
- switch(cur) {
- case 'same': state.extenSame = true; break;
- case 'include':
- case 'switch':
- case 'ignorepat':
- state.extenInclude = true;break;
- default:break;
- }
- return "atom";
- }
- }
-
- return {
- startState: function() {
- return {
- blockComment: false,
- extenStart: false,
- extenSame: false,
- extenInclude: false,
- extenExten: false,
- extenPriority: false,
- extenApplication: false
- };
- },
- token: function(stream, state) {
-
- var cur = '';
- if(stream.eatSpace()) return null;
- // extension started
- if(state.extenStart){
- stream.eatWhile(/[^\s]/);
- cur = stream.current();
- if(/^=>?$/.test(cur)){
- state.extenExten = true;
- state.extenStart = false;
- return "strong";
- } else {
- state.extenStart = false;
- stream.skipToEnd();
- return "error";
- }
- } else if(state.extenExten) {
- // set exten and priority
- state.extenExten = false;
- state.extenPriority = true;
- stream.eatWhile(/[^,]/);
- if(state.extenInclude) {
- stream.skipToEnd();
- state.extenPriority = false;
- state.extenInclude = false;
- }
- if(state.extenSame) {
- state.extenPriority = false;
- state.extenSame = false;
- state.extenApplication = true;
- }
- return "tag";
- } else if(state.extenPriority) {
- state.extenPriority = false;
- state.extenApplication = true;
- stream.next(); // get comma
- if(state.extenSame) return null;
- stream.eatWhile(/[^,]/);
- return "number";
- } else if(state.extenApplication) {
- stream.eatWhile(/,/);
- cur = stream.current();
- if(cur === ',') return null;
- stream.eatWhile(/\w/);
- cur = stream.current().toLowerCase();
- state.extenApplication = false;
- if(apps.indexOf(cur) !== -1){
- return "def strong";
- }
- } else{
- return basicToken(stream,state);
- }
-
- return null;
- },
-
- blockCommentStart: ";--",
- blockCommentEnd: "--;",
- lineComment: ";"
- };
- });
-
- CodeMirror.defineMIME("text/x-asterisk", "asterisk");
-
- });
|