diff options
Diffstat (limited to 'imports/codemirror/mode/shell/shell.js')
-rw-r--r-- | imports/codemirror/mode/shell/shell.js | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/imports/codemirror/mode/shell/shell.js b/imports/codemirror/mode/shell/shell.js new file mode 100644 index 00000000..dddca867 --- /dev/null +++ b/imports/codemirror/mode/shell/shell.js | |||
@@ -0,0 +1,103 @@ | |||
1 | CodeMirror.defineMode('shell', function(config) { | ||
2 | |||
3 | var atoms = ['true','false'], | ||
4 | keywords = ['if','then','do','else','elif','while','until','for','in','esac','fi','fin','fil','done','exit','set','unset','export','function'], | ||
5 | commands = ['ab','awk','bash','beep','cat','cc','cd','chown','chmod','chroot','clear','cp','curl','cut','diff','echo','find','gawk','gcc','get','git','grep','kill','killall','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']; | ||
6 | |||
7 | function tokenBase(stream, state) { | ||
8 | |||
9 | var sol = stream.sol(); | ||
10 | var ch = stream.next(); | ||
11 | |||
12 | if (ch === '\'' || ch === '"' || ch === '`') { | ||
13 | state.tokens.unshift(tokenString(ch)); | ||
14 | return tokenize(stream, state); | ||
15 | } | ||
16 | if (ch === '#') { | ||
17 | if (sol && stream.eat('!')) { | ||
18 | stream.skipToEnd(); | ||
19 | return 'meta'; // 'comment'? | ||
20 | } | ||
21 | stream.skipToEnd(); | ||
22 | return 'comment'; | ||
23 | } | ||
24 | if (ch === '$') { | ||
25 | state.tokens.unshift(tokenDollar); | ||
26 | return tokenize(stream, state); | ||
27 | } | ||
28 | if (ch === '+' || ch === '=') { | ||
29 | return 'operator'; | ||
30 | } | ||
31 | if (ch === '-') { | ||
32 | stream.eat('-'); | ||
33 | stream.eatWhile(/\w/); | ||
34 | return 'attribute'; | ||
35 | } | ||
36 | if (/\d/.test(ch)) { | ||
37 | stream.eatWhile(/\d/); | ||
38 | if(!/\w/.test(stream.peek())) { | ||
39 | return 'number'; | ||
40 | } | ||
41 | } | ||
42 | stream.eatWhile(/\w/); | ||
43 | var cur = stream.current(); | ||
44 | if (stream.peek() === '=' && /\w+/.test(cur)) return 'def'; | ||
45 | if (atoms.indexOf(cur) !== -1) return 'atom'; | ||
46 | if (commands.indexOf(cur) !== -1) return 'builtin'; | ||
47 | if (keywords.indexOf(cur) !== -1) return 'keyword'; | ||
48 | return 'word'; | ||
49 | } | ||
50 | |||
51 | function tokenString(quote) { | ||
52 | return function(stream, state) { | ||
53 | var next, end = false, escaped = false; | ||
54 | while ((next = stream.next()) != null) { | ||
55 | if (next === quote && !escaped) { | ||
56 | end = true; | ||
57 | break; | ||
58 | } | ||
59 | if (next === '$' && !escaped && quote !== '\'') { | ||
60 | escaped = true; | ||
61 | stream.backUp(1); | ||
62 | state.tokens.unshift(tokenDollar); | ||
63 | break; | ||
64 | } | ||
65 | escaped = !escaped && next === '\\'; | ||
66 | } | ||
67 | if (end || !escaped) { | ||
68 | state.tokens.shift(); | ||
69 | } | ||
70 | return (quote === '`' || quote === ')' ? 'quote' : 'string'); | ||
71 | }; | ||
72 | }; | ||
73 | |||
74 | var tokenDollar = function(stream, state) { | ||
75 | if (state.tokens.length > 1) stream.eat('$'); | ||
76 | var ch = stream.next(), hungry = /\w/; | ||
77 | if (ch === '{') hungry = /[^}]/; | ||
78 | if (ch === '(') { | ||
79 | state.tokens[0] = tokenString(')'); | ||
80 | return tokenize(stream, state); | ||
81 | } | ||
82 | if (!/\d/.test(ch)) { | ||
83 | stream.eatWhile(hungry); | ||
84 | stream.eat('}'); | ||
85 | } | ||
86 | state.tokens.shift(); | ||
87 | return 'def'; | ||
88 | }; | ||
89 | |||
90 | function tokenize(stream, state) { | ||
91 | return (state.tokens[0] || tokenBase) (stream, state); | ||
92 | }; | ||
93 | |||
94 | return { | ||
95 | startState: function() {return {tokens:[]}}, | ||
96 | token: function(stream, state) { | ||
97 | if (stream.eatSpace()) return null; | ||
98 | return tokenize(stream, state); | ||
99 | } | ||
100 | }; | ||
101 | }); | ||
102 | |||
103 | CodeMirror.defineMIME('text/x-sh', 'shell'); | ||