admin(major): add YAMLField for attributes, add codemirror editor
This commit is contained in:
		
							
								
								
									
										220
									
								
								passbook/admin/static/codemirror/mode/asterisk/asterisk.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										220
									
								
								passbook/admin/static/codemirror/mode/asterisk/asterisk.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,220 @@
 | 
			
		||||
// 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");
 | 
			
		||||
 | 
			
		||||
});
 | 
			
		||||
							
								
								
									
										155
									
								
								passbook/admin/static/codemirror/mode/asterisk/index.html
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										155
									
								
								passbook/admin/static/codemirror/mode/asterisk/index.html
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,155 @@
 | 
			
		||||
<!doctype html>
 | 
			
		||||
 | 
			
		||||
<title>CodeMirror: Asterisk dialplan mode</title>
 | 
			
		||||
<meta charset="utf-8"/>
 | 
			
		||||
<link rel=stylesheet href="../../doc/docs.css">
 | 
			
		||||
 | 
			
		||||
<link rel="stylesheet" href="../../lib/codemirror.css">
 | 
			
		||||
<script src="../../lib/codemirror.js"></script>
 | 
			
		||||
<script src="../../addon/edit/matchbrackets.js"></script>
 | 
			
		||||
<script src="asterisk.js"></script>
 | 
			
		||||
