ace-rails-ap 2.0.0 → 2.0.1

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 (167) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +1 -1
  3. data/lib/ace/rails/version.rb +1 -1
  4. data/vendor/assets/javascripts/ace/ace.js +6911 -5290
  5. data/vendor/assets/javascripts/ace/ext-chromevox.js +537 -0
  6. data/vendor/assets/javascripts/ace/ext-elastic_tabstops_lite.js +301 -0
  7. data/vendor/assets/javascripts/ace/ext-emmet.js +1109 -0
  8. data/vendor/assets/javascripts/ace/ext-keybinding_menu.js +207 -0
  9. data/vendor/assets/javascripts/ace/ext-language_tools.js +1665 -0
  10. data/vendor/assets/javascripts/ace/ext-modelist.js +168 -0
  11. data/vendor/assets/javascripts/ace/ext-old_ie.js +500 -0
  12. data/vendor/assets/javascripts/ace/ext-options.js +252 -0
  13. data/vendor/assets/javascripts/ace/ext-searchbox.js +421 -0
  14. data/vendor/assets/javascripts/ace/ext-settings_menu.js +632 -0
  15. data/vendor/assets/javascripts/ace/ext-spellcheck.js +68 -0
  16. data/vendor/assets/javascripts/ace/ext-split.js +271 -0
  17. data/vendor/assets/javascripts/ace/ext-static_highlight.js +178 -0
  18. data/vendor/assets/javascripts/ace/ext-statusbar.js +47 -0
  19. data/vendor/assets/javascripts/ace/ext-textarea.js +478 -0
  20. data/vendor/assets/javascripts/ace/ext-themelist.js +86 -0
  21. data/vendor/assets/javascripts/ace/ext-whitespace.js +206 -0
  22. data/vendor/assets/javascripts/ace/keybinding-emacs.js +822 -131
  23. data/vendor/assets/javascripts/ace/keybinding-vim.js +382 -258
  24. data/vendor/assets/javascripts/ace/mode-abap.js +261 -0
  25. data/vendor/assets/javascripts/ace/mode-actionscript.js +257 -0
  26. data/vendor/assets/javascripts/ace/mode-ada.js +118 -0
  27. data/vendor/assets/javascripts/ace/mode-asciidoc.js +373 -0
  28. data/vendor/assets/javascripts/ace/mode-assembly_x86.js +217 -0
  29. data/vendor/assets/javascripts/ace/mode-autohotkey.js +225 -0
  30. data/vendor/assets/javascripts/ace/mode-batchfile.js +213 -0
  31. data/vendor/assets/javascripts/ace/mode-c9search.js +144 -124
  32. data/vendor/assets/javascripts/ace/mode-c_cpp.js +296 -254
  33. data/vendor/assets/javascripts/ace/mode-clojure.js +113 -177
  34. data/vendor/assets/javascripts/ace/mode-cobol.js +125 -0
  35. data/vendor/assets/javascripts/ace/mode-coffee.js +152 -235
  36. data/vendor/assets/javascripts/ace/mode-coldfusion.js +823 -835
  37. data/vendor/assets/javascripts/ace/mode-csharp.js +325 -187
  38. data/vendor/assets/javascripts/ace/mode-css.js +583 -297
  39. data/vendor/assets/javascripts/ace/mode-curly.js +2423 -0
  40. data/vendor/assets/javascripts/ace/mode-d.js +492 -0
  41. data/vendor/assets/javascripts/ace/mode-dart.js +993 -0
  42. data/vendor/assets/javascripts/ace/mode-diff.js +124 -204
  43. data/vendor/assets/javascripts/ace/mode-django.js +2448 -0
  44. data/vendor/assets/javascripts/ace/mode-dot.js +361 -0
  45. data/vendor/assets/javascripts/ace/mode-ejs.js +2817 -0
  46. data/vendor/assets/javascripts/ace/mode-erlang.js +987 -0
  47. data/vendor/assets/javascripts/ace/mode-forth.js +280 -0
  48. data/vendor/assets/javascripts/ace/mode-ftl.js +1061 -0
  49. data/vendor/assets/javascripts/ace/mode-glsl.js +313 -275
  50. data/vendor/assets/javascripts/ace/mode-golang.js +268 -275
  51. data/vendor/assets/javascripts/ace/mode-groovy.js +347 -492
  52. data/vendor/assets/javascripts/ace/mode-haml.js +498 -0
  53. data/vendor/assets/javascripts/ace/mode-handlebars.js +2433 -0
  54. data/vendor/assets/javascripts/ace/mode-haskell.js +362 -0
  55. data/vendor/assets/javascripts/ace/mode-haxe.js +226 -202
  56. data/vendor/assets/javascripts/ace/mode-html.js +1099 -802
  57. data/vendor/assets/javascripts/ace/mode-html_completions.js +309 -0
  58. data/vendor/assets/javascripts/ace/mode-html_ruby.js +2822 -0
  59. data/vendor/assets/javascripts/ace/mode-ini.js +185 -0
  60. data/vendor/assets/javascripts/ace/mode-jack.js +653 -0
  61. data/vendor/assets/javascripts/ace/mode-jade.js +2081 -0
  62. data/vendor/assets/javascripts/ace/mode-java.js +339 -488
  63. data/vendor/assets/javascripts/ace/mode-javascript.js +342 -478
  64. data/vendor/assets/javascripts/ace/mode-json.js +215 -178
  65. data/vendor/assets/javascripts/ace/mode-jsoniq.js +2761 -0
  66. data/vendor/assets/javascripts/ace/mode-jsp.js +1553 -0
  67. data/vendor/assets/javascripts/ace/mode-jsx.js +325 -289
  68. data/vendor/assets/javascripts/ace/mode-julia.js +286 -0
  69. data/vendor/assets/javascripts/ace/mode-latex.js +141 -46
  70. data/vendor/assets/javascripts/ace/mode-less.js +493 -151
  71. data/vendor/assets/javascripts/ace/mode-liquid.js +594 -656
  72. data/vendor/assets/javascripts/ace/mode-lisp.js +137 -0
  73. data/vendor/assets/javascripts/ace/mode-livescript.js +288 -0
  74. data/vendor/assets/javascripts/ace/mode-logiql.js +669 -0
  75. data/vendor/assets/javascripts/ace/mode-lsl.js +890 -0
  76. data/vendor/assets/javascripts/ace/mode-lua.js +274 -368
  77. data/vendor/assets/javascripts/ace/mode-luapage.js +1331 -1107
  78. data/vendor/assets/javascripts/ace/mode-lucene.js +64 -0
  79. data/vendor/assets/javascripts/ace/mode-makefile.js +332 -0
  80. data/vendor/assets/javascripts/ace/mode-markdown.js +1303 -948
  81. data/vendor/assets/javascripts/ace/mode-matlab.js +230 -0
  82. data/vendor/assets/javascripts/ace/mode-mushcode.js +705 -0
  83. data/vendor/assets/javascripts/ace/mode-mushcode_high_rules.js +569 -0
  84. data/vendor/assets/javascripts/ace/mode-mysql.js +185 -0
  85. data/vendor/assets/javascripts/ace/mode-nix.js +935 -0
  86. data/vendor/assets/javascripts/ace/mode-objectivec.js +699 -0
  87. data/vendor/assets/javascripts/ace/mode-ocaml.js +44 -63
  88. data/vendor/assets/javascripts/ace/mode-pascal.js +233 -0
  89. data/vendor/assets/javascripts/ace/mode-perl.js +116 -189
  90. data/vendor/assets/javascripts/ace/mode-pgsql.js +886 -500
  91. data/vendor/assets/javascripts/ace/mode-php.js +1158 -380
  92. data/vendor/assets/javascripts/ace/mode-plain_text.js +56 -0
  93. data/vendor/assets/javascripts/ace/mode-powershell.js +222 -167
  94. data/vendor/assets/javascripts/ace/mode-prolog.js +354 -0
  95. data/vendor/assets/javascripts/ace/mode-properties.js +100 -0
  96. data/vendor/assets/javascripts/ace/mode-protobuf.js +885 -0
  97. data/vendor/assets/javascripts/ace/mode-python.js +99 -201
  98. data/vendor/assets/javascripts/ace/mode-r.js +337 -0
  99. data/vendor/assets/javascripts/ace/mode-rdoc.js +210 -0
  100. data/vendor/assets/javascripts/ace/mode-rhtml.js +2663 -0
  101. data/vendor/assets/javascripts/ace/mode-ruby.js +262 -136
  102. data/vendor/assets/javascripts/ace/mode-rust.js +245 -0
  103. data/vendor/assets/javascripts/ace/mode-sass.js +443 -0
  104. data/vendor/assets/javascripts/ace/mode-scad.js +225 -240
  105. data/vendor/assets/javascripts/ace/mode-scala.js +340 -494
  106. data/vendor/assets/javascripts/ace/mode-scheme.js +143 -0
  107. data/vendor/assets/javascripts/ace/mode-scss.js +499 -157
  108. data/vendor/assets/javascripts/ace/mode-sh.js +180 -110
  109. data/vendor/assets/javascripts/ace/mode-sjs.js +1154 -0
  110. data/vendor/assets/javascripts/ace/mode-snippets.js +198 -0
  111. data/vendor/assets/javascripts/ace/mode-soy_template.js +2707 -0
  112. data/vendor/assets/javascripts/ace/mode-space.js +160 -0
  113. data/vendor/assets/javascripts/ace/mode-sql.js +48 -69
  114. data/vendor/assets/javascripts/ace/mode-stylus.js +447 -0
  115. data/vendor/assets/javascripts/ace/mode-svg.js +552 -605
  116. data/vendor/assets/javascripts/ace/mode-tcl.js +139 -98
  117. data/vendor/assets/javascripts/ace/mode-tex.js +187 -0
  118. data/vendor/assets/javascripts/ace/mode-textile.js +29 -40
  119. data/vendor/assets/javascripts/ace/mode-tmsnippet.js +200 -0
  120. data/vendor/assets/javascripts/ace/mode-toml.js +177 -0
  121. data/vendor/assets/javascripts/ace/mode-twig.js +2228 -0
  122. data/vendor/assets/javascripts/ace/mode-typescript.js +1018 -0
  123. data/vendor/assets/javascripts/ace/mode-vbscript.js +250 -0
  124. data/vendor/assets/javascripts/ace/mode-velocity.js +1621 -0
  125. data/vendor/assets/javascripts/ace/mode-verilog.js +127 -0
  126. data/vendor/assets/javascripts/ace/mode-vhdl.js +139 -0
  127. data/vendor/assets/javascripts/ace/mode-xml.js +350 -242
  128. data/vendor/assets/javascripts/ace/mode-xquery.js +2490 -300
  129. data/vendor/assets/javascripts/ace/mode-yaml.js +146 -45
  130. data/vendor/assets/javascripts/ace/theme-ambiance.js +202 -0
  131. data/vendor/assets/javascripts/ace/theme-chaos.js +179 -0
  132. data/vendor/assets/javascripts/ace/theme-chrome.js +97 -153
  133. data/vendor/assets/javascripts/ace/theme-clouds.js +78 -119
  134. data/vendor/assets/javascripts/ace/theme-clouds_midnight.js +79 -120
  135. data/vendor/assets/javascripts/ace/theme-cobalt.js +89 -140
  136. data/vendor/assets/javascripts/ace/theme-crimson_editor.js +93 -145
  137. data/vendor/assets/javascripts/ace/theme-dawn.js +84 -143
  138. data/vendor/assets/javascripts/ace/theme-dreamweaver.js +99 -162
  139. data/vendor/assets/javascripts/ace/theme-eclipse.js +78 -111
  140. data/vendor/assets/javascripts/ace/theme-github.js +70 -121
  141. data/vendor/assets/javascripts/ace/theme-idle_fingers.js +75 -134
  142. data/vendor/assets/javascripts/ace/theme-kr.js +135 -0
  143. data/vendor/assets/javascripts/ace/theme-merbivore.js +80 -143
  144. data/vendor/assets/javascripts/ace/theme-merbivore_soft.js +81 -149
  145. data/vendor/assets/javascripts/ace/theme-mono_industrial.js +87 -146
  146. data/vendor/assets/javascripts/ace/theme-monokai.js +88 -146
  147. data/vendor/assets/javascripts/ace/theme-pastel_on_dark.js +82 -142
  148. data/vendor/assets/javascripts/ace/theme-solarized_dark.js +83 -144
  149. data/vendor/assets/javascripts/ace/theme-solarized_light.js +76 -133
  150. data/vendor/assets/javascripts/ace/theme-terminal.js +145 -0
  151. data/vendor/assets/javascripts/ace/theme-textmate.js +101 -158
  152. data/vendor/assets/javascripts/ace/theme-tomorrow.js +89 -163
  153. data/vendor/assets/javascripts/ace/theme-tomorrow_night.js +89 -163
  154. data/vendor/assets/javascripts/ace/theme-tomorrow_night_blue.js +89 -165
  155. data/vendor/assets/javascripts/ace/theme-tomorrow_night_bright.js +101 -162
  156. data/vendor/assets/javascripts/ace/theme-tomorrow_night_eighties.js +90 -160
  157. data/vendor/assets/javascripts/ace/theme-twilight.js +87 -158
  158. data/vendor/assets/javascripts/ace/theme-vibrant_ink.js +75 -140
  159. data/vendor/assets/javascripts/ace/theme-xcode.js +120 -0
  160. data/vendor/assets/javascripts/ace/worker-coffee.js +3049 -2665
  161. data/vendor/assets/javascripts/ace/worker-css.js +1779 -4376
  162. data/vendor/assets/javascripts/ace/worker-javascript.js +8701 -9008
  163. data/vendor/assets/javascripts/ace/worker-json.js +709 -1340
  164. data/vendor/assets/javascripts/ace/worker-lua.js +3525 -0
  165. data/vendor/assets/javascripts/ace/worker-php.js +6893 -0
  166. data/vendor/assets/javascripts/ace/worker-xquery.js +19924 -64507
  167. metadata +100 -17
@@ -8,10 +8,9 @@ var Tokenizer = require("../tokenizer").Tokenizer;
8
8
  var LuaPageHighlightRules = require("./luapage_highlight_rules").LuaPageHighlightRules;
9
9
 
10
10
  var Mode = function() {
11
- var highlighter = new LuaPageHighlightRules();
11
+ this.HighlightRules = LuaPageHighlightRules;
12
12
 
13
- this.$tokenizer = new Tokenizer(new LuaPageHighlightRules().getRules());
14
- this.$embeds = highlighter.getEmbeds();
13
+ this.HighlightRules = LuaPageHighlightRules;
15
14
  this.createModeDelegates({
16
15
  "lua-": LuaMode
17
16
  });
@@ -21,7 +20,7 @@ oop.inherits(Mode, HtmlMode);
21
20
  exports.Mode = Mode;
22
21
  });
23
22
 
