mirror of
https://github.com/renbaoshuo/S2OJ.git
synced 2024-11-30 03:26:20 +00:00
96d4a3ecf7
Due to historical reasons, the code is in subfolder "1". With SVN removal, we place the code back and remove the annoying "1" folder.
139 lines
3.7 KiB
JavaScript
139 lines
3.7 KiB
JavaScript
// 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: '#'
|
|
};
|
|
});
|
|
|
|
CodeMirror.defineMIME('text/x-sh', 'shell');
|
|
|
|
});
|