codemirror-rails 2.24 → 2.32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. data/.gitignore +1 -0
  2. data/Rakefile +19 -0
  3. data/codemirror-rails.gemspec +6 -1
  4. data/lib/codemirror/rails/version.rb +2 -2
  5. data/test/dummy/README.rdoc +261 -0
  6. data/test/dummy/Rakefile +7 -0
  7. data/test/dummy/app/assets/javascripts/application.js +15 -0
  8. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  9. data/test/dummy/app/controllers/application_controller.rb +3 -0
  10. data/test/dummy/app/helpers/application_helper.rb +2 -0
  11. data/test/dummy/app/mailers/.gitkeep +0 -0
  12. data/test/dummy/app/models/.gitkeep +0 -0
  13. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  14. data/test/dummy/config.ru +4 -0
  15. data/test/dummy/config/application.rb +56 -0
  16. data/test/dummy/config/boot.rb +10 -0
  17. data/test/dummy/config/environment.rb +5 -0
  18. data/test/dummy/config/environments/development.rb +37 -0
  19. data/test/dummy/config/environments/production.rb +67 -0
  20. data/test/dummy/config/environments/test.rb +37 -0
  21. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  22. data/test/dummy/config/initializers/inflections.rb +15 -0
  23. data/test/dummy/config/initializers/mime_types.rb +5 -0
  24. data/test/dummy/config/initializers/secret_token.rb +7 -0
  25. data/test/dummy/config/initializers/session_store.rb +8 -0
  26. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  27. data/test/dummy/config/locales/en.yml +5 -0
  28. data/test/dummy/config/routes.rb +58 -0
  29. data/test/dummy/lib/assets/.gitkeep +0 -0
  30. data/test/dummy/log/.gitkeep +0 -0
  31. data/test/dummy/public/404.html +26 -0
  32. data/test/dummy/public/422.html +26 -0
  33. data/test/dummy/public/500.html +25 -0
  34. data/test/dummy/public/favicon.ico +0 -0
  35. data/test/dummy/script/rails +6 -0
  36. data/test/integration/codemirror_rails_integration_test.rb +13 -0
  37. data/test/test_helper.rb +13 -0
  38. data/vendor/assets/javascripts/codemirror.js +381 -197
  39. data/vendor/assets/javascripts/codemirror/keymaps/emacs.js +1 -1
  40. data/vendor/assets/javascripts/codemirror/keymaps/vim.js +649 -94
  41. data/vendor/assets/javascripts/codemirror/modes/clike.js +53 -7
  42. data/vendor/assets/javascripts/codemirror/modes/coffeescript.js +12 -7
  43. data/vendor/assets/javascripts/codemirror/modes/diff.js +24 -5
  44. data/vendor/assets/javascripts/codemirror/modes/ecl.js +2 -2
  45. data/vendor/assets/javascripts/codemirror/modes/erlang.js +463 -0
  46. data/vendor/assets/javascripts/codemirror/modes/gfm.js +38 -2
  47. data/vendor/assets/javascripts/codemirror/modes/go.js +1 -1
  48. data/vendor/assets/javascripts/codemirror/modes/groovy.js +1 -1
  49. data/vendor/assets/javascripts/codemirror/modes/haxe.js +432 -0
  50. data/vendor/assets/javascripts/codemirror/modes/javascript.js +1 -1
  51. data/vendor/assets/javascripts/codemirror/modes/less.js +93 -93
  52. data/vendor/assets/javascripts/codemirror/modes/markdown.js +29 -6
  53. data/vendor/assets/javascripts/codemirror/modes/mysql.js +6 -8
  54. data/vendor/assets/javascripts/codemirror/modes/ocaml.js +114 -0
  55. data/vendor/assets/javascripts/codemirror/modes/pascal.js +1 -1
  56. data/vendor/assets/javascripts/codemirror/modes/pig.js +2 -2
  57. data/vendor/assets/javascripts/codemirror/modes/plsql.js +2 -2
  58. data/vendor/assets/javascripts/codemirror/modes/python.js +13 -16
  59. data/vendor/assets/javascripts/codemirror/modes/ruby.js +3 -8
  60. data/vendor/assets/javascripts/codemirror/modes/scheme.js +74 -46
  61. data/vendor/assets/javascripts/codemirror/modes/shell.js +22 -7
  62. data/vendor/assets/javascripts/codemirror/modes/stex.js +7 -5
  63. data/vendor/assets/javascripts/codemirror/modes/tiddlywiki.js +14 -14
  64. data/vendor/assets/javascripts/codemirror/modes/vb.js +260 -0
  65. data/vendor/assets/javascripts/codemirror/modes/verilog.js +1 -1
  66. data/vendor/assets/javascripts/codemirror/modes/xml.js +2 -1
  67. data/vendor/assets/javascripts/codemirror/modes/xquery.js +3 -3
  68. data/vendor/assets/javascripts/codemirror/utils/closetag.js +24 -34
  69. data/vendor/assets/javascripts/codemirror/utils/dialog.js +5 -1
  70. data/vendor/assets/javascripts/codemirror/utils/foldcode.js +10 -5
  71. data/vendor/assets/javascripts/codemirror/utils/formatting.js +8 -3
  72. data/vendor/assets/javascripts/codemirror/utils/loadmode.js +2 -1
  73. data/vendor/assets/javascripts/codemirror/utils/match-highlighter.js +1 -1
  74. data/vendor/assets/javascripts/codemirror/utils/multiplex.js +81 -0
  75. data/vendor/assets/javascripts/codemirror/utils/overlay.js +2 -1
  76. data/vendor/assets/javascripts/codemirror/utils/pig-hint.js +123 -0
  77. data/vendor/assets/javascripts/codemirror/utils/search.js +16 -12
  78. data/vendor/assets/javascripts/codemirror/utils/searchcursor.js +1 -1
  79. data/vendor/assets/javascripts/codemirror/utils/simple-hint.js +4 -0
  80. data/vendor/assets/javascripts/codemirror/utils/xml-hint.js +137 -0
  81. data/vendor/assets/stylesheets/codemirror.css +59 -4
  82. data/vendor/assets/stylesheets/codemirror/modes/tiddlywiki.css +14 -21
  83. data/vendor/assets/stylesheets/codemirror/themes/ambiance.css +1 -2
  84. data/vendor/assets/stylesheets/codemirror/themes/erlang-dark.css +21 -0
  85. data/vendor/assets/stylesheets/codemirror/themes/lesser-dark.css +2 -3
  86. data/vendor/assets/stylesheets/codemirror/themes/night.css +1 -1
  87. data/vendor/assets/stylesheets/codemirror/themes/vibrant-ink.css +27 -0
  88. data/vendor/assets/stylesheets/codemirror/utils/dialog.css +4 -0
  89. metadata +98 -5
  90. data/vendor/assets/javascripts/codemirror/modes/rpm-spec.css +0 -5
