|
@@ -0,0 +1,139 @@
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+(function(mod) {
|
|
|
+ if (typeof exports == "object" && typeof module == "object")
|
|
|
+ mod(require("../../lib/codemirror"));
|
|
|
+ else if (typeof define == "function" && define.amd)
|
|
|
+ define(["../../lib/codemirror"], mod);
|
|
|
+ else
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+
|
|
|
+ define('atom', 'true false');
|
|
|
+
|
|
|
+
|
|
|
+ define('keyword', 'if then do else elif while until for in esac fi fin ' +
|
|
|
+ 'fil done exit set unset export function');
|
|
|
+
|
|
|
+
|
|
|
+ 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';
|
|
|
+ }
|
|
|
+ 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');
|
|
|
+
|
|
|
+});
|