asterisk.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. // CodeMirror, copyright (c) by Marijn Haverbeke and others
  2. // Distributed under an MIT license: https://codemirror.net/LICENSE
  3. /*
  4. * =====================================================================================
  5. *
  6. * Filename: mode/asterisk/asterisk.js
  7. *
  8. * Description: CodeMirror mode for Asterisk dialplan
  9. *
  10. * Created: 05/17/2012 09:20:25 PM
  11. * Revision: 08/05/2019 AstLinux Project: Support block-comments
  12. *
  13. * Author: Stas Kobzar (stas@modulis.ca),
  14. * Company: Modulis.ca Inc.
  15. *
  16. * =====================================================================================
  17. */
  18. ;(function (mod) {
  19. if (typeof exports == 'object' && typeof module == 'object')
  20. // CommonJS
  21. mod(require('../../lib/codemirror'))
  22. else if (typeof define == 'function' && define.amd)
  23. // AMD
  24. define(['../../lib/codemirror'], mod)
  25. // Plain browser env
  26. else mod(CodeMirror)
  27. })(function (CodeMirror) {
  28. 'use strict'
  29. CodeMirror.defineMode('asterisk', function () {
  30. var atoms = ['exten', 'same', 'include', 'ignorepat', 'switch'],
  31. dpcmd = ['#include', '#exec'],
  32. apps = [
  33. 'addqueuemember',
  34. 'adsiprog',
  35. 'aelsub',
  36. 'agentlogin',
  37. 'agentmonitoroutgoing',
  38. 'agi',
  39. 'alarmreceiver',
  40. 'amd',
  41. 'answer',
  42. 'authenticate',
  43. 'background',
  44. 'backgrounddetect',
  45. 'bridge',
  46. 'busy',
  47. 'callcompletioncancel',
  48. 'callcompletionrequest',
  49. 'celgenuserevent',
  50. 'changemonitor',
  51. 'chanisavail',
  52. 'channelredirect',
  53. 'chanspy',
  54. 'clearhash',
  55. 'confbridge',
  56. 'congestion',
  57. 'continuewhile',
  58. 'controlplayback',
  59. 'dahdiacceptr2call',
  60. 'dahdibarge',
  61. 'dahdiras',
  62. 'dahdiscan',
  63. 'dahdisendcallreroutingfacility',
  64. 'dahdisendkeypadfacility',
  65. 'datetime',
  66. 'dbdel',
  67. 'dbdeltree',
  68. 'deadagi',
  69. 'dial',
  70. 'dictate',
  71. 'directory',
  72. 'disa',
  73. 'dumpchan',
  74. 'eagi',
  75. 'echo',
  76. 'endwhile',
  77. 'exec',
  78. 'execif',
  79. 'execiftime',
  80. 'exitwhile',
  81. 'extenspy',
  82. 'externalivr',
  83. 'festival',
  84. 'flash',
  85. 'followme',
  86. 'forkcdr',
  87. 'getcpeid',
  88. 'gosub',
  89. 'gosubif',
  90. 'goto',
  91. 'gotoif',
  92. 'gotoiftime',
  93. 'hangup',
  94. 'iax2provision',
  95. 'ices',
  96. 'importvar',
  97. 'incomplete',
  98. 'ivrdemo',
  99. 'jabberjoin',
  100. 'jabberleave',
  101. 'jabbersend',
  102. 'jabbersendgroup',
  103. 'jabberstatus',
  104. 'jack',
  105. 'log',
  106. 'macro',
  107. 'macroexclusive',
  108. 'macroexit',
  109. 'macroif',
  110. 'mailboxexists',
  111. 'meetme',
  112. 'meetmeadmin',
  113. 'meetmechanneladmin',
  114. 'meetmecount',
  115. 'milliwatt',
  116. 'minivmaccmess',
  117. 'minivmdelete',
  118. 'minivmgreet',
  119. 'minivmmwi',
  120. 'minivmnotify',
  121. 'minivmrecord',
  122. 'mixmonitor',
  123. 'monitor',
  124. 'morsecode',
  125. 'mp3player',
  126. 'mset',
  127. 'musiconhold',
  128. 'nbscat',
  129. 'nocdr',
  130. 'noop',
  131. 'odbc',
  132. 'odbc',
  133. 'odbcfinish',
  134. 'originate',
  135. 'ospauth',
  136. 'ospfinish',
  137. 'osplookup',
  138. 'ospnext',
  139. 'page',
  140. 'park',
  141. 'parkandannounce',
  142. 'parkedcall',
  143. 'pausemonitor',
  144. 'pausequeuemember',
  145. 'pickup',
  146. 'pickupchan',
  147. 'playback',
  148. 'playtones',
  149. 'privacymanager',
  150. 'proceeding',
  151. 'progress',
  152. 'queue',
  153. 'queuelog',
  154. 'raiseexception',
  155. 'read',
  156. 'readexten',
  157. 'readfile',
  158. 'receivefax',
  159. 'receivefax',
  160. 'receivefax',
  161. 'record',
  162. 'removequeuemember',
  163. 'resetcdr',
  164. 'retrydial',
  165. 'return',
  166. 'ringing',
  167. 'sayalpha',
  168. 'saycountedadj',
  169. 'saycountednoun',
  170. 'saycountpl',
  171. 'saydigits',
  172. 'saynumber',
  173. 'sayphonetic',
  174. 'sayunixtime',
  175. 'senddtmf',
  176. 'sendfax',
  177. 'sendfax',
  178. 'sendfax',
  179. 'sendimage',
  180. 'sendtext',
  181. 'sendurl',
  182. 'set',
  183. 'setamaflags',
  184. 'setcallerpres',
  185. 'setmusiconhold',
  186. 'sipaddheader',
  187. 'sipdtmfmode',
  188. 'sipremoveheader',
  189. 'skel',
  190. 'slastation',
  191. 'slatrunk',
  192. 'sms',
  193. 'softhangup',
  194. 'speechactivategrammar',
  195. 'speechbackground',
  196. 'speechcreate',
  197. 'speechdeactivategrammar',
  198. 'speechdestroy',
  199. 'speechloadgrammar',
  200. 'speechprocessingsound',
  201. 'speechstart',
  202. 'speechunloadgrammar',
  203. 'stackpop',
  204. 'startmusiconhold',
  205. 'stopmixmonitor',
  206. 'stopmonitor',
  207. 'stopmusiconhold',
  208. 'stopplaytones',
  209. 'system',
  210. 'testclient',
  211. 'testserver',
  212. 'transfer',
  213. 'tryexec',
  214. 'trysystem',
  215. 'unpausemonitor',
  216. 'unpausequeuemember',
  217. 'userevent',
  218. 'verbose',
  219. 'vmauthenticate',
  220. 'vmsayname',
  221. 'voicemail',
  222. 'voicemailmain',
  223. 'wait',
  224. 'waitexten',
  225. 'waitfornoise',
  226. 'waitforring',
  227. 'waitforsilence',
  228. 'waitmusiconhold',
  229. 'waituntil',
  230. 'while',
  231. 'zapateller',
  232. ]
  233. function basicToken(stream, state) {
  234. var cur = ''
  235. var ch = stream.next()
  236. // comment
  237. if (state.blockComment) {
  238. if (ch == '-' && stream.match('-;', true)) {
  239. state.blockComment = false
  240. } else if (stream.skipTo('--;')) {
  241. stream.next()
  242. stream.next()
  243. stream.next()
  244. state.blockComment = false
  245. } else {
  246. stream.skipToEnd()
  247. }
  248. return 'comment'
  249. }
  250. if (ch == ';') {
  251. if (stream.match('--', true)) {
  252. if (!stream.match('-', false)) {
  253. // Except ;--- is not a block comment
  254. state.blockComment = true
  255. return 'comment'
  256. }
  257. }
  258. stream.skipToEnd()
  259. return 'comment'
  260. }
  261. // context
  262. if (ch == '[') {
  263. stream.skipTo(']')
  264. stream.eat(']')
  265. return 'header'
  266. }
  267. // string
  268. if (ch == '"') {
  269. stream.skipTo('"')
  270. return 'string'
  271. }
  272. if (ch == "'") {
  273. stream.skipTo("'")
  274. return 'string-2'
  275. }
  276. // dialplan commands
  277. if (ch == '#') {
  278. stream.eatWhile(/\w/)
  279. cur = stream.current()
  280. if (dpcmd.indexOf(cur) !== -1) {
  281. stream.skipToEnd()
  282. return 'strong'
  283. }
  284. }
  285. // application args
  286. if (ch == '$') {
  287. var ch1 = stream.peek()
  288. if (ch1 == '{') {
  289. stream.skipTo('}')
  290. stream.eat('}')
  291. return 'variable-3'
  292. }
  293. }
  294. // extension
  295. stream.eatWhile(/\w/)
  296. cur = stream.current()
  297. if (atoms.indexOf(cur) !== -1) {
  298. state.extenStart = true
  299. switch (cur) {
  300. case 'same':
  301. state.extenSame = true
  302. break
  303. case 'include':
  304. case 'switch':
  305. case 'ignorepat':
  306. state.extenInclude = true
  307. break
  308. default:
  309. break
  310. }
  311. return 'atom'
  312. }
  313. }
  314. return {
  315. startState: function () {
  316. return {
  317. blockComment: false,
  318. extenStart: false,
  319. extenSame: false,
  320. extenInclude: false,
  321. extenExten: false,
  322. extenPriority: false,
  323. extenApplication: false,
  324. }
  325. },
  326. token: function (stream, state) {
  327. var cur = ''
  328. if (stream.eatSpace()) return null
  329. // extension started
  330. if (state.extenStart) {
  331. stream.eatWhile(/[^\s]/)
  332. cur = stream.current()
  333. if (/^=>?$/.test(cur)) {
  334. state.extenExten = true
  335. state.extenStart = false
  336. return 'strong'
  337. } else {
  338. state.extenStart = false
  339. stream.skipToEnd()
  340. return 'error'
  341. }
  342. } else if (state.extenExten) {
  343. // set exten and priority
  344. state.extenExten = false
  345. state.extenPriority = true
  346. stream.eatWhile(/[^,]/)
  347. if (state.extenInclude) {
  348. stream.skipToEnd()
  349. state.extenPriority = false
  350. state.extenInclude = false
  351. }
  352. if (state.extenSame) {
  353. state.extenPriority = false
  354. state.extenSame = false
  355. state.extenApplication = true
  356. }
  357. return 'tag'
  358. } else if (state.extenPriority) {
  359. state.extenPriority = false
  360. state.extenApplication = true
  361. stream.next() // get comma
  362. if (state.extenSame) return null
  363. stream.eatWhile(/[^,]/)
  364. return 'number'
  365. } else if (state.extenApplication) {
  366. stream.eatWhile(/,/)
  367. cur = stream.current()
  368. if (cur === ',') return null
  369. stream.eatWhile(/\w/)
  370. cur = stream.current().toLowerCase()
  371. state.extenApplication = false
  372. if (apps.indexOf(cur) !== -1) {
  373. return 'def strong'
  374. }
  375. } else {
  376. return basicToken(stream, state)
  377. }
  378. return null
  379. },
  380. blockCommentStart: ';--',
  381. blockCommentEnd: '--;',
  382. lineComment: ';',
  383. }
  384. })
  385. CodeMirror.defineMIME('text/x-asterisk', 'asterisk')
  386. })