mirror of
https://github.com/fofolee/uTools-quickcommand.git
synced 2025-09-28 23:24:14 +08:00
v0.0.1
This commit is contained in:
66
codemirror/mode/shell/index.html
vendored
Normal file
66
codemirror/mode/shell/index.html
vendored
Normal file
@@ -0,0 +1,66 @@
|
||||
<!doctype html>
|
||||
|
||||
<title>CodeMirror: Shell mode</title>
|
||||
<meta charset="utf-8"/>
|
||||
<link rel=stylesheet href="../../doc/docs.css">
|
||||
|
||||
<link rel=stylesheet href=../../lib/codemirror.css>
|
||||
<script src=../../lib/codemirror.js></script>
|
||||
<script src="../../addon/edit/matchbrackets.js"></script>
|
||||
<script src=shell.js></script>
|
||||
<style type=text/css>
|
||||
.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}
|
||||
</style>
|
||||
<div id=nav>
|
||||
<a href="https://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
|
||||
|
||||
<ul>
|
||||
<li><a href="../../index.html">Home</a>
|
||||
<li><a href="../../doc/manual.html">Manual</a>
|
||||
<li><a href="https://github.com/codemirror/codemirror">Code</a>
|
||||
</ul>
|
||||
<ul>
|
||||
<li><a href="../index.html">Language modes</a>
|
||||
<li><a class=active href="#">Shell</a>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<article>
|
||||
<h2>Shell mode</h2>
|
||||
|
||||
|
||||
<textarea id=code>
|
||||
#!/bin/bash
|
||||
|
||||
# clone the repository
|
||||
git clone http://github.com/garden/tree
|
||||
|
||||
# generate HTTPS credentials
|
||||
cd tree
|
||||
openssl genrsa -aes256 -out https.key 1024
|
||||
openssl req -new -nodes -key https.key -out https.csr
|
||||
openssl x509 -req -days 365 -in https.csr -signkey https.key -out https.crt
|
||||
cp https.key{,.orig}
|
||||
openssl rsa -in https.key.orig -out https.key
|
||||
|
||||
# start the server in HTTPS mode
|
||||
cd web
|
||||
sudo node ../server.js 443 'yes' >> ../node.log &
|
||||
|
||||
# here is how to stop the server
|
||||
for pid in `ps aux | grep 'node ../server.js' | awk '{print $2}'` ; do
|
||||
sudo kill -9 $pid 2> /dev/null
|
||||
done
|
||||
|
||||
exit 0</textarea>
|
||||
|
||||
<script>
|
||||
var editor = CodeMirror.fromTextArea(document.getElementById('code'), {
|
||||
mode: 'shell',
|
||||
lineNumbers: true,
|
||||
matchBrackets: true
|
||||
});
|
||||
</script>
|
||||
|
||||
<p><strong>MIME types defined:</strong> <code>text/x-sh</code>, <code>application/x-sh</code>.</p>
|
||||
</article>
|
152
codemirror/mode/shell/shell.js
vendored
Normal file
152
codemirror/mode/shell/shell.js
vendored
Normal file
@@ -0,0 +1,152 @@
|
||||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||
// Distributed under an MIT license: https://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, dict) {
|
||||
for(var i = 0; i < dict.length; i++) {
|
||||
words[dict[i]] = style;
|
||||
}
|
||||
};
|
||||
|
||||
var commonAtoms = ["true", "false"];
|
||||
var commonKeywords = ["if", "then", "do", "else", "elif", "while", "until", "for", "in", "esac", "fi",
|
||||
"fin", "fil", "done", "exit", "set", "unset", "export", "function"];
|
||||
var commonCommands = ["ab", "awk", "bash", "beep", "cat", "cc", "cd", "chown", "chmod", "chroot", "clear",
|
||||
"cp", "curl", "cut", "diff", "echo", "find", "gawk", "gcc", "get", "git", "grep", "hg", "kill", "killall",
|
||||
"ln", "ls", "make", "mkdir", "openssl", "mv", "nc", "nl", "node", "npm", "ping", "ps", "restart", "rm",
|
||||
"rmdir", "sed", "service", "sh", "shopt", "shred", "source", "sort", "sleep", "ssh", "start", "stop",
|
||||
"su", "sudo", "svn", "tee", "telnet", "top", "touch", "vi", "vim", "wall", "wc", "wget", "who", "write",
|
||||
"yes", "zsh"];
|
||||
|
||||
CodeMirror.registerHelper("hintWords", "shell", commonAtoms.concat(commonKeywords, commonCommands));
|
||||
|
||||
define('atom', commonAtoms);
|
||||
define('keyword', commonKeywords);
|
||||
define('builtin', commonCommands);
|
||||
|
||||
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, ch === "`" ? "quote" : "string"));
|
||||
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, style) {
|
||||
var close = quote == "(" ? ")" : quote == "{" ? "}" : quote
|
||||
return function(stream, state) {
|
||||
var next, escaped = false;
|
||||
while ((next = stream.next()) != null) {
|
||||
if (next === close && !escaped) {
|
||||
state.tokens.shift();
|
||||
break;
|
||||
} else if (next === '$' && !escaped && quote !== "'" && stream.peek() != close) {
|
||||
escaped = true;
|
||||
stream.backUp(1);
|
||||
state.tokens.unshift(tokenDollar);
|
||||
break;
|
||||
} else if (!escaped && quote !== close && next === quote) {
|
||||
state.tokens.unshift(tokenString(quote, style))
|
||||
return tokenize(stream, state)
|
||||
} else if (!escaped && /['"]/.test(next) && !/['"]/.test(quote)) {
|
||||
state.tokens.unshift(tokenStringStart(next, "string"));
|
||||
stream.backUp(1);
|
||||
break;
|
||||
}
|
||||
escaped = !escaped && next === '\\';
|
||||
}
|
||||
return style;
|
||||
};
|
||||
};
|
||||
|
||||
function tokenStringStart(quote, style) {
|
||||
return function(stream, state) {
|
||||
state.tokens[0] = tokenString(quote, style)
|
||||
stream.next()
|
||||
return tokenize(stream, state)
|
||||
}
|
||||
}
|
||||
|
||||
var tokenDollar = function(stream, state) {
|
||||
if (state.tokens.length > 1) stream.eat('$');
|
||||
var ch = stream.next()
|
||||
if (/['"({]/.test(ch)) {
|
||||
state.tokens[0] = tokenString(ch, ch == "(" ? "quote" : ch == "{" ? "def" : "string");
|
||||
return tokenize(stream, state);
|
||||
}
|
||||
if (!/\d/.test(ch)) stream.eatWhile(/\w/);
|
||||
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);
|
||||
},
|
||||
closeBrackets: "()[]{}''\"\"``",
|
||||
lineComment: '#',
|
||||
fold: "brace"
|
||||
};
|
||||
});
|
||||
|
||||
CodeMirror.defineMIME('text/x-sh', 'shell');
|
||||
// Apache uses a slightly different Media Type for Shell scripts
|
||||
// http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
|
||||
CodeMirror.defineMIME('application/x-sh', 'shell');
|
||||
|
||||
});
|
73
codemirror/mode/shell/test.js
vendored
Normal file
73
codemirror/mode/shell/test.js
vendored
Normal file
@@ -0,0 +1,73 @@
|
||||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||
// Distributed under an MIT license: https://codemirror.net/LICENSE
|
||||
|
||||
(function() {
|
||||
var mode = CodeMirror.getMode({}, "shell");
|
||||
function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); }
|
||||
|
||||
MT("var",
|
||||
"text [def $var] text");
|
||||
MT("varBraces",
|
||||
"text[def ${var}]text");
|
||||
MT("varVar",
|
||||
"text [def $a$b] text");
|
||||
MT("varBracesVarBraces",
|
||||
"text[def ${a}${b}]text");
|
||||
|
||||
MT("singleQuotedVar",
|
||||
"[string 'text $var text']");
|
||||
MT("singleQuotedVarBraces",
|
||||
"[string 'text ${var} text']");
|
||||
|
||||
MT("doubleQuotedVar",
|
||||
'[string "text ][def $var][string text"]');
|
||||
MT("doubleQuotedVarBraces",
|
||||
'[string "text][def ${var}][string text"]');
|
||||
MT("doubleQuotedVarPunct",
|
||||
'[string "text ][def $@][string text"]');
|
||||
MT("doubleQuotedVarVar",
|
||||
'[string "][def $a$b][string "]');
|
||||
MT("doubleQuotedVarBracesVarBraces",
|
||||
'[string "][def ${a}${b}][string "]');
|
||||
|
||||
MT("notAString",
|
||||
"text\\'text");
|
||||
MT("escapes",
|
||||
"outside\\'\\\"\\`\\\\[string \"inside\\`\\'\\\"\\\\`\\$notAVar\"]outside\\$\\(notASubShell\\)");
|
||||
|
||||
MT("subshell",
|
||||
"[builtin echo] [quote $(whoami)] s log, stardate [quote `date`].");
|
||||
MT("doubleQuotedSubshell",
|
||||
"[builtin echo] [string \"][quote $(whoami)][string 's log, stardate `date`.\"]");
|
||||
|
||||
MT("hashbang",
|
||||
"[meta #!/bin/bash]");
|
||||
MT("comment",
|
||||
"text [comment # Blurb]");
|
||||
|
||||
MT("numbers",
|
||||
"[number 0] [number 1] [number 2]");
|
||||
MT("keywords",
|
||||
"[keyword while] [atom true]; [keyword do]",
|
||||
" [builtin sleep] [number 3]",
|
||||
"[keyword done]");
|
||||
MT("options",
|
||||
"[builtin ls] [attribute -l] [attribute --human-readable]");
|
||||
MT("operator",
|
||||
"[def var][operator =]value");
|
||||
|
||||
MT("doubleParens",
|
||||
"foo [quote $((bar))]")
|
||||
|
||||
MT("nested braces",
|
||||
"[builtin echo] [def ${A[${B}]]}]")
|
||||
|
||||
MT("strings in parens",
|
||||
"[def FOO][operator =]([quote $(<][string \"][def $MYDIR][string \"][quote /myfile grep ][string 'hello$'][quote )])")
|
||||
|
||||
MT ("string ending in dollar",
|
||||
'[def a][operator =][string "xyz$"]; [def b][operator =][string "y"]')
|
||||
|
||||
MT ("quote ending in dollar",
|
||||
"[quote $(echo a$)]")
|
||||
})();
|
Reference in New Issue
Block a user