annotate .cms/lib/codemirror/mode/shell/shell.js @ 0:78edf6b517a0 draft

24.10
author Coffee CMS <info@coffee-cms.ru>
date Fri, 11 Oct 2024 22:40:23 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
1 // CodeMirror, copyright (c) by Marijn Haverbeke and others
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
2 // Distributed under an MIT license: https://codemirror.net/5/LICENSE
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
3
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
4 (function(mod) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
5 if (typeof exports == "object" && typeof module == "object") // CommonJS
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
6 mod(require("../../lib/codemirror"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
7 else if (typeof define == "function" && define.amd) // AMD
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8 define(["../../lib/codemirror"], mod);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9 else // Plain browser env
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10 mod(CodeMirror);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11 })(function(CodeMirror) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12 "use strict";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14 CodeMirror.defineMode('shell', function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16 var words = {};
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 function define(style, dict) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18 for(var i = 0; i < dict.length; i++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 words[dict[i]] = style;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23 var commonAtoms = ["true", "false"];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24 var commonKeywords = ["if", "then", "do", "else", "elif", "while", "until", "for", "in", "esac", "fi",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25 "fin", "fil", "done", "exit", "set", "unset", "export", "function"];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 var commonCommands = ["ab", "awk", "bash", "beep", "cat", "cc", "cd", "chown", "chmod", "chroot", "clear",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 "cp", "curl", "cut", "diff", "echo", "find", "gawk", "gcc", "get", "git", "grep", "hg", "kill", "killall",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 "ln", "ls", "make", "mkdir", "openssl", "mv", "nc", "nl", "node", "npm", "ping", "ps", "restart", "rm",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29 "rmdir", "sed", "service", "sh", "shopt", "shred", "source", "sort", "sleep", "ssh", "start", "stop",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 "su", "sudo", "svn", "tee", "telnet", "top", "touch", "vi", "vim", "wall", "wc", "wget", "who", "write",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31 "yes", "zsh"];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 CodeMirror.registerHelper("hintWords", "shell", commonAtoms.concat(commonKeywords, commonCommands));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35 define('atom', commonAtoms);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36 define('keyword', commonKeywords);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 define('builtin', commonCommands);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39 function tokenBase(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40 if (stream.eatSpace()) return null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42 var sol = stream.sol();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43 var ch = stream.next();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45 if (ch === '\\') {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46 stream.next();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47 return null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49 if (ch === '\'' || ch === '"' || ch === '`') {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50 state.tokens.unshift(tokenString(ch, ch === "`" ? "quote" : "string"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51 return tokenize(stream, state);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53 if (ch === '#') {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54 if (sol && stream.eat('!')) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55 stream.skipToEnd();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
56 return 'meta'; // 'comment'?
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
57 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
58 stream.skipToEnd();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59 return 'comment';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61 if (ch === '$') {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
62 state.tokens.unshift(tokenDollar);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
63 return tokenize(stream, state);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
64 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
65 if (ch === '+' || ch === '=') {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
66 return 'operator';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
67 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
68 if (ch === '-') {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
69 stream.eat('-');
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
70 stream.eatWhile(/\w/);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
71 return 'attribute';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
72 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
73 if (ch == "<") {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
74 if (stream.match("<<")) return "operator"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
75 var heredoc = stream.match(/^<-?\s*['"]?([^'"]*)['"]?/)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
76 if (heredoc) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
77 state.tokens.unshift(tokenHeredoc(heredoc[1]))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
78 return 'string-2'
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
79 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
80 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
81 if (/\d/.test(ch)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
82 stream.eatWhile(/\d/);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
83 if(stream.eol() || !/\w/.test(stream.peek())) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
84 return 'number';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
85 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
86 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
87 stream.eatWhile(/[\w-]/);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
88 var cur = stream.current();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
89 if (stream.peek() === '=' && /\w+/.test(cur)) return 'def';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
90 return words.hasOwnProperty(cur) ? words[cur] : null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
91 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
92
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
93 function tokenString(quote, style) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
94 var close = quote == "(" ? ")" : quote == "{" ? "}" : quote
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
95 return function(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
96 var next, escaped = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
97 while ((next = stream.next()) != null) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
98 if (next === close && !escaped) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
99 state.tokens.shift();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
100 break;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
101 } else if (next === '$' && !escaped && quote !== "'" && stream.peek() != close) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
102 escaped = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
103 stream.backUp(1);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
104 state.tokens.unshift(tokenDollar);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
105 break;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
106 } else if (!escaped && quote !== close && next === quote) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
107 state.tokens.unshift(tokenString(quote, style))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
108 return tokenize(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
109 } else if (!escaped && /['"]/.test(next) && !/['"]/.test(quote)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
110 state.tokens.unshift(tokenStringStart(next, "string"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
111 stream.backUp(1);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
112 break;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
113 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
114 escaped = !escaped && next === '\\';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
115 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
116 return style;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
117 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
118 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
119
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
120 function tokenStringStart(quote, style) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
121 return function(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
122 state.tokens[0] = tokenString(quote, style)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
123 stream.next()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
124 return tokenize(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
125 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
126 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
127
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
128 var tokenDollar = function(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
129 if (state.tokens.length > 1) stream.eat('$');
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
130 var ch = stream.next()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
131 if (/['"({]/.test(ch)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
132 state.tokens[0] = tokenString(ch, ch == "(" ? "quote" : ch == "{" ? "def" : "string");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
133 return tokenize(stream, state);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
134 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
135 if (!/\d/.test(ch)) stream.eatWhile(/\w/);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
136 state.tokens.shift();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
137 return 'def';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
138 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
139
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
140 function tokenHeredoc(delim) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
141 return function(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
142 if (stream.sol() && stream.string == delim) state.tokens.shift()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
143 stream.skipToEnd()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
144 return "string-2"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
145 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
146 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
147
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
148 function tokenize(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
149 return (state.tokens[0] || tokenBase) (stream, state);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
150 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
151
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
152 return {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
153 startState: function() {return {tokens:[]};},
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
154 token: function(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
155 return tokenize(stream, state);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
156 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
157 closeBrackets: "()[]{}''\"\"``",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
158 lineComment: '#',
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
159 fold: "brace"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
160 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
161 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
162
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
163 CodeMirror.defineMIME('text/x-sh', 'shell');
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
164 // Apache uses a slightly different Media Type for Shell scripts
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
165 // http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
166 CodeMirror.defineMIME('application/x-sh', 'shell');
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
167
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
168 });