@@ -46,7 +46,7 @@ CodeMirror.defineMode("pascal", function(config) {
46
46
  var cur = stream.current();
47
47
  if (keywords.propertyIsEnumerable(cur)) return "keyword";
48
48
  if (atoms.propertyIsEnumerable(cur)) return "atom";
49
- return "word";
49
+ return "variable";
50
50
  }
51
51
 
52
52
  function tokenString(quote) {
@@ -112,8 +112,8 @@ CodeMirror.defineMode("pig", function(config, parserConfig) {
112
112
  // is it one of the listed types?
113
113
  if (types && types.propertyIsEnumerable(stream.current().toUpperCase()))
114
114
  return ("keyword", "variable-3")
115
- // default is a 'word'
116
- return ret("word", "pig-word");
115
+ // default is a 'variable'
116
+ return ret("variable", "pig-word");
117
117
  }
118
118
  }
119
119
 
@@ -72,8 +72,8 @@ CodeMirror.defineMode("plsql", function(config, parserConfig) {
72
72
  if (types && types.propertyIsEnumerable(stream.current().toLowerCase())) return ret("keyword", "variable-2");
73
73
  // is it one of the listed sqlplus keywords?
74
74
  if (sqlplus && sqlplus.propertyIsEnumerable(stream.current().toLowerCase())) return ret("keyword", "variable-3");
75
- // default: just a "word"
76
- return ret("word", "plsql-word");
75
+ // default: just a "variable"
76
+ return ret("word", "variable");
77
77
  }
78
78
  }
79
79
 
@@ -249,26 +249,23 @@ CodeMirror.defineMode("python", function(conf, parserConf) {
249
249
 
250
250
  // Handle '.' connected identifiers
251
251
  if (current === '.') {
252
- style = state.tokenize(stream, state);
253
- current = stream.current();
254
- if (style === 'variable' || style === 'builtin') {
255
- return 'variable';
256
- } else {
257
- return ERRORCLASS;
252
+ style = stream.match(identifiers, false) ? null : ERRORCLASS;
253
+ if (style === null && state.lastToken === 'meta') {
254
+ // Apply 'meta' style to '.' connected identifiers when
255
+ // appropriate.
256
+ style = 'meta';
258
257
  }
258
+ return style;
259
259
  }
260
260
 
261
261
  // Handle decorators
262
262
  if (current === '@') {
263
- style = state.tokenize(stream, state);
264
- current = stream.current();
265
- if (style === 'variable'
266
- || current === '@staticmethod'
267
- || current === '@classmethod') {
268
- return 'meta';
269
- } else {
270
- return ERRORCLASS;
271
- }
263
+ return stream.match(identifiers, false) ? 'meta' : ERRORCLASS;
264
+ }
265
+
266
+ if ((style === 'variable' || style === 'builtin')
267
+ && state.lastToken === 'meta') {
268
+ style = 'meta';
272
269
  }
273
270
 
274
271
  // Handle scope changes.
@@ -317,7 +314,7 @@ CodeMirror.defineMode("python", function(conf, parserConf) {
317
314
  token: function(stream, state) {
318
315
  var style = tokenLexer(stream, state);
319
316
 
320
- state.lastToken = {style:style, content: stream.current()};
317
+ state.lastToken = style;
321
318
 
322
319
  if (stream.eol() && stream.lambda) {
323
320
  state.lambda = false;
@@ -30,7 +30,7 @@ CodeMirror.defineMode("ruby", function(config, parserConfig) {
30
30
  return "comment";
31
31
  }
32
32
  if (stream.eatSpace()) return null;
33
- var ch = stream.next();
33
+ var ch = stream.next(), m;
34
34
  if (ch == "`" || ch == "'" || ch == '"' ||
35
35
  (ch == "/" && !stream.eol() && stream.peek() != " ")) {
36
36
  return chain(readQuoted(ch, "string", ch == '"' || ch == "`"), stream, state);
@@ -46,13 +46,8 @@ CodeMirror.defineMode("ruby", function(config, parserConfig) {
46
46
  } else if (ch == "#") {
47
47
  stream.skipToEnd();
48
48
  return "comment";
49
- } else if (ch == "<" && stream.eat("<")) {
50
- stream.eat("-");
51
- stream.eat(/[\'\"\`]/);
52
- var match = stream.match(/^\w+/);
53
- stream.eat(/[\'\"\`]/);
54
- if (match) return chain(readHereDoc(match[0]), stream, state);
55
- return null;
49
+ } else if (ch == "<" && (m = stream.match(/^<-?[\`\"\']?([a-zA-Z_?]\w*)[\`\"\']?(?:;|$)/))) {
50
+ return chain(readHereDoc(m[1]), stream, state);
56
51
  } else if (ch == "0") {
57
52
  if (stream.eat("x")) stream.eatWhile(/[\da-fA-F]/);
58
53
  else if (stream.eat("b")) stream.eatWhile(/[01]/);
@@ -5,7 +5,7 @@ CodeMirror.defineMode("scheme", function (config, mode) {
5
5
  var BUILTIN = "builtin", COMMENT = "comment", STRING = "string",
6
6
  ATOM = "atom", NUMBER = "number", BRACKET = "bracket", KEYWORD="keyword";
7
7
  var INDENT_WORD_SKIP = 2, KEYWORDS_SKIP = 1;
8
-
8
+
9
9
  function makeKeywords(str) {
10
10
  var obj = {}, words = str.split(" ");
11
11
  for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
@@ -14,7 +14,6 @@ CodeMirror.defineMode("scheme", function (config, mode) {
14
14
 
15
15
  var keywords = makeKeywords("λ case-lambda call/cc class define-class exit-handler field import inherit init-field interface let*-values let-values let/ec mixin opt-lambda override protect provide public rename require require-for-syntax syntax syntax-case syntax-error unit/sig unless when with-syntax and begin call-with-current-continuation call-with-input-file call-with-output-file case cond define define-syntax delay do dynamic-wind else for-each if lambda let let* let-syntax letrec letrec-syntax map or syntax-rules abs acos angle append apply asin assoc assq assv atan boolean? caar cadr call-with-input-file call-with-output-file call-with-values car cdddar cddddr cdr ceiling char->integer char-alphabetic? char-ci<=? char-ci<? char-ci=? char-ci>=? char-ci>? char-downcase char-lower-case? char-numeric? char-ready? char-upcase char-upper-case? char-whitespace? char<=? char<? char=? char>=? char>? char? close-input-port close-output-port complex? cons cos current-input-port current-output-port denominator display eof-object? eq? equal? eqv? eval even? exact->inexact exact? exp expt #f floor force gcd imag-part inexact->exact inexact? input-port? integer->char integer? interaction-environment lcm length list list->string list->vector list-ref list-tail list? load log magnitude make-polar make-rectangular make-string make-vector max member memq memv min modulo negative? newline not null-environment null? number->string number? numerator odd? open-input-file open-output-file output-port? pair? peek-char port? positive? procedure? quasiquote quote quotient rational? rationalize read read-char real-part real? remainder reverse round scheme-report-environment set! set-car! set-cdr! sin sqrt string string->list string->number string->symbol string-append string-ci<=? string-ci<? string-ci=? string-ci>=? string-ci>? string-copy string-fill! string-length string-ref string-set! string<=? string<? string=? string>=? string>? string? substring symbol->string symbol? #t tan transcript-off transcript-on truncate values vector vector->list vector-fill! vector-length vector-ref vector-set! with-input-from-file with-output-to-file write write-char zero?");
16
16
  var indentKeys = makeKeywords("define let letrec let* lambda");
17
-
18
17
 
19
18
  function stateStack(indent, type, prev) { // represents a state stack object
20
19
  this.indent = indent;
@@ -29,21 +28,29 @@ CodeMirror.defineMode("scheme", function (config, mode) {
29
28
  function popStack(state) {
30
29
  state.indentStack = state.indentStack.prev;
31
30
  }
32
-
33
- /**
34
- * Scheme numbers are complicated unfortunately.
35
- * Checks if we're looking at a number, which might be possibly a fraction.
36
- * Also checks that it is not part of a longer identifier. Returns true/false accordingly.
37
- */
38
- function isNumber(ch, stream){
39
- if(/[0-9]/.exec(ch) != null){
40
- stream.eatWhile(/[0-9]/);
41
- stream.eat(/\//);
42
- stream.eatWhile(/[0-9]/);
43
- if (stream.eol() || !(/[a-zA-Z\-\_\/]/.exec(stream.peek()))) return true;
44
- stream.backUp(stream.current().length - 1); // undo all the eating
31
+
32
+ var binaryMatcher = new RegExp(/^(?:[-+]i|[-+][01]+#*(?:\/[01]+#*)?i|[-+]?[01]+#*(?:\/[01]+#*)?@[-+]?[01]+#*(?:\/[01]+#*)?|[-+]?[01]+#*(?:\/[01]+#*)?[-+](?:[01]+#*(?:\/[01]+#*)?)?i|[-+]?[01]+#*(?:\/[01]+#*)?)(?=[()\s;"]|$)/i);
33
+ var octalMatcher = new RegExp(/^(?:[-+]i|[-+][0-7]+#*(?:\/[0-7]+#*)?i|[-+]?[0-7]+#*(?:\/[0-7]+#*)?@[-+]?[0-7]+#*(?:\/[0-7]+#*)?|[-+]?[0-7]+#*(?:\/[0-7]+#*)?[-+](?:[0-7]+#*(?:\/[0-7]+#*)?)?i|[-+]?[0-7]+#*(?:\/[0-7]+#*)?)(?=[()\s;"]|$)/i);
34
+ var hexMatcher = new RegExp(/^(?:[-+]i|[-+][\da-f]+#*(?:\/[\da-f]+#*)?i|[-+]?[\da-f]+#*(?:\/[\da-f]+#*)?@[-+]?[\da-f]+#*(?:\/[\da-f]+#*)?|[-+]?[\da-f]+#*(?:\/[\da-f]+#*)?[-+](?:[\da-f]+#*(?:\/[\da-f]+#*)?)?i|[-+]?[\da-f]+#*(?:\/[\da-f]+#*)?)(?=[()\s;"]|$)/i);
35
+ var decimalMatcher = new RegExp(/^(?:[-+]i|[-+](?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)i|[-+]?(?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)@[-+]?(?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)|[-+]?(?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)[-+](?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)?i|(?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*))(?=[()\s;"]|$)/i);
36
+
37
+ function isBinaryNumber (stream) {
38
+ return stream.match(binaryMatcher);
39
+ }
40
+
41
+ function isOctalNumber (stream) {
42
+ return stream.match(octalMatcher);
43
+ }
44
+
45
+ function isDecimalNumber (stream, backup) {
46
+ if (backup === true) {
47
+ stream.backUp(1);
45
48
  }
46
- return false;
49
+ return stream.match(decimalMatcher);
50
+ }
51
+
52
+ function isHexNumber (stream) {
53
+ return stream.match(hexMatcher);
47
54
  }
48
55
 
49
56
  return {
@@ -67,13 +74,13 @@ CodeMirror.defineMode("scheme", function (config, mode) {
67
74
  return null;
68
75
  }
69
76
  var returnType = null;
70
-
77
+
71
78
  switch(state.mode){
72
79
  case "string": // multi-line string parsing mode
73
80
  var next, escaped = false;
74
81
  while ((next = stream.next()) != null) {
75
82
  if (next == "\"" && !escaped) {
76
-
83
+
77
84
  state.mode = false;
78
85
  break;
79
86
  }
@@ -85,7 +92,7 @@ CodeMirror.defineMode("scheme", function (config, mode) {
85
92
  var next, maybeEnd = false;
86
93
  while ((next = stream.next()) != null) {
87
94
  if (next == "#" && maybeEnd) {
88
-
95
+
89
96
  state.mode = false;
90
97
  break;
91
98
  }
@@ -106,52 +113,73 @@ CodeMirror.defineMode("scheme", function (config, mode) {
106
113
  }
107
114
  default: // default parsing mode
108
115
  var ch = stream.next();
109
-
116
+
110
117
  if (ch == "\"") {
111
118
  state.mode = "string";
112
119
  returnType = STRING;
113
-
120
+
114
121
  } else if (ch == "'") {
115
122
  returnType = ATOM;
116
123
  } else if (ch == '#') {
117
- if (stream.eat("|")) { // Multi-line comment
124
+ if (stream.eat("|")) { // Multi-line comment
118
125
  state.mode = "comment"; // toggle to comment mode
119
126
  returnType = COMMENT;
120
- } else if (stream.eat(/[tf]/)) { // #t/#f (atom)
127
+ } else if (stream.eat(/[tf]/i)) { // #t/#f (atom)
121
128
  returnType = ATOM;
122
- } else if (stream.eat(';')) { // S-Expr comment
129
+ } else if (stream.eat(';')) { // S-Expr comment
123
130
  state.mode = "s-expr-comment";
124
131
  returnType = COMMENT;
132
+ } else {
133
+ var numTest = null, hasExactness = false, hasRadix = true;
134
+ if (stream.eat(/[ei]/i)) {
135
+ hasExactness = true;
136
+ } else {
137
+ stream.backUp(1); // must be radix specifier
138
+ }
139
+ if (stream.match(/^#b/i)) {
140
+ numTest = isBinaryNumber;
141
+ } else if (stream.match(/^#o/i)) {
142
+ numTest = isOctalNumber;
143
+ } else if (stream.match(/^#x/i)) {
144
+ numTest = isHexNumber;
145
+ } else if (stream.match(/^#d/i)) {
146
+ numTest = isDecimalNumber;
147
+ } else if (stream.match(/^[-+0-9.]/, false)) {
148
+ hasRadix = false;
149
+ numTest = isDecimalNumber;
150
+ // re-consume the intial # if all matches failed
151
+ } else if (!hasExactness) {
152
+ stream.eat('#');
153
+ }
154
+ if (numTest != null) {
155
+ if (hasRadix && !hasExactness) {
156
+ // consume optional exactness after radix
157
+ stream.match(/^#[ei]/i);
158
+ }
159
+ if (numTest(stream))
160
+ returnType = NUMBER;
161
+ }
125
162
  }
126
-
163
+ } else if (/^[-+0-9.]/.test(ch) && isDecimalNumber(stream, true)) { // match non-prefixed number, must be decimal
164
+ returnType = NUMBER;
127
165
  } else if (ch == ";") { // comment
128
166
  stream.skipToEnd(); // rest of the line is a comment
129
167
  returnType = COMMENT;
130
- } else if (ch == "-"){
131
-
132
- if(!isNaN(parseInt(stream.peek()))){
133
- stream.eatWhile(/[\/0-9]/);
134
- returnType = NUMBER;
135
- }else{
136
- returnType = null;
137
- }
138
- } else if (isNumber(ch,stream)){
139
- returnType = NUMBER;
140
168
  } else if (ch == "(" || ch == "[") {
141
169
  var keyWord = ''; var indentTemp = stream.column();
142
170
  /**
143
- Either
171
+ Either
144
172
  (indent-word ..
145
173
  (non-indent-word ..
146
174
  (;something else, bracket, etc.
147
175
  */
148
-
176
+
149
177
  while ((letter = stream.eat(/[^\s\(\[\;\)\]]/)) != null) {
150
178
  keyWord += letter;
151
179
  }
152
-
180
+
153
181
  if (keyWord.length > 0 && indentKeys.propertyIsEnumerable(keyWord)) { // indent-word
154
-
182
+
155
183
  pushStack(state, indentTemp + INDENT_WORD_SKIP, ch);
156
184
  } else { // non-indent word
157
185
  // we continue eating the spaces
@@ -165,15 +193,15 @@ CodeMirror.defineMode("scheme", function (config, mode) {
165
193
  }
166
194
  }
167
195
  stream.backUp(stream.current().length - 1); // undo all the eating
168
-
196
+
169
197
  if(typeof state.sExprComment == "number") state.sExprComment++;
170
-
198
+
171
199
  returnType = BRACKET;
172
200
  } else if (ch == ")" || ch == "]") {
173
201
  returnType = BRACKET;
174
202
  if (state.indentStack != null && state.indentStack.type == (ch == ")" ? "(" : "[")) {
175
203
  popStack(state);
176
-
204
+
177
205
  if(typeof state.sExprComment == "number"){
178
206
  if(--state.sExprComment == 0){
179
207
  returnType = COMMENT; // final closing bracket
@@ -182,11 +210,11 @@ CodeMirror.defineMode("scheme", function (config, mode) {
182
210
  }
183
211
  }
184
212
  } else {
185
- stream.eatWhile(/[\w\$_\-]/);
186
-
213
+ stream.eatWhile(/[\w\$_\-!$%&*+\.\/:<=>?@\^~]/);
214
+
187
215
  if (keywords && keywords.propertyIsEnumerable(stream.current())) {
188
216
  returnType = BUILTIN;
189
- }else returnType = null;
217
+ } else returnType = "variable";
190
218
  }
191
219
  }
192
220
  return (typeof state.sExprComment == "number") ? COMMENT : returnType;
@@ -199,4 +227,4 @@ CodeMirror.defineMode("scheme", function (config, mode) {
199
227
  };
200
228
  });
201
229
 
202
- CodeMirror.defineMIME("text/x-scheme", "scheme");
230
+ CodeMirror.defineMIME("text/x-scheme", "scheme");
@@ -1,8 +1,26 @@
1
1
  CodeMirror.defineMode('shell', function(config) {
2
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'];
3
+ var words = {};
4
+ function define(style, string) {
5
+ var split = string.split(' ');
6
+ for(var i = 0; i < split.length; i++) {
7
+ words[split[i]] = style;
8
+ }
9
+ };
10
+
11
+ // Atoms
12
+ define('atom', 'true false');
13
+
14
+ // Keywords
15
+ define('keyword', 'if then do else elif while until for in esac fi fin ' +
16
+ 'fil done exit set unset export function');
17
+
18
+ // Commands
19
+ define('builtin', 'ab awk bash beep cat cc cd chown chmod chroot clear cp ' +
20
+ 'curl cut diff echo find gawk gcc get git grep kill killall ln ls make ' +
21
+ 'mkdir openssl mv nc node npm ping ps restart rm rmdir sed service sh ' +
22
+ 'shopt shred source sort sleep ssh start stop su sudo tee telnet top ' +
23
+ 'touch vi vim wall wc wget who write yes zsh');
6
24
 
7
25
  function tokenBase(stream, state) {
8
26
 
@@ -42,10 +60,7 @@ CodeMirror.defineMode('shell', function(config) {
42
60
  stream.eatWhile(/\w/);
43
61
  var cur = stream.current();
44
62
  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';
63
+ return words[cur] || null;
49
64
  }
50
65
 
51
66
  function tokenString(quote) {
@@ -85,10 +85,12 @@ CodeMirror.defineMode("stex", function(cmCfg, modeCfg)
85
85
  if (source.match(/^\\[a-zA-Z@]+/)) {
86
86
  var cmdName = source.current();
87
87
  cmdName = cmdName.substr(1, cmdName.length-1);
88
- var plug = plugins[cmdName];
89
- if (typeof(plug) == 'undefined') {
90
- plug = plugins["DEFAULT"];
91
- }
88
+ var plug;
89
+ if (plugins.hasOwnProperty(cmdName)) {
90
+ plug = plugins[cmdName];
91
+ } else {
92
+ plug = plugins["DEFAULT"];
93
+ }
92
94
  plug = new plug();
93
95
  pushCommand(state, plug);
94
96
  setState(state, beginParams);
@@ -176,5 +178,5 @@ CodeMirror.defineMode("stex", function(cmCfg, modeCfg)
176
178
  };
177
179
  });
178
180
 
179
-
180
181
  CodeMirror.defineMIME("text/x-stex", "stex");
182
+ CodeMirror.defineMIME("text/x-latex", "stex");
@@ -107,10 +107,10 @@ CodeMirror.defineMode("tiddlywiki", function (config, parserConfig) {
107
107
  return ret('quote', 'quote');
108
108
  }
109
109
  if (stream.match(reWikiCommentStart) || stream.match(reWikiCommentStop)) {
110
- return ret('code', 'code');
110
+ return ret('code', 'comment');
111
111
  }
112
112
  if (stream.match(reJsCodeStart) || stream.match(reJsCodeStop) || stream.match(reXmlCodeStart) || stream.match(reXmlCodeStop)) {
113
- return ret('code', 'code');
113
+ return ret('code', 'comment');
114
114
  }
115
115
  if (stream.match(reHR)) {
116
116
  return ret('hr', 'hr');
@@ -125,26 +125,26 @@ CodeMirror.defineMode("tiddlywiki", function (config, parserConfig) {
125
125
  }
126
126
  if (ch == "*") { // tw list
127
127
  stream.eatWhile('*');
128
- return ret("list", "list");
128
+ return ret("list", "comment");
129
129
  }
130
130
  if (ch == "#") { // tw numbered list
131
131
  stream.eatWhile('#');
132
- return ret("list", "list");
132
+ return ret("list", "comment");
133
133
  }
134
134
  if (ch == ";") { // definition list, term
135
135
  stream.eatWhile(';');
136
- return ret("list", "list");
136
+ return ret("list", "comment");
137
137
  }
138
138
  if (ch == ":") { // definition list, description
139
139
  stream.eatWhile(':');
140
- return ret("list", "list");
140
+ return ret("list", "comment");
141
141
  }
142
142
  if (ch == ">") { // single line quote
143
143
  stream.eatWhile(">");
144
144
  return ret("quote", "quote");
145
145
  }
146
146
  if (ch == '|') {
147
- return ret('table', 'table');
147
+ return ret('table', 'header');
148
148
  }
149
149
  }
150
150
 
@@ -155,7 +155,7 @@ CodeMirror.defineMode("tiddlywiki", function (config, parserConfig) {
155
155
  // rudimentary html:// file:// link matching. TW knows much more ...
156
156
  if (/[hf]/i.test(ch)) {
157
157
  if (/[ti]/i.test(stream.peek()) && stream.match(/\b(ttps?|tp|ile):\/\/[\-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i)) {
158
- return ret("link-external", "link-external");
158
+ return ret("link", "link");
159
159
  }
160
160
  }
161
161
  // just a little string indicator, don't want to have the whole string covered
@@ -173,7 +173,7 @@ CodeMirror.defineMode("tiddlywiki", function (config, parserConfig) {
173
173
  }
174
174
  if (ch == "@") { // check for space link. TODO fix @@...@@ highlighting
175
175
  stream.eatWhile(isSpaceName);
176
- return ret("link-external", "link-external");
176
+ return ret("link", "link");
177
177
  }
178
178
  if (/\d/.test(ch)) { // numbers
179
179
  stream.eatWhile(/\d/);
@@ -266,21 +266,21 @@ CodeMirror.defineMode("tiddlywiki", function (config, parserConfig) {
266
266
  var ch, sb = state.block;
267
267
 
268
268
  if (sb && stream.current()) {
269
- return ret("code", "code");
269
+ return ret("code", "comment");
270
270
  }
271
271
 
272
272
  if (!sb && stream.match(reUntilCodeStop)) {
273
273
  state.tokenize = jsTokenBase;
274
- return ret("code", "code-inline");
274
+ return ret("code", "comment");
275
275
  }
276
276
 
277
277
  if (sb && stream.sol() && stream.match(reCodeBlockStop)) {
278
278
  state.tokenize = jsTokenBase;
279
- return ret("code", "code");
279
+ return ret("code", "comment");
280
280
  }
281
281
 
282
282
  ch = stream.next();
283
- return (sb) ? ret("code", "code") : ret("code", "code-inline");
283
+ return (sb) ? ret("code", "comment") : ret("code", "comment");
284
284
  }
285
285
 
286
286
  // tw em / italic
@@ -324,7 +324,7 @@ CodeMirror.defineMode("tiddlywiki", function (config, parserConfig) {
324
324
  }
325
325
  maybeEnd = (ch == "-");
326
326
  }
327
- return ret("text", "line-through");
327
+ return ret("text", "strikethrough");
328
328
  }
329
329
 
330
330
  // macro