codemirror-rails 3.00 → 3.02

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. data/README.md +5 -2
  2. data/lib/codemirror/rails/version.rb +2 -2
  3. data/test/dummy/config/database.yml +25 -0
  4. data/test/dummy/db/.gitkeep +0 -0
  5. data/test/integration/codemirror_rails_integration_test.rb +1 -1
  6. data/vendor/assets/javascripts/codemirror.js +385 -152
  7. data/vendor/assets/javascripts/codemirror/keymaps/vim.js +279 -66
  8. data/vendor/assets/javascripts/codemirror/modes/apl.js +160 -0
  9. data/vendor/assets/javascripts/codemirror/modes/asterisk.js +183 -0
  10. data/vendor/assets/javascripts/codemirror/modes/clike.js +2 -0
  11. data/vendor/assets/javascripts/codemirror/modes/clojure.js +3 -3
  12. data/vendor/assets/javascripts/codemirror/modes/css.js +2 -2
  13. data/vendor/assets/javascripts/codemirror/modes/d.js +205 -0
  14. data/vendor/assets/javascripts/codemirror/modes/gfm.js +2 -1
  15. data/vendor/assets/javascripts/codemirror/modes/javascript.js +13 -2
  16. data/vendor/assets/javascripts/codemirror/modes/markdown.js +8 -7
  17. data/vendor/assets/javascripts/codemirror/modes/properties.js +0 -0
  18. data/vendor/assets/javascripts/codemirror/modes/sass.js +349 -0
  19. data/vendor/assets/javascripts/codemirror/modes/sieve.js +37 -10
  20. data/vendor/assets/javascripts/codemirror/modes/sql.js +268 -0
  21. data/vendor/assets/javascripts/codemirror/modes/xquery.js +8 -8
  22. data/vendor/assets/javascripts/codemirror/utils/collapserange.js +68 -0
  23. data/vendor/assets/javascripts/codemirror/utils/dialog.js +1 -0
  24. data/vendor/assets/javascripts/codemirror/utils/foldcode.js +2 -1
  25. data/vendor/assets/javascripts/codemirror/utils/formatting.js +9 -3
  26. data/vendor/assets/javascripts/codemirror/utils/javascript-hint.js +5 -4
  27. data/vendor/assets/javascripts/codemirror/utils/python-hint.js +93 -0
  28. data/vendor/assets/javascripts/codemirror/utils/runmode-standalone.js +51 -10
  29. data/vendor/assets/javascripts/codemirror/utils/search.js +20 -8
  30. data/vendor/assets/javascripts/codemirror/utils/searchcursor.js +17 -10
  31. data/vendor/assets/stylesheets/codemirror.css +10 -9
  32. metadata +47 -15
  33. data/vendor/assets/javascripts/codemirror/modes/xmlpure.js +0 -490
  34. data/vendor/assets/stylesheets/codemirror/modes/diff.css +0 -3
