| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 | // CodeMirror, copyright (c) by Marijn Haverbeke and others// Distributed under an MIT license: http://codemirror.net/LICENSE(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('shell', function() {  var words = {};  function define(style, string) {    var split = string.split(' ');    for(var i = 0; i < split.length; i++) {      words[split[i]] = style;    }  };  // Atoms  define('atom', 'true false');  // Keywords  define('keyword', 'if then do else elif while until for in esac fi fin ' +    'fil done exit set unset export function');  // Commands  define('builtin', 'ab awk bash beep cat cc cd chown chmod chroot clear cp ' +    'curl cut diff echo find gawk gcc get git grep kill killall ln ls make ' +    'mkdir openssl mv nc node npm ping ps restart rm rmdir sed service sh ' +    'shopt shred source sort sleep ssh start stop su sudo tee telnet top ' +    'touch vi vim wall wc wget who write yes zsh');  function tokenBase(stream, state) {    if (stream.eatSpace()) return null;    var sol = stream.sol();    var ch = stream.next();    if (ch === '\\') {      stream.next();      return null;    }    if (ch === '\'' || ch === '"' || ch === '`') {      state.tokens.unshift(tokenString(ch));      return tokenize(stream, state);    }    if (ch === '#') {      if (sol && stream.eat('!')) {        stream.skipToEnd();        return 'meta'; // 'comment'?      }      stream.skipToEnd();      return 'comment';    }    if (ch === '$') {      state.tokens.unshift(tokenDollar);      return tokenize(stream, state);    }    if (ch === '+' || ch === '=') {      return 'operator';    }    if (ch === '-') {      stream.eat('-');      stream.eatWhile(/\w/);      return 'attribute';    }    if (/\d/.test(ch)) {      stream.eatWhile(/\d/);      if(stream.eol() || !/\w/.test(stream.peek())) {        return 'number';      }    }    stream.eatWhile(/[\w-]/);    var cur = stream.current();    if (stream.peek() === '=' && /\w+/.test(cur)) return 'def';    return words.hasOwnProperty(cur) ? words[cur] : null;  }  function tokenString(quote) {    return function(stream, state) {      var next, end = false, escaped = false;      while ((next = stream.next()) != null) {        if (next === quote && !escaped) {          end = true;          break;        }        if (next === '$' && !escaped && quote !== '\'') {          escaped = true;          stream.backUp(1);          state.tokens.unshift(tokenDollar);          break;        }        escaped = !escaped && next === '\\';      }      if (end || !escaped) {        state.tokens.shift();      }      return (quote === '`' || quote === ')' ? 'quote' : 'string');    };  };  var tokenDollar = function(stream, state) {    if (state.tokens.length > 1) stream.eat('$');    var ch = stream.next(), hungry = /\w/;    if (ch === '{') hungry = /[^}]/;    if (ch === '(') {      state.tokens[0] = tokenString(')');      return tokenize(stream, state);    }    if (!/\d/.test(ch)) {      stream.eatWhile(hungry);      stream.eat('}');    }    state.tokens.shift();    return 'def';  };  function tokenize(stream, state) {    return (state.tokens[0] || tokenBase) (stream, state);  };  return {    startState: function() {return {tokens:[]};},    token: function(stream, state) {      return tokenize(stream, state);    },    lineComment: '#',    fold: "brace"  };});CodeMirror.defineMIME('text/x-sh', 'shell');});
 |