luca 0.9.89 → 0.9.91

Sign up to get free protection for your applications and to get access to all the features.
Files changed (186) hide show
  1. data/CHANGELOG +11 -1
  2. data/Gemfile +5 -2
  3. data/Gemfile.lock +84 -56
  4. data/Rakefile +10 -2
  5. data/app/assets/javascripts/luca/components/application.coffee +82 -89
  6. data/app/assets/javascripts/luca/components/collection_view.coffee +9 -5
  7. data/app/assets/javascripts/luca/components/controller.coffee +72 -11
  8. data/app/assets/javascripts/luca/components/fields/base.coffee +61 -8
  9. data/app/assets/javascripts/luca/components/fields/button_field.coffee +53 -7
  10. data/app/assets/javascripts/luca/components/fields/checkbox_array.coffee +12 -7
  11. data/app/assets/javascripts/luca/components/fields/text_field.coffee +1 -1
  12. data/app/assets/javascripts/luca/components/form_view.coffee +2 -2
  13. data/app/assets/javascripts/luca/components/grid_layout_view.coffee +0 -1
  14. data/app/assets/javascripts/luca/components/page.coffee +1 -0
  15. data/app/assets/javascripts/luca/components/table_view.coffee +2 -2
  16. data/app/assets/javascripts/luca/concerns/dom_helpers.coffee +2 -2
  17. data/app/assets/javascripts/luca/containers/card_view.coffee +84 -54
  18. data/app/assets/javascripts/luca/containers/container.coffee +126 -46
  19. data/app/assets/javascripts/luca/containers/modal_view.coffee +9 -9
  20. data/app/assets/javascripts/luca/containers/page_controller.coffee +25 -0
  21. data/app/assets/javascripts/luca/containers/panel_toolbar.coffee +1 -1
  22. data/app/assets/javascripts/luca/containers/viewport.coffee +2 -5
  23. data/app/assets/javascripts/luca/core/collection.coffee +18 -4
  24. data/app/assets/javascripts/luca/core/model.coffee +1 -1
  25. data/app/assets/javascripts/luca/core/panel.coffee +1 -1
  26. data/app/assets/javascripts/luca/core/view.coffee +26 -7
  27. data/app/assets/javascripts/luca/development/code_sync_manager.coffee +51 -4
  28. data/app/assets/javascripts/luca/development/console.coffee +1 -1
  29. data/app/assets/javascripts/luca/framework.coffee +1 -1
  30. data/app/assets/javascripts/luca/index.coffee +1 -0
  31. data/app/assets/javascripts/luca/util/luca.coffee +2 -1
  32. data/app/assets/stylesheets/luca/components/viewport.scss +0 -4
  33. data/bin/luca +14 -0
  34. data/docs/framework.json +1 -1
  35. data/docs/luca-framework-documentation.js +1 -0
  36. data/lib/luca/cli/generate.rb +37 -0
  37. data/lib/luca/cli/server.rb +20 -0
  38. data/lib/luca/cli/sync.rb +40 -0
  39. data/lib/luca/cli/watch.rb +16 -0
  40. data/lib/luca/cli.rb +68 -0
  41. data/lib/luca/collection/endpoint.rb +1 -0
  42. data/lib/luca/component_definition.rb +23 -5
  43. data/lib/luca/luca_application.rb +18 -7
  44. data/lib/luca/rails/version.rb +1 -1
  45. data/lib/luca/server.rb +7 -0
  46. data/lib/luca/stylesheet.rb +2 -3
  47. data/lib/luca/version.rb +3 -0
  48. data/lib/luca/watcher.rb +72 -0
  49. data/lib/luca.rb +8 -1
  50. data/luca.gemspec +14 -7
  51. data/site/.bundle/config +2 -0
  52. data/site/.gitignore +5 -0
  53. data/site/.rvmrc +1 -0
  54. data/site/CHANGELOG.md +41 -0
  55. data/site/DOCS.md +41 -0
  56. data/site/Gemfile +8 -0
  57. data/site/Gemfile.lock +134 -0
  58. data/site/LICENSE.md +19 -0
  59. data/site/config.rb +84 -0
  60. data/site/helpers/site_helpers.rb +20 -0
  61. data/site/html5bp-docs/README.md +38 -0
  62. data/site/html5bp-docs/contribute.md +104 -0
  63. data/site/html5bp-docs/crossdomain.md +21 -0
  64. data/site/html5bp-docs/css.md +135 -0
  65. data/site/html5bp-docs/extend.md +507 -0
  66. data/site/html5bp-docs/faq.md +77 -0
  67. data/site/html5bp-docs/htaccess.md +323 -0
  68. data/site/html5bp-docs/html.md +170 -0
  69. data/site/html5bp-docs/js.md +31 -0
  70. data/site/html5bp-docs/misc.md +25 -0
  71. data/site/html5bp-docs/usage.md +109 -0
  72. data/site/readme.md +47 -0
  73. data/site/source/.htaccess +540 -0
  74. data/site/source/404.html +157 -0
  75. data/site/source/app/assets/javascripts/dependencies.js.coffee +6 -0
  76. data/site/source/app/assets/javascripts/docs/application.coffee +64 -0
  77. data/site/source/app/assets/javascripts/docs/collections/docs_documentation.coffee +17 -0
  78. data/site/source/app/assets/javascripts/docs/collections/github_repositories.coffee +7 -0
  79. data/site/source/app/assets/javascripts/docs/collections/index.coffee +1 -0
  80. data/site/source/app/assets/javascripts/docs/collections/luca_documentation.coffee +17 -0
  81. data/site/source/app/assets/javascripts/docs/collections/public_gists.coffee +4 -0
  82. data/site/source/app/assets/javascripts/docs/config.coffee +5 -0
  83. data/site/source/app/assets/javascripts/docs/index.coffee +12 -0
  84. data/site/source/app/assets/javascripts/docs/lib/router.coffee +3 -0
  85. data/site/source/app/assets/javascripts/docs/lib/util.coffee +0 -0
  86. data/site/source/app/assets/javascripts/docs/models/component.coffee +99 -0
  87. data/site/source/app/assets/javascripts/docs/models/github_repository.coffee +3 -0
  88. data/site/source/app/assets/javascripts/docs/models/index.coffee +1 -0
  89. data/site/source/app/assets/javascripts/docs/templates/component_documentation.jst.ejs +55 -0
  90. data/site/source/app/assets/javascripts/docs/templates/examples_browser/overview.jst.ejs +4 -0
  91. data/site/source/app/assets/javascripts/docs/templates/examples_browser/selector.jst.ejs +11 -0
  92. data/site/source/app/assets/javascripts/docs/templates/github_repository.jst.ejs +4 -0
  93. data/site/source/app/assets/javascripts/docs/templates/layouts/main.jst.ejs +4 -0
  94. data/site/source/app/assets/javascripts/docs/templates/left_navigation.jst.ejs +5 -0
  95. data/site/source/app/assets/javascripts/docs/templates/pages/getting_started.jst.ejs +78 -0
  96. data/site/source/app/assets/javascripts/docs/templates/pages/home.jst.ejs +57 -0
  97. data/site/source/app/assets/javascripts/docs/views/components/code_editor/index.coffee +0 -0
  98. data/site/source/app/assets/javascripts/docs/views/components/code_editor.coffee +45 -0
  99. data/site/source/app/assets/javascripts/docs/views/components/component_documentation.coffee +72 -0
  100. data/site/source/app/assets/javascripts/docs/views/index.coffee +3 -0
  101. data/site/source/app/assets/javascripts/docs/views/pages/browse_source/details.coffee +37 -0
  102. data/site/source/app/assets/javascripts/docs/views/pages/browse_source/list.coffee +31 -0
  103. data/site/source/app/assets/javascripts/docs/views/pages/browse_source.coffee +46 -0
  104. data/site/source/app/assets/javascripts/docs/views/pages/component_editor.coffee +10 -0
  105. data/site/source/app/assets/javascripts/docs/views/pages/examples_browser/docs.coffee +12 -0
  106. data/site/source/app/assets/javascripts/docs/views/pages/examples_browser/source.coffee +13 -0
  107. data/site/source/app/assets/javascripts/docs/views/pages/examples_browser.coffee +102 -0
  108. data/site/source/app/assets/javascripts/docs/views/pages/home.coffee +10 -0
  109. data/site/source/app/assets/javascripts/docs/views/views/api_browser/index.coffee +43 -0
  110. data/site/source/app/assets/javascripts/docs/views/views/collection_view_examples/grid_layout_view_example.coffee +14 -0
  111. data/site/source/app/assets/javascripts/docs/views/views/collection_view_examples/table_view_example.coffee +39 -0
  112. data/site/source/app/assets/javascripts/docs/views/views/form_view_examples/basic_example.coffee +38 -0
  113. data/site/source/app/assets/javascripts/docs/views/views/form_view_examples/complex_layout.coffee +110 -0
  114. data/site/source/app/assets/javascripts/docs/views/views/top_navigation.coffee +6 -0
  115. data/site/source/app/assets/javascripts/docs-docs.js +1 -0
  116. data/site/source/app/assets/javascripts/luca-docs.js +1 -0
  117. data/site/source/app/assets/javascripts/luca-framework-documentation.js +1 -0
  118. data/site/source/app/assets/javascripts/site.js.coffee +4 -0
  119. data/site/source/app/assets/javascripts/vendor/codemirror.js +4786 -0
  120. data/site/source/app/assets/javascripts/vendor/coffeescript.js +346 -0
  121. data/site/source/app/assets/javascripts/vendor/css.js +465 -0
  122. data/site/source/app/assets/javascripts/vendor/htmlmixed.js +84 -0
  123. data/site/source/app/assets/javascripts/vendor/javascript.js +422 -0
  124. data/site/source/app/assets/javascripts/vendor/js-beautify.js +1353 -0
  125. data/site/source/app/assets/javascripts/vendor/modernizr-2.6.1.min.js +4 -0
  126. data/site/source/app/assets/javascripts/vendor/vim.js +2511 -0
  127. data/site/source/app/assets/stylesheets/docs/api-browser.css.scss +5 -0
  128. data/site/source/app/assets/stylesheets/docs/application.css.scss +35 -0
  129. data/site/source/app/assets/stylesheets/docs/browse-source.css.scss +5 -0
  130. data/site/source/app/assets/stylesheets/docs/scrollable-table.css.scss +5 -0
  131. data/site/source/app/assets/stylesheets/site.css.scss +2 -0
  132. data/site/source/app/assets/stylesheets/vendor/codemirror.css +240 -0
  133. data/site/source/app/assets/stylesheets/vendor/prettify-tomorrow-night-bright.css +160 -0
  134. data/site/source/app/assets/stylesheets/vendor/twilight.css +26 -0
  135. data/site/source/crossdomain.xml +15 -0
  136. data/site/source/documentation.html.haml +1 -0
  137. data/site/source/favicon_base.png +0 -0
  138. data/site/source/humans.txt +15 -0
  139. data/site/source/images/background.png +0 -0
  140. data/site/source/images/middleman.png +0 -0
  141. data/site/source/index.html.haml +1 -0
  142. data/site/source/layouts/layout.haml +55 -0
  143. data/site/source/readme.md +63 -0
  144. data/site/source/robots.txt +3 -0
  145. data/spec/javascripts/components/collection_view_spec.coffee +1 -1
  146. data/spec/javascripts/containers/card_view_spec.coffee +58 -5
  147. data/spec/javascripts/core/collection_spec.coffee +1 -1
  148. data/spec/javascripts/core/view_spec.coffee +2 -2
  149. data/vendor/assets/javascripts/backbone-min.js +37 -33
  150. data/vendor/assets/javascripts/backbone-query.min.js +1 -1
  151. data/vendor/assets/javascripts/jquery.js +5 -4
  152. data/vendor/assets/javascripts/luca-dependencies.min.js +8 -6
  153. data/vendor/assets/javascripts/luca-development.min.js +1 -1
  154. data/vendor/assets/javascripts/luca.full.min.js +12 -10
  155. data/vendor/assets/javascripts/luca.min.js +5 -5
  156. data/vendor/assets/javascripts/underscore-min.js +1 -5
  157. data/vendor/assets/javascripts/underscore-string.min.js +1 -1
  158. data/vendor/assets/stylesheets/luca-components.css +0 -2
  159. data/vendor/assets/stylesheets/luca-development.css +1 -1
  160. metadata +215 -39
  161. data/app/assets/javascripts/luca/components/page_controller.coffee +0 -3
  162. data/app/assets/javascripts/luca/core/collection_view.coffee +0 -150
  163. data/site/assets/bootstrap.min.js +0 -7
  164. data/site/assets/dependencies.js +0 -94
  165. data/site/assets/glyphicons-halflings-white.png +0 -0
  166. data/site/assets/glyphicons-halflings.png +0 -0
  167. data/site/assets/luca-ui-bootstrap.css +0 -1331
  168. data/site/assets/luca-ui-bootstrap.js +0 -9
  169. data/site/assets/luca-ui-development-tools.css +0 -234
  170. data/site/assets/luca-ui-development-tools.js +0 -18561
  171. data/site/assets/luca-ui-development-tools.min.js +0 -15
  172. data/site/assets/luca-ui-full.min.js +0 -8
  173. data/site/assets/luca-ui.min.js +0 -4
  174. data/site/assets/sandbox.css +0 -62
  175. data/site/assets/sandbox.js +0 -469
  176. data/site/docs/application.html +0 -41
  177. data/site/docs/caching.html +0 -43
  178. data/site/docs/collection.html +0 -75
  179. data/site/docs/collection_manager.html +0 -71
  180. data/site/docs/containers.html +0 -118
  181. data/site/docs/events.html +0 -153
  182. data/site/docs/view.html +0 -128
  183. data/site/img/glyphicons-halflings-white.png +0 -0
  184. data/site/img/glyphicons-halflings.png +0 -0
  185. data/site/index.html +0 -20
  186. data/site/source-map.js +0 -1