24
- define('ace/mode/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/javascript', 'ace/mode/css', 'ace/tokenizer', 'ace/mode/html_highlight_rules', 'ace/mode/behaviour/html', 'ace/mode/folding/html'], function(require, exports, module) {
23
+ define('ace/mode/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/javascript', 'ace/mode/css', 'ace/tokenizer', 'ace/mode/html_highlight_rules', 'ace/mode/behaviour/html', 'ace/mode/folding/html', 'ace/mode/html_completions'], function(require, exports, module) {
25
24
 
26
25
 
27
26
  var oop = require("../lib/oop");
@@ -32,13 +31,13 @@ var Tokenizer = require("../tokenizer").Tokenizer;
32
31
  var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules;
33
32
  var HtmlBehaviour = require("./behaviour/html").HtmlBehaviour;
34
33
  var HtmlFoldMode = require("./folding/html").FoldMode;
34
+ var HtmlCompletions = require("./html_completions").HtmlCompletions;
35
35
 
36
36
  var Mode = function() {
37
- var highlighter = new HtmlHighlightRules();
38
- this.$tokenizer = new Tokenizer(highlighter.getRules());
37
+ this.HighlightRules = HtmlHighlightRules;
39
38
  this.$behaviour = new HtmlBehaviour();
39
+ this.$completer = new HtmlCompletions();
40
40
 
41
- this.$embeds = highlighter.getEmbeds();
42
41
  this.createModeDelegates({
43
42
  "js-": JavaScriptMode,
44
43
  "css-": CssMode
@@ -50,10 +49,7 @@ oop.inherits(Mode, TextMode);
50
49
 
51
50
  (function() {
52
51
 
53
-
54
- this.toggleCommentLines = function(state, doc, startRow, endRow) {
55
- return 0;
56
- };
52
+ this.blockComment = {start: "<!--", end: "-->"};
57
53
 
58
54
  this.getNextLineIndent = function(state, line, tab) {
59
55
  return this.$getIndent(line);
@@ -63,6 +59,11 @@ oop.inherits(Mode, TextMode);
63
59
  return false;
64
60
  };
65
61
 
62
+ this.getCompletions = function(state, session, pos, prefix) {
63
+ return this.$completer.getCompletions(state, session, pos, prefix);
64
+ };
65
+
66
+ this.$id = "ace/mode/html";
66
67
  }).call(Mode.prototype);
67
68
 
68
69
  exports.Mode = Mode;
@@ -82,7 +83,8 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;
82
83
  var CStyleFoldMode = require("./folding/cstyle").FoldMode;
83
84
 
84
85
  var Mode = function() {
85
- this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());
86
+ this.HighlightRules = JavaScriptHighlightRules;
87
+
86
88
  this.$outdent = new MatchingBraceOutdent();
87
89
  this.$behaviour = new CstyleBehaviour();
88
90
  this.foldingRules = new CStyleFoldMode();
@@ -91,53 +93,27 @@ oop.inherits(Mode, TextMode);
91
93
 
92
94
  (function() {
93
95
 
94
-
95
- this.toggleCommentLines = function(state, doc, startRow, endRow) {
96
- var outdent = true;
97
- var re = /^(\s*)\/\//;
98
-
99
- for (var i=startRow; i<= endRow; i++) {
100
- if (!re.test(doc.getLine(i))) {
101
- outdent = false;
102
- break;
103
- }
104
- }
105
-
106
- if (outdent) {
107
- var deleteRange = new Range(0, 0, 0, 0);
108
- for (var i=startRow; i<= endRow; i++)
109
- {
110
- var line = doc.getLine(i);
111
- var m = line.match(re);
112
- deleteRange.start.row = i;
113
- deleteRange.end.row = i;
114
- deleteRange.end.column = m[0].length;
115
- doc.replace(deleteRange, m[1]);
116
- }
117
- }
118
- else {
119
- doc.indentRows(startRow, endRow, "//");
120
- }
121
- };
96
+ this.lineCommentStart = "//";
97
+ this.blockComment = {start: "/*", end: "*/"};
122
98
 
123
99
  this.getNextLineIndent = function(state, line, tab) {
124
100
  var indent = this.$getIndent(line);
125
101
 
126
- var tokenizedLine = this.$tokenizer.getLineTokens(line, state);
102
+ var tokenizedLine = this.getTokenizer().getLineTokens(line, state);
127
103
  var tokens = tokenizedLine.tokens;
128
104
  var endState = tokenizedLine.state;
129
105
 
130
106
  if (tokens.length && tokens[tokens.length-1].type == "comment") {
131
107
  return indent;
132
108
  }
133
-
134
- if (state == "start" || state == "regex_allowed") {
109
+
110
+ if (state == "start" || state == "no_regex") {
135
111
  var match = line.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/);
136
112
  if (match) {
137
113
  indent += tab;
138
114
  }
139
115
  } else if (state == "doc-start") {
140
- if (endState == "start" || state == "regex_allowed") {
116
+ if (endState == "start" || endState == "no_regex") {
141
117
  return "";
142
118
  }
143
119
  var match = line.match(/^\s*(\/?)\*/);
@@ -159,105 +135,64 @@ oop.inherits(Mode, TextMode);
159
135
  this.autoOutdent = function(state, doc, row) {
160
136
  this.$outdent.autoOutdent(doc, row);
161
137
  };
162
-
138
+
163
139
  this.createWorker = function(session) {
164
140
  var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker");
165
141
  worker.attachToDocument(session.getDocument());
166
-
142
+
167
143
  worker.on("jslint", function(results) {
168
- var errors = [];
169
- for (var i=0; i<results.data.length; i++) {
170
- var error = results.data[i];
171
- if (error)
172
- errors.push({
173
- row: error.line-1,
174
- column: error.character-1,
175
- text: error.reason,
176
- type: "warning",
177
- lint: error
178
- });
179
- }
180
- session.setAnnotations(errors);
181
- });
182
-
183
- worker.on("narcissus", function(e) {
184
- session.setAnnotations([e.data]);
144
+ session.setAnnotations(results.data);
185
145
  });
186
-
146
+
187
147
  worker.on("terminate", function() {
188
148
  session.clearAnnotations();
189
149
  });
190
-
150
+
191
151
  return worker;
192
152
  };
193
153
 
154
+ this.$id = "ace/mode/javascript";
194
155
  }).call(Mode.prototype);
195
156
 
196
157
  exports.Mode = Mode;
197
158
  });
198
159
 
199
- define('ace/mode/javascript_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/unicode', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
160
+ define('ace/mode/javascript_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
200
161
 
201
162
 
202
163
  var oop = require("../lib/oop");
203
- var lang = require("../lib/lang");
204
- var unicode = require("../unicode");
205
164
  var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules;
206
165
  var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
207
166
 
208
167
  var JavaScriptHighlightRules = function() {
209
-
210
- // see: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects
211
- var globals = lang.arrayToMap(
212
- // Constructors
213
- ("Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" +
214
- // E4X
215
- "Namespace|QName|XML|XMLList|" +
216
- "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" +
217
- "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" +
218
- // Errors
219
- "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" +
220
- "SyntaxError|TypeError|URIError|" +
221
- // Non-constructor functions
222
- "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" +
223
- "isNaN|parseFloat|parseInt|" +
224
- // Other
225
- "JSON|Math|" +
226
- // Pseudo
227
- "this|arguments|prototype|window|document"
228
- ).split("|")
229
- );
230
-
231
- var keywords = lang.arrayToMap(
232
- ("break|case|catch|continue|default|delete|do|else|finally|for|function|" +
233
- "if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|" +
234
- "const|yield|import|get|set").split("|")
235
- );
236
-
237
- // keywords which can be followed by regular expressions
238
- var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield";
239
-
240
- var deprecated = lang.arrayToMap(
241
- ("__parent__|__count__|escape|unescape|with|__proto__").split("|")
242
- );
243
-
244
- var definitions = lang.arrayToMap(("const|let|var|function").split("|"));
245
-
246
- var buildinConstants = lang.arrayToMap(
247
- ("null|Infinity|NaN|undefined").split("|")
248
- );
249
-
250
- var futureReserved = lang.arrayToMap(
251
- ("class|enum|extends|super|export|implements|private|" +
252
- "public|interface|package|protected|static").split("|")
253
- );
254
-
255
- // TODO: Unicode escape sequences
256
- var identifierRe = "[" + unicode.packages.L + "\\$_]["
257
- + unicode.packages.L
258
- + unicode.packages.Mn + unicode.packages.Mc
259
- + unicode.packages.Nd
260
- + unicode.packages.Pc + "\\$_]*\\b";
168
+ var keywordMapper = this.createKeywordMapper({
169
+ "variable.language":
170
+ "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors
171
+ "Namespace|QName|XML|XMLList|" + // E4X
172
+ "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" +
173
+ "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" +
174
+ "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors
175
+ "SyntaxError|TypeError|URIError|" +
176
+ "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions
177
+ "isNaN|parseFloat|parseInt|" +
178
+ "JSON|Math|" + // Other
179
+ "this|arguments|prototype|window|document" , // Pseudo
180
+ "keyword":
181
+ "const|yield|import|get|set|" +
182
+ "break|case|catch|continue|default|delete|do|else|finally|for|function|" +
183
+ "if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" +
184
+ "__parent__|__count__|escape|unescape|with|__proto__|" +
185
+ "class|enum|extends|super|export|implements|private|public|interface|package|protected|static",
186
+ "storage.type":
187
+ "const|let|var|function",
188
+ "constant.language":
189
+ "null|Infinity|NaN|undefined",
190
+ "support.function":
191
+ "alert",
192
+ "constant.language.boolean": "true|false"
193
+ }, "identifier");
194
+ var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void";
195
+ var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b";
261
196
 
262
197
  var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex
263
198
  "u[0-9a-fA-F]{4}|" + // unicode
@@ -267,19 +202,16 @@ var JavaScriptHighlightRules = function() {
267
202
  "[4-7][0-7]?|" + //oct
268
203
  ".)";
269
204
 
270
- // regexp must not have capturing parentheses. Use (?:) instead.
271
- // regexps are ordered -> the first match is used
272
-
273
205
  this.$rules = {
274
- "start" : [
206
+ "no_regex" : [
275
207
  {
276
208
  token : "comment",
277
- regex : /\/\/.*$/
209
+ regex : "\\/\\/",
210
+ next : "line_comment"
278
211
  },
279
212
  DocCommentHighlightRules.getStartRule("doc-start"),
280
213
  {
281
214
  token : "comment", // multi line comment
282
- merge : true,
283
215
  regex : /\/\*/,
284
216
  next : "comment"
285
217
  }, {
@@ -296,119 +228,61 @@ var JavaScriptHighlightRules = function() {
296
228
  }, {
297
229
  token : "constant.numeric", // float
298
230
  regex : /[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/
299
- }, { // match stuff like: Sound.prototype.play = function() { }
300
- token : [
301
- "storage.type",
302
- "punctuation.operator",
303
- "support.function",
304
- "punctuation.operator",
305
- "entity.name.function",
306
- "text",
307
- "keyword.operator",
308
- "text",
309
- "storage.type",
310
- "text",
311
- "paren.lparen"
312
- ],
313
- regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",
314
- next: "function_arguments"
315
- }, { // match stuff like: Sound.prototype.play = myfunc
231
+ }, {
316
232
  token : [
317
- "storage.type",
318
- "punctuation.operator",
319
- "support.function",
320
- "punctuation.operator",
321
- "entity.name.function",
322
- "text",
323
- "keyword.operator",
324
- "text"
233
+ "storage.type", "punctuation.operator", "support.function",
234
+ "punctuation.operator", "entity.name.function", "text","keyword.operator"
325
235
  ],
326
- regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)",
236
+ regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)",
327
237
  next: "function_arguments"
328
- }, { // match stuff like: Sound.play = function() { }
238
+ }, {
329
239
  token : [
330
- "storage.type",
331
- "punctuation.operator",
332
- "entity.name.function",
333
- "text",
334
- "keyword.operator",
335
- "text",
336
- "storage.type",
337
- "text",
338
- "paren.lparen"
240
+ "storage.type", "punctuation.operator", "entity.name.function", "text",
241
+ "keyword.operator", "text", "storage.type", "text", "paren.lparen"
339
242
  ],
340
243
  regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",
341
244
  next: "function_arguments"
342
- }, { // match stuff like: play = function() { }
245
+ }, {
343
246
  token : [
344
- "entity.name.function",
345
- "text",
346
- "keyword.operator",
347
- "text",
348
- "storage.type",
349
- "text",
350
- "paren.lparen"
247
+ "entity.name.function", "text", "keyword.operator", "text", "storage.type",
248
+ "text", "paren.lparen"
351
249
  ],
352
250
  regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",
353
251
  next: "function_arguments"
354
- }, { // match stuff like: Sound.play = function play() { }
252
+ }, {
355
253
  token : [
356
- "storage.type",
357
- "punctuation.operator",
358
- "entity.name.function",
359
- "text",
360
- "keyword.operator",
361
- "text",
362
- "storage.type",
363
- "text",
364
- "entity.name.function",
365
- "text",
366
- "paren.lparen"
254
+ "storage.type", "punctuation.operator", "entity.name.function", "text",
255
+ "keyword.operator", "text",
256
+ "storage.type", "text", "entity.name.function", "text", "paren.lparen"
367
257
  ],
368
258
  regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()",
369
259
  next: "function_arguments"
370
- }, { // match regular function like: function myFunc(arg) { }
260
+ }, {
371
261
  token : [
372
- "storage.type",
373
- "text",
374
- "entity.name.function",
375
- "text",
376
- "paren.lparen"
262
+ "storage.type", "text", "entity.name.function", "text", "paren.lparen"
377
263
  ],
378
264
  regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()",
379
265
  next: "function_arguments"
380
- }, { // match stuff like: foobar: function() { }
266
+ }, {
381
267
  token : [
382
- "entity.name.function",
383
- "text",
384
- "punctuation.operator",
385
- "text",
386
- "storage.type",
387
- "text",
388
- "paren.lparen"
268
+ "entity.name.function", "text", "punctuation.operator",
269
+ "text", "storage.type", "text", "paren.lparen"
389
270
  ],
390
271
  regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()",
391
272
  next: "function_arguments"
392
- }, { // Attempt to match : function() { } (this is for issues with 'foo': function() { })
273
+ }, {
393
274
  token : [
394
- "text",
395
- "text",
396
- "storage.type",
397
- "text",
398
- "paren.lparen"
275
+ "text", "text", "storage.type", "text", "paren.lparen"
399
276
  ],
400
277
  regex : "(:)(\\s*)(function)(\\s*)(\\()",
401
278
  next: "function_arguments"
402
- }, {
403
- token : "constant.language.boolean",
404
- regex : /(?:true|false)\b/
405
279
  }, {
406
280
  token : "keyword",
407
281
  regex : "(?:" + kwBeforeRe + ")\\b",
408
- next : "regex_allowed"
282
+ next : "start"
409
283
  }, {
410
284
  token : ["punctuation.operator", "support.function"],
411
- regex : /(\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/
285
+ regex : /(\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/
412
286
  }, {
413
287
  token : ["punctuation.operator", "support.function.dom"],
414
288
  regex : /(\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/
@@ -419,78 +293,54 @@ var JavaScriptHighlightRules = function() {
419
293
  token : ["storage.type", "punctuation.operator", "support.function.firebug"],
420
294
  regex : /(console)(\.)(warn|info|log|error|time|timeEnd|assert)\b/
421
295
  }, {
422
- token : function(value) {
423
- if (globals.hasOwnProperty(value))
424
- return "variable.language";
425
- else if (deprecated.hasOwnProperty(value))
426
- return "invalid.deprecated";
427
- else if (definitions.hasOwnProperty(value))
428
- return "storage.type";
429
- else if (keywords.hasOwnProperty(value))
430
- return "keyword";
431
- else if (buildinConstants.hasOwnProperty(value))
432
- return "constant.language";
433
- else if (futureReserved.hasOwnProperty(value))
434
- return "invalid.illegal";
435
- else if (value == "debugger")
436
- return "invalid.deprecated";
437
- else
438
- return "identifier";
439
- },
296
+ token : keywordMapper,
440
297
  regex : identifierRe
441
298
  }, {
442
299
  token : "keyword.operator",
443
- regex : /!|\$|%|&|\*|\-\-|\-|\+\+|\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?\:|\*=|%=|\+=|\-=|&=|\^=|\b(?:in|instanceof|new|delete|typeof|void)/,
444
- next : "regex_allowed"
300
+ regex : /--|\+\+|[!$%&*+\-~]|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?\:|\*=|%=|\+=|\-=|&=|\^=/,
301
+ next : "start"
445
302
  }, {
446
303
  token : "punctuation.operator",
447
304
  regex : /\?|\:|\,|\;|\./,
448
- next : "regex_allowed"
305
+ next : "start"
449
306
  }, {
450
307
  token : "paren.lparen",
451
308
  regex : /[\[({]/,
452
- next : "regex_allowed"
309
+ next : "start"
453
310
  }, {
454
311
  token : "paren.rparen",
455
312
  regex : /[\])}]/
456
313
  }, {
457
314
  token : "keyword.operator",
458
315
  regex : /\/=?/,
459
- next : "regex_allowed"
316
+ next : "start"
460
317
  }, {
461
318
  token: "comment",
462
319
  regex: /^#!.*$/
463
- }, {
464
- token : "text",
465
- regex : /\s+/
466
320
  }
467
321
  ],
468
- // regular expressions are only allowed after certain tokens. This
469
- // makes sure we don't mix up regexps with the divison operator
470
- "regex_allowed": [
322
+ "start": [
471
323
  DocCommentHighlightRules.getStartRule("doc-start"),
472
324
  {
473
325
  token : "comment", // multi line comment
474
- merge : true,
475
326
  regex : "\\/\\*",
476
327
  next : "comment_regex_allowed"
477
328
  }, {
478
329
  token : "comment",
479
- regex : "\\/\\/.*$"
330
+ regex : "\\/\\/",
331
+ next : "line_comment_regex_allowed"
480
332
  }, {
481
333
  token: "string.regexp",
482
334
  regex: "\\/",
483
- next: "regex",
484
- merge: true
335
+ next: "regex"
485
336
  }, {
486
337
  token : "text",
487
- regex : "\\s+"
338
+ regex : "\\s+|^$",
339
+ next : "start"
488
340
  }, {
489
- // immediately return to the start mode without matching
490
- // anything
491
341
  token: "empty",
492
342
  regex: "",
493
- next: "start"
343
+ next: "no_regex"
494
344
  }
495
345
  ],
496
346
  "regex": [
@@ -498,24 +348,28 @@ var JavaScriptHighlightRules = function() {
498
348
  token: "regexp.keyword.operator",
499
349
  regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"
500
350
  }, {
501
- // flag
502
351
  token: "string.regexp",
503
- regex: "/\\w*",
504
- next: "start",
505
- merge: true
352
+ regex: "/[sxngimy]*",
353
+ next: "no_regex"
506
354
  }, {
507
- token: "string.regexp",
508
- regex: "[^\\\\/\\[]+",
509
- merge: true
355
+ token : "invalid",
356
+ regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/
357
+ }, {
358
+ token : "constant.language.escape",
359
+ regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/
360
+ }, {
361
+ token : "constant.language.delimiter",
362
+ regex: /\|/
510
363
  }, {
511
- token: "string.regexp.charachterclass",
512
- regex: "\\[",
513
- next: "regex_character_class",
514
- merge: true
364
+ token: "constant.language.escape",
365
+ regex: /\[\^?/,
366
+ next: "regex_character_class"
515
367
  }, {
516
368
  token: "empty",
517
- regex: "",
518
- next: "start"
369
+ regex: "$",
370
+ next: "no_regex"
371
+ }, {
372
+ defaultToken: "string.regexp"
519
373
  }
520
374
  ],
521
375
  "regex_character_class": [
@@ -523,18 +377,18 @@ var JavaScriptHighlightRules = function() {
523
377
  token: "regexp.keyword.operator",
524
378
  regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"
525
379
  }, {
526
- token: "string.regexp.charachterclass",
380
+ token: "constant.language.escape",
527
381
  regex: "]",
528
- next: "regex",
529
- merge: true
382
+ next: "regex"
530
383
  }, {
531
- token: "string.regexp.charachterclass",
532
- regex: "[^\\\\\\]]+",
533
- merge: true
384
+ token: "constant.language.escape",
385
+ regex: "-"
534
386
  }, {
535
387
  token: "empty",
536
- regex: "",
537
- next: "start"
388
+ regex: "$",
389
+ next: "no_regex"
390
+ }, {
391
+ defaultToken: "string.regexp.charachterclass"
538
392
  }
539
393
  ],
540
394
  "function_arguments": [
@@ -543,86 +397,68 @@ var JavaScriptHighlightRules = function() {
543
397
  regex: identifierRe
544
398
  }, {
545
399
  token: "punctuation.operator",
546
- regex: "[, ]+",
547
- merge: true
400
+ regex: "[, ]+"
548
401
  }, {
549
402
  token: "punctuation.operator",
550
- regex: "$",
551
- merge: true
403
+ regex: "$"
552
404
  }, {
553
405
  token: "empty",
554
406
  regex: "",
555
- next: "start"
407
+ next: "no_regex"
556
408
  }
557
409
  ],
558
410
  "comment_regex_allowed" : [
559
- {
560
- token : "comment", // closing comment
561
- regex : ".*?\\*\\/",
562
- merge : true,
563
- next : "regex_allowed"
564
- }, {
565
- token : "comment", // comment spanning whole line
566
- merge : true,
567
- regex : ".+"
568
- }
411
+ {token : "comment", regex : "\\*\\/", next : "start"},
412
+ {defaultToken : "comment"}
569
413
  ],
570
414
  "comment" : [
571
- {
572
- token : "comment", // closing comment
573
- regex : ".*?\\*\\/",
574
- merge : true,
575
- next : "start"
576
- }, {
577
- token : "comment", // comment spanning whole line
578
- merge : true,
579
- regex : ".+"
580
- }
415
+ {token : "comment", regex : "\\*\\/", next : "no_regex"},
416
+ {defaultToken : "comment"}
417
+ ],
418
+ "line_comment_regex_allowed" : [
419
+ {token : "comment", regex : "$|^", next : "start"},
420
+ {defaultToken : "comment"}
421
+ ],
422
+ "line_comment" : [
423
+ {token : "comment", regex : "$|^", next : "no_regex"},
424
+ {defaultToken : "comment"}
581
425
  ],
582
426
  "qqstring" : [
583
427
  {
584
428
  token : "constant.language.escape",
585
429
  regex : escapedRe
586
- }, {
587
- token : "string",
588
- regex : '[^"\\\\]+',
589
- merge : true
590
430
  }, {
591
431
  token : "string",
592
432
  regex : "\\\\$",
593
- next : "qqstring",
594
- merge : true
433
+ next : "qqstring"
595
434
  }, {
596
435
  token : "string",
597
436
  regex : '"|$',
598
- next : "start",
599
- merge : true
437
+ next : "no_regex"
438
+ }, {
439
+ defaultToken: "string"
600
440
  }
601
441
  ],
602
442
  "qstring" : [
603
443
  {
604
444
  token : "constant.language.escape",
605
445
  regex : escapedRe
606
- }, {
607
- token : "string",
608
- regex : "[^'\\\\]+",
609
- merge : true
610
446
  }, {
611
447
  token : "string",
612
448
  regex : "\\\\$",
613
- next : "qstring",
614
- merge : true
449
+ next : "qstring"
615
450
  }, {
616
451
  token : "string",
617
452
  regex : "'|$",
618
- next : "start",
619
- merge : true
453
+ next : "no_regex"
454
+ }, {
455
+ defaultToken: "string"
620
456
  }
621
457
  ]
622
458
  };
623
459
 
624
460
  this.embedRules(DocCommentHighlightRules, "doc-",
625
- [ DocCommentHighlightRules.getEndRule("start") ]);
461
+ [ DocCommentHighlightRules.getEndRule("no_regex") ]);
626
462
  };
627
463
 
628
464
  oop.inherits(JavaScriptHighlightRules, TextHighlightRules);
@@ -643,21 +479,10 @@ var DocCommentHighlightRules = function() {
643
479
  token : "comment.doc.tag",
644
480
  regex : "@[\\w\\d_]+" // TODO: fix email addresses
645
481
  }, {
646
- token : "comment.doc",
647
- merge : true,
648
- regex : "\\s+"
649
- }, {
650
- token : "comment.doc",
651
- merge : true,
652
- regex : "TODO"
653
- }, {
654
- token : "comment.doc",
655
- merge : true,
656
- regex : "[^@\\*]+"
482
+ token : "comment.doc.tag",
483
+ regex : "\\bTODO\\b"
657
484
  }, {
658
- token : "comment.doc",
659
- merge : true,
660
- regex : "."
485
+ defaultToken : "comment.doc"
661
486
  }]
662
487
  };
663
488
  };
@@ -667,7 +492,6 @@ oop.inherits(DocCommentHighlightRules, TextHighlightRules);
667
492
  DocCommentHighlightRules.getStartRule = function(start) {
668
493
  return {
669
494
  token : "comment.doc", // doc comment
670
- merge : true,
671
495
  regex : "\\/\\*(?=\\*)",
672
496
  next : start
673
497
  };
@@ -676,7 +500,6 @@ DocCommentHighlightRules.getStartRule = function(start) {
676
500
  DocCommentHighlightRules.getEndRule = function (start) {
677
501
  return {
678
502
  token : "comment.doc", // closing comment
679
- merge : true,
680
503
  regex : "\\*\\/",
681
504
  next : start
682
505
  };
@@ -719,12 +542,7 @@ var MatchingBraceOutdent = function() {};
719
542
  };
720
543
 
721
544
  this.$getIndent = function(line) {
722
- var match = line.match(/^(\s+)/);
723
- if (match) {
724
- return match[1];
725
- }
726
-
727
- return "";
545
+ return line.match(/^\s*/)[0];
728
546
  };
729
547
 
730
548
  }).call(MatchingBraceOutdent.prototype);
@@ -732,59 +550,155 @@ var MatchingBraceOutdent = function() {};
732
550
  exports.MatchingBraceOutdent = MatchingBraceOutdent;
733
551
  });
734
552
 
735
- define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour'], function(require, exports, module) {
553
+ define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) {
736
554
 
737
555
 
738
556
  var oop = require("../../lib/oop");
739
557
  var Behaviour = require("../behaviour").Behaviour;
558
+ var TokenIterator = require("../../token_iterator").TokenIterator;
559
+ var lang = require("../../lib/lang");
560
+
561
+ var SAFE_INSERT_IN_TOKENS =
562
+ ["text", "paren.rparen", "punctuation.operator"];
563
+ var SAFE_INSERT_BEFORE_TOKENS =
564
+ ["text", "paren.rparen", "punctuation.operator", "comment"];
565
+
566
+
567
+ var autoInsertedBrackets = 0;
568
+ var autoInsertedRow = -1;
569
+ var autoInsertedLineEnd = "";
570
+ var maybeInsertedBrackets = 0;
571
+ var maybeInsertedRow = -1;
572
+ var maybeInsertedLineStart = "";
573
+ var maybeInsertedLineEnd = "";
740
574
 
741
575
  var CstyleBehaviour = function () {
576
+
577
+ CstyleBehaviour.isSaneInsertion = function(editor, session) {
578
+ var cursor = editor.getCursorPosition();
579
+ var iterator = new TokenIterator(session, cursor.row, cursor.column);
580
+ if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) {
581
+ var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);
582
+ if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS))
583
+ return false;
584
+ }
585
+ iterator.stepForward();
586
+ return iterator.getCurrentTokenRow() !== cursor.row ||
587
+ this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS);
588
+ };
589
+
590
+ CstyleBehaviour.$matchTokenType = function(token, types) {
591
+ return types.indexOf(token.type || token) > -1;
592
+ };
593
+
594
+ CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {
595
+ var cursor = editor.getCursorPosition();
596
+ var line = session.doc.getLine(cursor.row);
597
+ if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0]))
598
+ autoInsertedBrackets = 0;
599
+ autoInsertedRow = cursor.row;
600
+ autoInsertedLineEnd = bracket + line.substr(cursor.column);
601
+ autoInsertedBrackets++;
602
+ };
603
+
604
+ CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {
605
+ var cursor = editor.getCursorPosition();
606
+ var line = session.doc.getLine(cursor.row);
607
+ if (!this.isMaybeInsertedClosing(cursor, line))
608
+ maybeInsertedBrackets = 0;
609
+ maybeInsertedRow = cursor.row;
610
+ maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;
611
+ maybeInsertedLineEnd = line.substr(cursor.column);
612
+ maybeInsertedBrackets++;
613
+ };
614
+
615
+ CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {
616
+ return autoInsertedBrackets > 0 &&
617
+ cursor.row === autoInsertedRow &&
618
+ bracket === autoInsertedLineEnd[0] &&
619
+ line.substr(cursor.column) === autoInsertedLineEnd;
620
+ };
621
+
622
+ CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {
623
+ return maybeInsertedBrackets > 0 &&
624
+ cursor.row === maybeInsertedRow &&
625
+ line.substr(cursor.column) === maybeInsertedLineEnd &&
626
+ line.substr(0, cursor.column) == maybeInsertedLineStart;
627
+ };
628
+
629
+ CstyleBehaviour.popAutoInsertedClosing = function() {
630
+ autoInsertedLineEnd = autoInsertedLineEnd.substr(1);
631
+ autoInsertedBrackets--;
632
+ };
633
+
634
+ CstyleBehaviour.clearMaybeInsertedClosing = function() {
635
+ maybeInsertedBrackets = 0;
636
+ maybeInsertedRow = -1;
637
+ };
742
638
 
743
639
  this.add("braces", "insertion", function (state, action, editor, session, text) {
640
+ var cursor = editor.getCursorPosition();
641
+ var line = session.doc.getLine(cursor.row);
744
642
  if (text == '{') {
745
643
  var selection = editor.getSelectionRange();
746
644
  var selected = session.doc.getTextRange(selection);
747
- if (selected !== "") {
645
+ if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) {
748
646
  return {
749
647
  text: '{' + selected + '}',
750
648
  selection: false
751
649
  };
752
- } else {
753
- return {
754
- text: '{}',
755
- selection: [1, 1]
756
- };
650
+ } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {
651
+ if (/[\]\}\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {
652
+ CstyleBehaviour.recordAutoInsert(editor, session, "}");
653
+ return {
654
+ text: '{}',
655
+ selection: [1, 1]
656
+ };
657
+ } else {
658
+ CstyleBehaviour.recordMaybeInsert(editor, session, "{");
659
+ return {
660
+ text: '{',
661
+ selection: [1, 1]
662
+ };
663
+ }
757
664
  }
758
665
  } else if (text == '}') {
759
- var cursor = editor.getCursorPosition();
760
- var line = session.doc.getLine(cursor.row);
761
666
  var rightChar = line.substring(cursor.column, cursor.column + 1);
762
667
  if (rightChar == '}') {
763
668
  var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});
764
- if (matching !== null) {
669
+ if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {
670
+ CstyleBehaviour.popAutoInsertedClosing();
765
671
  return {
766
672
  text: '',
767
673
  selection: [1, 1]
768
674
  };
769
675
  }
770
676
  }
771
- } else if (text == "\n") {
772
- var cursor = editor.getCursorPosition();
773
- var line = session.doc.getLine(cursor.row);
677
+ } else if (text == "\n" || text == "\r\n") {
678
+ var closing = "";
679
+ if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {
680
+ closing = lang.stringRepeat("}", maybeInsertedBrackets);
681
+ CstyleBehaviour.clearMaybeInsertedClosing();
682
+ }
774
683
  var rightChar = line.substring(cursor.column, cursor.column + 1);
775
- if (rightChar == '}') {
776
- var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column + 1});
684
+ if (rightChar === '}') {
685
+ var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');
777
686
  if (!openBracePos)
778
687
  return null;
779
-
780
- var indent = this.getNextLineIndent(state, line.substring(0, line.length - 1), session.getTabString());
781
- var next_indent = this.$getIndent(session.doc.getLine(openBracePos.row));
782
-
783
- return {
784
- text: '\n' + indent + '\n' + next_indent,
785
- selection: [1, indent.length, 1, indent.length]
786
- };
688
+ var next_indent = this.$getIndent(session.getLine(openBracePos.row));
689
+ } else if (closing) {
690
+ var next_indent = this.$getIndent(line);
691
+ } else {
692
+ return;
787
693
  }
694
+ var indent = next_indent + session.getTabString();
695
+
696
+ return {
697
+ text: '\n' + indent + '\n' + next_indent + closing,
698
+ selection: [1, indent.length, 1, indent.length]
699
+ };
700
+ } else {
701
+ CstyleBehaviour.clearMaybeInsertedClosing();
788
702
  }
789
703
  });
790
704
 
@@ -796,6 +710,8 @@ var CstyleBehaviour = function () {
796
710
  if (rightChar == '}') {
797
711
  range.end.column++;
798
712
  return range;
713
+ } else {
714
+ maybeInsertedBrackets--;
799
715
  }
800
716
  }
801
717
  });
