123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- // CodeMirror, copyright (c) by Marijn Haverbeke and others
- // Distributed under an MIT license: https://codemirror.net/LICENSE
- //mIRC mode by Ford_Lawnmower :: Based on Velocity mode by Steve O'Hara
- ;(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)
- // Plain browser env
- else mod(CodeMirror)
- })(function (CodeMirror) {
- 'use strict'
- CodeMirror.defineMIME('text/mirc', 'mirc')
- CodeMirror.defineMode('mirc', function () {
- function parseWords(str) {
- var obj = {},
- words = str.split(' ')
- for (var i = 0; i < words.length; ++i) obj[words[i]] = true
- return obj
- }
- var specials = parseWords(
- '$! $$ $& $? $+ $abook $abs $active $activecid ' +
- '$activewid $address $addtok $agent $agentname $agentstat $agentver ' +
- '$alias $and $anick $ansi2mirc $aop $appactive $appstate $asc $asctime ' +
- '$asin $atan $avoice $away $awaymsg $awaytime $banmask $base $bfind ' +
- '$binoff $biton $bnick $bvar $bytes $calc $cb $cd $ceil $chan $chanmodes ' +
- '$chantypes $chat $chr $cid $clevel $click $cmdbox $cmdline $cnick $color ' +
- '$com $comcall $comchan $comerr $compact $compress $comval $cos $count ' +
- '$cr $crc $creq $crlf $ctime $ctimer $ctrlenter $date $day $daylight ' +
- '$dbuh $dbuw $dccignore $dccport $dde $ddename $debug $decode $decompress ' +
- '$deltok $devent $dialog $did $didreg $didtok $didwm $disk $dlevel $dll ' +
- '$dllcall $dname $dns $duration $ebeeps $editbox $emailaddr $encode $error ' +
- '$eval $event $exist $feof $ferr $fgetc $file $filename $filtered $finddir ' +
- '$finddirn $findfile $findfilen $findtok $fline $floor $fopen $fread $fserve ' +
- '$fulladdress $fulldate $fullname $fullscreen $get $getdir $getdot $gettok $gmt ' +
- '$group $halted $hash $height $hfind $hget $highlight $hnick $hotline ' +
- '$hotlinepos $ial $ialchan $ibl $idle $iel $ifmatch $ignore $iif $iil ' +
- '$inelipse $ini $inmidi $inpaste $inpoly $input $inrect $inroundrect ' +
- '$insong $instok $int $inwave $ip $isalias $isbit $isdde $isdir $isfile ' +
- '$isid $islower $istok $isupper $keychar $keyrpt $keyval $knick $lactive ' +
- '$lactivecid $lactivewid $left $len $level $lf $line $lines $link $lock ' +
- '$lock $locked $log $logstamp $logstampfmt $longfn $longip $lower $ltimer ' +
- '$maddress $mask $matchkey $matchtok $md5 $me $menu $menubar $menucontext ' +
- '$menutype $mid $middir $mircdir $mircexe $mircini $mklogfn $mnick $mode ' +
- '$modefirst $modelast $modespl $mouse $msfile $network $newnick $nick $nofile ' +
- '$nopath $noqt $not $notags $notify $null $numeric $numok $oline $onpoly ' +
- '$opnick $or $ord $os $passivedcc $pic $play $pnick $port $portable $portfree ' +
- '$pos $prefix $prop $protect $puttok $qt $query $rand $r $rawmsg $read $readomo ' +
- '$readn $regex $regml $regsub $regsubex $remove $remtok $replace $replacex ' +
- '$reptok $result $rgb $right $round $scid $scon $script $scriptdir $scriptline ' +
- '$sdir $send $server $serverip $sfile $sha1 $shortfn $show $signal $sin ' +
- '$site $sline $snick $snicks $snotify $sock $sockbr $sockerr $sockname ' +
- '$sorttok $sound $sqrt $ssl $sreq $sslready $status $strip $str $stripped ' +
- '$syle $submenu $switchbar $tan $target $ticks $time $timer $timestamp ' +
- '$timestampfmt $timezone $tip $titlebar $toolbar $treebar $trust $ulevel ' +
- '$ulist $upper $uptime $url $usermode $v1 $v2 $var $vcmd $vcmdstat $vcmdver ' +
- '$version $vnick $vol $wid $width $wildsite $wildtok $window $wrap $xor'
- )
- var keywords = parseWords(
- 'abook ajinvite alias aline ame amsg anick aop auser autojoin avoice ' +
- 'away background ban bcopy beep bread break breplace bset btrunc bunset bwrite ' +
- 'channel clear clearall cline clipboard close cnick color comclose comopen ' +
- 'comreg continue copy creq ctcpreply ctcps dcc dccserver dde ddeserver ' +
- 'debug dec describe dialog did didtok disable disconnect dlevel dline dll ' +
- 'dns dqwindow drawcopy drawdot drawfill drawline drawpic drawrect drawreplace ' +
- 'drawrot drawsave drawscroll drawtext ebeeps echo editbox emailaddr enable ' +
- 'events exit fclose filter findtext finger firewall flash flist flood flush ' +
- 'flushini font fopen fseek fsend fserve fullname fwrite ghide gload gmove ' +
- 'gopts goto gplay gpoint gqreq groups gshow gsize gstop gtalk gunload hadd ' +
- 'halt haltdef hdec hdel help hfree hinc hload hmake hop hsave ial ialclear ' +
- 'ialmark identd if ignore iline inc invite iuser join kick linesep links list ' +
- 'load loadbuf localinfo log mdi me menubar mkdir mnick mode msg nick noop notice ' +
- 'notify omsg onotice part partall pdcc perform play playctrl pop protect pvoice ' +
- 'qme qmsg query queryn quit raw reload remini remote remove rename renwin ' +
- 'reseterror resetidle return rlevel rline rmdir run ruser save savebuf saveini ' +
- 'say scid scon server set showmirc signam sline sockaccept sockclose socklist ' +
- 'socklisten sockmark sockopen sockpause sockread sockrename sockudp sockwrite ' +
- 'sound speak splay sreq strip switchbar timer timestamp titlebar tnick tokenize ' +
- 'toolbar topic tray treebar ulist unload unset unsetall updatenl url uwho ' +
- 'var vcadd vcmd vcrem vol while whois window winhelp write writeint if isalnum ' +
- 'isalpha isaop isavoice isban ischan ishop isignore isin isincs isletter islower ' +
- 'isnotify isnum ison isop isprotect isreg isupper isvoice iswm iswmcs ' +
- 'elseif else goto menu nicklist status title icon size option text edit ' +
- 'button check radio box scroll list combo link tab item'
- )
- var functions = parseWords('if elseif else and not or eq ne in ni for foreach while switch')
- var isOperatorChar = /[+\-*&%=<>!?^\/\|]/
- function chain(stream, state, f) {
- state.tokenize = f
- return f(stream, state)
- }
- function tokenBase(stream, state) {
- var beforeParams = state.beforeParams
- state.beforeParams = false
- var ch = stream.next()
- if (/[\[\]{}\(\),\.]/.test(ch)) {
- if (ch == '(' && beforeParams) state.inParams = true
- else if (ch == ')') state.inParams = false
- return null
- } else if (/\d/.test(ch)) {
- stream.eatWhile(/[\w\.]/)
- return 'number'
- } else if (ch == '\\') {
- stream.eat('\\')
- stream.eat(/./)
- return 'number'
- } else if (ch == '/' && stream.eat('*')) {
- return chain(stream, state, tokenComment)
- } else if (ch == ';' && stream.match(/ *\( *\(/)) {
- return chain(stream, state, tokenUnparsed)
- } else if (ch == ';' && !state.inParams) {
- stream.skipToEnd()
- return 'comment'
- } else if (ch == '"') {
- stream.eat(/"/)
- return 'keyword'
- } else if (ch == '$') {
- stream.eatWhile(/[$_a-z0-9A-Z\.:]/)
- if (specials && specials.propertyIsEnumerable(stream.current().toLowerCase())) {
- return 'keyword'
- } else {
- state.beforeParams = true
- return 'builtin'
- }
- } else if (ch == '%') {
- stream.eatWhile(/[^,\s()]/)
- state.beforeParams = true
- return 'string'
- } else if (isOperatorChar.test(ch)) {
- stream.eatWhile(isOperatorChar)
- return 'operator'
- } else {
- stream.eatWhile(/[\w\$_{}]/)
- var word = stream.current().toLowerCase()
- if (keywords && keywords.propertyIsEnumerable(word)) return 'keyword'
- if (functions && functions.propertyIsEnumerable(word)) {
- state.beforeParams = true
- return 'keyword'
- }
- return null
- }
- }
- function tokenComment(stream, state) {
- var maybeEnd = false,
- ch
- while ((ch = stream.next())) {
- if (ch == '/' && maybeEnd) {
- state.tokenize = tokenBase
- break
- }
- maybeEnd = ch == '*'
- }
- return 'comment'
- }
- function tokenUnparsed(stream, state) {
- var maybeEnd = 0,
- ch
- while ((ch = stream.next())) {
- if (ch == ';' && maybeEnd == 2) {
- state.tokenize = tokenBase
- break
- }
- if (ch == ')') maybeEnd++
- else if (ch != ' ') maybeEnd = 0
- }
- return 'meta'
- }
- return {
- startState: function () {
- return {
- tokenize: tokenBase,
- beforeParams: false,
- inParams: false,
- }
- },
- token: function (stream, state) {
- if (stream.eatSpace()) return null
- return state.tokenize(stream, state)
- },
- }
- })
- })
|