@@ -0,0 +1,422 @@
1
+ // TODO actually recognize syntax of TypeScript constructs
2
+
3
+ CodeMirror.defineMode("javascript", function(config, parserConfig) {
4
+ var indentUnit = config.indentUnit;
5
+ var jsonMode = parserConfig.json;
6
+ var isTS = parserConfig.typescript;
7
+
8
+ // Tokenizer
9
+
10
+ var keywords = function(){
11
+ function kw(type) {return {type: type, style: "keyword"};}
12
+ var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c");
13
+ var operator = kw("operator"), atom = {type: "atom", style: "atom"};
14
+
15
+ var jsKeywords = {
16
+ "if": A, "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B,
17
+ "return": C, "break": C, "continue": C, "new": C, "delete": C, "throw": C,
18
+ "var": kw("var"), "const": kw("var"), "let": kw("var"),
19
+ "function": kw("function"), "catch": kw("catch"),
20
+ "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"),
21
+ "in": operator, "typeof": operator, "instanceof": operator,
22
+ "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom
23
+ };
24
+
25
+ // Extend the 'normal' keywords with the TypeScript language extensions
26
+ if (isTS) {
27
+ var type = {type: "variable", style: "variable-3"};
28
+ var tsKeywords = {
29
+ // object-like things
30
+ "interface": kw("interface"),
31
+ "class": kw("class"),
32
+ "extends": kw("extends"),
33
+ "constructor": kw("constructor"),
34
+
35
+ // scope modifiers
36
+ "public": kw("public"),
37
+ "private": kw("private"),
38
+ "protected": kw("protected"),
39
+ "static": kw("static"),
40
+
41
+ "super": kw("super"),
42
+
43
+ // types
44
+ "string": type, "number": type, "bool": type, "any": type
45
+ };
46
+
47
+ for (var attr in tsKeywords) {
48
+ jsKeywords[attr] = tsKeywords[attr];
49
+ }
50
+ }
51
+
52
+ return jsKeywords;
53
+ }();
54
+
55
+ var isOperatorChar = /[+\-*&%=<>!?|]/;
56
+
57
+ function chain(stream, state, f) {
58
+ state.tokenize = f;
59
+ return f(stream, state);
60
+ }
61
+
62
+ function nextUntilUnescaped(stream, end) {
63
+ var escaped = false, next;
64
+ while ((next = stream.next()) != null) {
65
+ if (next == end && !escaped)
66
+ return false;
67
+ escaped = !escaped && next == "\\";
68
+ }
69
+ return escaped;
70
+ }
71
+
72
+ // Used as scratch variables to communicate multiple values without
73
+ // consing up tons of objects.
74
+ var type, content;
75
+ function ret(tp, style, cont) {
76
+ type = tp; content = cont;
77
+ return style;
78
+ }
79
+
80
+ function jsTokenBase(stream, state) {
81
+ var ch = stream.next();
82
+ if (ch == '"' || ch == "'")
83
+ return chain(stream, state, jsTokenString(ch));
84
+ else if (/[\[\]{}\(\),;\:\.]/.test(ch))
85
+ return ret(ch);
86
+ else if (ch == "0" && stream.eat(/x/i)) {
87
+ stream.eatWhile(/[\da-f]/i);
88
+ return ret("number", "number");
89
+ }
90
+ else if (/\d/.test(ch) || ch == "-" && stream.eat(/\d/)) {
91
+ stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/);
92
+ return ret("number", "number");
93
+ }
94
+ else if (ch == "/") {
95
+ if (stream.eat("*")) {
96
+ return chain(stream, state, jsTokenComment);
97
+ }
98
+ else if (stream.eat("/")) {
99
+ stream.skipToEnd();
100
+ return ret("comment", "comment");
101
+ }
102
+ else if (state.lastType == "operator" || state.lastType == "keyword c" ||
103
+ /^[\[{}\(,;:]$/.test(state.lastType)) {
104
+ nextUntilUnescaped(stream, "/");
105
+ stream.eatWhile(/[gimy]/); // 'y' is "sticky" option in Mozilla
106
+ return ret("regexp", "string-2");
107
+ }
108
+ else {
109
+ stream.eatWhile(isOperatorChar);
110
+ return ret("operator", null, stream.current());
111
+ }
112
+ }
113
+ else if (ch == "#") {
114
+ stream.skipToEnd();
115
+ return ret("error", "error");
116
+ }
117
+ else if (isOperatorChar.test(ch)) {
118
+ stream.eatWhile(isOperatorChar);
119
+ return ret("operator", null, stream.current());
120
+ }
121
+ else {
122
+ stream.eatWhile(/[\w\$_]/);
123
+ var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word];
124
+ return (known && state.lastType != ".") ? ret(known.type, known.style, word) :
125
+ ret("variable", "variable", word);
126
+ }
127
+ }
128
+
129
+ function jsTokenString(quote) {
130
+ return function(stream, state) {
131
+ if (!nextUntilUnescaped(stream, quote))
132
+ state.tokenize = jsTokenBase;
133
+ return ret("string", "string");
134
+ };
135
+ }
136
+
137
+ function jsTokenComment(stream, state) {
138
+ var maybeEnd = false, ch;
139
+ while (ch = stream.next()) {
140
+ if (ch == "/" && maybeEnd) {
141
+ state.tokenize = jsTokenBase;
142
+ break;
143
+ }
144
+ maybeEnd = (ch == "*");
145
+ }
146
+ return ret("comment", "comment");
147
+ }
148
+
149
+ // Parser
150
+
151
+ var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true};
152
+
153
+ function JSLexical(indented, column, type, align, prev, info) {
154
+ this.indented = indented;
155
+ this.column = column;
156
+ this.type = type;
157
+ this.prev = prev;
158
+ this.info = info;
159
+ if (align != null) this.align = align;
160
+ }
161
+
162
+ function inScope(state, varname) {
163
+ for (var v = state.localVars; v; v = v.next)
164
+ if (v.name == varname) return true;
165
+ }
166
+
167
+ function parseJS(state, style, type, content, stream) {
168
+ var cc = state.cc;
169
+ // Communicate our context to the combinators.
170
+ // (Less wasteful than consing up a hundred closures on every call.)
171
+ cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc;
172
+
173
+ if (!state.lexical.hasOwnProperty("align"))
174
+ state.lexical.align = true;
175
+
176
+ while(true) {
177
+ var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement;
178
+ if (combinator(type, content)) {
179
+ while(cc.length && cc[cc.length - 1].lex)
180
+ cc.pop()();
181
+ if (cx.marked) return cx.marked;
182
+ if (type == "variable" && inScope(state, content)) return "variable-2";
183
+ return style;
184
+ }
185
+ }
186
+ }
187
+
188
+ // Combinator utils
189
+
190
+ var cx = {state: null, column: null, marked: null, cc: null};
191
+ function pass() {
192
+ for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);
193
+ }
194
+ function cont() {
195
+ pass.apply(null, arguments);
196
+ return true;
197
+ }
198
+ function register(varname) {
199
+ function inList(list) {
200
+ for (var v = list; v; v = v.next)
201
+ if (v.name == varname) return true;
202
+ return false;
203
+ }
204
+ var state = cx.state;
205
+ if (state.context) {
206
+ cx.marked = "def";
207
+ if (inList(state.localVars)) return;
208
+ state.localVars = {name: varname, next: state.localVars};
209
+ } else {
210
+ if (inList(state.globalVars)) return;
211
+ state.globalVars = {name: varname, next: state.globalVars};
212
+ }
213
+ }
214
+
215
+ // Combinators
216
+
217
+ var defaultVars = {name: "this", next: {name: "arguments"}};
218
+ function pushcontext() {
219
+ cx.state.context = {prev: cx.state.context, vars: cx.state.localVars};
220
+ cx.state.localVars = defaultVars;
221
+ }
222
+ function popcontext() {
223
+ cx.state.localVars = cx.state.context.vars;
224
+ cx.state.context = cx.state.context.prev;
225
+ }
226
+ function pushlex(type, info) {
227
+ var result = function() {
228
+ var state = cx.state;
229
+ state.lexical = new JSLexical(state.indented, cx.stream.column(), type, null, state.lexical, info);
230
+ };
231
+ result.lex = true;
232
+ return result;
233
+ }
234
+ function poplex() {
235
+ var state = cx.state;
236
+ if (state.lexical.prev) {
237
+ if (state.lexical.type == ")")
238
+ state.indented = state.lexical.indented;
239
+ state.lexical = state.lexical.prev;
240
+ }
241
+ }
242
+ poplex.lex = true;
243
+
244
+ function expect(wanted) {
245
+ return function expecting(type) {
246
+ if (type == wanted) return cont();
247
+ else if (wanted == ";") return pass();
248
+ else return cont(arguments.callee);
249
+ };
250
+ }
251
+
252
+ function statement(type) {
253
+ if (type == "var") return cont(pushlex("vardef"), vardef1, expect(";"), poplex);
254
+ if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex);
255
+ if (type == "keyword b") return cont(pushlex("form"), statement, poplex);
256
+ if (type == "{") return cont(pushlex("}"), block, poplex);
257
+ if (type == ";") return cont();
258
+ if (type == "function") return cont(functiondef);
259
+ if (type == "for") return cont(pushlex("form"), expect("("), pushlex(")"), forspec1, expect(")"),
260
+ poplex, statement, poplex);
261
+ if (type == "variable") return cont(pushlex("stat"), maybelabel);
262
+ if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"),
263
+ block, poplex, poplex);
264
+ if (type == "case") return cont(expression, expect(":"));
265
+ if (type == "default") return cont(expect(":"));
266
+ if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"),
267
+ statement, poplex, popcontext);
268
+ return pass(pushlex("stat"), expression, expect(";"), poplex);
269
+ }
270
+ function expression(type) {
271
+ if (atomicTypes.hasOwnProperty(type)) return cont(maybeoperator);
272
+ if (type == "function") return cont(functiondef);
273
+ if (type == "keyword c") return cont(maybeexpression);
274
+ if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeoperator);
275
+ if (type == "operator") return cont(expression);
276
+ if (type == "[") return cont(pushlex("]"), commasep(expression, "]"), poplex, maybeoperator);
277
+ if (type == "{") return cont(pushlex("}"), commasep(objprop, "}"), poplex, maybeoperator);
278
+ return cont();
279
+ }
280
+ function maybeexpression(type) {
281
+ if (type.match(/[;\}\)\],]/)) return pass();
282
+ return pass(expression);
283
+ }
284
+
285
+ function maybeoperator(type, value) {
286
+ if (type == "operator" && /\+\+|--/.test(value)) return cont(maybeoperator);
287
+ if (type == "operator" && value == "?") return cont(expression, expect(":"), expression);
288
+ if (type == ";") return;
289
+ if (type == "(") return cont(pushlex(")"), commasep(expression, ")"), poplex, maybeoperator);
290
+ if (type == ".") return cont(property, maybeoperator);
291
+ if (type == "[") return cont(pushlex("]"), expression, expect("]"), poplex, maybeoperator);
292
+ }
293
+ function maybelabel(type) {
294
+ if (type == ":") return cont(poplex, statement);
295
+ return pass(maybeoperator, expect(";"), poplex);
296
+ }
297
+ function property(type) {
298
+ if (type == "variable") {cx.marked = "property"; return cont();}
299
+ }
300
+ function objprop(type) {
301
+ if (type == "variable") cx.marked = "property";
302
+ if (atomicTypes.hasOwnProperty(type)) return cont(expect(":"), expression);
303
+ }
304
+ function commasep(what, end) {
305
+ function proceed(type) {
306
+ if (type == ",") return cont(what, proceed);
307
+ if (type == end) return cont();
308
+ return cont(expect(end));
309
+ }
310
+ return function commaSeparated(type) {
311
+ if (type == end) return cont();
312
+ else return pass(what, proceed);
313
+ };
314
+ }
315
+ function block(type) {
316
+ if (type == "}") return cont();
317
+ return pass(statement, block);
318
+ }
319
+ function maybetype(type) {
320
+ if (type == ":") return cont(typedef);
321
+ return pass();
322
+ }
323
+ function typedef(type) {
324
+ if (type == "variable"){cx.marked = "variable-3"; return cont();}
325
+ return pass();
326
+ }
327
+ function vardef1(type, value) {
328
+ if (type == "variable") {
329
+ register(value);
330
+ return isTS ? cont(maybetype, vardef2) : cont(vardef2);
331
+ }
332
+ return pass();
333
+ }
334
+ function vardef2(type, value) {
335
+ if (value == "=") return cont(expression, vardef2);
336
+ if (type == ",") return cont(vardef1);
337
+ }
338
+ function forspec1(type) {
339
+ if (type == "var") return cont(vardef1, expect(";"), forspec2);
340
+ if (type == ";") return cont(forspec2);
341
+ if (type == "variable") return cont(formaybein);
342
+ return cont(forspec2);
343
+ }
344
+ function formaybein(_type, value) {
345
+ if (value == "in") return cont(expression);
346
+ return cont(maybeoperator, forspec2);
347
+ }
348
+ function forspec2(type, value) {
349
+ if (type == ";") return cont(forspec3);
350
+ if (value == "in") return cont(expression);
351
+ return cont(expression, expect(";"), forspec3);
352
+ }
353
+ function forspec3(type) {
354
+ if (type != ")") cont(expression);
355
+ }
356
+ function functiondef(type, value) {
357
+ if (type == "variable") {register(value); return cont(functiondef);}
358
+ if (type == "(") return cont(pushlex(")"), pushcontext, commasep(funarg, ")"), poplex, statement, popcontext);
359
+ }
360
+ function funarg(type, value) {
361
+ if (type == "variable") {register(value); return isTS ? cont(maybetype) : cont();}
362
+ }
363
+
364
+ // Interface
365
+
366
+ return {
367
+ startState: function(basecolumn) {
368
+ return {
369
+ tokenize: jsTokenBase,
370
+ lastType: null,
371
+ cc: [],
372
+ lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false),
373
+ localVars: parserConfig.localVars,
374
+ globalVars: parserConfig.globalVars,
375
+ context: parserConfig.localVars && {vars: parserConfig.localVars},
376
+ indented: 0
377
+ };
378
+ },
379
+
380
+ token: function(stream, state) {
381
+ if (stream.sol()) {
382
+ if (!state.lexical.hasOwnProperty("align"))
383
+ state.lexical.align = false;
384
+ state.indented = stream.indentation();
385
+ }
386
+ if (stream.eatSpace()) return null;
387
+ var style = state.tokenize(stream, state);
388
+ if (type == "comment") return style;
389
+ state.lastType = type;
390
+ return parseJS(state, style, type, content, stream);
391
+ },
392
+
393
+ indent: function(state, textAfter) {
394
+ if (state.tokenize == jsTokenComment) return CodeMirror.Pass;
395
+ if (state.tokenize != jsTokenBase) return 0;
396
+ var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical;
397
+ if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev;
398
+ var type = lexical.type, closing = firstChar == type;
399
+ if (type == "vardef") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? 4 : 0);
400
+ else if (type == "form" && firstChar == "{") return lexical.indented;
401
+ else if (type == "form") return lexical.indented + indentUnit;
402
+ else if (type == "stat")
403
+ return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? indentUnit : 0);
404
+ else if (lexical.info == "switch" && !closing)
405
+ return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit);
406
+ else if (lexical.align) return lexical.column + (closing ? 0 : 1);
407
+ else return lexical.indented + (closing ? 0 : indentUnit);
408
+ },
409
+
410
+ electricChars: ":{}",
411
+
412
+ jsonMode: jsonMode
413
+ };
414
+ });
415
+
416
+ CodeMirror.defineMIME("text/javascript", "javascript");
417
+ CodeMirror.defineMIME("text/ecmascript", "javascript");
418
+ CodeMirror.defineMIME("application/javascript", "javascript");
419
+ CodeMirror.defineMIME("application/ecmascript", "javascript");
420
+ CodeMirror.defineMIME("application/json", {name: "javascript", json: true});
421
+ CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true });
422
+ CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true });