@@ -804,12 +720,13 @@ var CstyleBehaviour = function () {
804
720
  if (text == '(') {
805
721
  var selection = editor.getSelectionRange();
806
722
  var selected = session.doc.getTextRange(selection);
807
- if (selected !== "") {
723
+ if (selected !== "" && editor.getWrapBehavioursEnabled()) {
808
724
  return {
809
725
  text: '(' + selected + ')',
810
726
  selection: false
811
727
  };
812
- } else {
728
+ } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {
729
+ CstyleBehaviour.recordAutoInsert(editor, session, ")");
813
730
  return {
814
731
  text: '()',
815
732
  selection: [1, 1]
@@ -821,7 +738,8 @@ var CstyleBehaviour = function () {
821
738
  var rightChar = line.substring(cursor.column, cursor.column + 1);
822
739
  if (rightChar == ')') {
823
740
  var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});
824
- if (matching !== null) {
741
+ if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {
742
+ CstyleBehaviour.popAutoInsertedClosing();
825
743
  return {
826
744
  text: '',
827
745
  selection: [1, 1]
@@ -847,12 +765,13 @@ var CstyleBehaviour = function () {
847
765
  if (text == '[') {
848
766
  var selection = editor.getSelectionRange();
849
767
  var selected = session.doc.getTextRange(selection);
850
- if (selected !== "") {
768
+ if (selected !== "" && editor.getWrapBehavioursEnabled()) {
851
769
  return {
852
770
  text: '[' + selected + ']',
853
771
  selection: false
854
772
  };
855
- } else {
773
+ } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {
774
+ CstyleBehaviour.recordAutoInsert(editor, session, "]");
856
775
  return {
857
776
  text: '[]',
858
777
  selection: [1, 1]
@@ -864,7 +783,8 @@ var CstyleBehaviour = function () {
864
783
  var rightChar = line.substring(cursor.column, cursor.column + 1);
865
784
  if (rightChar == ']') {
866
785
  var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});
867
- if (matching !== null) {
786
+ if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {
787
+ CstyleBehaviour.popAutoInsertedClosing();
868
788
  return {
869
789
  text: '',
870
790
  selection: [1, 1]
@@ -891,7 +811,7 @@ var CstyleBehaviour = function () {
891
811
  var quote = text;
892
812
  var selection = editor.getSelectionRange();
893
813
  var selected = session.doc.getTextRange(selection);
894
- if (selected !== "") {
814
+ if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) {
895
815
  return {
896
816
  text: quote + selected + quote,
897
817
  selection: false
@@ -900,13 +820,9 @@ var CstyleBehaviour = function () {
900
820
  var cursor = editor.getCursorPosition();
901
821
  var line = session.doc.getLine(cursor.row);
902
822
  var leftChar = line.substring(cursor.column-1, cursor.column);
903
-
904
- // We're escaped.
905
823
  if (leftChar == '\\') {
906
824
  return null;
907
825
  }
908
-
909
- // Find what token we're inside.
910
826
  var tokens = session.getTokens(selection.start.row);
911
827
  var col = 0, token;
912
828
  var quotepos = -1; // Track whether we're inside an open quote.
@@ -923,15 +839,14 @@ var CstyleBehaviour = function () {
923
839
  }
924
840
  col += tokens[x].value.length;
925
841
  }
926
-
927
- // Try and be smart about when we auto insert.
928
842
  if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {
843
+ if (!CstyleBehaviour.isSaneInsertion(editor, session))
844
+ return;
929
845
  return {
930
846
  text: quote + quote,
931
847
  selection: [1,1]
932
848
  };
933
849
  } else if (token && token.type === "string") {
934
- // Ignore input and move right one if we're typing over the closing quote.
935
850
  var rightChar = line.substring(cursor.column, cursor.column + 1);
936
851
  if (rightChar == quote) {
937
852
  return {
@@ -949,7 +864,7 @@ var CstyleBehaviour = function () {
949
864
  if (!range.isMultiLine() && (selected == '"' || selected == "'")) {
950
865
  var line = session.doc.getLine(range.start.row);
951
866
  var rightChar = line.substring(range.start.column + 1, range.start.column + 2);
952
- if (rightChar == '"') {
867
+ if (rightChar == selected) {
953
868
  range.end.column++;
954
869
  return range;
955
870
  }
@@ -970,15 +885,24 @@ var oop = require("../../lib/oop");
970
885
  var Range = require("../../range").Range;
971
886
  var BaseFoldMode = require("./fold_mode").FoldMode;
972
887
 
973
- var FoldMode = exports.FoldMode = function() {};
888
+ var FoldMode = exports.FoldMode = function(commentRegex) {
889
+ if (commentRegex) {
890
+ this.foldingStartMarker = new RegExp(
891
+ this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start)
892
+ );
893
+ this.foldingStopMarker = new RegExp(
894
+ this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end)
895
+ );
896
+ }
897
+ };
974
898
  oop.inherits(FoldMode, BaseFoldMode);
975
899
 
976
900
  (function() {
977
901
 
978
902
  this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/;
979
903
  this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/;
980
-
981
- this.getFoldWidgetRange = function(session, foldStyle, row) {
904
+
905
+ this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {
982
906
  var line = session.getLine(row);
983
907
  var match = line.match(this.foldingStartMarker);
984
908
  if (match) {
@@ -986,122 +910,70 @@ oop.inherits(FoldMode, BaseFoldMode);
986
910
 
987
911
  if (match[1])
988
912
  return this.openingBracketBlock(session, match[1], row, i);
989
-
990
- var range = session.getCommentFoldRange(row, i + match[0].length);
991
- range.end.column -= 2;
913
+
914
+ var range = session.getCommentFoldRange(row, i + match[0].length, 1);
915
+
916
+ if (range && !range.isMultiLine()) {
917
+ if (forceMultiline) {
918
+ range = this.getSectionRange(session, row);
919
+ } else if (foldStyle != "all")
920
+ range = null;
921
+ }
922
+
992
923
  return range;
993
924
  }
994
925
 
995
- if (foldStyle !== "markbeginend")
926
+ if (foldStyle === "markbegin")
996
927
  return;
997
-
928
+
998
929
  var match = line.match(this.foldingStopMarker);
999
930
  if (match) {
1000
931
  var i = match.index + match[0].length;
1001
932
 
1002
- if (match[2]) {
1003
- var range = session.getCommentFoldRange(row, i);
1004
- range.end.column -= 2;
1005
- return range;
1006
- }
1007
-
1008
- var end = {row: row, column: i};
1009
- var start = session.$findOpeningBracket(match[1], end);
1010
-
1011
- if (!start)
1012
- return;
1013
-
1014
- start.column++;
1015
- end.column--;
933
+ if (match[1])
934
+ return this.closingBracketBlock(session, match[1], row, i);
1016
935
 
1017
- return Range.fromPoints(start, end);
936
+ return session.getCommentFoldRange(row, i, -1);
1018
937
  }
1019
938
  };
1020
939
 
1021
- }).call(FoldMode.prototype);
1022
-
1023
- });
1024
-
1025
- define('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {
1026
-
1027
-
1028
- var Range = require("../../range").Range;
1029
-
1030
- var FoldMode = exports.FoldMode = function() {};
1031
-
1032
- (function() {
1033
-
1034
- this.foldingStartMarker = null;
1035
- this.foldingStopMarker = null;
1036
-
1037
- // must return "" if there's no fold, to enable caching
1038
- this.getFoldWidget = function(session, foldStyle, row) {
1039
- var line = session.getLine(row);
1040
- if (this.foldingStartMarker.test(line))
1041
- return "start";
1042
- if (foldStyle == "markbeginend"
1043
- && this.foldingStopMarker
1044
- && this.foldingStopMarker.test(line))
1045
- return "end";
1046
- return "";
1047
- };
1048
-
1049
- this.getFoldWidgetRange = function(session, foldStyle, row) {
1050
- return null;
1051
- };
1052
-
1053
- this.indentationBlock = function(session, row, column) {
1054
- var re = /\S/;
940
+ this.getSectionRange = function(session, row) {
1055
941
  var line = session.getLine(row);
1056
- var startLevel = line.search(re);
1057
- if (startLevel == -1)
1058
- return;
1059
-
1060
- var startColumn = column || line.length;
1061
- var maxRow = session.getLength();
942
+ var startIndent = line.search(/\S/);
1062
943
  var startRow = row;
944
+ var startColumn = line.length;
945
+ row = row + 1;
1063
946
  var endRow = row;
1064
-
947
+ var maxRow = session.getLength();
1065
948
  while (++row < maxRow) {
1066
- var level = session.getLine(row).search(re);
1067
-
1068
- if (level == -1)
949
+ line = session.getLine(row);
950
+ var indent = line.search(/\S/);
951
+ if (indent === -1)
1069
952
  continue;
1070
-
1071
- if (level <= startLevel)
953
+ if (startIndent > indent)
1072
954
  break;
1073
-
955
+ var subRange = this.getFoldWidgetRange(session, "all", row);
956
+
957
+ if (subRange) {
958
+ if (subRange.start.row <= startRow) {
959
+ break;
960
+ } else if (subRange.isMultiLine()) {
961
+ row = subRange.end.row;
962
+ } else if (startIndent == indent) {
963
+ break;
964
+ }
965
+ }
1074
966
  endRow = row;
1075
967
  }
1076
-
1077
- if (endRow > startRow) {
1078
- var endColumn = session.getLine(endRow).length;
1079
- return new Range(startRow, startColumn, endRow, endColumn);
1080
- }
1081
- };
1082
-
1083
- this.openingBracketBlock = function(session, bracket, row, column, typeRe) {
1084
- var start = {row: row, column: column + 1};
1085
- var end = session.$findClosingBracket(bracket, start, typeRe);
1086
- if (!end)
1087
- return;
1088
-
1089
- var fw = session.foldWidgets[end.row];
1090
- if (fw == null)
1091
- fw = this.getFoldWidget(session, end.row);
1092
-
1093
- if (fw == "start" && end.row > start.row) {
1094
- end.row --;
1095
- end.column = session.getLine(end.row).length;
1096
- }
1097
- return Range.fromPoints(start, end);
968
+
969
+ return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);
1098
970
  };
1099
971
 
1100
972
  }).call(FoldMode.prototype);
1101
973
 
1102
974
  });
1103
975
 
1104
- define('ace/mode/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/css_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/worker/worker_client', 'ace/mode/folding/cstyle'], function(require, exports, module) {
976
+ define('ace/mode/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/css_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/worker/worker_client', 'ace/mode/behaviour/css', 'ace/mode/folding/cstyle'], function(require, exports, module) {
1105
977
 
1106
978
 
1107
979
  var oop = require("../lib/oop");
@@ -1110,11 +982,13 @@ var Tokenizer = require("../tokenizer").Tokenizer;
1110
982
  var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;
1111
983
  var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;
1112
984
  var WorkerClient = require("../worker/worker_client").WorkerClient;
985
+ var CssBehaviour = require("./behaviour/css").CssBehaviour;
1113
986
  var CStyleFoldMode = require("./folding/cstyle").FoldMode;
1114
987
 
1115
988
  var Mode = function() {
1116
- this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules(), "i");
989
+ this.HighlightRules = CssHighlightRules;
1117
990
  this.$outdent = new MatchingBraceOutdent();
991
+ this.$behaviour = new CssBehaviour();
1118
992
  this.foldingRules = new CStyleFoldMode();
1119
993
  };
1120
994
  oop.inherits(Mode, TextMode);
@@ -1122,12 +996,11 @@ oop.inherits(Mode, TextMode);
1122
996
  (function() {
1123
997
 
1124
998
  this.foldingRules = "cStyle";
999
+ this.blockComment = {start: "/*", end: "*/"};
1125
1000
 
1126
1001
  this.getNextLineIndent = function(state, line, tab) {
1127
1002
  var indent = this.$getIndent(line);
1128
-
1129
- // ignore braces in comments
1130
- var tokens = this.$tokenizer.getLineTokens(line, state).tokens;
1003
+ var tokens = this.getTokenizer().getLineTokens(line, state).tokens;
1131
1004
  if (tokens.length && tokens[tokens.length-1].type == "comment") {
1132
1005
  return indent;
1133
1006
  }
@@ -1147,28 +1020,23 @@ oop.inherits(Mode, TextMode);
1147
1020
  this.autoOutdent = function(state, doc, row) {
1148
1021
  this.$outdent.autoOutdent(doc, row);
1149
1022
  };
1150
-
1023
+
1151
1024
  this.createWorker = function(session) {
1152
1025
  var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker");
1153
1026
  worker.attachToDocument(session.getDocument());
1154
-
1027
+
1155
1028
  worker.on("csslint", function(e) {
1156
- var errors = [];
1157
- e.data.forEach(function(message) {
1158
- errors.push({
1159
- row: message.line - 1,
1160
- column: message.col - 1,
1161
- text: message.message,
1162
- type: message.type,
1163
- lint: message
1164
- });
1165
- });
1166
-
1167
- session.setAnnotations(errors);
1029
+ session.setAnnotations(e.data);
1168
1030
  });
1031
+
1032
+ worker.on("terminate", function() {
1033
+ session.clearAnnotations();
1034
+ });
1035
+
1169
1036
  return worker;
1170
1037
  };
1171
1038
 
1039
+ this.$id = "ace/mode/css";
1172
1040
  }).call(Mode.prototype);
1173
1041
 
1174
1042
  exports.Mode = Mode;
@@ -1181,198 +1049,136 @@ define('ace/mode/css_highlight_rules', ['require', 'exports', 'module' , 'ace/li
1181
1049
  var oop = require("../lib/oop");
1182
1050
  var lang = require("../lib/lang");
1183
1051
  var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
1052
+ var supportType = exports.supportType = "animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index";
1053
+ var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters";
1054
+ var supportConstant = exports.supportConstant = "absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero";
1055
+ var supportConstantColor = exports.supportConstantColor = "aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow";
1056
+ var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace";
1184
1057
 
1185
- var CssHighlightRules = function() {
1186
-
1187
- var properties = lang.arrayToMap(
1188
- ("animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index").split("|")
1189
- );
1190
-
1191
- var functions = lang.arrayToMap(
1192
- ("rgb|rgba|url|attr|counter|counters").split("|")
1193
- );
1194
-
1195
- var constants = lang.arrayToMap(
1196
- ("absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|font-size|font|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|top|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero").split("|")
1197
- );
1198
-
1199
- var colors = lang.arrayToMap(
1200
- ("aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|" +
1201
- "purple|red|silver|teal|white|yellow").split("|")
1202
- );
1203
-
1204
- var fonts = lang.arrayToMap(
1205
- ("arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|" +
1206
- "symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|" +
1207
- "serif|monospace").split("|")
1208
- );
1209
-
1210
- // regexp must not have capturing parentheses. Use (?:) instead.
1211
- // regexps are ordered -> the first match is used
1212
-
1213
- var numRe = "\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))";
1214
- var pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b";
1215
- var pseudoClasses = "(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b";
1216
-
1217
- var base_ruleset = [
1218
- {
1219
- token : "comment", // multi line comment
1220
- merge : true,
1221
- regex : "\\/\\*",
1222
- next : "ruleset_comment"
1223
- }, {
1224
- token : "string", // single line
1225
- regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'
1226
- }, {
1227
- token : "string", // single line
1228
- regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"
1229
- }, {
1230
- token : ["constant.numeric", "keyword"],
1231
- regex : "(" + numRe + ")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)"
1232
- }, {
1233
- token : ["constant.numeric"],
1234
- regex : "([0-9]+)"
1235
- }, {
1236
- token : "constant.numeric", // hex6 color
1237
- regex : "#[a-f0-9]{6}"
1238
- }, {
1239
- token : "constant.numeric", // hex3 color
1240
- regex : "#[a-f0-9]{3}"
1241
- }, {
1242
- token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],
1243
- regex : pseudoElements
1244
- }, {
1245
- token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],
1246
- regex : pseudoClasses
1247
- }, {
1248
- token : function(value) {
1249
- if (properties.hasOwnProperty(value.toLowerCase())) {
1250
- return "support.type";
1251
- }
1252
- else if (functions.hasOwnProperty(value.toLowerCase())) {
1253
- return "support.function";
1254
- }
1255
- else if (constants.hasOwnProperty(value.toLowerCase())) {
1256
- return "support.constant";
1257
- }
1258
- else if (colors.hasOwnProperty(value.toLowerCase())) {
1259
- return "support.constant.color";
1260
- }
1261
- else if (fonts.hasOwnProperty(value.toLowerCase())) {
1262
- return "support.constant.fonts";
1263
- }
1264
- else {
1265
- return "text";
1266
- }
1267
- },
1268
- regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*"
1269
- }
1270
- ];
1271
-
1272
- var ruleset = lang.copyArray(base_ruleset);
1273
- ruleset.unshift({
1274
- token : "paren.rparen",
1275
- regex : "\\}",
1276
- next: "start"
1277
- });
1058
+ var numRe = exports.numRe = "\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))";
1059
+ var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b";
1060
+ var pseudoClasses = exports.pseudoClasses = "(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b";
1278
1061
 
1279
- var media_ruleset = lang.copyArray( base_ruleset );
1280
- media_ruleset.unshift({
1281
- token : "paren.rparen",
1282
- regex : "\\}",
1283
- next: "media"
1284
- });
1285
-
1286
- var base_comment = [{
1287
- token : "comment", // comment spanning whole line
1288
- merge : true,
1289
- regex : ".+"
1290
- }];
1291
-
1292
- var comment = lang.copyArray(base_comment);
1293
- comment.unshift({
1294
- token : "comment", // closing comment
1295
- regex : ".*?\\*\\/",
1296
- next : "start"
1297
- });
1298
-
1299
- var media_comment = lang.copyArray(base_comment);
1300
- media_comment.unshift({
1301
- token : "comment", // closing comment
1302
- regex : ".*?\\*\\/",
1303
- next : "media"
1304
- });
1062
+ var CssHighlightRules = function() {
1305
1063
 
1306
- var ruleset_comment = lang.copyArray(base_comment);
1307
- ruleset_comment.unshift({
1308
- token : "comment", // closing comment
1309
- regex : ".*?\\*\\/",
1310
- next : "ruleset"
1311
- });
1064
+ var keywordMapper = this.createKeywordMapper({
1065
+ "support.function": supportFunction,
1066
+ "support.constant": supportConstant,
1067
+ "support.type": supportType,
1068
+ "support.constant.color": supportConstantColor,
1069
+ "support.constant.fonts": supportConstantFonts
1070
+ }, "text", true);
1312
1071
 
1313
1072
  this.$rules = {
1314
1073
  "start" : [{
1315
1074
  token : "comment", // multi line comment
1316
- merge : true,
1317
1075
  regex : "\\/\\*",
1318
- next : "comment"
1076
+ push : "comment"
1319
1077
  }, {
1320
1078
  token: "paren.lparen",
1321
1079
  regex: "\\{",
1322
- next: "ruleset"
1080
+ push: "ruleset"
1323
1081
  }, {
1324
1082
  token: "string",
1325
1083
  regex: "@.*?{",
1326
- next: "media"
1327
- },{
1084
+ push: "media"
1085
+ }, {
1328
1086
  token: "keyword",
1329
1087
  regex: "#[a-z0-9-_]+"
1330
- },{
1088
+ }, {
1331
1089
  token: "variable",
1332
1090
  regex: "\\.[a-z0-9-_]+"
1333
- },{
1091
+ }, {
1334
1092
  token: "string",
1335
1093
  regex: ":[a-z0-9-_]+"
1336
- },{
1094
+ }, {
1337
1095
  token: "constant",
1338
1096
  regex: "[a-z0-9-_]+"
1097
+ }, {
1098
+ caseInsensitive: true
1339
1099
  }],
1340
1100
 
1341
- "media" : [ {
1101
+ "media" : [{
1342
1102
  token : "comment", // multi line comment
1343
- merge : true,
1344
1103
  regex : "\\/\\*",
1345
- next : "media_comment"
1104
+ push : "comment"
1346
1105
  }, {
1347
1106
  token: "paren.lparen",
1348
1107
  regex: "\\{",
1349
- next: "media_ruleset"
1350
- },{
1108
+ push: "ruleset"
1109
+ }, {
1351
1110
  token: "string",
1352
1111
  regex: "\\}",
1353
- next: "start"
1354
- },{
1112
+ next: "pop"
1113
+ }, {
1355
1114
  token: "keyword",
1356
1115
  regex: "#[a-z0-9-_]+"
1357
- },{
1116
+ }, {
1358
1117
  token: "variable",
1359
1118
  regex: "\\.[a-z0-9-_]+"
1360
- },{
1119
+ }, {
1361
1120
  token: "string",
1362
1121
  regex: ":[a-z0-9-_]+"
1363
- },{
1122
+ }, {
1364
1123
  token: "constant",
1365
1124
  regex: "[a-z0-9-_]+"
1125
+ }, {
1126
+ caseInsensitive: true
1366
1127
  }],
1367
1128
 
1368
- "comment" : comment,
1369
-
1370
- "ruleset" : ruleset,
1371
- "ruleset_comment" : ruleset_comment,
1129
+ "comment" : [{
1130
+ token : "comment",
1131
+ regex : "\\*\\/",
1132
+ next : "pop"
1133
+ }, {
1134
+ defaultToken : "comment"
1135
+ }],
1372
1136
 
1373
- "media_ruleset" : media_ruleset,
1374
- "media_comment" : media_comment
1137
+ "ruleset" : [
1138
+ {
1139
+ token : "paren.rparen",
1140
+ regex : "\\}",
1141
+ next: "pop"
1142
+ }, {
1143
+ token : "comment", // multi line comment
1144
+ regex : "\\/\\*",
1145
+ push : "comment"
1146
+ }, {
1147
+ token : "string", // single line
1148
+ regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'
1149
+ }, {
1150
+ token : "string", // single line
1151
+ regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"
1152
+ }, {
1153
+ token : ["constant.numeric", "keyword"],
1154
+ regex : "(" + numRe + ")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)"
1155
+ }, {
1156
+ token : "constant.numeric",
1157
+ regex : numRe
1158
+ }, {
1159
+ token : "constant.numeric", // hex6 color
1160
+ regex : "#[a-f0-9]{6}"
1161
+ }, {
1162
+ token : "constant.numeric", // hex3 color
1163
+ regex : "#[a-f0-9]{3}"
1164
+ }, {
1165
+ token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],
1166
+ regex : pseudoElements
1167
+ }, {
1168
+ token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],
1169
+ regex : pseudoClasses
1170
+ }, {
1171
+ token : ["support.function", "string", "support.function"],
1172
+ regex : "(url\\()(.*)(\\))"
1173
+ }, {
1174
+ token : keywordMapper,
1175
+ regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*"
1176
+ }, {
1177
+ caseInsensitive: true
1178
+ }]
1375
1179
  };
1180
+
1181
+ this.normalizeRules();
1376
1182
  };
1377
1183
 
1378
1184
  oop.inherits(CssHighlightRules, TextHighlightRules);
@@ -1381,15 +1187,93 @@ exports.CssHighlightRules = CssHighlightRules;
1381
1187
 
1382
1188
  });
1383
1189
 
1384
- define('ace/mode/html_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/css_highlight_rules', 'ace/mode/javascript_highlight_rules', 'ace/mode/xml_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
1190
+ define('ace/mode/behaviour/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) {
1191
+
1192
+
1193
+ var oop = require("../../lib/oop");
1194
+ var Behaviour = require("../behaviour").Behaviour;
1195
+ var CstyleBehaviour = require("./cstyle").CstyleBehaviour;
1196
+ var TokenIterator = require("../../token_iterator").TokenIterator;
1197
+
1198
+ var CssBehaviour = function () {
1199
+
1200
+ this.inherit(CstyleBehaviour);
1201
+
1202
+ this.add("colon", "insertion", function (state, action, editor, session, text) {
1203
+ if (text === ':') {
1204
+ var cursor = editor.getCursorPosition();
1205
+ var iterator = new TokenIterator(session, cursor.row, cursor.column);
1206
+ var token = iterator.getCurrentToken();
1207
+ if (token && token.value.match(/\s+/)) {
1208
+ token = iterator.stepBackward();
1209
+ }
1210
+ if (token && token.type === 'support.type') {
1211
+ var line = session.doc.getLine(cursor.row);
1212
+ var rightChar = line.substring(cursor.column, cursor.column + 1);
1213
+ if (rightChar === ':') {
1214
+ return {
1215
+ text: '',
1216
+ selection: [1, 1]
1217
+ }
1218
+ }
1219
+ if (!line.substring(cursor.column).match(/^\s*;/)) {
1220
+ return {
1221
+ text: ':;',
1222
+ selection: [1, 1]
1223
+ }
1224
+ }
1225
+ }
1226
+ }
1227
+ });
1228
+
1229
+ this.add("colon", "deletion", function (state, action, editor, session, range) {
1230
+ var selected = session.doc.getTextRange(range);
1231
+ if (!range.isMultiLine() && selected === ':') {
1232
+ var cursor = editor.getCursorPosition();
1233
+ var iterator = new TokenIterator(session, cursor.row, cursor.column);
1234
+ var token = iterator.getCurrentToken();
1235
+ if (token && token.value.match(/\s+/)) {
1236
+ token = iterator.stepBackward();
1237
+ }
1238
+ if (token && token.type === 'support.type') {
1239
+ var line = session.doc.getLine(range.start.row);
1240
+ var rightChar = line.substring(range.end.column, range.end.column + 1);
1241
+ if (rightChar === ';') {
1242
+ range.end.column ++;
1243
+ return range;
1244
+ }
1245
+ }
1246
+ }
1247
+ });
1248
+
1249
+ this.add("semicolon", "insertion", function (state, action, editor, session, text) {
1250
+ if (text === ';') {
1251
+ var cursor = editor.getCursorPosition();
1252
+ var line = session.doc.getLine(cursor.row);
1253
+ var rightChar = line.substring(cursor.column, cursor.column + 1);
1254
+ if (rightChar === ';') {
1255
+ return {
1256
+ text: '',
1257
+ selection: [1, 1]
1258
+ }
1259
+ }
1260
+ }
1261
+ });
1262
+
1263
+ }
1264
+ oop.inherits(CssBehaviour, CstyleBehaviour);
1265
+
1266
+ exports.CssBehaviour = CssBehaviour;
1267
+ });
1268
+
1269
+ define('ace/mode/html_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/css_highlight_rules', 'ace/mode/javascript_highlight_rules', 'ace/mode/xml_highlight_rules'], function(require, exports, module) {
1385
1270
 
1386
1271
 
1387
1272
  var oop = require("../lib/oop");
1388
1273
  var lang = require("../lib/lang");
1389
1274
  var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;
1390
1275
  var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;
1391
- var xmlUtil = require("./xml_util");
1392
- var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
1276
+ var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules;
1393
1277
 
1394
1278
  var tagMap = lang.createMap({
1395
1279
  a : 'anchor',
@@ -1398,6 +1282,7 @@ var tagMap = lang.createMap({
1398
1282
  img : 'image',
1399
1283
  input : 'form',
1400
1284
  label : 'form',
1285
+ option : 'form',
1401
1286
  script : 'script',
1402
1287
  select : 'form',
1403
1288
  textarea : 'form',
@@ -1411,98 +1296,255 @@ var tagMap = lang.createMap({
1411
1296
  });
1412
1297
 
1413
1298
  var HtmlHighlightRules = function() {
1299
+ XmlHighlightRules.call(this);
1414
1300
 
1415
- // regexp must not have capturing parentheses
1416
- // regexps are ordered -> the first match is used
1417
- this.$rules = {
1418
- start : [{
1419
- token : "text",
1420
- merge : true,
1421
- regex : "<\\!\\[CDATA\\[",
1422
- next : "cdata"
1301
+ this.addRules({
1302
+ attributes: [{
1303
+ include : "space"
1423
1304
  }, {
1424
- token : "xml_pe",
1425
- regex : "<\\?.*?\\?>"
1305
+ token : "entity.other.attribute-name",
1306
+ regex : "[-_a-zA-Z0-9:]+"
1426
1307
  }, {
1427
- token : "comment",
1428
- merge : true,
1429
- regex : "<\\!--",
1430
- next : "comment"
1431
- }, {
1432
- token : "xml_pe",
1433
- regex : "<\\!.*?>"
1434
- }, {
1435
- token : "meta.tag",
1436
- regex : "<(?=\s*script\\b)",
1437
- next : "script"
1438
- }, {
1439
- token : "meta.tag",
1440
- regex : "<(?=\s*style\\b)",
1441
- next : "style"
1308
+ token : "keyword.operator.separator",
1309
+ regex : "=",
1310
+ push : [{
1311
+ include: "space"
1312
+ }, {
1313
+ token : "string",
1314
+ regex : "[^<>='\"`\\s]+",
1315
+ next : "pop"
1316
+ }, {
1317
+ token : "empty",
1318
+ regex : "",
1319
+ next : "pop"
1320
+ }]
1442
1321
  }, {
1443
- token : "meta.tag", // opening tag
1444
- regex : "<\\/?",
1445
- next : "tag"
1322
+ include : "string"
1323
+ }],
1324
+ tag: [{
1325
+ token : function(start, tag) {
1326
+ var group = tagMap[tag];
1327
+ return ["meta.tag.punctuation.begin",
1328
+ "meta.tag.name" + (group ? "." + group : "")];
1329
+ },
1330
+ regex : "(<)([-_a-zA-Z0-9:]+)",
1331
+ next: "start_tag_stuff"
1446
1332
  }, {
1333
+ token : function(start, tag) {
1334
+ var group = tagMap[tag];
1335
+ return ["meta.tag.punctuation.begin",
1336
+ "meta.tag.name" + (group ? "." + group : "")];
1337
+ },
1338
+ regex : "(</)([-_a-zA-Z0-9:]+)",
1339
+ next: "end_tag_stuff"
1340
+ }],
1341
+ start_tag_stuff: [
1342
+ {include : "attributes"},
1343
+ {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}
1344
+ ],
1345
+ end_tag_stuff: [
1346
+ {include : "space"},
1347
+ {token : "meta.tag.punctuation.end", regex : ">", next : "start"}
1348
+ ]
1349
+ });
1350
+
1351
+ this.embedTagRules(CssHighlightRules, "css-", "style");
1352
+ this.embedTagRules(JavaScriptHighlightRules, "js-", "script");
1353
+
1354
+ if (this.constructor === HtmlHighlightRules)
1355
+ this.normalizeRules();
1356
+ };
1357
+
1358
+ oop.inherits(HtmlHighlightRules, XmlHighlightRules);
1359
+
1360
+ exports.HtmlHighlightRules = HtmlHighlightRules;
1361
+ });
1362
+
1363
+ define('ace/mode/xml_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/xml_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
1364
+
1365
+
1366
+ var oop = require("../lib/oop");
1367
+ var xmlUtil = require("./xml_util");
1368
+ var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
1369
+
1370
+ var XmlHighlightRules = function(normalize) {
1371
+ this.$rules = {
1372
+ start : [
1373
+ {token : "punctuation.string.begin", regex : "<\\!\\[CDATA\\[", next : "cdata"},
1374
+ {
1375
+ token : ["punctuation.instruction.begin", "keyword.instruction"],
1376
+ regex : "(<\\?)(xml)(?=[\\s])", next : "xml_declaration"
1377
+ },
1378
+ {
1379
+ token : ["punctuation.instruction.begin", "keyword.instruction"],
1380
+ regex : "(<\\?)([-_a-zA-Z0-9]+)", next : "instruction"
1381
+ },
1382
+ {token : "comment", regex : "<\\!--", next : "comment"},
1383
+ {
1384
+ token : ["punctuation.doctype.begin", "meta.tag.doctype"],
1385
+ regex : "(<\\!)(DOCTYPE)(?=[\\s])", next : "doctype"
1386
+ },
1387
+ {include : "tag"},
1388
+ {include : "reference"}
1389
+ ],
1390
+
1391
+ xml_declaration : [
1392
+ {include : "attributes"},
1393
+ {include : "instruction"}
1394
+ ],
1395
+
1396
+ instruction : [
1397
+ {token : "punctuation.instruction.end", regex : "\\?>", next : "start"}
1398
+ ],
1399
+
1400
+ doctype : [
1401
+ {include : "space"},
1402
+ {include : "string"},
1403
+ {token : "punctuation.doctype.end", regex : ">", next : "start"},
1404
+ {token : "xml-pe", regex : "[-_a-zA-Z0-9:]+"},
1405
+ {token : "punctuation.begin", regex : "\\[", push : "declarations"}
1406
+ ],
1407
+
1408
+ declarations : [{
1447
1409
  token : "text",
1448
1410
  regex : "\\s+"
1449
1411
  }, {
1450
- token : "constant.character.entity",
1451
- regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"
1412
+ token: "punctuation.end",
1413
+ regex: "]",
1414
+ next: "pop"
1452
1415
  }, {
1453
- token : "text",
1454
- regex : "[^<]+"
1455
- } ],
1456
-
1457
- cdata : [ {
1458
- token : "text",
1459
- regex : "\\]\\]>",
1460
- next : "start"
1416
+ token : ["punctuation.begin", "keyword"],
1417
+ regex : "(<\\!)([-_a-zA-Z0-9]+)",
1418
+ push : [{
1419
+ token : "text",
1420
+ regex : "\\s+"
1421
+ },
1422
+ {
1423
+ token : "punctuation.end",
1424
+ regex : ">",
1425
+ next : "pop"
1426
+ },
1427
+ {include : "string"}]
1428
+ }],
1429
+
1430
+ cdata : [
1431
+ {token : "string.end", regex : "\\]\\]>", next : "start"},
1432
+ {token : "text", regex : "\\s+"},
1433
+ {token : "text", regex : "(?:[^\\]]|\\](?!\\]>))+"}
1434
+ ],
1435
+
1436
+ comment : [
1437
+ {token : "comment", regex : "-->", next : "start"},
1438
+ {defaultToken : "comment"}
1439
+ ],
1440
+
1441
+ tag : [{
1442
+ token : ["meta.tag.punctuation.begin", "meta.tag.name"],
1443
+ regex : "(<)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",
1444
+ next: [
1445
+ {include : "attributes"},
1446
+ {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}
1447
+ ]
1448
+ }, {
1449
+ token : ["meta.tag.punctuation.begin", "meta.tag.name"],
1450
+ regex : "(</)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",
1451
+ next: [
1452
+ {include : "space"},
1453
+ {token : "meta.tag.punctuation.end", regex : ">", next : "start"}
1454
+ ]
1455
+ }],
1456
+
1457
+ space : [
1458
+ {token : "text", regex : "\\s+"}
1459
+ ],
1460
+
1461
+ reference : [{
1462
+ token : "constant.language.escape",
1463
+ regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"
1461
1464
  }, {
1462
- token : "text",
1463
- merge : true,
1464
- regex : "\\s+"
1465
+ token : "text", regex : "&"
1466
+ }],
1467
+
1468
+ string: [{
1469
+ token : "string",
1470
+ regex : "'",
1471
+ push : "qstring_inner"
1465
1472
  }, {
1466
- token : "text",
1467
- merge : true,
1468
- regex : ".+"
1469
- } ],
1473
+ token : "string",
1474
+ regex : '"',
1475
+ push : "qqstring_inner"
1476
+ }],
1470
1477
 
1471
- comment : [ {
1472
- token : "comment",
1473
- regex : ".*?-->",
1474
- next : "start"
1478
+ qstring_inner: [
1479
+ {token : "string", regex: "'", next: "pop"},
1480
+ {include : "reference"},
1481
+ {defaultToken : "string"}
1482
+ ],
1483
+
1484
+ qqstring_inner: [
1485
+ {token : "string", regex: '"', next: "pop"},
1486
+ {include : "reference"},
1487
+ {defaultToken : "string"}
1488
+ ],
1489
+
1490
+ attributes: [{
1491
+ token : "entity.other.attribute-name",
1492
+ regex : "(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+"
1475
1493
  }, {
1476
- token : "comment",
1477
- merge : true,
1478
- regex : ".+"
1479
- } ]
1494
+ token : "keyword.operator.separator",
1495
+ regex : "="
1496
+ }, {
1497
+ include : "space"
1498
+ }, {
1499
+ include : "string"
1500
+ }]
1480
1501
  };
1481
-
1482
- xmlUtil.tag(this.$rules, "tag", "start", tagMap);
1483
- xmlUtil.tag(this.$rules, "style", "css-start", tagMap);
1484
- xmlUtil.tag(this.$rules, "script", "js-start", tagMap);
1485
-
1486
- this.embedRules(JavaScriptHighlightRules, "js-", [{
1487
- token: "comment",
1488
- regex: "\\/\\/.*(?=<\\/script>)",
1489
- next: "tag"
1490
- }, {
1491
- token: "meta.tag",
1492
- regex: "<\\/(?=script)",
1493
- next: "tag"
1494
- }]);
1495
-
1496
- this.embedRules(CssHighlightRules, "css-", [{
1497
- token: "meta.tag",
1498
- regex: "<\\/(?=style)",
1499
- next: "tag"
1500
- }]);
1502
+
1503
+ if (this.constructor === XmlHighlightRules)
1504
+ this.normalizeRules();
1501
1505
  };
1502
1506
 
1503
- oop.inherits(HtmlHighlightRules, TextHighlightRules);
1504
1507
 
1505
- exports.HtmlHighlightRules = HtmlHighlightRules;
1508
+ (function() {
1509
+
1510
+ this.embedTagRules = function(HighlightRules, prefix, tag){
1511
+ this.$rules.tag.unshift({
1512
+ token : ["meta.tag.punctuation.begin", "meta.tag.name." + tag],
1513
+ regex : "(<)(" + tag + ")",
1514
+ next: [
1515
+ {include : "space"},
1516
+ {include : "attributes"},
1517
+ {token : "meta.tag.punctuation.end", regex : "/?>", next : prefix + "start"}
1518
+ ]
1519
+ });
1520
+
1521
+ this.$rules[tag + "-end"] = [
1522
+ {include : "space"},
1523
+ {token : "meta.tag.punctuation.end", regex : ">", next: "start",
1524
+ onMatch : function(value, currentState, stack) {
1525
+ stack.splice(0);
1526
+ return this.token;
1527
+ }}
1528
+ ]
1529
+
1530
+ this.embedRules(HighlightRules, prefix, [{
1531
+ token: ["meta.tag.punctuation.begin", "meta.tag.name." + tag],
1532
+ regex : "(</)(" + tag + ")",
1533
+ next: tag + "-end"
1534
+ }, {
1535
+ token: "string.begin",
1536
+ regex : "<\\!\\[CDATA\\["
1537
+ }, {
1538
+ token: "string.end",
1539
+ regex : "\\]\\]>"
1540
+ }]);
1541
+ };
1542
+
1543
+ }).call(TextHighlightRules.prototype);
1544
+
1545
+ oop.inherits(XmlHighlightRules, TextHighlightRules);
1546
+
1547
+ exports.XmlHighlightRules = XmlHighlightRules;
1506
1548
  });
1507
1549
 
1508
1550
  define('ace/mode/xml_util', ['require', 'exports', 'module' ], function(require, exports, module) {
@@ -1511,34 +1553,24 @@ define('ace/mode/xml_util', ['require', 'exports', 'module' ], function(require,
1511
1553
  function string(state) {
1512
1554
  return [{
1513
1555
  token : "string",
1514
- regex : '".*?"'
1515
- }, {
1516
- token : "string", // multi line string start
1517
- merge : true,
1518
- regex : '["].*',
1556
+ regex : '"',
1519
1557
  next : state + "_qqstring"
1520
1558
  }, {
1521
1559
  token : "string",
1522
- regex : "'.*?'"
1523
- }, {
1524
- token : "string", // multi line string start
1525
- merge : true,
1526
- regex : "['].*",
1560
+ regex : "'",
1527
1561
  next : state + "_qstring"
1528
1562
  }];
1529
1563
  }
1530
1564
 
1531
1565
  function multiLineString(quote, state) {
1532
- return [{
1533
- token : "string",
1534
- merge : true,
1535
- regex : ".*?" + quote,
1536
- next : state
1537
- }, {
1538
- token : "string",
1539
- merge : true,
1540
- regex : '.+'
1541
- }];
1566
+ return [
1567
+ {token : "string", regex : quote, next : state},
1568
+ {
1569
+ token : "constant.language.escape",
1570
+ regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"
1571
+ },
1572
+ {defaultToken : "string"}
1573
+ ];
1542
1574
  }
1543
1575
 
1544
1576
  exports.tag = function(states, name, nextState, tagMap) {
@@ -1546,7 +1578,6 @@ exports.tag = function(states, name, nextState, tagMap) {
1546
1578
  token : "text",
1547
1579
  regex : "\\s+"
1548
1580
  }, {
1549
- //token : "meta.tag",
1550
1581
 
1551
1582
  token : !tagMap ? "meta.tag.tag-name" : function(value) {
1552
1583
  if (tagMap[value])
@@ -1554,7 +1585,6 @@ exports.tag = function(states, name, nextState, tagMap) {
1554
1585
  else
1555
1586
  return "meta.tag.tag-name";
1556
1587
  },
1557
- merge : true,
1558
1588
  regex : "[-_a-zA-Z0-9:]+",
1559
1589
  next : name + "_embed_attribute_list"
1560
1590
  }, {
@@ -1567,9 +1597,8 @@ exports.tag = function(states, name, nextState, tagMap) {
1567
1597
  states[name + "_qqstring"] = multiLineString("\"", name + "_embed_attribute_list");
1568
1598
 
1569
1599
  states[name + "_embed_attribute_list"] = [{
1570
- token : "meta.tag",
1571
- merge : true,
1572
- regex : "\/?>",
1600
+ token : "meta.tag.r",
1601
+ regex : "/?>",
1573
1602
  next : nextState
1574
1603
  }, {
1575
1604
  token : "keyword.operator",
@@ -1598,14 +1627,9 @@ var TokenIterator = require("../../token_iterator").TokenIterator;
1598
1627
  var voidElements = ['area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr'];
1599
1628
 
1600
1629
  function hasType(token, type) {
1601
- var hasType = true;
1602
- var typeList = token.type.split('.');
1603
- var needleList = type.split('.');
1604
- needleList.forEach(function(needle){
1605
- if (typeList.indexOf(needle) == -1) {
1606
- hasType = false;
1607
- return false;
1608
- }
1630
+ var tokenTypes = token.type.split('.');
1631
+ return type.split('.').every(function(type){
1632
+ return (tokenTypes.indexOf(type) !== -1);
1609
1633
  });
1610
1634
  return hasType;
1611
1635
  }
@@ -1619,6 +1643,9 @@ var HtmlBehaviour = function () {
1619
1643
  var position = editor.getCursorPosition();
1620
1644
  var iterator = new TokenIterator(session, position.row, position.column);
1621
1645
  var token = iterator.getCurrentToken();
1646
+
1647
+ if (token && hasType(token, 'string') && iterator.getCurrentTokenColumn() + token.value.length > position.column)
1648
+ return;
1622
1649
  var atCursor = false;
1623
1650
  if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){
1624
1651
  do {
@@ -1627,8 +1654,8 @@ var HtmlBehaviour = function () {
1627
1654
  } else {
1628
1655
  atCursor = true;
1629
1656
  }
1630
- if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) {
1631
- return
1657
+ if (!token || !hasType(token, 'meta.tag.name') || iterator.stepBackward().value.match('/')) {
1658
+ return;
1632
1659
  }
1633
1660
  var element = token.value;
1634
1661
  if (atCursor){
@@ -1658,14 +1685,9 @@ var CstyleBehaviour = require("./cstyle").CstyleBehaviour;
1658
1685
  var TokenIterator = require("../../token_iterator").TokenIterator;
1659
1686
 
1660
1687
  function hasType(token, type) {
1661
- var hasType = true;
1662
- var typeList = token.type.split('.');
1663
- var needleList = type.split('.');
1664
- needleList.forEach(function(needle){
1665
- if (typeList.indexOf(needle) == -1) {
1666
- hasType = false;
1667
- return false;
1668
- }
1688
+ var tokenTypes = token.type.split('.');
1689
+ return type.split('.').every(function(type){
1690
+ return (tokenTypes.indexOf(type) !== -1);
1669
1691
  });
1670
1692
  return hasType;
1671
1693
  }
@@ -1679,6 +1701,9 @@ var XmlBehaviour = function () {
1679
1701
  var position = editor.getCursorPosition();
1680
1702
  var iterator = new TokenIterator(session, position.row, position.column);
1681
1703
  var token = iterator.getCurrentToken();
1704
+
1705
+ if (token && hasType(token, 'string') && iterator.getCurrentTokenColumn() + token.value.length > position.column)
1706
+ return;
1682
1707
  var atCursor = false;
1683
1708
  if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){
1684
1709
  do {
@@ -1687,8 +1712,8 @@ var XmlBehaviour = function () {
1687
1712
  } else {
1688
1713
  atCursor = true;
1689
1714
  }
1690
- if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) {
1691
- return
1715
+ if (!token || !hasType(token, 'meta.tag.name') || iterator.stepBackward().value.match('/')) {
1716
+ return;
1692
1717
  }
1693
1718
  var tag = token.value;
1694
1719
  if (atCursor){
@@ -1705,11 +1730,11 @@ var XmlBehaviour = function () {
1705
1730
  this.add('autoindent', 'insertion', function (state, action, editor, session, text) {
1706
1731
  if (text == "\n") {
1707
1732
  var cursor = editor.getCursorPosition();
1708
- var line = session.doc.getLine(cursor.row);
1733
+ var line = session.getLine(cursor.row);
1709
1734
  var rightChars = line.substring(cursor.column, cursor.column + 2);
1710
1735
  if (rightChars == '</') {
1711
- var indent = this.$getIndent(session.doc.getLine(cursor.row)) + session.getTabString();
1712
- var next_indent = this.$getIndent(session.doc.getLine(cursor.row));
1736
+ var next_indent = this.$getIndent(line);
1737
+ var indent = next_indent + session.getTabString();
1713
1738
 
1714
1739
  return {
1715
1740
  text: '\n' + indent + '\n' + next_indent,
@@ -1735,7 +1760,6 @@ var CStyleFoldMode = require("./cstyle").FoldMode;
1735
1760
 
1736
1761
  var FoldMode = exports.FoldMode = function() {
1737
1762
  MixedFoldMode.call(this, new XmlFoldMode({
1738
- // void elements
1739
1763
  "area": 1,
1740
1764
  "base": 1,
1741
1765
  "br": 1,
@@ -1752,8 +1776,6 @@ var FoldMode = exports.FoldMode = function() {
1752
1776
  "source": 1,
1753
1777
  "track": 1,
1754
1778
  "wbr": 1,
1755
-
1756
- // optional tags
1757
1779
  "li": 1,
1758
1780
  "dt": 1,
1759
1781
  "dd": 1,
@@ -1791,6 +1813,8 @@ oop.inherits(FoldMode, BaseFoldMode);
1791
1813
 
1792
1814
 
1793
1815
  this.$getMode = function(state) {
1816
+ if (typeof state != "string")
1817
+ state = state[0];
1794
1818
  for (var key in this.subModes) {
1795
1819
  if (state.indexOf(key) === 0)
1796
1820
  return this.subModes[key];
@@ -1867,7 +1891,7 @@ oop.inherits(FoldMode, BaseFoldMode);
1867
1891
  var value = "";
1868
1892
  for (var i = 0; i < tokens.length; i++) {
1869
1893
  var token = tokens[i];
1870
- if (token.type.indexOf("meta.tag") === 0)
1894
+ if (token.type.lastIndexOf("meta.tag", 0) === 0)
1871
1895
  value += token.value;
1872
1896
  else
1873
1897
  value += lang.stringRepeat(" ", token.value.length);
@@ -1879,9 +1903,8 @@ oop.inherits(FoldMode, BaseFoldMode);
1879
1903
  this.tagRe = /^(\s*)(<?(\/?)([-_a-zA-Z0-9:!]*)\s*(\/?)>?)/;
1880
1904
  this._parseTag = function(tag) {
1881
1905
 
1882
- var match = this.tagRe.exec(tag);
1883
- var column = this.tagRe.lastIndex || 0;
1884
- this.tagRe.lastIndex = 0;
1906
+ var match = tag.match(this.tagRe);
1907
+ var column = 0;
1885
1908
 
1886
1909
  return {
1887
1910
  value: tag,
@@ -1901,7 +1924,7 @@ oop.inherits(FoldMode, BaseFoldMode);
1901
1924
  var start;
1902
1925
 
1903
1926
  do {
1904
- if (token.type.indexOf("meta.tag") === 0) {
1927
+ if (token.type.lastIndexOf("meta.tag", 0) === 0) {
1905
1928
  if (!start) {
1906
1929
  var start = {
1907
1930
  row: iterator.getCurrentTokenRow(),
@@ -1934,7 +1957,7 @@ oop.inherits(FoldMode, BaseFoldMode);
1934
1957
  var end;
1935
1958
 
1936
1959
  do {
1937
- if (token.type.indexOf("meta.tag") === 0) {
1960
+ if (token.type.lastIndexOf("meta.tag", 0) === 0) {
1938
1961
  if (!end) {
1939
1962
  end = {
1940
1963
  row: iterator.getCurrentTokenRow(),
@@ -2049,21 +2072,309 @@ oop.inherits(FoldMode, BaseFoldMode);
2049
2072
 
2050
2073
  });
2051
2074
 
2052
- define('ace/mode/lua', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/lua_highlight_rules', 'ace/range'], function(require, exports, module) {
2075
+ define('ace/mode/html_completions', ['require', 'exports', 'module' , 'ace/token_iterator'], function(require, exports, module) {
2076
+
2077
+
2078
+ var TokenIterator = require("../token_iterator").TokenIterator;
2079
+
2080
+ var commonAttributes = [
2081
+ "accesskey",
2082
+ "class",
2083
+ "contenteditable",
2084
+ "contextmenu",
2085
+ "dir",
2086
+ "draggable",
2087
+ "dropzone",
2088
+ "hidden",
2089
+ "id",
2090
+ "lang",
2091
+ "spellcheck",
2092
+ "style",
2093
+ "tabindex",
2094
+ "title",
2095
+ "translate"
2096
+ ];
2097
+
2098
+ var eventAttributes = [
2099
+ "onabort",
2100
+ "onblur",
2101
+ "oncancel",
2102
+ "oncanplay",
2103
+ "oncanplaythrough",
2104
+ "onchange",
2105
+ "onclick",
2106
+ "onclose",
2107
+ "oncontextmenu",
2108
+ "oncuechange",
2109
+ "ondblclick",
2110
+ "ondrag",
2111
+ "ondragend",
2112
+ "ondragenter",
2113
+ "ondragleave",
2114
+ "ondragover",
2115
+ "ondragstart",
2116
+ "ondrop",
2117
+ "ondurationchange",
2118
+ "onemptied",
2119
+ "onended",
2120
+ "onerror",
2121
+ "onfocus",
2122
+ "oninput",
2123
+ "oninvalid",
2124
+ "onkeydown",
2125
+ "onkeypress",
2126
+ "onkeyup",
2127
+ "onload",
2128
+ "onloadeddata",
2129
+ "onloadedmetadata",
2130
+ "onloadstart",
2131
+ "onmousedown",
2132
+ "onmousemove",
2133
+ "onmouseout",
2134
+ "onmouseover",
2135
+ "onmouseup",
2136
+ "onmousewheel",
2137
+ "onpause",
2138
+ "onplay",
2139
+ "onplaying",
2140
+ "onprogress",
2141
+ "onratechange",
2142
+ "onreset",
2143
+ "onscroll",
2144
+ "onseeked",
2145
+ "onseeking",
2146
+ "onselect",
2147
+ "onshow",
2148
+ "onstalled",
2149
+ "onsubmit",
2150
+ "onsuspend",
2151
+ "ontimeupdate",
2152
+ "onvolumechange",
2153
+ "onwaiting"
2154
+ ];
2155
+
2156
+ var globalAttributes = commonAttributes.concat(eventAttributes);
2157
+
2158
+ var attributeMap = {
2159
+ "html": ["manifest"],
2160
+ "head": [],
2161
+ "title": [],
2162
+ "base": ["href", "target"],
2163
+ "link": ["href", "hreflang", "rel", "media", "type", "sizes"],
2164
+ "meta": ["http-equiv", "name", "content", "charset"],
2165
+ "style": ["type", "media", "scoped"],
2166
+ "script": ["charset", "type", "src", "defer", "async"],
2167
+ "noscript": ["href"],
2168
+ "body": ["onafterprint", "onbeforeprint", "onbeforeunload", "onhashchange", "onmessage", "onoffline", "onpopstate", "onredo", "onresize", "onstorage", "onundo", "onunload"],
2169
+ "section": [],
2170
+ "nav": [],
2171
+ "article": ["pubdate"],
2172
+ "aside": [],
2173
+ "h1": [],
2174
+ "h2": [],
2175
+ "h3": [],
2176
+ "h4": [],
2177
+ "h5": [],
2178
+ "h6": [],
2179
+ "header": [],
2180
+ "footer": [],
2181
+ "address": [],
2182
+ "main": [],
2183
+ "p": [],
2184
+ "hr": [],
2185
+ "pre": [],
2186
+ "blockquote": ["cite"],
2187
+ "ol": ["start", "reversed"],
2188
+ "ul": [],
2189
+ "li": ["value"],
2190
+ "dl": [],
2191
+ "dt": [],
2192
+ "dd": [],
2193
+ "figure": [],
2194
+ "figcaption": [],
2195
+ "div": [],
2196
+ "a": ["href", "target", "ping", "rel", "media", "hreflang", "type"],
2197
+ "em": [],
2198
+ "strong": [],
2199
+ "small": [],
2200
+ "s": [],
2201
+ "cite": [],
2202
+ "q": ["cite"],
2203
+ "dfn": [],
2204
+ "abbr": [],
2205
+ "data": [],
2206
+ "time": ["datetime"],
2207
+ "code": [],
2208
+ "var": [],
2209
+ "samp": [],
2210
+ "kbd": [],
2211
+ "sub": [],
2212
+ "sup": [],
2213
+ "i": [],
2214
+ "b": [],
2215
+ "u": [],
2216
+ "mark": [],
2217
+ "ruby": [],
2218
+ "rt": [],
2219
+ "rp": [],
2220
+ "bdi": [],
2221
+ "bdo": [],
2222
+ "span": [],
2223
+ "br": [],
2224
+ "wbr": [],
2225
+ "ins": ["cite", "datetime"],
2226
+ "del": ["cite", "datetime"],
2227
+ "img": ["alt", "src", "height", "width", "usemap", "ismap"],
2228
+ "iframe": ["name", "src", "height", "width", "sandbox", "seamless"],
2229
+ "embed": ["src", "height", "width", "type"],
2230
+ "object": ["param", "data", "type", "height" , "width", "usemap", "name", "form", "classid"],
2231
+ "param": ["name", "value"],
2232
+ "video": ["src", "autobuffer", "autoplay", "loop", "controls", "width", "height", "poster"],
2233
+ "audio": ["src", "autobuffer", "autoplay", "loop", "controls"],
2234
+ "source": ["src", "type", "media"],
2235
+ "track": ["kind", "src", "srclang", "label", "default"],
2236
+ "canvas": ["width", "height"],
2237
+ "map": ["name"],
2238
+ "area": ["shape", "coords", "href", "hreflang", "alt", "target", "media", "rel", "ping", "type"],
2239
+ "svg": [],
2240
+ "math": [],
2241
+ "table": ["summary"],
2242
+ "caption": [],
2243
+ "colgroup": ["span"],
2244
+ "col": ["span"],
2245
+ "tbody": [],
2246
+ "thead": [],
2247
+ "tfoot": [],
2248
+ "tr": [],
2249
+ "td": ["headers", "rowspan", "colspan"],
2250
+ "th": ["headers", "rowspan", "colspan", "scope"],
2251
+ "form": ["accept-charset", "action", "autocomplete", "enctype", "method", "name", "novalidate", "target"],
2252
+ "fieldset": ["disabled", "form", "name"],
2253
+ "legend": [],
2254
+ "label": ["form", "for"],
2255
+ "input": ["type", "accept", "alt", "autocomplete", "checked", "disabled", "form", "formaction", "formenctype", "formmethod", "formnovalidate", "formtarget", "height", "list", "max", "maxlength", "min", "multiple", "pattern", "placeholder", "readonly", "required", "size", "src", "step", "width", "files", "value"],
2256
+ "button": ["autofocus", "disabled", "form", "formaction", "formenctype", "formmethod", "formnovalidate", "formtarget", "name", "value", "type"],
2257
+ "select": ["autofocus", "disabled", "form", "multiple", "name", "size"],
2258
+ "datalist": [],
2259
+ "optgroup": ["disabled", "label"],
2260
+ "option": ["disabled", "selected", "label", "value"],
2261
+ "textarea": ["autofocus", "disabled", "form", "maxlength", "name", "placeholder", "readonly", "required", "rows", "cols", "wrap"],
2262
+ "keygen": ["autofocus", "challenge", "disabled", "form", "keytype", "name"],
2263
+ "output": ["for", "form", "name"],
2264
+ "progress": ["value", "max"],
2265
+ "meter": ["value", "min", "max", "low", "high", "optimum"],
2266
+ "details": ["open"],
2267
+ "summary": [],
2268
+ "command": ["type", "label", "icon", "disabled", "checked", "radiogroup", "command"],
2269
+ "menu": ["type", "label"],
2270
+ "dialog": ["open"]
2271
+ };
2272
+
2273
+ var allElements = Object.keys(attributeMap);
2274
+
2275
+ function hasType(token, type) {
2276
+ var tokenTypes = token.type.split('.');
2277
+ return type.split('.').every(function(type){
2278
+ return (tokenTypes.indexOf(type) !== -1);
2279
+ });
2280
+ }
2281
+
2282
+ function findTagName(session, pos) {
2283
+ var iterator = new TokenIterator(session, pos.row, pos.column);
2284
+ var token = iterator.getCurrentToken();
2285
+ if (!token || !hasType(token, 'tag') && !(hasType(token, 'text') && token.value.match('/'))){
2286
+ do {
2287
+ token = iterator.stepBackward();
2288
+ } while (token && (hasType(token, 'string') || hasType(token, 'operator') || hasType(token, 'attribute-name') || hasType(token, 'text')));
2289
+ }
2290
+ if (token && hasType(token, 'tag-name') && !iterator.stepBackward().value.match('/'))
2291
+ return token.value;
2292
+ }
2293
+
2294
+ var HtmlCompletions = function() {
2295
+
2296
+ };
2297
+
2298
+ (function() {
2299
+
2300
+ this.getCompletions = function(state, session, pos, prefix) {
2301
+ var token = session.getTokenAt(pos.row, pos.column);
2302
+
2303
+ if (!token)
2304
+ return [];
2305
+ if (hasType(token, "tag-name") || (token.value == '<' && hasType(token, "text")))
2306
+ return this.getTagCompletions(state, session, pos, prefix);
2307
+ if (hasType(token, 'text') || hasType(token, 'attribute-name'))
2308
+ return this.getAttributeCompetions(state, session, pos, prefix);
2309
+
2310
+ return [];
2311
+ };
2312
+
2313
+ this.getTagCompletions = function(state, session, pos, prefix) {
2314
+ var elements = allElements;
2315
+ if (prefix) {
2316
+ elements = elements.filter(function(element){
2317
+ return element.indexOf(prefix) === 0;
2318
+ });
2319
+ }
2320
+ return elements.map(function(element){
2321
+ return {
2322
+ value: element,
2323
+ meta: "tag"
2324
+ };
2325
+ });
2326
+ };
2327
+
2328
+ this.getAttributeCompetions = function(state, session, pos, prefix) {
2329
+ var tagName = findTagName(session, pos);
2330
+ if (!tagName)
2331
+ return [];
2332
+ var attributes = globalAttributes;
2333
+ if (tagName in attributeMap) {
2334
+ attributes = attributes.concat(attributeMap[tagName]);
2335
+ }
2336
+ if (prefix) {
2337
+ attributes = attributes.filter(function(attribute){
2338
+ return attribute.indexOf(prefix) === 0;
2339
+ });
2340
+ }
2341
+ return attributes.map(function(attribute){
2342
+ return {
2343
+ caption: attribute,
2344
+ snippet: attribute + '="$0"',
2345
+ meta: "attribute"
2346
+ };
2347
+ });
2348
+ };
2349
+
2350
+ }).call(HtmlCompletions.prototype);
2351
+
2352
+ exports.HtmlCompletions = HtmlCompletions;
2353
+ });
2354
+
2355
+ define('ace/mode/lua', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/lua_highlight_rules', 'ace/mode/folding/lua', 'ace/range', 'ace/worker/worker_client'], function(require, exports, module) {
2053
2356
 
2054
2357
 
2055
2358
  var oop = require("../lib/oop");
2056
2359
  var TextMode = require("./text").Mode;
2057
2360
  var Tokenizer = require("../tokenizer").Tokenizer;
2058
2361
  var LuaHighlightRules = require("./lua_highlight_rules").LuaHighlightRules;
2362
+ var LuaFoldMode = require("./folding/lua").FoldMode;
2059
2363
  var Range = require("../range").Range;
2364
+ var WorkerClient = require("../worker/worker_client").WorkerClient;
2060
2365
 
2061
2366
  var Mode = function() {
2062
- this.$tokenizer = new Tokenizer(new LuaHighlightRules().getRules());
2367
+ this.HighlightRules = LuaHighlightRules;
2368
+
2369
+ this.foldingRules = new LuaFoldMode();
2063
2370
  };
2064
2371
  oop.inherits(Mode, TextMode);
2065
2372
 
2066
2373
  (function() {
2374
+
2375
+ this.lineCommentStart = "--";
2376
+ this.blockComment = {start: "--[", end: "]--"};
2377
+
2067
2378
  var indentKeywords = {
2068
2379
  "function": 1,
2069
2380
  "then": 1,
@@ -2072,7 +2383,7 @@ oop.inherits(Mode, TextMode);
2072
2383
  "elseif": 1,
2073
2384
  "repeat": 1,
2074
2385
  "end": -1,
2075
- "until": -1,
2386
+ "until": -1
2076
2387
  };
2077
2388
  var outdentKeywords = [
2078
2389
  "else",
@@ -2083,9 +2394,7 @@ oop.inherits(Mode, TextMode);
2083
2394
 
2084
2395
  function getNetIndentLevel(tokens) {
2085
2396
  var level = 0;
2086
- // Support single-line blocks by decrementing the indent level if
2087
- // an ending token is found
2088
- for (var i in tokens){
2397
+ for (var i = 0; i < tokens.length; i++) {
2089
2398
  var token = tokens[i];
2090
2399
  if (token.type == "keyword") {
2091
2400
  if (token.value in indentKeywords) {
@@ -2097,8 +2406,6 @@ oop.inherits(Mode, TextMode);
2097
2406
  level --;
2098
2407
  }
2099
2408
  }
2100
- // Limit the level to +/- 1 since usually users only indent one level
2101
- // at a time regardless of the logical nesting level
2102
2409
  if (level < 0) {
2103
2410
  return -1;
2104
2411
  } else if (level > 0) {
@@ -2112,7 +2419,7 @@ oop.inherits(Mode, TextMode);
2112
2419
  var indent = this.$getIndent(line);
2113
2420
  var level = 0;
2114
2421
 
2115
- var tokenizedLine = this.$tokenizer.getLineTokens(line, state);
2422
+ var tokenizedLine = this.getTokenizer().getLineTokens(line, state);
2116
2423
  var tokens = tokenizedLine.tokens;
2117
2424
 
2118
2425
  if (state == "start") {
@@ -2121,7 +2428,6 @@ oop.inherits(Mode, TextMode);
2121
2428
  if (level > 0) {
2122
2429
  return indent + tab;
2123
2430
  } else if (level < 0 && indent.substr(indent.length - tab.length) == tab) {
2124
- // Don't do a next-line outdent if we're going to do a real outdent of this line
2125
2431
  if (!this.checkOutdent(state, line, "\n")) {
2126
2432
  return indent.substr(0, indent.length - tab.length);
2127
2433
  }
@@ -2136,7 +2442,7 @@ oop.inherits(Mode, TextMode);
2136
2442
  if (line.match(/^\s*[\)\}\]]$/))
2137
2443
  return true;
2138
2444
 
2139
- var tokens = this.$tokenizer.getLineTokens(line.trim(), state).tokens;
2445
+ var tokens = this.getTokenizer().getLineTokens(line.trim(), state).tokens;
2140
2446
 
2141
2447
  if (!tokens || !tokens.length)
2142
2448
  return false;
@@ -2147,42 +2453,54 @@ oop.inherits(Mode, TextMode);
2147
2453
  this.autoOutdent = function(state, session, row) {
2148
2454
  var prevLine = session.getLine(row - 1);
2149
2455
  var prevIndent = this.$getIndent(prevLine).length;
2150
- var prevTokens = this.$tokenizer.getLineTokens(prevLine, "start").tokens;
2456
+ var prevTokens = this.getTokenizer().getLineTokens(prevLine, "start").tokens;
2151
2457
  var tabLength = session.getTabString().length;
2152
2458
  var expectedIndent = prevIndent + tabLength * getNetIndentLevel(prevTokens);
2153
2459
  var curIndent = this.$getIndent(session.getLine(row)).length;
2154
2460
  if (curIndent < expectedIndent) {
2155
- // User already outdented //
2156
2461
  return;
2157
2462
  }
2158
2463
  session.outdentRows(new Range(row, 0, row + 2, 0));
2159
2464
  };
2160
2465
 
2466
+ this.createWorker = function(session) {
2467
+ var worker = new WorkerClient(["ace"], "ace/mode/lua_worker", "Worker");
2468
+ worker.attachToDocument(session.getDocument());
2469
+
2470
+ worker.on("error", function(e) {
2471
+ session.setAnnotations([e.data]);
2472
+ });
2473
+
2474
+ worker.on("ok", function(e) {
2475
+ session.clearAnnotations();
2476
+ });
2477
+
2478
+ return worker;
2479
+ };
2480
+
2481
+ this.$id = "ace/mode/lua";
2161
2482
  }).call(Mode.prototype);
2162
2483
 
2163
2484
  exports.Mode = Mode;
2164
2485
  });
2165
2486
 
2166
- define('ace/mode/lua_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
2487
+ define('ace/mode/lua_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
2167
2488
 
2168
2489
 
2169
2490
  var oop = require("../lib/oop");
2170
- var lang = require("../lib/lang");
2171
2491
  var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
2172
2492
 
2173
2493
  var LuaHighlightRules = function() {
2174
2494
 
2175
- var keywords = lang.arrayToMap(
2176
- ("break|do|else|elseif|end|for|function|if|in|local|repeat|"+
2177
- "return|then|until|while|or|and|not").split("|")
2495
+ var keywords = (
2496
+ "break|do|else|elseif|end|for|function|if|in|local|repeat|"+
2497
+ "return|then|until|while|or|and|not"
2178
2498
  );
2179
2499
 
2180
- var builtinConstants = lang.arrayToMap(
2181
- ("true|false|nil|_G|_VERSION").split("|")
2182
- );
2500
+ var builtinConstants = ("true|false|nil|_G|_VERSION");
2183
2501
 
2184
- var builtinFunctions = lang.arrayToMap(
2185
- ("string|xpcall|package|tostring|print|os|unpack|require|"+
2502
+ var functions = (
2503
+ "string|xpcall|package|tostring|print|os|unpack|require|"+
2186
2504
  "getfenv|setmetatable|next|assert|tonumber|io|rawequal|"+
2187
2505
  "collectgarbage|getmetatable|module|rawset|math|debug|"+
2188
2506
  "pcall|table|newproxy|type|coroutine|_G|select|gcinfo|"+
@@ -2201,27 +2519,26 @@ var LuaHighlightRules = function() {
2201
2519
  "gethook|setmetatable|setlocal|traceback|setfenv|getinfo|"+
2202
2520
  "setupvalue|getlocal|getregistry|getfenv|setn|insert|getn|"+
2203
2521
  "foreachi|maxn|foreach|concat|sort|remove|resume|yield|"+
2204
- "status|wrap|create|running").split("|")
2205
- );
2206
-
2207
- var stdLibaries = lang.arrayToMap(
2208
- ("string|package|os|io|math|debug|table|coroutine").split("|")
2209
- );
2210
-
2211
- var metatableMethods = lang.arrayToMap(
2212
- ("__add|__sub|__mod|__unm|__concat|__lt|__index|__call|__gc|__metatable|"+
2213
- "__mul|__div|__pow|__len|__eq|__le|__newindex|__tostring|__mode|__tonumber").split("|")
2522
+ "status|wrap|create|running|"+
2523
+ "__add|__sub|__mod|__unm|__concat|__lt|__index|__call|__gc|__metatable|"+
2524
+ "__mul|__div|__pow|__len|__eq|__le|__newindex|__tostring|__mode|__tonumber"
2214
2525
  );
2215
2526
 
2216
- var futureReserved = lang.arrayToMap(
2217
- ("").split("|")
2218
- );
2219
-
2220
- var deprecatedIn5152 = lang.arrayToMap(
2221
- ("setn|foreach|foreachi|gcinfo|log10|maxn").split("|")
2222
- );
2527
+ var stdLibaries = ("string|package|os|io|math|debug|table|coroutine");
2528
+
2529
+ var futureReserved = "";
2223
2530
 
2224
- var strPre = "";
2531
+ var deprecatedIn5152 = ("setn|foreach|foreachi|gcinfo|log10|maxn");
2532
+
2533
+ var keywordMapper = this.createKeywordMapper({
2534
+ "keyword": keywords,
2535
+ "support.function": functions,
2536
+ "invalid.deprecated": deprecatedIn5152,
2537
+ "constant.library": stdLibaries,
2538
+ "constant.language": builtinConstants,
2539
+ "invalid.illegal": futureReserved,
2540
+ "variable.language": "this"
2541
+ }, "identifier");
2225
2542
 
2226
2543
  var decimalInteger = "(?:(?:[1-9]\\d*)|(?:0))";
2227
2544
  var hexInteger = "(?:0[xX][\\dA-Fa-f]+)";
@@ -2231,151 +2548,72 @@ var LuaHighlightRules = function() {
2231
2548
  var intPart = "(?:\\d+)";
2232
2549
  var pointFloat = "(?:(?:" + intPart + "?" + fraction + ")|(?:" + intPart + "\\.))";
2233
2550
  var floatNumber = "(?:" + pointFloat + ")";
2234
-
2235
- var comment_stack = [];
2236
-
2237
- this.$rules = {
2238
- "start" :
2239
2551
 
2240
-
2241
- // bracketed comments
2242
- [{
2243
- token : "comment", // --[[ comment
2244
- regex : strPre + '\\-\\-\\[\\[.*\\]\\]'
2245
- }, {
2246
- token : "comment", // --[=[ comment
2247
- regex : strPre + '\\-\\-\\[\\=\\[.*\\]\\=\\]'
2248
- }, {
2249
- token : "comment", // --[==[ comment
2250
- regex : strPre + '\\-\\-\\[\\={2}\\[.*\\]\\={2}\\]'
2251
- }, {
2252
- token : "comment", // --[===[ comment
2253
- regex : strPre + '\\-\\-\\[\\={3}\\[.*\\]\\={3}\\]'
2254
- }, {
2255
- token : "comment", // --[====[ comment
2256
- regex : strPre + '\\-\\-\\[\\={4}\\[.*\\]\\={4}\\]'
2257
- }, {
2258
- token : "comment", // --[====+[ comment
2259
- regex : strPre + '\\-\\-\\[\\={5}\\=*\\[.*\\]\\={5}\\=*\\]'
2260
- },
2261
-
2262
- // multiline bracketed comments
2263
- {
2264
- token : "comment", // --[[ comment
2265
- regex : strPre + '\\-\\-\\[\\[.*$',
2266
- merge : true,
2267
- next : "qcomment"
2268
- }, {
2269
- token : "comment", // --[=[ comment
2270
- regex : strPre + '\\-\\-\\[\\=\\[.*$',
2271
- merge : true,
2272
- next : "qcomment1"
2273
- }, {
2274
- token : "comment", // --[==[ comment
2275
- regex : strPre + '\\-\\-\\[\\={2}\\[.*$',
2276
- merge : true,
2277
- next : "qcomment2"
2278
- }, {
2279
- token : "comment", // --[===[ comment
2280
- regex : strPre + '\\-\\-\\[\\={3}\\[.*$',
2281
- merge : true,
2282
- next : "qcomment3"
2283
- }, {
2284
- token : "comment", // --[====[ comment
2285
- regex : strPre + '\\-\\-\\[\\={4}\\[.*$',
2286
- merge : true,
2287
- next : "qcomment4"
2288
- }, {
2289
- token : function(value){ // --[====+[ comment
2290
- // WARNING: EXTREMELY SLOW, but this is the only way to circumvent the
2291
- // limits imposed by the current automaton.
2292
- // I've never personally seen any practical code where 5 or more '='s are
2293
- // used for string or commenting, so this will rarely be invoked.
2294
- var pattern = /\-\-\[(\=+)\[/, match;
2295
- // you can never be too paranoid ;)
2296
- if ((match = pattern.exec(value)) != null && (match = match[1]) != undefined)
2297
- comment_stack.push(match.length);
2298
-
2552
+ this.$rules = {
2553
+ "start" : [{
2554
+ stateName: "bracketedComment",
2555
+ onMatch : function(value, currentState, stack){
2556
+ stack.unshift(this.next, value.length - 2, currentState);
2299
2557
  return "comment";
2300
2558
  },
2301
- regex : strPre + '\\-\\-\\[\\={5}\\=*\\[.*$',
2302
- merge : true,
2303
- next : "qcomment5"
2559
+ regex : /\-\-\[=*\[/,
2560
+ next : [
2561
+ {
2562
+ onMatch : function(value, currentState, stack) {
2563
+ if (value.length == stack[1]) {
2564
+ stack.shift();
2565
+ stack.shift();
2566
+ this.next = stack.shift();
2567
+ } else {
2568
+ this.next = "";
2569
+ }
2570
+ return "comment";
2571
+ },
2572
+ regex : /\]=*\]/,
2573
+ next : "start"
2574
+ }, {
2575
+ defaultToken : "comment"
2576
+ }
2577
+ ]
2304
2578
  },
2305
-
2306
- // single line comments
2579
+
2307
2580
  {
2308
2581
  token : "comment",
2309
2582
  regex : "\\-\\-.*$"
2310
- },
2311
-
2312
- // bracketed strings
2313
- {
2314
- token : "string", // [[ string
2315
- regex : strPre + '\\[\\[.*\\]\\]'
2316
- }, {
2317
- token : "string", // [=[ string
2318
- regex : strPre + '\\[\\=\\[.*\\]\\=\\]'
2319
- }, {
2320
- token : "string", // [==[ string
2321
- regex : strPre + '\\[\\={2}\\[.*\\]\\={2}\\]'
2322
- }, {
2323
- token : "string", // [===[ string
2324
- regex : strPre + '\\[\\={3}\\[.*\\]\\={3}\\]'
2325
- }, {
2326
- token : "string", // [====[ string
2327
- regex : strPre + '\\[\\={4}\\[.*\\]\\={4}\\]'
2328
- }, {
2329
- token : "string", // [====+[ string
2330
- regex : strPre + '\\[\\={5}\\=*\\[.*\\]\\={5}\\=*\\]'
2331
2583
  },
2332
-
2333
- // multiline bracketed strings
2334
2584
  {
2335
- token : "string", // [[ string
2336
- regex : strPre + '\\[\\[.*$',
2337
- merge : true,
2338
- next : "qstring"
2339
- }, {
2340
- token : "string", // [=[ string
2341
- regex : strPre + '\\[\\=\\[.*$',
2342
- merge : true,
2343
- next : "qstring1"
2344
- }, {
2345
- token : "string", // [==[ string
2346
- regex : strPre + '\\[\\={2}\\[.*$',
2347
- merge : true,
2348
- next : "qstring2"
2349
- }, {
2350
- token : "string", // [===[ string
2351
- regex : strPre + '\\[\\={3}\\[.*$',
2352
- merge : true,
2353
- next : "qstring3"
2354
- }, {
2355
- token : "string", // [====[ string
2356
- regex : strPre + '\\[\\={4}\\[.*$',
2357
- merge : true,
2358
- next : "qstring4"
2359
- }, {
2360
- token : function(value){ // --[====+[ string
2361
- // WARNING: EXTREMELY SLOW, see above.
2362
- var pattern = /\[(\=+)\[/, match;
2363
- if ((match = pattern.exec(value)) != null && (match = match[1]) != undefined)
2364
- comment_stack.push(match.length);
2365
-
2366
- return "string";
2585
+ stateName: "bracketedString",
2586
+ onMatch : function(value, currentState, stack){
2587
+ stack.unshift(this.next, value.length, currentState);
2588
+ return "comment";
2367
2589
  },
2368
- regex : strPre + '\\[\\={5}\\=*\\[.*$',
2369
- merge : true,
2370
- next : "qstring5"
2371
- },
2372
-
2590
+ regex : /\[=*\[/,
2591
+ next : [
2592
+ {
2593
+ onMatch : function(value, currentState, stack) {
2594
+ if (value.length == stack[1]) {
2595
+ stack.shift();
2596
+ stack.shift();
2597
+ this.next = stack.shift();
2598
+ } else {
2599
+ this.next = "";
2600
+ }
2601
+ return "comment";
2602
+ },
2603
+
2604
+ regex : /\]=*\]/,
2605
+ next : "start"
2606
+ }, {
2607
+ defaultToken : "comment"
2608
+ }
2609
+ ]
2610
+ },
2373
2611
  {
2374
2612
  token : "string", // " string
2375
- regex : strPre + '"(?:[^\\\\]|\\\\.)*?"'
2613
+ regex : '"(?:[^\\\\]|\\\\.)*?"'
2376
2614
  }, {
2377
2615
  token : "string", // ' string
2378
- regex : strPre + "'(?:[^\\\\]|\\\\.)*?'"
2616
+ regex : "'(?:[^\\\\]|\\\\.)*?'"
2379
2617
  }, {
2380
2618
  token : "constant.numeric", // float
2381
2619
  regex : floatNumber
@@ -2383,24 +2621,7 @@ var LuaHighlightRules = function() {
2383
2621
  token : "constant.numeric", // integer
2384
2622
  regex : integer + "\\b"
2385
2623
  }, {
2386
- token : function(value) {
2387
- if (keywords.hasOwnProperty(value))
2388
- return "keyword";
2389
- else if (builtinConstants.hasOwnProperty(value))
2390
- return "constant.language";
2391
- else if (futureReserved.hasOwnProperty(value))
2392
- return "invalid.illegal";
2393
- else if (stdLibaries.hasOwnProperty(value))
2394
- return "constant.library";
2395
- else if (deprecatedIn5152.hasOwnProperty(value))
2396
- return "invalid.deprecated";
2397
- else if (builtinFunctions.hasOwnProperty(value))
2398
- return "support.function";
2399
- else if (metatableMethods.hasOwnProperty(value))
2400
- return "support.function";
2401
- else
2402
- return "identifier";
2403
- },
2624
+ token : keywordMapper,
2404
2625
  regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b"
2405
2626
  }, {
2406
2627
  token : "keyword.operator",
@@ -2413,155 +2634,151 @@ var LuaHighlightRules = function() {
2413
2634
  regex : "[\\]\\)\\}]"
2414
2635
  }, {
2415
2636
  token : "text",
2416
- regex : "\\s+"
2417
- } ],
2418
-
2419
- "qcomment": [ {
2420
- token : "comment",
2421
- regex : "(?:[^\\\\]|\\\\.)*?\\]\\]",
2422
- next : "start"
2423
- }, {
2424
- token : "comment",
2425
- merge : true,
2426
- regex : '.+'
2427
- } ],
2428
- "qcomment1": [ {
2429
- token : "comment",
2430
- regex : "(?:[^\\\\]|\\\\.)*?\\]\\=\\]",
2431
- next : "start"
2432
- }, {
2433
- token : "comment",
2434
- merge : true,
2435
- regex : '.+'
2436
- } ],
2437
- "qcomment2": [ {
2438
- token : "comment",
2439
- regex : "(?:[^\\\\]|\\\\.)*?\\]\\={2}\\]",
2440
- next : "start"
2441
- }, {
2442
- token : "comment",
2443
- merge : true,
2444
- regex : '.+'
2445
- } ],
2446
- "qcomment3": [ {
2447
- token : "comment",
2448
- regex : "(?:[^\\\\]|\\\\.)*?\\]\\={3}\\]",
2449
- next : "start"
2450
- }, {
2451
- token : "comment",
2452
- merge : true,
2453
- regex : '.+'
2454
- } ],
2455
- "qcomment4": [ {
2456
- token : "comment",
2457
- regex : "(?:[^\\\\]|\\\\.)*?\\]\\={4}\\]",
2458
- next : "start"
2459
- }, {
2460
- token : "comment",
2461
- merge : true,
2462
- regex : '.+'
2463
- } ],
2464
- "qcomment5": [ {
2465
- token : function(value){
2466
- // very hackish, mutates the qcomment5 field on the fly.
2467
- var pattern = /\](\=+)\]/, rule = this.rules.qcomment5[0], match;
2468
- rule.next = "start";
2469
- if ((match = pattern.exec(value)) != null && (match = match[1]) != undefined){
2470
- var found = match.length, expected;
2471
- if ((expected = comment_stack.pop()) != found){
2472
- comment_stack.push(expected);
2473
- rule.next = "qcomment5";
2474
- }
2475
- }
2476
-
2477
- return "comment";
2478
- },
2479
- regex : "(?:[^\\\\]|\\\\.)*?\\]\\={5}\\=*\\]",
2480
- next : "start"
2481
- }, {
2482
- token : "comment",
2483
- merge : true,
2484
- regex : '.+'
2485
- } ],
2486
-
2487
- "qstring": [ {
2488
- token : "string",
2489
- regex : "(?:[^\\\\]|\\\\.)*?\\]\\]",
2490
- next : "start"
2491
- }, {
2492
- token : "string",
2493
- merge : true,
2494
- regex : '.+'
2495
- } ],
2496
- "qstring1": [ {
2497
- token : "string",
2498
- regex : "(?:[^\\\\]|\\\\.)*?\\]\\=\\]",
2499
- next : "start"
2500
- }, {
2501
- token : "string",
2502
- merge : true,
2503
- regex : '.+'
2504
- } ],
2505
- "qstring2": [ {
2506
- token : "string",
2507
- regex : "(?:[^\\\\]|\\\\.)*?\\]\\={2}\\]",
2508
- next : "start"
2509
- }, {
2510
- token : "string",
2511
- merge : true,
2512
- regex : '.+'
2513
- } ],
2514
- "qstring3": [ {
2515
- token : "string",
2516
- regex : "(?:[^\\\\]|\\\\.)*?\\]\\={3}\\]",
2517
- next : "start"
2518
- }, {
2519
- token : "string",
2520
- merge : true,
2521
- regex : '.+'
2522
- } ],
2523
- "qstring4": [ {
2524
- token : "string",
2525
- regex : "(?:[^\\\\]|\\\\.)*?\\]\\={4}\\]",
2526
- next : "start"
2527
- }, {
2528
- token : "string",
2529
- merge : true,
2530
- regex : '.+'
2531
- } ],
2532
- "qstring5": [ {
2533
- token : function(value){
2534
- // very hackish, mutates the qstring5 field on the fly.
2535
- var pattern = /\](\=+)\]/, rule = this.rules.qstring5[0], match;
2536
- rule.next = "start";
2537
- if ((match = pattern.exec(value)) != null && (match = match[1]) != undefined){
2538
- var found = match.length, expected;
2539
- if ((expected = comment_stack.pop()) != found){
2540
- comment_stack.push(expected);
2541
- rule.next = "qstring5";
2542
- }
2543
- }
2544
-
2545
- return "string";
2546
- },
2547
- regex : "(?:[^\\\\]|\\\\.)*?\\]\\={5}\\=*\\]",
2548
- next : "start"
2549
- }, {
2550
- token : "string",
2551
- merge : true,
2552
- regex : '.+'
2637
+ regex : "\\s+|\\w+"
2553
2638
  } ]
2554
-
2555
2639
  };
2556
-
2640
+
2641
+ this.normalizeRules();
2557
2642
  }
2558
2643
 
2559
2644
  oop.inherits(LuaHighlightRules, TextHighlightRules);
2560
2645
 
2561
2646
  exports.LuaHighlightRules = LuaHighlightRules;
2562
2647
  });
2563
- // LuaPage implements the LuaPage markup as described by the Kepler Project's CGILua
2564
- // documentation: http://keplerproject.github.com/cgilua/manual.html#templates
2648
+
2649
+ define('ace/mode/folding/lua', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range', 'ace/token_iterator'], function(require, exports, module) {
2650
+
2651
+
2652
+ var oop = require("../../lib/oop");
2653
+ var BaseFoldMode = require("./fold_mode").FoldMode;
2654
+ var Range = require("../../range").Range;
2655
+ var TokenIterator = require("../../token_iterator").TokenIterator;
2656
+
2657
+
2658
+ var FoldMode = exports.FoldMode = function() {};
2659
+
2660
+ oop.inherits(FoldMode, BaseFoldMode);
2661
+
2662
+ (function() {
2663
+
2664
+ this.foldingStartMarker = /\b(function|then|do|repeat)\b|{\s*$|(\[=*\[)/;
2665
+ this.foldingStopMarker = /\bend\b|^\s*}|\]=*\]/;
2666
+
2667
+ this.getFoldWidget = function(session, foldStyle, row) {
2668
+ var line = session.getLine(row);
2669
+ var isStart = this.foldingStartMarker.test(line);
2670
+ var isEnd = this.foldingStopMarker.test(line);
2671
+
2672
+ if (isStart && !isEnd) {
2673
+ var match = line.match(this.foldingStartMarker);
2674
+ if (match[1] == "then" && /\belseif\b/.test(line))
2675
+ return;
2676
+ if (match[1]) {
2677
+ if (session.getTokenAt(row, match.index + 1).type === "keyword")
2678
+ return "start";
2679
+ } else if (match[2]) {
2680
+ var type = session.bgTokenizer.getState(row) || "";
2681
+ if (type[0] == "bracketedComment" || type[0] == "bracketedString")
2682
+ return "start";
2683
+ } else {
2684
+ return "start";
2685
+ }
2686
+ }
2687
+ if (foldStyle != "markbeginend" || !isEnd || isStart && isEnd)
2688
+ return "";
2689
+
2690
+ var match = line.match(this.foldingStopMarker);
2691
+ if (match[0] === "end") {
2692
+ if (session.getTokenAt(row, match.index + 1).type === "keyword")
2693
+ return "end";
2694
+ } else if (match[0][0] === "]") {
2695
+ var type = session.bgTokenizer.getState(row - 1) || "";
2696
+ if (type[0] == "bracketedComment" || type[0] == "bracketedString")
2697
+ return "end";
2698
+ } else
2699
+ return "end";
2700
+ };
2701
+
2702
+ this.getFoldWidgetRange = function(session, foldStyle, row) {
2703
+ var line = session.doc.getLine(row);
2704
+ var match = this.foldingStartMarker.exec(line);
2705
+ if (match) {
2706
+ if (match[1])
2707
+ return this.luaBlock(session, row, match.index + 1);
2708
+
2709
+ if (match[2])
2710
+ return session.getCommentFoldRange(row, match.index + 1);
2711
+
2712
+ return this.openingBracketBlock(session, "{", row, match.index);
2713
+ }
2714
+
2715
+ var match = this.foldingStopMarker.exec(line);
2716
+ if (match) {
2717
+ if (match[0] === "end") {
2718
+ if (session.getTokenAt(row, match.index + 1).type === "keyword")
2719
+ return this.luaBlock(session, row, match.index + 1);
2720
+ }
2721
+
2722
+ if (match[0][0] === "]")
2723
+ return session.getCommentFoldRange(row, match.index + 1);
2724
+
2725
+ return this.closingBracketBlock(session, "}", row, match.index + match[0].length);
2726
+ }
2727
+ };
2728
+
2729
+ this.luaBlock = function(session, row, column) {
2730
+ var stream = new TokenIterator(session, row, column);
2731
+ var indentKeywords = {
2732
+ "function": 1,
2733
+ "do": 1,
2734
+ "then": 1,
2735
+ "elseif": -1,
2736
+ "end": -1,
2737
+ "repeat": 1,
2738
+ "until": -1
2739
+ };
2740
+
2741
+ var token = stream.getCurrentToken();
2742
+ if (!token || token.type != "keyword")
2743
+ return;
2744
+
2745
+ var val = token.value;
2746
+ var stack = [val];
2747
+ var dir = indentKeywords[val];
2748
+
2749
+ if (!dir)
2750
+ return;
2751
+
2752
+ var startColumn = dir === -1 ? stream.getCurrentTokenColumn() : session.getLine(row).length;
2753
+ var startRow = row;
2754
+
2755
+ stream.step = dir === -1 ? stream.stepBackward : stream.stepForward;
2756
+ while(token = stream.step()) {
2757
+ if (token.type !== "keyword")
2758
+ continue;
2759
+ var level = dir * indentKeywords[token.value];
2760
+
2761
+ if (level > 0) {
2762
+ stack.unshift(token.value);
2763
+ } else if (level <= 0) {
2764
+ stack.shift();
2765
+ if (!stack.length && token.value != "elseif")
2766
+ break;
2767
+ if (level === 0)
2768
+ stack.unshift(token.value);
2769
+ }
2770
+ }
2771
+
2772
+ var row = stream.getCurrentTokenRow();
2773
+ if (dir === -1)
2774
+ return new Range(row, session.getLine(row).length, startRow, startColumn);
2775
+ else
2776
+ return new Range(startRow, startColumn, row, stream.getCurrentTokenColumn());
2777
+ };
2778
+
2779
+ }).call(FoldMode.prototype);
2780
+
2781
+ });
2565
2782
  define('ace/mode/luapage_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/html_highlight_rules', 'ace/mode/lua_highlight_rules'], function(require, exports, module) {
2566
2783
 
2567
2784
 
@@ -2570,31 +2787,38 @@ var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules;
2570
2787
  var LuaHighlightRules = require("./lua_highlight_rules").LuaHighlightRules;
2571
2788
 
2572
2789
  var LuaPageHighlightRules = function() {
2573
- this.$rules = new HtmlHighlightRules().getRules();
2574
-
2575
- for (var i in this.$rules) {
2576
- this.$rules[i].unshift({
2790
+ HtmlHighlightRules.call(this);
2791
+
2792
+ var startRules = [
2793
+ {
2577
2794
  token: "keyword",
2578
2795
  regex: "<\\%\\=?",
2579
- next: "lua-start"
2796
+ push: "lua-start"
2580
2797
  }, {
2581
2798
  token: "keyword",
2582
2799
  regex: "<\\?lua\\=?",
2583
- next: "lua-start"
2584
- });
2585
- }
2586
- this.embedRules(LuaHighlightRules, "lua-", [
2800
+ push: "lua-start"
2801
+ }
2802
+ ];
2803
+
2804
+ var endRules = [
2587
2805
  {
2588
2806
  token: "keyword",
2589
2807
  regex: "\\%>",
2590
- next: "start"
2591
- },
2592
- {
2808
+ next: "pop"
2809
+ }, {
2593
2810
  token: "keyword",
2594
2811
  regex: "\\?>",
2595
- next: "start"
2812
+ next: "pop"
2596
2813
  }
2597
- ]);
2814
+ ];
2815
+
2816
+ this.embedRules(LuaHighlightRules, "lua-", endRules, ["start"]);
2817
+
2818
+ for (var key in this.$rules)
2819
+ this.$rules[key].unshift.apply(this.$rules[key], startRules);
2820
+
2821
+ this.normalizeRules();
2598
2822
  };
2599
2823
 
2600
2824
  oop.inherits(LuaPageHighlightRules, HtmlHighlightRules);