codemirror-rails 2.24 → 2.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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