ace-rails-ap 2.0.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
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);