@@ -0,0 +1,160 @@
1
+ CodeMirror.defineMode("apl", function() {
2
+ var builtInOps = {
3
+ ".": "innerProduct",
4
+ "\\": "scan",
5
+ "/": "reduce",
6
+ "⌿": "reduce1Axis",
7
+ "⍀": "scan1Axis",
8
+ "¨": "each",
9
+ "⍣": "power"
10
+ };
11
+ var builtInFuncs = {
12
+ "+": ["conjugate", "add"],
13
+ "−": ["negate", "subtract"],
14
+ "×": ["signOf", "multiply"],
15
+ "÷": ["reciprocal", "divide"],
16
+ "⌈": ["ceiling", "greaterOf"],
17
+ "⌊": ["floor", "lesserOf"],
18
+ "∣": ["absolute", "residue"],
19
+ "⍳": ["indexGenerate", "indexOf"],
20
+ "?": ["roll", "deal"],
21
+ "⋆": ["exponentiate", "toThePowerOf"],
22
+ "⍟": ["naturalLog", "logToTheBase"],
23
+ "○": ["piTimes", "circularFuncs"],
24
+ "!": ["factorial", "binomial"],
25
+ "⌹": ["matrixInverse", "matrixDivide"],
26
+ "<": [null, "lessThan"],
27
+ "≤": [null, "lessThanOrEqual"],
28
+ "=": [null, "equals"],
29
+ ">": [null, "greaterThan"],
30
+ "≥": [null, "greaterThanOrEqual"],
31
+ "≠": [null, "notEqual"],
32
+ "≡": ["depth", "match"],
33
+ "≢": [null, "notMatch"],
34
+ "∈": ["enlist", "membership"],
35
+ "⍷": [null, "find"],
36
+ "∪": ["unique", "union"],
37
+ "∩": [null, "intersection"],
38
+ "∼": ["not", "without"],
39
+ "∨": [null, "or"],
40
+ "∧": [null, "and"],
41
+ "⍱": [null, "nor"],
42
+ "⍲": [null, "nand"],
43
+ "⍴": ["shapeOf", "reshape"],
44
+ ",": ["ravel", "catenate"],
45
+ "⍪": [null, "firstAxisCatenate"],
46
+ "⌽": ["reverse", "rotate"],
47
+ "⊖": ["axis1Reverse", "axis1Rotate"],
48
+ "⍉": ["transpose", null],
49
+ "↑": ["first", "take"],
50
+ "↓": [null, "drop"],
51
+ "⊂": ["enclose", "partitionWithAxis"],
52
+ "⊃": ["diclose", "pick"],
53
+ "⌷": [null, "index"],
54
+ "⍋": ["gradeUp", null],
55
+ "⍒": ["gradeDown", null],
56
+ "⊤": ["encode", null],
57
+ "⊥": ["decode", null],
58
+ "⍕": ["format", "formatByExample"],
59
+ "⍎": ["execute", null],
60
+ "⊣": ["stop", "left"],
61
+ "⊢": ["pass", "right"]
62
+ };
63
+
64
+ var isOperator = /[\.\/⌿⍀¨⍣]/;
65
+ var isNiladic = /⍬/;
66
+ var isFunction = /[\+−×÷⌈⌊∣⍳\?⋆⍟○!⌹<≤=>≥≠≡≢∈⍷∪∩∼∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⌷⍋⍒⊤⊥⍕⍎⊣⊢]/;
67
+ var isArrow = /←/;
68
+ var isComment = /[⍝#].*$/;
69
+
70
+ var stringEater = function(type) {
71
+ var prev;
72
+ prev = false;
73
+ return function(c) {
74
+ prev = c;
75
+ if (c === type) {
76
+ return prev === "\\";
77
+ }
78
+ return true;
79
+ };
80
+ };
81
+ return {
82
+ startState: function() {
83
+ return {
84
+ prev: false,
85
+ func: false,
86
+ op: false,
87
+ string: false,
88
+ escape: false
89
+ };
90
+ },
91
+ token: function(stream, state) {
92
+ var ch, funcName, word;
93
+ if (stream.eatSpace()) {
94
+ return null;
95
+ }
96
+ ch = stream.next();
97
+ if (ch === '"' || ch === "'") {
98
+ stream.eatWhile(stringEater(ch));
99
+ stream.next();
100
+ state.prev = true;
101
+ return "string";
102
+ }
103
+ if (/[\[{\(]/.test(ch)) {
104
+ state.prev = false;
105
+ return null;
106
+ }
107
+ if (/[\]}\)]/.test(ch)) {
108
+ state.prev = true;
109
+ return null;
110
+ }
111
+ if (isNiladic.test(ch)) {
112
+ state.prev = false;
113
+ return "niladic";
114
+ }
115
+ if (/[¯\d]/.test(ch)) {
116
+ if (state.func) {
117
+ state.func = false;
118
+ state.prev = false;
119
+ } else {
120
+ state.prev = true;
121
+ }
122
+ stream.eatWhile(/[\w\.]/);
123
+ return "number";
124
+ }
125
+ if (isOperator.test(ch)) {
126
+ return "operator apl-" + builtInOps[ch];
127
+ }
128
+ if (isArrow.test(ch)) {
129
+ return "apl-arrow";
130
+ }
131
+ if (isFunction.test(ch)) {
132
+ funcName = "apl-";
133
+ if (builtInFuncs[ch] != null) {
134
+ if (state.prev) {
135
+ funcName += builtInFuncs[ch][1];
136
+ } else {
137
+ funcName += builtInFuncs[ch][0];
138
+ }
139
+ }
140
+ state.func = true;
141
+ state.prev = false;
142
+ return "function " + funcName;
143
+ }
144
+ if (isComment.test(ch)) {
145
+ stream.skipToEnd();
146
+ return "comment";
147
+ }
148
+ if (ch === "∘" && stream.peek() === ".") {
149
+ stream.next();
150
+ return "function jot-dot";
151
+ }
152
+ stream.eatWhile(/[\w\$_]/);
153
+ word = stream.current();
154
+ state.prev = true;
155
+ return "keyword";
156
+ }
157
+ };
158
+ });
159
+
160
+ CodeMirror.defineMIME("text/apl", "apl");
@@ -0,0 +1,183 @@
1
+ /*
2
+ * =====================================================================================
3
+ *
4
+ * Filename: mode/asterisk/asterisk.js
5
+ *
6
+ * Description: CodeMirror mode for Asterisk dialplan
7
+ *
8
+ * Created: 05/17/2012 09:20:25 PM
9
+ * Revision: none
10
+ *
11
+ * Author: Stas Kobzar (stas@modulis.ca),
12
+ * Company: Modulis.ca Inc.
13
+ *
14
+ * =====================================================================================
15
+ */
16
+
17
+ CodeMirror.defineMode("asterisk", function() {
18
+ var atoms = ["exten", "same", "include","ignorepat","switch"],
19
+ dpcmd = ["#include","#exec"],
20
+ apps = [
21
+ "addqueuemember","adsiprog","aelsub","agentlogin","agentmonitoroutgoing","agi",
22
+ "alarmreceiver","amd","answer","authenticate","background","backgrounddetect",
23
+ "bridge","busy","callcompletioncancel","callcompletionrequest","celgenuserevent",
24
+ "changemonitor","chanisavail","channelredirect","chanspy","clearhash","confbridge",
25
+ "congestion","continuewhile","controlplayback","dahdiacceptr2call","dahdibarge",
26
+ "dahdiras","dahdiscan","dahdisendcallreroutingfacility","dahdisendkeypadfacility",
27
+ "datetime","dbdel","dbdeltree","deadagi","dial","dictate","directory","disa",
28
+ "dumpchan","eagi","echo","endwhile","exec","execif","execiftime","exitwhile","extenspy",
29
+ "externalivr","festival","flash","followme","forkcdr","getcpeid","gosub","gosubif",
30
+ "goto","gotoif","gotoiftime","hangup","iax2provision","ices","importvar","incomplete",
31
+ "ivrdemo","jabberjoin","jabberleave","jabbersend","jabbersendgroup","jabberstatus",
32
+ "jack","log","macro","macroexclusive","macroexit","macroif","mailboxexists","meetme",
33
+ "meetmeadmin","meetmechanneladmin","meetmecount","milliwatt","minivmaccmess","minivmdelete",
34
+ "minivmgreet","minivmmwi","minivmnotify","minivmrecord","mixmonitor","monitor","morsecode",
35
+ "mp3player","mset","musiconhold","nbscat","nocdr","noop","odbc","odbc","odbcfinish",
36
+ "originate","ospauth","ospfinish","osplookup","ospnext","page","park","parkandannounce",
37
+ "parkedcall","pausemonitor","pausequeuemember","pickup","pickupchan","playback","playtones",
38
+ "privacymanager","proceeding","progress","queue","queuelog","raiseexception","read","readexten",
39
+ "readfile","receivefax","receivefax","receivefax","record","removequeuemember",
40
+ "resetcdr","retrydial","return","ringing","sayalpha","saycountedadj","saycountednoun",
41
+ "saycountpl","saydigits","saynumber","sayphonetic","sayunixtime","senddtmf","sendfax",
42
+ "sendfax","sendfax","sendimage","sendtext","sendurl","set","setamaflags",
43
+ "setcallerpres","setmusiconhold","sipaddheader","sipdtmfmode","sipremoveheader","skel",
44
+ "slastation","slatrunk","sms","softhangup","speechactivategrammar","speechbackground",
45
+ "speechcreate","speechdeactivategrammar","speechdestroy","speechloadgrammar","speechprocessingsound",
46
+ "speechstart","speechunloadgrammar","stackpop","startmusiconhold","stopmixmonitor","stopmonitor",
47
+ "stopmusiconhold","stopplaytones","system","testclient","testserver","transfer","tryexec",
48
+ "trysystem","unpausemonitor","unpausequeuemember","userevent","verbose","vmauthenticate",
49
+ "vmsayname","voicemail","voicemailmain","wait","waitexten","waitfornoise","waitforring",
50
+ "waitforsilence","waitmusiconhold","waituntil","while","zapateller"
51
+ ];
52
+
53
+ function basicToken(stream,state){
54
+ var cur = '';
55
+ var ch = '';
56
+ ch = stream.next();
57
+ // comment
58
+ if(ch == ";") {
59
+ stream.skipToEnd();
60
+ return "comment";
61
+ }
62
+ // context
63
+ if(ch == '[') {
64
+ stream.skipTo(']');
65
+ stream.eat(']');
66
+ return "header";
67
+ }
68
+ // string
69
+ if(ch == '"') {
70
+ stream.skipTo('"');
71
+ return "string";
72
+ }
73
+ if(ch == "'") {
74
+ stream.skipTo("'");
75
+ return "string-2";
76
+ }
77
+ // dialplan commands
78
+ if(ch == '#') {
79
+ stream.eatWhile(/\w/);
80
+ cur = stream.current();
81
+ if(dpcmd.indexOf(cur) !== -1) {
82
+ stream.skipToEnd();
83
+ return "strong";
84
+ }
85
+ }
86
+ // application args
87
+ if(ch == '$'){
88
+ var ch1 = stream.peek();
89
+ if(ch1 == '{'){
90
+ stream.skipTo('}');
91
+ stream.eat('}');
92
+ return "variable-3";
93
+ }
94
+ }
95
+ // extension
96
+ stream.eatWhile(/\w/);
97
+ cur = stream.current();
98
+ if(atoms.indexOf(cur) !== -1) {
99
+ state.extenStart = true;
100
+ switch(cur) {
101
+ case 'same': state.extenSame = true; break;
102
+ case 'include':
103
+ case 'switch':
104
+ case 'ignorepat':
105
+ state.extenInclude = true;break;
106
+ default:break;
107
+ }
108
+ return "atom";
109
+ }
110
+ }
111
+
112
+ return {
113
+ startState: function() {
114
+ return {
115
+ extenStart: false,
116
+ extenSame: false,
117
+ extenInclude: false,
118
+ extenExten: false,
119
+ extenPriority: false,
120
+ extenApplication: false
121
+ };
122
+ },
123
+ token: function(stream, state) {
124
+
125
+ var cur = '';
126
+ var ch = '';
127
+ if(stream.eatSpace()) return null;
128
+ // extension started
129
+ if(state.extenStart){
130
+ stream.eatWhile(/[^\s]/);
131
+ cur = stream.current();
132
+ if(/^=>?$/.test(cur)){
133
+ state.extenExten = true;
134
+ state.extenStart = false;
135
+ return "strong";
136
+ } else {
137
+ state.extenStart = false;
138
+ stream.skipToEnd();
139
+ return "error";
140
+ }
141
+ } else if(state.extenExten) {
142
+ // set exten and priority
143
+ state.extenExten = false;
144
+ state.extenPriority = true;
145
+ stream.eatWhile(/[^,]/);
146
+ if(state.extenInclude) {
147
+ stream.skipToEnd();
148
+ state.extenPriority = false;
149
+ state.extenInclude = false;
150
+ }
151
+ if(state.extenSame) {
152
+ state.extenPriority = false;
153
+ state.extenSame = false;
154
+ state.extenApplication = true;
155
+ }
156
+ return "tag";
157
+ } else if(state.extenPriority) {
158
+ state.extenPriority = false;
159
+ state.extenApplication = true;
160
+ ch = stream.next(); // get comma
161
+ if(state.extenSame) return null;
162
+ stream.eatWhile(/[^,]/);
163
+ return "number";
164
+ } else if(state.extenApplication) {
165
+ stream.eatWhile(/,/);
166
+ cur = stream.current();
167
+ if(cur === ',') return null;
168
+ stream.eatWhile(/\w/);
169
+ cur = stream.current().toLowerCase();
170
+ state.extenApplication = false;
171
+ if(apps.indexOf(cur) !== -1){
172
+ return "def strong";
173
+ }
174
+ } else{
175
+ return basicToken(stream,state);
176
+ }
177
+
178
+ return null;
179
+ }
180
+ };
181
+ });
182
+
183
+ CodeMirror.defineMIME("text/x-asterisk", "asterisk");
@@ -1,6 +1,7 @@
1
1
  CodeMirror.defineMode("clike", function(config, parserConfig) {
2
2
  var indentUnit = config.indentUnit,
3
3
  statementIndentUnit = parserConfig.statementIndentUnit || indentUnit,
4
+ dontAlignCalls = parserConfig.dontAlignCalls,
4
5
  keywords = parserConfig.keywords || {},
5
6
  builtin = parserConfig.builtin || {},
6
7
  blockKeywords = parserConfig.blockKeywords || {},
@@ -149,6 +150,7 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
149
150
  if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev;
150
151
  var closing = firstChar == ctx.type;
151
152
  if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : statementIndentUnit);
153
+ else if (dontAlignCalls && ctx.type == ")" && !closing) return ctx.indented + statementIndentUnit;
152
154
  else if (ctx.align) return ctx.column + (closing ? 0 : 1);
153
155
  else return ctx.indented + (closing ? 0 : indentUnit);
154
156
  },
@@ -142,7 +142,7 @@ CodeMirror.defineMode("clojure", function () {
142
142
  returnType = COMMENT;
143
143
  } else if (isNumber(ch,stream)){
144
144
  returnType = NUMBER;
145
- } else if (ch == "(" || ch == "[") {
145
+ } else if (ch == "(" || ch == "[" || ch == "{" ) {
146
146
  var keyWord = '', indentTemp = stream.column(), letter;
147
147
  /**
148
148
  Either
@@ -172,9 +172,9 @@ CodeMirror.defineMode("clojure", function () {
172
172
  stream.backUp(stream.current().length - 1); // undo all the eating
173
173
 
174
174
  returnType = BRACKET;
175
- } else if (ch == ")" || ch == "]") {
175
+ } else if (ch == ")" || ch == "]" || ch == "}") {
176
176
  returnType = BRACKET;
177
- if (state.indentStack != null && state.indentStack.type == (ch == ")" ? "(" : "[")) {
177
+ if (state.indentStack != null && state.indentStack.type == (ch == ")" ? "(" : (ch == "]" ? "[" :"{"))) {
178
178
  popStack(state);
179
179
  }
180
180
  } else if ( ch == ":" ) {
@@ -222,14 +222,14 @@ CodeMirror.defineMode("css", function(config) {
222
222
  stream.eatWhile(/[\w.%]/);
223
223
  return ret("number", "unit");
224
224
  } else if (stream.match(/^[^-]+-/)) {
225
- return ret("meta", type);
225
+ return ret("meta", "meta");
226
226
  }
227
227
  }
228
228
  else if (/[,+>*\/]/.test(ch)) {
229
229
  return ret(null, "select-op");
230
230
  }
231
231
  else if (ch == "." && stream.match(/^-?[_a-z][_a-z0-9-]*/i)) {
232
- return ret("qualifier", type);
232
+ return ret("qualifier", "qualifier");
233
233
  }
234
234
  else if (ch == ":") {
235
235
  return ret("operator", ch);
@@ -0,0 +1,205 @@
1
+ CodeMirror.defineMode("d", function(config, parserConfig) {
2
+ var indentUnit = config.indentUnit,
3
+ statementIndentUnit = parserConfig.statementIndentUnit || indentUnit,
4
+ keywords = parserConfig.keywords || {},
5
+ builtin = parserConfig.builtin || {},
6
+ blockKeywords = parserConfig.blockKeywords || {},
7
+ atoms = parserConfig.atoms || {},
8
+ hooks = parserConfig.hooks || {},
9
+ multiLineStrings = parserConfig.multiLineStrings;
10
+ var isOperatorChar = /[+\-*&%=<>!?|\/]/;
11
+
12
+ var curPunc;
13
+
14
+ function tokenBase(stream, state) {
15
+ var ch = stream.next();
16
+ if (hooks[ch]) {
17
+ var result = hooks[ch](stream, state);
18
+ if (result !== false) return result;
19
+ }
20
+ if (ch == '"' || ch == "'" || ch == "`") {
21
+ state.tokenize = tokenString(ch);
22
+ return state.tokenize(stream, state);
23
+ }
24
+ if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
25
+ curPunc = ch;
26
+ return null;
27
+ }
28
+ if (/\d/.test(ch)) {
29
+ stream.eatWhile(/[\w\.]/);
30
+ return "number";
31
+ }
32
+ if (ch == "/") {
33
+ if (stream.eat("+")) {
34
+ state.tokenize = tokenComment;
35
+ return tokenNestedComment(stream, state);
36
+ }
37
+ if (stream.eat("*")) {
38
+ state.tokenize = tokenComment;
39
+ return tokenComment(stream, state);
40
+ }
41
+ if (stream.eat("/")) {
42
+ stream.skipToEnd();
43
+ return "comment";
44
+ }
45
+ }
46
+ if (isOperatorChar.test(ch)) {
47
+ stream.eatWhile(isOperatorChar);
48
+ return "operator";
49
+ }
50
+ stream.eatWhile(/[\w\$_]/);
51
+ var cur = stream.current();
52
+ if (keywords.propertyIsEnumerable(cur)) {
53
+ if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement";
54
+ return "keyword";
55
+ }
56
+ if (builtin.propertyIsEnumerable(cur)) {
57
+ if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement";
58
+ return "builtin";
59
+ }
60
+ if (atoms.propertyIsEnumerable(cur)) return "atom";
61
+ return "variable";
62
+ }
63
+
64
+ function tokenString(quote) {
65
+ return function(stream, state) {
66
+ var escaped = false, next, end = false;
67
+ while ((next = stream.next()) != null) {
68
+ if (next == quote && !escaped) {end = true; break;}
69
+ escaped = !escaped && next == "\\";
70
+ }
71
+ if (end || !(escaped || multiLineStrings))
72
+ state.tokenize = null;
73
+ return "string";
74
+ };
75
+ }
76
+
77
+ function tokenComment(stream, state) {
78
+ var maybeEnd = false, ch;
79
+ while (ch = stream.next()) {
80
+ if (ch == "/" && maybeEnd) {
81
+ state.tokenize = null;
82
+ break;
83
+ }
84
+ maybeEnd = (ch == "*");
85
+ }
86
+ return "comment";
87
+ }
88
+
89
+ function tokenNestedComment(stream, state) {
90
+ var maybeEnd = false, ch;
91
+ while (ch = stream.next()) {
92
+ if (ch == "/" && maybeEnd) {
93
+ state.tokenize = null;
94
+ break;
95
+ }
96
+ maybeEnd = (ch == "+");
97
+ }
98
+ return "comment";
99
+ }
100
+
101
+ function Context(indented, column, type, align, prev) {
102
+ this.indented = indented;
103
+ this.column = column;
104
+ this.type = type;
105
+ this.align = align;
106
+ this.prev = prev;
107
+ }
108
+ function pushContext(state, col, type) {
109
+ var indent = state.indented;
110
+ if (state.context && state.context.type == "statement")
111
+ indent = state.context.indented;
112
+ return state.context = new Context(indent, col, type, null, state.context);
113
+ }
114
+ function popContext(state) {
115
+ var t = state.context.type;
116
+ if (t == ")" || t == "]" || t == "}")
117
+ state.indented = state.context.indented;
118
+ return state.context = state.context.prev;
119
+ }
120
+
121
+ // Interface
122
+
123
+ return {
124
+ startState: function(basecolumn) {
125
+ return {
126
+ tokenize: null,
127
+ context: new Context((basecolumn || 0) - indentUnit, 0, "top", false),
128
+ indented: 0,
129
+ startOfLine: true
130
+ };
131
+ },
132
+
133
+ token: function(stream, state) {
134
+ var ctx = state.context;
135
+ if (stream.sol()) {
136
+ if (ctx.align == null) ctx.align = false;
137
+ state.indented = stream.indentation();
138
+ state.startOfLine = true;
139
+ }
140
+ if (stream.eatSpace()) return null;
141
+ curPunc = null;
142
+ var style = (state.tokenize || tokenBase)(stream, state);
143
+ if (style == "comment" || style == "meta") return style;
144
+ if (ctx.align == null) ctx.align = true;
145
+
146
+ if ((curPunc == ";" || curPunc == ":" || curPunc == ",") && ctx.type == "statement") popContext(state);
147
+ else if (curPunc == "{") pushContext(state, stream.column(), "}");
148
+ else if (curPunc == "[") pushContext(state, stream.column(), "]");
149
+ else if (curPunc == "(") pushContext(state, stream.column(), ")");
150
+ else if (curPunc == "}") {
151
+ while (ctx.type == "statement") ctx = popContext(state);
152
+ if (ctx.type == "}") ctx = popContext(state);
153
+ while (ctx.type == "statement") ctx = popContext(state);
154
+ }
155
+ else if (curPunc == ctx.type) popContext(state);
156
+ else if (((ctx.type == "}" || ctx.type == "top") && curPunc != ';') || (ctx.type == "statement" && curPunc == "newstatement"))
157
+ pushContext(state, stream.column(), "statement");
158
+ state.startOfLine = false;
159
+ return style;
160
+ },
161
+
162
+ indent: function(state, textAfter) {
163
+ if (state.tokenize != tokenBase && state.tokenize != null) return CodeMirror.Pass;
164
+ var ctx = state.context, firstChar = textAfter && textAfter.charAt(0);
165
+ if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev;
166
+ var closing = firstChar == ctx.type;
167
+ if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : statementIndentUnit);
168
+ else if (ctx.align) return ctx.column + (closing ? 0 : 1);
169
+ else return ctx.indented + (closing ? 0 : indentUnit);
170
+ },
171
+
172
+ electricChars: "{}"
173
+ };
174
+ });
175
+
176
+ (function() {
177
+ function words(str) {
178
+ var obj = {}, words = str.split(" ");
179
+ for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
180
+ return obj;
181
+ }
182
+
183
+ var blockKeywords = "body catch class do else enum for foreach foreach_reverse if in interface mixin " +
184
+ "out scope struct switch try union unittest version while with";
185
+
186
+ CodeMirror.defineMIME("text/x-d", {
187
+ name: "d",
188
+ keywords: words("abstract alias align asm assert auto break case cast cdouble cent cfloat const continue " +
189
+ "debug default delegate delete deprecated export extern final finally function goto immutable " +
190
+ "import inout invariant is lazy macro module new nothrow override package pragma private " +
191
+ "protected public pure ref return shared short static super synchronized template this " +
192
+ "throw typedef typeid typeof volatile __FILE__ __LINE__ __gshared __traits __vector __parameters " +
193
+ blockKeywords),
194
+ blockKeywords: words(blockKeywords),
195
+ builtin: words("bool byte char creal dchar double float idouble ifloat int ireal long real short ubyte " +
196
+ "ucent uint ulong ushort wchar wstring void size_t sizediff_t"),
197
+ atoms: words("exit failure success true false null"),
198
+ hooks: {
199
+ "@": function(stream, _state) {
200
+ stream.eatWhile(/[\w\$_]/);
201
+ return "meta";
202
+ }
203
+ }
204
+ });
205
+ }());