<style>
 | 
			
		||||
      .CodeMirror {border: 1px solid #999;}
 | 
			
		||||
      .cm-s-default span.cm-arrow { color: red; }
 | 
			
		||||
    </style>
 | 
			
		||||
<div id=nav>
 | 
			
		||||
  <a href="https://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
 | 
			
		||||
 | 
			
		||||
  <ul>
 | 
			
		||||
    <li><a href="../../index.html">Home</a>
 | 
			
		||||
    <li><a href="../../doc/manual.html">Manual</a>
 | 
			
		||||
    <li><a href="https://github.com/codemirror/codemirror">Code</a>
 | 
			
		||||
  </ul>
 | 
			
		||||
  <ul>
 | 
			
		||||
    <li><a href="../index.html">Language modes</a>
 | 
			
		||||
    <li><a class=active href="#">Asterisk dialplan</a>
 | 
			
		||||
  </ul>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<article>
 | 
			
		||||
<h2>Asterisk dialplan mode</h2>
 | 
			
		||||
<form><textarea id="code" name="code">
 | 
			
		||||
; extensions.conf - the Asterisk dial plan
 | 
			
		||||
;
 | 
			
		||||
 | 
			
		||||
[general]
 | 
			
		||||
;
 | 
			
		||||
; If static is set to no, or omitted, then the pbx_config will rewrite
 | 
			
		||||
; this file when extensions are modified.  Remember that all comments
 | 
			
		||||
; made in the file will be lost when that happens.
 | 
			
		||||
static=yes
 | 
			
		||||
 | 
			
		||||
#include "/etc/asterisk/additional_general.conf
 | 
			
		||||
 | 
			
		||||
[iaxprovider]
 | 
			
		||||
switch => IAX2/user:[key]@myserver/mycontext
 | 
			
		||||
 | 
			
		||||
[dynamic]
 | 
			
		||||
#exec /usr/bin/dynamic-peers.pl
 | 
			
		||||
 | 
			
		||||
[trunkint]
 | 
			
		||||
;
 | 
			
		||||
; International long distance through trunk
 | 
			
		||||
;
 | 
			
		||||
exten => _9011.,1,Macro(dundi-e164,${EXTEN:4})
 | 
			
		||||
exten => _9011.,n,Dial(${GLOBAL(TRUNK)}/${FILTER(0-9,${EXTEN:${GLOBAL(TRUNKMSD)}})})
 | 
			
		||||
 | 
			
		||||
[local]
 | 
			
		||||
;
 | 
			
		||||
; Master context for local, toll-free, and iaxtel calls only
 | 
			
		||||
;
 | 
			
		||||
ignorepat => 9
 | 
			
		||||
include => default
 | 
			
		||||
 | 
			
		||||
[demo]
 | 
			
		||||
include => stdexten
 | 
			
		||||
;
 | 
			
		||||
; We start with what to do when a call first comes in.
 | 
			
		||||
;
 | 
			
		||||
exten => s,1,Wait(1)			; Wait a second, just for fun
 | 
			
		||||
same  => n,Answer			; Answer the line
 | 
			
		||||
same  => n,Set(TIMEOUT(digit)=5)	; Set Digit Timeout to 5 seconds
 | 
			
		||||
same  => n,Set(TIMEOUT(response)=10)	; Set Response Timeout to 10 seconds
 | 
			
		||||
same  => n(restart),BackGround(demo-congrats)	; Play a congratulatory message
 | 
			
		||||
same  => n(instruct),BackGround(demo-instruct)	; Play some instructions
 | 
			
		||||
same  => n,WaitExten			; Wait for an extension to be dialed.
 | 
			
		||||
 | 
			
		||||
exten => 2,1,BackGround(demo-moreinfo)	; Give some more information.
 | 
			
		||||
exten => 2,n,Goto(s,instruct)
 | 
			
		||||
 | 
			
		||||
exten => 3,1,Set(LANGUAGE()=fr)		; Set language to french
 | 
			
		||||
exten => 3,n,Goto(s,restart)		; Start with the congratulations
 | 
			
		||||
 | 
			
		||||
exten => 1000,1,Goto(default,s,1)
 | 
			
		||||
;
 | 
			
		||||
; We also create an example user, 1234, who is on the console and has
 | 
			
		||||
; voicemail, etc.
 | 
			
		||||
;
 | 
			
		||||
exten => 1234,1,Playback(transfer,skip)		; "Please hold while..."
 | 
			
		||||
					; (but skip if channel is not up)
 | 
			
		||||
exten => 1234,n,Gosub(${EXTEN},stdexten(${GLOBAL(CONSOLE)}))
 | 
			
		||||
exten => 1234,n,Goto(default,s,1)		; exited Voicemail
 | 
			
		||||
 | 
			
		||||
exten => 1235,1,Voicemail(1234,u)		; Right to voicemail
 | 
			
		||||
 | 
			
		||||
exten => 1236,1,Dial(Console/dsp)		; Ring forever
 | 
			
		||||
exten => 1236,n,Voicemail(1234,b)		; Unless busy
 | 
			
		||||
 | 
			
		||||
;
 | 
			
		||||
; # for when they're done with the demo
 | 
			
		||||
;
 | 
			
		||||
exten => #,1,Playback(demo-thanks)	; "Thanks for trying the demo"
 | 
			
		||||
exten => #,n,Hangup			; Hang them up.
 | 
			
		||||
 | 
			
		||||
;
 | 
			
		||||
; A timeout and "invalid extension rule"
 | 
			
		||||
;
 | 
			
		||||
exten => t,1,Goto(#,1)			; If they take too long, give up
 | 
			
		||||
exten => i,1,Playback(invalid)		; "That's not valid, try again"
 | 
			
		||||
 | 
			
		||||
;
 | 
			
		||||
; Create an extension, 500, for dialing the
 | 
			
		||||
; Asterisk demo.
 | 
			
		||||
;
 | 
			
		||||
exten => 500,1,Playback(demo-abouttotry); Let them know what's going on
 | 
			
		||||
exten => 500,n,Dial(IAX2/guest@pbx.digium.com/s@default)	; Call the Asterisk demo
 | 
			
		||||
exten => 500,n,Playback(demo-nogo)	; Couldn't connect to the demo site
 | 
			
		||||
exten => 500,n,Goto(s,6)		; Return to the start over message.
 | 
			
		||||
 | 
			
		||||
;
 | 
			
		||||
; Create an extension, 600, for evaluating echo latency.
 | 
			
		||||
;
 | 
			
		||||
exten => 600,1,Playback(demo-echotest)	; Let them know what's going on
 | 
			
		||||
exten => 600,n,Echo			; Do the echo test
 | 
			
		||||
exten => 600,n,Playback(demo-echodone)	; Let them know it's over
 | 
			
		||||
exten => 600,n,Goto(s,6)		; Start over
 | 
			
		||||
 | 
			
		||||
;
 | 
			
		||||
;	You can use the Macro Page to intercom a individual user
 | 
			
		||||
exten => 76245,1,Macro(page,SIP/Grandstream1)
 | 
			
		||||
; or if your peernames are the same as extensions
 | 
			
		||||
exten => _7XXX,1,Macro(page,SIP/${EXTEN})
 | 
			
		||||
;
 | 
			
		||||
;
 | 
			
		||||
; System Wide Page at extension 7999
 | 
			
		||||
;
 | 
			
		||||
exten => 7999,1,Set(TIMEOUT(absolute)=60)
 | 
			
		||||
exten => 7999,2,Page(Local/Grandstream1@page&Local/Xlite1@page&Local/1234@page/n,d)
 | 
			
		||||
 | 
			
		||||
; Give voicemail at extension 8500
 | 
			
		||||
;
 | 
			
		||||
exten => 8500,1,VoicemailMain
 | 
			
		||||
exten => 8500,n,Goto(s,6)
 | 
			
		||||
 | 
			
		||||
    </textarea></form>
 | 
			
		||||
    <script>
 | 
			
		||||
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
 | 
			
		||||
        mode: "text/x-asterisk",
 | 
			
		||||
        matchBrackets: true,
 | 
			
		||||
        lineNumbers: true
 | 
			
		||||
      });
 | 
			
		||||
    </script>
 | 
			
		||||
 | 
			
		||||
    <p><strong>MIME types defined:</strong> <code>text/x-asterisk</code>.</p>
 | 
			
		||||
 | 
			
		||||
  </article>
 | 
			
		||||
		Reference in New Issue
	
	Block a user