ace-rails-ap 4.3 → 4.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (249) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -2
  3. data/ace-rails-ap.gemspec +0 -2
  4. data/lib/ace/rails/version.rb +1 -1
  5. data/vendor/assets/javascripts/ace/ace.js +659 -1137
  6. data/vendor/assets/javascripts/ace/ext-beautify.js +5 -2
  7. data/vendor/assets/javascripts/ace/ext-code_lens.js +238 -0
  8. data/vendor/assets/javascripts/ace/ext-emmet.js +36 -28
  9. data/vendor/assets/javascripts/ace/ext-language_tools.js +63 -48
  10. data/vendor/assets/javascripts/ace/ext-modelist.js +12 -6
  11. data/vendor/assets/javascripts/ace/ext-options.js +46 -19
  12. data/vendor/assets/javascripts/ace/ext-prompt.js +57 -38
  13. data/vendor/assets/javascripts/ace/ext-settings_menu.js +46 -19
  14. data/vendor/assets/javascripts/ace/ext-spellcheck.js +0 -1
  15. data/vendor/assets/javascripts/ace/ext-themelist.js +2 -1
  16. data/vendor/assets/javascripts/ace/keybinding-emacs.js +21 -22
  17. data/vendor/assets/javascripts/ace/keybinding-sublime.js +2 -5
  18. data/vendor/assets/javascripts/ace/keybinding-vim.js +45 -9
  19. data/vendor/assets/javascripts/ace/keybinding-vscode.js +262 -0
  20. data/vendor/assets/javascripts/ace/mode-abc.js +3 -0
  21. data/vendor/assets/javascripts/ace/mode-actionscript.js +1 -0
  22. data/vendor/assets/javascripts/ace/mode-alda.js +311 -0
  23. data/vendor/assets/javascripts/ace/mode-asl.js +17 -16
  24. data/vendor/assets/javascripts/ace/mode-c_cpp.js +1 -0
  25. data/vendor/assets/javascripts/ace/mode-clojure.js +1 -0
  26. data/vendor/assets/javascripts/ace/mode-coffee.js +1 -0
  27. data/vendor/assets/javascripts/ace/mode-coldfusion.js +3 -0
  28. data/vendor/assets/javascripts/ace/mode-csound_document.js +40 -5
  29. data/vendor/assets/javascripts/ace/mode-csound_orchestra.js +37 -5
  30. data/vendor/assets/javascripts/ace/mode-csound_score.js +1 -0
  31. data/vendor/assets/javascripts/ace/mode-css.js +1 -0
  32. data/vendor/assets/javascripts/ace/mode-curly.js +3 -0
  33. data/vendor/assets/javascripts/ace/mode-d.js +1 -1
  34. data/vendor/assets/javascripts/ace/mode-dart.js +2 -0
  35. data/vendor/assets/javascripts/ace/mode-diff.js +1 -0
  36. data/vendor/assets/javascripts/ace/mode-django.js +4 -0
  37. data/vendor/assets/javascripts/ace/mode-dockerfile.js +1 -0
  38. data/vendor/assets/javascripts/ace/mode-drools.js +1 -0
  39. data/vendor/assets/javascripts/ace/mode-edifact.js +1 -0
  40. data/vendor/assets/javascripts/ace/mode-ejs.js +673 -165
  41. data/vendor/assets/javascripts/ace/mode-erlang.js +1 -0
  42. data/vendor/assets/javascripts/ace/mode-fsl.js +1 -0
  43. data/vendor/assets/javascripts/ace/mode-glsl.js +1 -0
  44. data/vendor/assets/javascripts/ace/mode-gobstones.js +2 -0
  45. data/vendor/assets/javascripts/ace/mode-graphqlschema.js +1 -0
  46. data/vendor/assets/javascripts/ace/mode-groovy.js +1 -0
  47. data/vendor/assets/javascripts/ace/mode-haml.js +419 -104
  48. data/vendor/assets/javascripts/ace/mode-handlebars.js +3 -0
  49. data/vendor/assets/javascripts/ace/mode-haskell.js +1 -0
  50. data/vendor/assets/javascripts/ace/mode-html.js +3 -0
  51. data/vendor/assets/javascripts/ace/mode-html_elixir.js +3 -0
  52. data/vendor/assets/javascripts/ace/mode-html_ruby.js +673 -165
  53. data/vendor/assets/javascripts/ace/mode-io.js +1 -0
  54. data/vendor/assets/javascripts/ace/mode-java.js +2 -0
  55. data/vendor/assets/javascripts/ace/mode-javascript.js +1 -0
  56. data/vendor/assets/javascripts/ace/mode-json.js +3 -0
  57. data/vendor/assets/javascripts/ace/mode-json5.js +360 -0
  58. data/vendor/assets/javascripts/ace/mode-jsoniq.js +1 -0
  59. data/vendor/assets/javascripts/ace/mode-jsp.js +1 -0
  60. data/vendor/assets/javascripts/ace/mode-kotlin.js +2 -0
  61. data/vendor/assets/javascripts/ace/mode-liquid.js +4 -0
  62. data/vendor/assets/javascripts/ace/mode-lsl.js +1 -0
  63. data/vendor/assets/javascripts/ace/mode-lua.js +1 -0
  64. data/vendor/assets/javascripts/ace/mode-luapage.js +4 -0
  65. data/vendor/assets/javascripts/ace/mode-makefile.js +1 -0
  66. data/vendor/assets/javascripts/ace/mode-markdown.js +5 -0
  67. data/vendor/assets/javascripts/ace/mode-maze.js +1 -0
  68. data/vendor/assets/javascripts/ace/mode-mediawiki.js +592 -0
  69. data/vendor/assets/javascripts/ace/mode-nix.js +1 -0
  70. data/vendor/assets/javascripts/ace/mode-nsis.js +1 -1
  71. data/vendor/assets/javascripts/ace/mode-nunjucks.js +2698 -0
  72. data/vendor/assets/javascripts/ace/mode-perl.js +1 -0
  73. data/vendor/assets/javascripts/ace/mode-pgsql.js +2 -2
  74. data/vendor/assets/javascripts/ace/mode-php.js +4 -0
  75. data/vendor/assets/javascripts/ace/mode-php_laravel_blade.js +4 -0
  76. data/vendor/assets/javascripts/ace/mode-prisma.js +489 -0
  77. data/vendor/assets/javascripts/ace/mode-protobuf.js +1 -0
  78. data/vendor/assets/javascripts/ace/mode-puppet.js +5 -6
  79. data/vendor/assets/javascripts/ace/mode-python.js +3 -2
  80. data/vendor/assets/javascripts/ace/mode-qml.js +381 -0
  81. data/vendor/assets/javascripts/ace/mode-r.js +1 -0
  82. data/vendor/assets/javascripts/ace/mode-razor.js +4 -0
  83. data/vendor/assets/javascripts/ace/mode-rhtml.js +3 -0
  84. data/vendor/assets/javascripts/ace/mode-rst.js +1 -0
  85. data/vendor/assets/javascripts/ace/mode-ruby.js +670 -165
  86. data/vendor/assets/javascripts/ace/mode-rust.js +1 -1
  87. data/vendor/assets/javascripts/ace/mode-scala.js +1 -0
  88. data/vendor/assets/javascripts/ace/mode-sh.js +1 -0
  89. data/vendor/assets/javascripts/ace/mode-sjs.js +1 -0
  90. data/vendor/assets/javascripts/ace/mode-slim.js +708 -110
  91. data/vendor/assets/javascripts/ace/mode-smarty.js +3 -0
  92. data/vendor/assets/javascripts/ace/mode-snippets.js +1 -0
  93. data/vendor/assets/javascripts/ace/mode-soy_template.js +3 -0
  94. data/vendor/assets/javascripts/ace/mode-sql.js +1 -0
  95. data/vendor/assets/javascripts/ace/mode-sqlserver.js +2 -1
  96. data/vendor/assets/javascripts/ace/mode-svg.js +1 -0
  97. data/vendor/assets/javascripts/ace/mode-swift.js +6 -0
  98. data/vendor/assets/javascripts/ace/mode-tcl.js +1 -0
  99. data/vendor/assets/javascripts/ace/mode-terraform.js +10 -7
  100. data/vendor/assets/javascripts/ace/mode-tex.js +1 -0
  101. data/vendor/assets/javascripts/ace/mode-textile.js +1 -0
  102. data/vendor/assets/javascripts/ace/mode-tsx.js +1 -0
  103. data/vendor/assets/javascripts/ace/mode-twig.js +3 -0
  104. data/vendor/assets/javascripts/ace/mode-typescript.js +1 -0
  105. data/vendor/assets/javascripts/ace/mode-vala.js +1 -0
  106. data/vendor/assets/javascripts/ace/mode-vbscript.js +444 -15
  107. data/vendor/assets/javascripts/ace/mode-velocity.js +4 -0
  108. data/vendor/assets/javascripts/ace/mode-vhdl.js +5 -6
  109. data/vendor/assets/javascripts/ace/mode-visualforce.js +3 -0
  110. data/vendor/assets/javascripts/ace/mode-wollok.js +2 -0
  111. data/vendor/assets/javascripts/ace/mode-xquery.js +1 -0
  112. data/vendor/assets/javascripts/ace/snippets/abap.js +1 -6
  113. data/vendor/assets/javascripts/ace/snippets/ada.js +1 -6
  114. data/vendor/assets/javascripts/ace/snippets/alda.js +9 -0
  115. data/vendor/assets/javascripts/ace/snippets/apache_conf.js +1 -6
  116. data/vendor/assets/javascripts/ace/snippets/apex.js +1 -6
  117. data/vendor/assets/javascripts/ace/snippets/applescript.js +1 -6
  118. data/vendor/assets/javascripts/ace/snippets/aql.js +1 -6
  119. data/vendor/assets/javascripts/ace/snippets/asciidoc.js +1 -6
  120. data/vendor/assets/javascripts/ace/snippets/asl.js +1 -5
  121. data/vendor/assets/javascripts/ace/snippets/assembly_x86.js +1 -6
  122. data/vendor/assets/javascripts/ace/snippets/autohotkey.js +1 -6
  123. data/vendor/assets/javascripts/ace/snippets/batchfile.js +1 -6
  124. data/vendor/assets/javascripts/ace/snippets/c9search.js +1 -6
  125. data/vendor/assets/javascripts/ace/snippets/cirru.js +1 -6
  126. data/vendor/assets/javascripts/ace/snippets/cobol.js +1 -6
  127. data/vendor/assets/javascripts/ace/snippets/coldfusion.js +1 -6
  128. data/vendor/assets/javascripts/ace/snippets/crystal.js +1 -6
  129. data/vendor/assets/javascripts/ace/snippets/csharp.js +1 -6
  130. data/vendor/assets/javascripts/ace/snippets/csound_score.js +1 -6
  131. data/vendor/assets/javascripts/ace/snippets/csp.js +1 -6
  132. data/vendor/assets/javascripts/ace/snippets/curly.js +1 -6
  133. data/vendor/assets/javascripts/ace/snippets/d.js +1 -6
  134. data/vendor/assets/javascripts/ace/snippets/dockerfile.js +1 -6
  135. data/vendor/assets/javascripts/ace/snippets/dot.js +1 -6
  136. data/vendor/assets/javascripts/ace/snippets/eiffel.js +1 -6
  137. data/vendor/assets/javascripts/ace/snippets/ejs.js +1 -6
  138. data/vendor/assets/javascripts/ace/snippets/elixir.js +1 -6
  139. data/vendor/assets/javascripts/ace/snippets/elm.js +1 -6
  140. data/vendor/assets/javascripts/ace/snippets/forth.js +1 -6
  141. data/vendor/assets/javascripts/ace/snippets/fortran.js +1 -6
  142. data/vendor/assets/javascripts/ace/snippets/fsharp.js +1 -6
  143. data/vendor/assets/javascripts/ace/snippets/ftl.js +1 -6
  144. data/vendor/assets/javascripts/ace/snippets/gcode.js +1 -6
  145. data/vendor/assets/javascripts/ace/snippets/gherkin.js +1 -6
  146. data/vendor/assets/javascripts/ace/snippets/gitignore.js +1 -6
  147. data/vendor/assets/javascripts/ace/snippets/glsl.js +1 -6
  148. data/vendor/assets/javascripts/ace/snippets/golang.js +1 -6
  149. data/vendor/assets/javascripts/ace/snippets/groovy.js +1 -6
  150. data/vendor/assets/javascripts/ace/snippets/handlebars.js +1 -6
  151. data/vendor/assets/javascripts/ace/snippets/haskell_cabal.js +1 -6
  152. data/vendor/assets/javascripts/ace/snippets/haxe.js +1 -6
  153. data/vendor/assets/javascripts/ace/snippets/hjson.js +1 -6
  154. data/vendor/assets/javascripts/ace/snippets/html_elixir.js +1 -6
  155. data/vendor/assets/javascripts/ace/snippets/html_ruby.js +1 -6
  156. data/vendor/assets/javascripts/ace/snippets/ini.js +1 -6
  157. data/vendor/assets/javascripts/ace/snippets/jack.js +1 -6
  158. data/vendor/assets/javascripts/ace/snippets/jade.js +1 -6
  159. data/vendor/assets/javascripts/ace/snippets/json.js +1 -6
  160. data/vendor/assets/javascripts/ace/snippets/json5.js +9 -0
  161. data/vendor/assets/javascripts/ace/snippets/jssm.js +1 -6
  162. data/vendor/assets/javascripts/ace/snippets/jsx.js +1 -6
  163. data/vendor/assets/javascripts/ace/snippets/julia.js +1 -6
  164. data/vendor/assets/javascripts/ace/snippets/kotlin.js +1 -6
  165. data/vendor/assets/javascripts/ace/snippets/latex.js +1 -6
  166. data/vendor/assets/javascripts/ace/snippets/less.js +1 -6
  167. data/vendor/assets/javascripts/ace/snippets/lisp.js +1 -6
  168. data/vendor/assets/javascripts/ace/snippets/livescript.js +1 -6
  169. data/vendor/assets/javascripts/ace/snippets/logiql.js +1 -6
  170. data/vendor/assets/javascripts/ace/snippets/logtalk.js +1 -6
  171. data/vendor/assets/javascripts/ace/snippets/luapage.js +1 -6
  172. data/vendor/assets/javascripts/ace/snippets/lucene.js +1 -6
  173. data/vendor/assets/javascripts/ace/snippets/mask.js +1 -6
  174. data/vendor/assets/javascripts/ace/snippets/matlab.js +1 -6
  175. data/vendor/assets/javascripts/ace/snippets/mediawiki.js +9 -0
  176. data/vendor/assets/javascripts/ace/snippets/mel.js +1 -6
  177. data/vendor/assets/javascripts/ace/snippets/mixal.js +1 -6
  178. data/vendor/assets/javascripts/ace/snippets/mushcode.js +1 -6
  179. data/vendor/assets/javascripts/ace/snippets/mysql.js +1 -6
  180. data/vendor/assets/javascripts/ace/snippets/nginx.js +1 -6
  181. data/vendor/assets/javascripts/ace/snippets/nim.js +1 -6
  182. data/vendor/assets/javascripts/ace/snippets/nix.js +1 -6
  183. data/vendor/assets/javascripts/ace/snippets/nsis.js +1 -6
  184. data/vendor/assets/javascripts/ace/snippets/nunjucks.js +9 -0
  185. data/vendor/assets/javascripts/ace/snippets/objectivec.js +1 -6
  186. data/vendor/assets/javascripts/ace/snippets/ocaml.js +1 -6
  187. data/vendor/assets/javascripts/ace/snippets/pascal.js +1 -6
  188. data/vendor/assets/javascripts/ace/snippets/perl6.js +1 -6
  189. data/vendor/assets/javascripts/ace/snippets/pgsql.js +1 -6
  190. data/vendor/assets/javascripts/ace/snippets/php_laravel_blade.js +1 -6
  191. data/vendor/assets/javascripts/ace/snippets/pig.js +1 -6
  192. data/vendor/assets/javascripts/ace/snippets/plain_text.js +1 -6
  193. data/vendor/assets/javascripts/ace/snippets/powershell.js +1 -6
  194. data/vendor/assets/javascripts/ace/snippets/praat.js +1 -6
  195. data/vendor/assets/javascripts/ace/snippets/prisma.js +9 -0
  196. data/vendor/assets/javascripts/ace/snippets/prolog.js +1 -6
  197. data/vendor/assets/javascripts/ace/snippets/properties.js +1 -6
  198. data/vendor/assets/javascripts/ace/snippets/protobuf.js +1 -6
  199. data/vendor/assets/javascripts/ace/snippets/puppet.js +1 -6
  200. data/vendor/assets/javascripts/ace/snippets/qml.js +9 -0
  201. data/vendor/assets/javascripts/ace/snippets/rdoc.js +1 -6
  202. data/vendor/assets/javascripts/ace/snippets/red.js +1 -6
  203. data/vendor/assets/javascripts/ace/snippets/redshift.js +1 -6
  204. data/vendor/assets/javascripts/ace/snippets/rhtml.js +1 -6
  205. data/vendor/assets/javascripts/ace/snippets/rust.js +1 -6
  206. data/vendor/assets/javascripts/ace/snippets/sass.js +1 -6
  207. data/vendor/assets/javascripts/ace/snippets/scad.js +1 -6
  208. data/vendor/assets/javascripts/ace/snippets/scala.js +1 -6
  209. data/vendor/assets/javascripts/ace/snippets/scheme.js +1 -6
  210. data/vendor/assets/javascripts/ace/snippets/scss.js +1 -6
  211. data/vendor/assets/javascripts/ace/snippets/sjs.js +1 -6
  212. data/vendor/assets/javascripts/ace/snippets/slim.js +1 -6
  213. data/vendor/assets/javascripts/ace/snippets/smarty.js +1 -6
  214. data/vendor/assets/javascripts/ace/snippets/soy_template.js +1 -6
  215. data/vendor/assets/javascripts/ace/snippets/space.js +1 -6
  216. data/vendor/assets/javascripts/ace/snippets/sparql.js +1 -6
  217. data/vendor/assets/javascripts/ace/snippets/stylus.js +1 -6
  218. data/vendor/assets/javascripts/ace/snippets/svg.js +1 -6
  219. data/vendor/assets/javascripts/ace/snippets/swift.js +1 -6
  220. data/vendor/assets/javascripts/ace/snippets/terraform.js +1 -6
  221. data/vendor/assets/javascripts/ace/snippets/text.js +1 -6
  222. data/vendor/assets/javascripts/ace/snippets/toml.js +1 -6
  223. data/vendor/assets/javascripts/ace/snippets/tsx.js +1 -6
  224. data/vendor/assets/javascripts/ace/snippets/turtle.js +1 -6
  225. data/vendor/assets/javascripts/ace/snippets/twig.js +1 -6
  226. data/vendor/assets/javascripts/ace/snippets/typescript.js +1 -6
  227. data/vendor/assets/javascripts/ace/snippets/vbscript.js +1 -6
  228. data/vendor/assets/javascripts/ace/snippets/verilog.js +1 -6
  229. data/vendor/assets/javascripts/ace/snippets/vhdl.js +1 -6
  230. data/vendor/assets/javascripts/ace/snippets/visualforce.js +1 -6
  231. data/vendor/assets/javascripts/ace/snippets/xml.js +1 -6
  232. data/vendor/assets/javascripts/ace/snippets/yaml.js +1 -6
  233. data/vendor/assets/javascripts/ace/snippets/zeek.js +1 -6
  234. data/vendor/assets/javascripts/ace/theme-ambiance.js +3 -2
  235. data/vendor/assets/javascripts/ace/theme-chaos.js +1 -1
  236. data/vendor/assets/javascripts/ace/theme-nord_dark.js +102 -0
  237. data/vendor/assets/javascripts/ace/worker-base.js +1421 -0
  238. data/vendor/assets/javascripts/ace/worker-coffee.js +17 -703
  239. data/vendor/assets/javascripts/ace/worker-css.js +17 -703
  240. data/vendor/assets/javascripts/ace/worker-html.js +17 -703
  241. data/vendor/assets/javascripts/ace/worker-javascript.js +7833 -5352
  242. data/vendor/assets/javascripts/ace/worker-json.js +17 -703
  243. data/vendor/assets/javascripts/ace/worker-lua.js +17 -703
  244. data/vendor/assets/javascripts/ace/worker-php.js +857 -1475
  245. data/vendor/assets/javascripts/ace/worker-xml.js +26 -707
  246. data/vendor/assets/javascripts/ace/worker-xquery.js +17 -703
  247. metadata +18 -4
  248. data/vendor/assets/javascripts/ace/mode-bro.js +0 -334
  249. data/vendor/assets/javascripts/ace/snippets/bro.js +0 -14
@@ -784,6 +784,7 @@ oop.inherits(Mode, TextMode);
784
784
  };
785
785
 
786
786
  this.$id = "ace/mode/javascript";
787
+ this.snippetFileId = "ace/snippets/javascript";
787
788
  }).call(Mode.prototype);
788
789
 
789
790
  exports.Mode = Mode;
@@ -1316,6 +1317,7 @@ oop.inherits(Mode, TextMode);
1316
1317
  };
1317
1318
 
1318
1319
  this.$id = "ace/mode/css";
1320
+ this.snippetFileId = "ace/snippets/css";
1319
1321
  }).call(Mode.prototype);
1320
1322
 
1321
1323
  exports.Mode = Mode;
@@ -2493,6 +2495,7 @@ oop.inherits(Mode, TextMode);
2493
2495
  };
2494
2496
 
2495
2497
  this.$id = "ace/mode/html";
2498
+ this.snippetFileId = "ace/snippets/html";
2496
2499
  }).call(Mode.prototype);
2497
2500
 
2498
2501
  exports.Mode = Mode;
@@ -2858,6 +2861,7 @@ oop.inherits(Mode, HtmlMode);
2858
2861
  };
2859
2862
 
2860
2863
  this.$id = "ace/mode/razor";
2864
+ this.snippetFileId = "ace/snippets/razor";
2861
2865
  }).call(Mode.prototype);
2862
2866
 
2863
2867
  exports.Mode = Mode;
@@ -784,6 +784,7 @@ oop.inherits(Mode, TextMode);
784
784
  };
785
785
 
786
786
  this.$id = "ace/mode/javascript";
787
+ this.snippetFileId = "ace/snippets/javascript";
787
788
  }).call(Mode.prototype);
788
789
 
789
790
  exports.Mode = Mode;
@@ -1316,6 +1317,7 @@ oop.inherits(Mode, TextMode);
1316
1317
  };
1317
1318
 
1318
1319
  this.$id = "ace/mode/css";
1320
+ this.snippetFileId = "ace/snippets/css";
1319
1321
  }).call(Mode.prototype);
1320
1322
 
1321
1323
  exports.Mode = Mode;
@@ -2493,6 +2495,7 @@ oop.inherits(Mode, TextMode);
2493
2495
  };
2494
2496
 
2495
2497
  this.$id = "ace/mode/html";
2498
+ this.snippetFileId = "ace/snippets/html";
2496
2499
  }).call(Mode.prototype);
2497
2500
 
2498
2501
  exports.Mode = Mode;
@@ -242,6 +242,7 @@ oop.inherits(Mode, TextMode);
242
242
  this.type = "text";
243
243
 
244
244
  this.$id = "ace/mode/rst";
245
+ this.snippetFileId = "ace/snippets/rst";
245
246
  }).call(Mode.prototype);
246
247
 
247
248
  exports.Mode = Mode;
@@ -8,17 +8,17 @@ var constantOtherSymbol = exports.constantOtherSymbol = {
8
8
  regex : "[:](?:[A-Za-z_]|[@$](?=[a-zA-Z0-9_]))[a-zA-Z0-9_]*[!=?]?"
9
9
  };
10
10
 
11
- var qString = exports.qString = {
11
+ exports.qString = {
12
12
  token : "string", // single line
13
13
  regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"
14
14
  };
15
15
 
16
- var qqString = exports.qqString = {
16
+ exports.qqString = {
17
17
  token : "string", // single line
18
18
  regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'
19
19
  };
20
20
 
21
- var tString = exports.tString = {
21
+ exports.tString = {
22
22
  token : "string", // backtick string
23
23
  regex : "[`](?:(?:\\\\.)|(?:[^'\\\\]))*?[`]"
24
24
  };
@@ -28,9 +28,34 @@ var constantNumericHex = exports.constantNumericHex = {
28
28
  regex : "0[xX][0-9a-fA-F](?:[0-9a-fA-F]|_(?=[0-9a-fA-F]))*\\b"
29
29
  };
30
30
 
31
+ var constantNumericBinary = exports.constantNumericBinary = {
32
+ token: "constant.numeric",
33
+ regex: /\b(0[bB][01](?:[01]|_(?=[01]))*)\b/
34
+ };
35
+
36
+ var constantNumericDecimal = exports.constantNumericDecimal = {
37
+ token: "constant.numeric",
38
+ regex: /\b(0[dD](?:[1-9](?:[\d]|_(?=[\d]))*|0))\b/
39
+ };
40
+
41
+ var constantNumericOctal = exports.constantNumericDecimal = {
42
+ token: "constant.numeric",
43
+ regex: /\b(0[oO]?(?:[1-7](?:[0-7]|_(?=[0-7]))*|0))\b/
44
+ };
45
+
46
+ var constantNumericRational = exports.constantNumericRational = {
47
+ token: "constant.numeric", //rational + complex
48
+ regex: /\b([\d]+(?:[./][\d]+)?ri?)\b/
49
+ };
50
+
51
+ var constantNumericComplex = exports.constantNumericComplex = {
52
+ token: "constant.numeric", //simple complex numbers
53
+ regex: /\b([\d]i)\b/
54
+ };
55
+
31
56
  var constantNumericFloat = exports.constantNumericFloat = {
32
- token : "constant.numeric", // float
33
- regex : "[+-]?\\d(?:\\d|_(?=\\d))*(?:(?:\\.\\d(?:\\d|_(?=\\d))*)?(?:[eE][+-]?\\d+)?)?\\b"
57
+ token : "constant.numeric", // float + complex
58
+ regex : "[+-]?\\d(?:\\d|_(?=\\d))*(?:(?:\\.\\d(?:\\d|_(?=\\d))*)?(?:[eE][+-]?\\d+)?)?i?\\b"
34
59
  };
35
60
 
36
61
  var instanceVariable = exports.instanceVariable = {
@@ -70,18 +95,19 @@ var RubyHighlightRules = function() {
70
95
  "filter_parameter_logging|match|get|post|resources|redirect|scope|assert_routing|" +
71
96
  "translate|localize|extract_locale_from_tld|caches_page|expire_page|caches_action|expire_action|" +
72
97
  "cache|expire_fragment|expire_cache_for|observe|cache_sweeper|" +
73
- "has_many|has_one|belongs_to|has_and_belongs_to_many"
98
+ "has_many|has_one|belongs_to|has_and_belongs_to_many|p|warn|refine|using|module_function|extend|alias_method|" +
99
+ "private_class_method|remove_method|undef_method"
74
100
  );
75
101
 
76
102
  var keywords = (
77
103
  "alias|and|BEGIN|begin|break|case|class|def|defined|do|else|elsif|END|end|ensure|" +
78
104
  "__FILE__|finally|for|gem|if|in|__LINE__|module|next|not|or|private|protected|public|" +
79
- "redo|rescue|retry|return|super|then|undef|unless|until|when|while|yield"
105
+ "redo|rescue|retry|return|super|then|undef|unless|until|when|while|yield|__ENCODING__|prepend"
80
106
  );
81
107
 
82
108
  var buildinConstants = (
83
109
  "true|TRUE|false|FALSE|nil|NIL|ARGF|ARGV|DATA|ENV|RUBY_PLATFORM|RUBY_RELEASE_DATE|" +
84
- "RUBY_VERSION|STDERR|STDIN|STDOUT|TOPLEVEL_BINDING"
110
+ "RUBY_VERSION|STDERR|STDIN|STDOUT|TOPLEVEL_BINDING|RUBY_PATCHLEVEL|RUBY_REVISION|RUBY_COPYRIGHT|RUBY_ENGINE|RUBY_ENGINE_VERSION|RUBY_DESCRIPTION"
85
111
  );
86
112
 
87
113
  var builtinVariables = (
@@ -97,126 +123,191 @@ var RubyHighlightRules = function() {
97
123
  "invalid.deprecated": "debugger" // TODO is this a remnant from js mode?
98
124
  }, "identifier");
99
125
 
126
+ var escapedChars = "\\\\(?:n(?:[1-7][0-7]{0,2}|0)|[nsrtvfbae'\"\\\\]|c(?:\\\\M-)?.|M-(?:\\\\C-|\\\\c)?.|C-(?:\\\\M-)?.|[0-7]{3}|x[\\da-fA-F]{2}|u[\\da-fA-F]{4}|u{[\\da-fA-F]{1,6}(?:\\s[\\da-fA-F]{1,6})*})";
127
+
128
+ var closeParen = {
129
+ "(": ")",
130
+ "[": "]",
131
+ "{": "}",
132
+ "<": ">",
133
+ "^": "^",
134
+ "|": "|",
135
+ "%": "%"
136
+ };
137
+
100
138
  this.$rules = {
101
- "start" : [
139
+ "start": [
102
140
  {
103
- token : "comment",
104
- regex : "#.*$"
141
+ token: "comment",
142
+ regex: "#.*$"
105
143
  }, {
106
- token : "comment", // multi line comment
107
- regex : "^=begin(?:$|\\s.*$)",
108
- next : "comment"
144
+ token: "comment.multiline", // multi line comment
145
+ regex: "^=begin(?=$|\\s.*$)",
146
+ next: "comment"
109
147
  }, {
110
- token : "string.regexp",
111
- regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)"
148
+ token: "string.regexp",
149
+ regex: /[/](?=.*\/)/,
150
+ next: "regex"
112
151
  },
113
152
 
114
153
  [{
115
- regex: "[{}]", onMatch: function(val, state, stack) {
116
- this.next = val == "{" ? this.nextState : "";
117
- if (val == "{" && stack.length) {
118
- stack.unshift("start", state);
119
- return "paren.lparen";
120
- }
121
- if (val == "}" && stack.length) {
122
- stack.shift();
123
- this.next = stack.shift();
124
- if (this.next.indexOf("string") != -1)
125
- return "paren.end";
126
- }
127
- return val == "{" ? "paren.lparen" : "paren.rparen";
128
- },
129
- nextState: "start"
130
- }, {
131
- token : "string.start",
132
- regex : /"/,
133
- push : [{
134
- token : "constant.language.escape",
135
- regex : /\\(?:[nsrtvfbae'"\\]|c.|C-.|M-.(?:\\C-.)?|[0-7]{3}|x[\da-fA-F]{2}|u[\da-fA-F]{4})/
154
+ token: ["constant.other.symbol.ruby", "string.start"],
155
+ regex: /(:)?(")/,
156
+ push: [{
157
+ token: "constant.language.escape",
158
+ regex: escapedChars
136
159
  }, {
137
- token : "paren.start",
138
- regex : /#{/,
139
- push : "start"
160
+ token: "paren.start",
161
+ regex: /#{/,
162
+ push: "start"
140
163
  }, {
141
- token : "string.end",
142
- regex : /"/,
143
- next : "pop"
164
+ token: "string.end",
165
+ regex: /"/,
166
+ next: "pop"
144
167
  }, {
145
168
  defaultToken: "string"
146
169
  }]
147
170
  }, {
148
- token : "string.start",
149
- regex : /`/,
150
- push : [{
151
- token : "constant.language.escape",
152
- regex : /\\(?:[nsrtvfbae'"\\]|c.|C-.|M-.(?:\\C-.)?|[0-7]{3}|x[\da-fA-F]{2}|u[\da-fA-F]{4})/
171
+ token: "string.start",
172
+ regex: /`/,
173
+ push: [{
174
+ token: "constant.language.escape",
175
+ regex: escapedChars
153
176
  }, {
154
- token : "paren.start",
155
- regex : /#{/,
156
- push : "start"
177
+ token: "paren.start",
178
+ regex: /#{/,
179
+ push: "start"
157
180
  }, {
158
- token : "string.end",
159
- regex : /`/,
160
- next : "pop"
181
+ token: "string.end",
182
+ regex: /`/,
183
+ next: "pop"
161
184
  }, {
162
185
  defaultToken: "string"
163
186
  }]
164
187
  }, {
165
- token : "string.start",
166
- regex : /'/,
167
- push : [{
168
- token : "constant.language.escape",
169
- regex : /\\['\\]/
170
- }, {
171
- token : "string.end",
172
- regex : /'/,
173
- next : "pop"
188
+ token: ["constant.other.symbol.ruby", "string.start"],
189
+ regex: /(:)?(')/,
190
+ push: [{
191
+ token: "constant.language.escape",
192
+ regex: /\\['\\]/
193
+ }, {
194
+ token: "string.end",
195
+ regex: /'/,
196
+ next: "pop"
174
197
  }, {
175
198
  defaultToken: "string"
176
199
  }]
200
+ }, {
201
+ token: "string.start",//doesn't see any differences between strings and array of strings in highlighting
202
+ regex: /%[qwx]([(\[<{^|%])/, onMatch: function (val, state, stack) {
203
+ if (stack.length)
204
+ stack = [];
205
+ var paren = val[val.length - 1];
206
+ stack.unshift(paren, state);
207
+ this.next = "qStateWithoutInterpolation";
208
+ return this.token;
209
+ }
210
+ }, {
211
+ token: "string.start", //doesn't see any differences between strings and array of strings in highlighting
212
+ regex: /%[QWX]?([(\[<{^|%])/, onMatch: function (val, state, stack) {
213
+ if (stack.length)
214
+ stack = [];
215
+ var paren = val[val.length - 1];
216
+ stack.unshift(paren, state);
217
+ this.next = "qStateWithInterpolation";
218
+ return this.token;
219
+ }
220
+ }, {
221
+ token: "constant.other.symbol.ruby", //doesn't see any differences between symbols and array of symbols in highlighting
222
+ regex: /%[si]([(\[<{^|%])/, onMatch: function (val, state, stack) {
223
+ if (stack.length)
224
+ stack = [];
225
+ var paren = val[val.length - 1];
226
+ stack.unshift(paren, state);
227
+ this.next = "sStateWithoutInterpolation";
228
+ return this.token;
229
+ }
230
+ }, {
231
+ token: "constant.other.symbol.ruby", //doesn't see any differences between symbols and array of symbols in highlighting
232
+ regex: /%[SI]([(\[<{^|%])/, onMatch: function (val, state, stack) {
233
+ if (stack.length)
234
+ stack = [];
235
+ var paren = val[val.length - 1];
236
+ stack.unshift(paren, state);
237
+ this.next = "sStateWithInterpolation";
238
+ return this.token;
239
+ }
240
+ }, {
241
+ token: "string.regexp",
242
+ regex: /%[r]([(\[<{^|%])/, onMatch: function (val, state, stack) {
243
+ if (stack.length)
244
+ stack = [];
245
+ var paren = val[val.length - 1];
246
+ stack.unshift(paren, state);
247
+ this.next = "rState";
248
+ return this.token;
249
+ }
177
250
  }],
178
251
 
179
252
  {
180
- token : "text", // namespaces aren't symbols
181
- regex : "::"
253
+ token: "punctuation", // namespaces aren't symbols
254
+ regex: "::"
255
+ },
256
+ instanceVariable,
257
+ {
258
+ token: "variable.global", // global variable
259
+ regex: "[$][a-zA-Z_\\d]+"
182
260
  }, {
183
- token : "variable.instance", // instance variable
184
- regex : "@{1,2}[a-zA-Z_\\d]+"
261
+ token: "support.class", // class name
262
+ regex: "[A-Z][a-zA-Z_\\d]*"
185
263
  }, {
186
- token : "support.class", // class name
187
- regex : "[A-Z][a-zA-Z_\\d]+"
264
+ token: ["punctuation.operator", "support.function"],
265
+ regex: /(\.)([a-zA-Z_\d]+)(?=\()/
266
+ }, {
267
+ token: ["punctuation.operator", "identifier"],
268
+ regex: /(\.)([a-zA-Z_][a-zA-Z_\d]*)/
269
+ }, {
270
+ token: "string.character",
271
+ regex: "\\B\\?(?:" + escapedChars + "|\\S)"
272
+ }, {
273
+ token: "punctuation.operator",
274
+ regex: /\?(?=.+:)/
188
275
  },
189
276
 
277
+ constantNumericRational,
278
+ constantNumericComplex,
190
279
  constantOtherSymbol,
191
280
  constantNumericHex,
192
281
  constantNumericFloat,
193
-
282
+ constantNumericBinary,
283
+ constantNumericDecimal,
284
+ constantNumericOctal,
194
285
  {
195
- token : "constant.language.boolean",
196
- regex : "(?:true|false)\\b"
286
+ token: "constant.language.boolean",
287
+ regex: "(?:true|false)\\b"
197
288
  }, {
198
- token : keywordMapper,
199
- regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b"
289
+ token: keywordMapper,
290
+ regex: "[a-zA-Z_$][a-zA-Z0-9_$]*\\b"
200
291
  }, {
201
- token : "punctuation.separator.key-value",
202
- regex : "=>"
292
+ token: "punctuation.separator.key-value",
293
+ regex: "=>"
203
294
  }, {
204
295
  stateName: "heredoc",
205
- onMatch : function(value, currentState, stack) {
206
- var next = value[2] == '-' ? "indentedHeredoc" : "heredoc";
296
+ onMatch: function (value, currentState, stack) {
297
+ var next = (value[2] == '-' || value[2] == '~') ? "indentedHeredoc" : "heredoc";
207
298
  var tokens = value.split(this.splitRegex);
208
299
  stack.push(next, tokens[3]);
209
300
  return [
210
- {type:"constant", value: tokens[1]},
211
- {type:"string", value: tokens[2]},
212
- {type:"support.class", value: tokens[3]},
213
- {type:"string", value: tokens[4]}
301
+ {type: "constant", value: tokens[1]},
302
+ {type: "string", value: tokens[2]},
303
+ {type: "support.class", value: tokens[3]},
304
+ {type: "string", value: tokens[4]}
214
305
  ];
215
306
  },
216
- regex : "(<<-?)(['\"`]?)([\\w]+)(['\"`]?)",
307
+ regex: "(<<[-~]?)(['\"`]?)([\\w]+)(['\"`]?)",
217
308
  rules: {
218
309
  heredoc: [{
219
- onMatch: function(value, currentState, stack) {
310
+ onMatch: function(value, currentState, stack) {
220
311
  if (value === stack[1]) {
221
312
  stack.shift();
222
313
  stack.shift();
@@ -233,7 +324,7 @@ var RubyHighlightRules = function() {
233
324
  token: "string",
234
325
  regex: "^ +"
235
326
  }, {
236
- onMatch: function(value, currentState, stack) {
327
+ onMatch: function(value, currentState, stack) {
237
328
  if (value === stack[1]) {
238
329
  stack.shift();
239
330
  stack.shift();
@@ -248,38 +339,261 @@ var RubyHighlightRules = function() {
248
339
  }]
249
340
  }
250
341
  }, {
251
- regex : "$",
252
- token : "empty",
253
- next : function(currentState, stack) {
342
+ regex: "$",
343
+ token: "empty",
344
+ next: function(currentState, stack) {
254
345
  if (stack[0] === "heredoc" || stack[0] === "indentedHeredoc")
255
346
  return stack[0];
256
347
  return currentState;
257
348
  }
349
+ }, {
350
+ token: "keyword.operator",
351
+ regex: "!|\\$|%|&|\\*|/|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\||\\b(?:in|instanceof|new|delete|typeof|void)"
352
+ }, {
353
+ token: "paren.lparen",
354
+ regex: "[[({]"
355
+ }, {
356
+ token: "paren.rparen",
357
+ regex: "[\\])}]",
358
+ onMatch: function(value, currentState, stack) {
359
+ this.next = '';
360
+ if (value == "}" && stack.length > 1 && stack[1] != "start") {
361
+ stack.shift();
362
+ this.next = stack.shift();
363
+ }
364
+ return this.token;
365
+ }
366
+ }, {
367
+ token: "text",
368
+ regex: "\\s+"
369
+ }, {
370
+ token: "punctuation.operator",
371
+ regex: /[?:,;.]/
372
+ }
373
+ ],
374
+ "comment": [
375
+ {
376
+ token: "comment.multiline", // closing comment
377
+ regex: "^=end(?=$|\\s.*$)",
378
+ next: "start"
379
+ }, {
380
+ token: "comment", // comment spanning whole line
381
+ regex: ".+"
382
+ }
383
+ ],
384
+ "qStateWithInterpolation": [{
385
+ token: "string.start",// excluded nested |^% due to difficulty in realization
386
+ regex: /[(\[<{]/, onMatch: function (val, state, stack) {
387
+ if (stack.length && val === stack[0]) {
388
+ stack.unshift(val, state);
389
+ return this.token;
390
+ }
391
+ return "string";
392
+ }
393
+ }, {
394
+ token: "constant.language.escape",
395
+ regex: escapedChars
396
+ }, {
397
+ token: "constant.language.escape",
398
+ regex: /\\./
399
+ }, {
400
+ token: "paren.start",
401
+ regex: /#{/,
402
+ push: "start"
403
+ }, {
404
+ token: "string.end",
405
+ regex: /[)\]>}^|%]/, onMatch: function (val, state, stack) {
406
+ if (stack.length && val === closeParen[stack[0]]) {
407
+ stack.shift();
408
+ this.next = stack.shift();
409
+ return this.token;
410
+ }
411
+ this.next = '';
412
+ return "string";
413
+ }
414
+ }, {
415
+ defaultToken: "string"
416
+ }],
417
+ "qStateWithoutInterpolation": [{
418
+ token: "string.start",// excluded nested |^% due to difficulty in realization
419
+ regex: /[(\[<{]/, onMatch: function (val, state, stack) {
420
+ if (stack.length && val === stack[0]) {
421
+ stack.unshift(val, state);
422
+ return this.token;
423
+ }
424
+ return "string";
425
+ }
426
+ }, {
427
+ token: "constant.language.escape",
428
+ regex: /\\['\\]/
429
+ }, {
430
+ token: "constant.language.escape",
431
+ regex: /\\./
432
+ }, {
433
+ token: "string.end",
434
+ regex: /[)\]>}^|%]/, onMatch: function (val, state, stack) {
435
+ if (stack.length && val === closeParen[stack[0]]) {
436
+ stack.shift();
437
+ this.next = stack.shift();
438
+ return this.token;
439
+ }
440
+ this.next = '';
441
+ return "string";
442
+ }
443
+ }, {
444
+ defaultToken: "string"
445
+ }],
446
+ "sStateWithoutInterpolation": [{
447
+ token: "constant.other.symbol.ruby",// excluded nested |^% due to difficulty in realization
448
+ regex: /[(\[<{]/, onMatch: function (val, state, stack) {
449
+ if (stack.length && val === stack[0]) {
450
+ stack.unshift(val, state);
451
+ return this.token;
452
+ }
453
+ return "constant.other.symbol.ruby";
454
+ }
455
+ }, {
456
+ token: "constant.other.symbol.ruby",
457
+ regex: /[)\]>}^|%]/, onMatch: function (val, state, stack) {
458
+ if (stack.length && val === closeParen[stack[0]]) {
459
+ stack.shift();
460
+ this.next = stack.shift();
461
+ return this.token;
462
+ }
463
+ this.next = '';
464
+ return "constant.other.symbol.ruby";
465
+ }
466
+ }, {
467
+ defaultToken: "constant.other.symbol.ruby"
468
+ }],
469
+ "sStateWithInterpolation": [{
470
+ token: "constant.other.symbol.ruby",// excluded nested |^% due to difficulty in realization
471
+ regex: /[(\[<{]/, onMatch: function (val, state, stack) {
472
+ if (stack.length && val === stack[0]) {
473
+ stack.unshift(val, state);
474
+ return this.token;
475
+ }
476
+ return "constant.other.symbol.ruby";
477
+ }
478
+ }, {
479
+ token: "constant.language.escape",
480
+ regex: escapedChars
481
+ }, {
482
+ token: "constant.language.escape",
483
+ regex: /\\./
484
+ }, {
485
+ token: "paren.start",
486
+ regex: /#{/,
487
+ push: "start"
488
+ }, {
489
+ token: "constant.other.symbol.ruby",
490
+ regex: /[)\]>}^|%]/, onMatch: function (val, state, stack) {
491
+ if (stack.length && val === closeParen[stack[0]]) {
492
+ stack.shift();
493
+ this.next = stack.shift();
494
+ return this.token;
495
+ }
496
+ this.next = '';
497
+ return "constant.other.symbol.ruby";
498
+ }
499
+ }, {
500
+ defaultToken: "constant.other.symbol.ruby"
501
+ }],
502
+ "rState": [{
503
+ token: "string.regexp",// excluded nested |^% due to difficulty in realization
504
+ regex: /[(\[<{]/, onMatch: function (val, state, stack) {
505
+ if (stack.length && val === stack[0]) {
506
+ stack.unshift(val, state);
507
+ return this.token;
508
+ }
509
+ return "constant.language.escape";
510
+ }
511
+ }, {
512
+ token: "paren.start",
513
+ regex: /#{/,
514
+ push: "start"
515
+ }, {
516
+ token: "string.regexp",
517
+ regex: /\//
518
+ }, {
519
+ token: "string.regexp",
520
+ regex: /[)\]>}^|%][imxouesn]*/, onMatch: function (val, state, stack) {
521
+ if (stack.length && val[0] === closeParen[stack[0]]) {
522
+ stack.shift();
523
+ this.next = stack.shift();
524
+ return this.token;
525
+ }
526
+ this.next = '';
527
+ return "constant.language.escape";
528
+ }
529
+ },
530
+ {include: "regex"},
531
+ {
532
+ defaultToken: "string.regexp"
533
+ }],
534
+ "regex": [
535
+ {// character classes
536
+ token: "regexp.keyword",
537
+ regex: /\\[wWdDhHsS]/
538
+ }, {
539
+ token: "constant.language.escape",
540
+ regex: /\\[AGbBzZ]/
541
+ }, {
542
+ token: "constant.language.escape",
543
+ regex: /\\g<[a-zA-Z0-9]*>/
258
544
  }, {
259
- token : "string.character",
260
- regex : "\\B\\?."
545
+ token: ["constant.language.escape", "regexp.keyword", "constant.language.escape"],
546
+ regex: /(\\p{\^?)(Alnum|Alpha|Blank|Cntrl|Digit|Graph|Lower|Print|Punct|Space|Upper|XDigit|Word|ASCII|Any|Assigned|Arabic|Armenian|Balinese|Bengali|Bopomofo|Braille|Buginese|Buhid|Canadian_Aboriginal|Carian|Cham|Cherokee|Common|Coptic|Cuneiform|Cypriot|Cyrillic|Deseret|Devanagari|Ethiopic|Georgian|Glagolitic|Gothic|Greek|Gujarati|Gurmukhi|Han|Hangul|Hanunoo|Hebrew|Hiragana|Inherited|Kannada|Katakana|Kayah_Li|Kharoshthi|Khmer|Lao|Latin|Lepcha|Limbu|Linear_B|Lycian|Lydian|Malayalam|Mongolian|Myanmar|New_Tai_Lue|Nko|Ogham|Ol_Chiki|Old_Italic|Old_Persian|Oriya|Osmanya|Phags_Pa|Phoenician|Rejang|Runic|Saurashtra|Shavian|Sinhala|Sundanese|Syloti_Nagri|Syriac|Tagalog|Tagbanwa|Tai_Le|Tamil|Telugu|Thaana|Thai|Tibetan|Tifinagh|Ugaritic|Vai|Yi|Ll|Lm|Lt|Lu|Lo|Mn|Mc|Me|Nd|Nl|Pc|Pd|Ps|Pe|Pi|Pf|Po|No|Sm|Sc|Sk|So|Zs|Zl|Zp|Cc|Cf|Cn|Co|Cs|N|L|M|P|S|Z|C)(})/
261
547
  }, {
262
- token : "keyword.operator",
263
- regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)"
548
+ token: ["constant.language.escape", "invalid", "constant.language.escape"],
549
+ regex: /(\\p{\^?)([^/]*)(})/
550
+ }, {// escapes
551
+ token: "regexp.keyword.operator",
552
+ regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"
553
+ }, {// flag
554
+ token: "string.regexp",
555
+ regex: /[/][imxouesn]*/,
556
+ next: "start"
557
+ }, {// invalid operators
558
+ token: "invalid",
559
+ regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/
560
+ }, {// operators
561
+ token: "constant.language.escape",
562
+ regex: /\(\?(?:[:=!>]|<'?[a-zA-Z]*'?>|<[=!])|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/
264
563
  }, {
265
- token : "paren.lparen",
266
- regex : "[[({]"
564
+ token: "constant.language.delimiter",
565
+ regex: /\|/
267
566
  }, {
268
- token : "paren.rparen",
269
- regex : "[\\])}]"
567
+ token: "regexp.keyword",
568
+ regex: /\[\[:(?:alnum|alpha|blank|cntrl|digit|graph|lower|print|punct|space|upper|xdigit|word|ascii):\]\]/
270
569
  }, {
271
- token : "text",
272
- regex : "\\s+"
570
+ token: "constant.language.escape",
571
+ regex: /\[\^?/,
572
+ push: "regex_character_class"
573
+ }, {
574
+ defaultToken: "string.regexp"
273
575
  }
274
576
  ],
275
- "comment" : [
577
+ "regex_character_class": [
276
578
  {
277
- token : "comment", // closing comment
278
- regex : "^=end(?:$|\\s.*$)",
279
- next : "start"
579
+ token: "regexp.keyword",
580
+ regex: /\\[wWdDhHsS]/
581
+ }, {
582
+ token: "regexp.charclass.keyword.operator",
583
+ regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"
280
584
  }, {
281
- token : "comment", // comment spanning whole line
282
- regex : ".+"
585
+ token: "constant.language.escape",
586
+ regex: /&?&?\[\^?/,
587
+ push: "regex_character_class"
588
+ }, {
589
+ token: "constant.language.escape",
590
+ regex: "]",
591
+ next: "pop"
592
+ }, {
593
+ token: "constant.language.escape",
594
+ regex: "-"
595
+ }, {
596
+ defaultToken: "string.regexp.characterclass"
283
597
  }
284
598
  ]
285
599
  };
@@ -332,94 +646,271 @@ var MatchingBraceOutdent = function() {};
332
646
  exports.MatchingBraceOutdent = MatchingBraceOutdent;
333
647
  });
334
648
 
335
- define("ace/mode/folding/coffee",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"], function(require, exports, module) {
649
+ define("ace/mode/folding/ruby",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range","ace/token_iterator"], function (require, exports, module) {
336
650
  "use strict";
337
651
 
338
652
  var oop = require("../../lib/oop");
339
653
  var BaseFoldMode = require("./fold_mode").FoldMode;
340
654
  var Range = require("../../range").Range;
655
+ var TokenIterator = require("../../token_iterator").TokenIterator;
656
+
657
+
658
+ var FoldMode = exports.FoldMode = function () {
659
+ };
341
660
 
342
- var FoldMode = exports.FoldMode = function() {};
343
661
  oop.inherits(FoldMode, BaseFoldMode);
344
662
 
345
- (function() {
663
+ (function () {
664
+ this.indentKeywords = {
665
+ "class": 1,
666
+ "def": 1,
667
+ "module": 1,
668
+ "do": 1,
669
+ "unless": 1,
670
+ "if": 1,
671
+ "while": 1,
672
+ "for": 1,
673
+ "until": 1,
674
+ "begin": 1,
675
+ "else": 0,
676
+ "elsif": 0,
677
+ "rescue": 0,
678
+ "ensure": 0,
679
+ "when": 0,
680
+ "end": -1,
681
+ "case": 1,
682
+ "=begin": 1,
683
+ "=end": -1
684
+ };
346
685
 
347
- this.getFoldWidgetRange = function(session, foldStyle, row) {
348
- var range = this.indentationBlock(session, row);
349
- if (range)
350
- return range;
686
+ this.foldingStartMarker = /(?:\s|^)(def|do|while|class|unless|module|if|for|until|begin|else|elsif|case|rescue|ensure|when)\b|({\s*$)|(=begin)/;
687
+ this.foldingStopMarker = /(=end(?=$|\s.*$))|(^\s*})|\b(end)\b/;
351
688
 
352
- var re = /\S/;
689
+ this.getFoldWidget = function (session, foldStyle, row) {
353
690
  var line = session.getLine(row);
354
- var startLevel = line.search(re);
355
- if (startLevel == -1 || line[startLevel] != "#")
356
- return;
357
-
358
- var startColumn = line.length;
359
- var maxRow = session.getLength();
360
- var startRow = row;
361
- var endRow = row;
691
+ var isStart = this.foldingStartMarker.test(line);
692
+ var isEnd = this.foldingStopMarker.test(line);
693
+
694
+ if (isStart && !isEnd) {
695
+ var match = line.match(this.foldingStartMarker);
696
+ if (match[1]) {
697
+ if (match[1] == "if" || match[1] == "else" || match[1] == "while" || match[1] == "until" || match[1] == "unless") {
698
+ if (match[1] == "else" && /^\s*else\s*$/.test(line) === false) {
699
+ return;
700
+ }
701
+ if (/^\s*(?:if|else|while|until|unless)\s*/.test(line) === false) {
702
+ return;
703
+ }
704
+ }
362
705
 
363
- while (++row < maxRow) {
364
- line = session.getLine(row);
365
- var level = line.search(re);
706
+ if (match[1] == "when") {
707
+ if (/\sthen\s/.test(line) === true) {
708
+ return;
709
+ }
710
+ }
711
+ if (session.getTokenAt(row, match.index + 2).type === "keyword")
712
+ return "start";
713
+ } else if (match[3]) {
714
+ if (session.getTokenAt(row, match.index + 1).type === "comment.multiline")
715
+ return "start";
716
+ } else {
717
+ return "start";
718
+ }
719
+ }
720
+ if (foldStyle != "markbeginend" || !isEnd || isStart && isEnd)
721
+ return "";
366
722
 
367
- if (level == -1)
368
- continue;
723
+ var match = line.match(this.foldingStopMarker);
724
+ if (match[3] === "end") {
725
+ if (session.getTokenAt(row, match.index + 1).type === "keyword")
726
+ return "end";
727
+ } else if (match[1]) {
728
+ if (session.getTokenAt(row, match.index + 1).type === "comment.multiline")
729
+ return "end";
730
+ } else
731
+ return "end";
732
+ };
369
733
 
370
- if (line[level] != "#")
371
- break;
734
+ this.getFoldWidgetRange = function (session, foldStyle, row) {
735
+ var line = session.doc.getLine(row);
736
+ var match = this.foldingStartMarker.exec(line);
737
+ if (match) {
738
+ if (match[1] || match[3])
739
+ return this.rubyBlock(session, row, match.index + 2);
372
740
 
373
- endRow = row;
741
+ return this.openingBracketBlock(session, "{", row, match.index);
374
742
  }
375
743
 
376
- if (endRow > startRow) {
377
- var endColumn = session.getLine(endRow).length;
378
- return new Range(startRow, startColumn, endRow, endColumn);
744
+ var match = this.foldingStopMarker.exec(line);
745
+ if (match) {
746
+ if (match[3] === "end") {
747
+ if (session.getTokenAt(row, match.index + 1).type === "keyword")
748
+ return this.rubyBlock(session, row, match.index + 1);
749
+ }
750
+
751
+ if (match[1] === "=end") {
752
+ if (session.getTokenAt(row, match.index + 1).type === "comment.multiline")
753
+ return this.rubyBlock(session, row, match.index + 1);
754
+ }
755
+
756
+ return this.closingBracketBlock(session, "}", row, match.index + match[0].length);
379
757
  }
380
758
  };
381
- this.getFoldWidget = function(session, foldStyle, row) {
759
+
760
+ this.rubyBlock = function (session, row, column, tokenRange) {
761
+ var stream = new TokenIterator(session, row, column);
762
+
763
+ var token = stream.getCurrentToken();
764
+ if (!token || (token.type != "keyword" && token.type != "comment.multiline"))
765
+ return;
766
+
767
+ var val = token.value;
382
768
  var line = session.getLine(row);
383
- var indent = line.search(/\S/);
384
- var next = session.getLine(row + 1);
385
- var prev = session.getLine(row - 1);
386
- var prevIndent = prev.search(/\S/);
387
- var nextIndent = next.search(/\S/);
388
-
389
- if (indent == -1) {
390
- session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : "";
391
- return "";
769
+ switch (token.value) {
770
+ case "if":
771
+ case "unless":
772
+ case "while":
773
+ case "until":
774
+ var checkToken = new RegExp("^\\s*" + token.value);
775
+ if (!checkToken.test(line)) {
776
+ return;
777
+ }
778
+ var dir = this.indentKeywords[val];
779
+ break;
780
+ case "when":
781
+ if (/\sthen\s/.test(line)) {
782
+ return;
783
+ }
784
+ case "elsif":
785
+ case "rescue":
786
+ case "ensure":
787
+ var dir = 1;
788
+ break;
789
+ case "else":
790
+ var checkToken = new RegExp("^\\s*" + token.value + "\\s*$");
791
+ if (!checkToken.test(line)) {
792
+ return;
793
+ }
794
+ var dir = 1;
795
+ break;
796
+ default:
797
+ var dir = this.indentKeywords[val];
798
+ break;
392
799
  }
393
- if (prevIndent == -1) {
394
- if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") {
395
- session.foldWidgets[row - 1] = "";
396
- session.foldWidgets[row + 1] = "";
397
- return "start";
800
+
801
+ var stack = [val];
802
+ if (!dir)
803
+ return;
804
+
805
+ var startColumn = dir === -1 ? session.getLine(row - 1).length : session.getLine(row).length;
806
+ var startRow = row;
807
+ var ranges = [];
808
+ ranges.push(stream.getCurrentTokenRange());
809
+
810
+ stream.step = dir === -1 ? stream.stepBackward : stream.stepForward;
811
+ if (token.type == "comment.multiline") {
812
+ while (token = stream.step()) {
813
+ if (token.type !== "comment.multiline")
814
+ continue;
815
+ if (dir == 1) {
816
+ startColumn = 6;
817
+ if (token.value == "=end") {
818
+ break;
819
+ }
820
+ } else {
821
+ if (token.value == "=begin") {
822
+ break;
823
+ }
824
+ }
398
825
  }
399
- } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") {
400
- if (session.getLine(row - 2).search(/\S/) == -1) {
401
- session.foldWidgets[row - 1] = "start";
402
- session.foldWidgets[row + 1] = "";
403
- return "";
826
+ } else {
827
+ while (token = stream.step()) {
828
+ var ignore = false;
829
+ if (token.type !== "keyword")
830
+ continue;
831
+ var level = dir * this.indentKeywords[token.value];
832
+ line = session.getLine(stream.getCurrentTokenRow());
833
+ switch (token.value) {
834
+ case "do":
835
+ for (var i = stream.$tokenIndex - 1; i >= 0; i--) {
836
+ var prevToken = stream.$rowTokens[i];
837
+ if (prevToken && (prevToken.value == "while" || prevToken.value == "until" || prevToken.value == "for")) {
838
+ level = 0;
839
+ break;
840
+ }
841
+ }
842
+ break;
843
+ case "else":
844
+ var checkToken = new RegExp("^\\s*" + token.value + "\\s*$");
845
+ if (!checkToken.test(line) || val == "case") {
846
+ level = 0;
847
+ ignore = true;
848
+ }
849
+ break;
850
+ case "if":
851
+ case "unless":
852
+ case "while":
853
+ case "until":
854
+ var checkToken = new RegExp("^\\s*" + token.value);
855
+ if (!checkToken.test(line)) {
856
+ level = 0;
857
+ ignore = true;
858
+ }
859
+ break;
860
+ case "when":
861
+ if (/\sthen\s/.test(line) || val == "case") {
862
+ level = 0;
863
+ ignore = true;
864
+ }
865
+ break;
866
+ }
867
+
868
+ if (level > 0) {
869
+ stack.unshift(token.value);
870
+ } else if (level <= 0 && ignore === false) {
871
+ stack.shift();
872
+ if (!stack.length) {
873
+ if ((val == "while" || val == "until" || val == "for") && token.value != "do") {
874
+ break;
875
+ }
876
+ if (token.value == "do" && dir == -1 && level != 0)
877
+ break;
878
+ if (token.value != "do")
879
+ break;
880
+ }
881
+
882
+ if (level === 0) {
883
+ stack.unshift(token.value);
884
+ }
885
+ }
404
886
  }
405
887
  }
406
888
 
407
- if (prevIndent!= -1 && prevIndent < indent)
408
- session.foldWidgets[row - 1] = "start";
409
- else
410
- session.foldWidgets[row - 1] = "";
889
+ if (!token)
890
+ return null;
411
891
 
412
- if (indent < nextIndent)
413
- return "start";
414
- else
415
- return "";
892
+ if (tokenRange) {
893
+ ranges.push(stream.getCurrentTokenRange());
894
+ return ranges;
895
+ }
896
+
897
+ var row = stream.getCurrentTokenRow();
898
+ if (dir === -1) {
899
+ if (token.type === "comment.multiline") {
900
+ var endColumn = 6;
901
+ } else {
902
+ var endColumn = session.getLine(row).length;
903
+ }
904
+ return new Range(row, endColumn, startRow - 1, startColumn);
905
+ } else
906
+ return new Range(startRow, startColumn, row - 1, session.getLine(row - 1).length);
416
907
  };
417
908
 
418
909
  }).call(FoldMode.prototype);
419
910
 
420
911
  });
421
912
 
422
- define("ace/mode/ruby",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/ruby_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/mode/behaviour/cstyle","ace/mode/folding/coffee"], function(require, exports, module) {
913
+ define("ace/mode/ruby",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/ruby_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/mode/behaviour/cstyle","ace/mode/folding/ruby"], function(require, exports, module) {
423
914
  "use strict";
424
915
 
425
916
  var oop = require("../lib/oop");
@@ -428,13 +919,14 @@ var RubyHighlightRules = require("./ruby_highlight_rules").RubyHighlightRules;
428
919
  var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;
429
920
  var Range = require("../range").Range;
430
921
  var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;
431
- var FoldMode = require("./folding/coffee").FoldMode;
922
+ var FoldMode = require("./folding/ruby").FoldMode;
432
923
 
433
924
  var Mode = function() {
434
925
  this.HighlightRules = RubyHighlightRules;
435
926
  this.$outdent = new MatchingBraceOutdent();
436
927
  this.$behaviour = new CstyleBehaviour();
437
928
  this.foldingRules = new FoldMode();
929
+ this.indentKeywords = this.foldingRules.indentKeywords;
438
930
  };
439
931
  oop.inherits(Mode, TextMode);
440
932
 
@@ -449,7 +941,7 @@ oop.inherits(Mode, TextMode);
449
941
  var tokenizedLine = this.getTokenizer().getLineTokens(line, state);
450
942
  var tokens = tokenizedLine.tokens;
451
943
 
452
- if (tokens.length && tokens[tokens.length-1].type == "comment") {
944
+ if (tokens.length && tokens[tokens.length - 1].type == "comment") {
453
945
  return indent;
454
946
  }
455
947
 
@@ -457,7 +949,7 @@ oop.inherits(Mode, TextMode);
457
949
  var match = line.match(/^.*[\{\(\[]\s*$/);
458
950
  var startingClassOrMethod = line.match(/^\s*(class|def|module)\s.*$/);
459
951
  var startingDoBlock = line.match(/.*do(\s*|\s+\|.*\|\s*)$/);
460
- var startingConditional = line.match(/^\s*(if|else|when)\s*/);
952
+ var startingConditional = line.match(/^\s*(if|else|when|elsif|unless|while|for|begin|rescue|ensure)\s*/);
461
953
  if (match || startingClassOrMethod || startingDoBlock || startingConditional) {
462
954
  indent += tab;
463
955
  }
@@ -467,7 +959,7 @@ oop.inherits(Mode, TextMode);
467
959
  };
468
960
 
469
961
  this.checkOutdent = function(state, line, input) {
470
- return /^\s+(end|else)$/.test(line + input) || this.$outdent.checkOutdent(line, input);
962
+ return /^\s+(end|else|rescue|ensure)$/.test(line + input) || this.$outdent.checkOutdent(line, input);
471
963
  };
472
964
 
473
965
  this.autoOutdent = function(state, session, row) {
@@ -480,11 +972,24 @@ oop.inherits(Mode, TextMode);
480
972
  var tab = session.getTabString();
481
973
  if (prevIndent.length <= indent.length) {
482
974
  if (indent.slice(-tab.length) == tab)
483
- session.remove(new Range(row, indent.length-tab.length, row, indent.length));
975
+ session.remove(new Range(row, indent.length - tab.length, row, indent.length));
484
976
  }
485
977
  };
486
978
 
979
+ this.getMatching = function(session, row, column) {
980
+ if (row == undefined) {
981
+ var pos = session.selection.lead;
982
+ column = pos.column;
983
+ row = pos.row;
984
+ }
985
+
986
+ var startToken = session.getTokenAt(row, column);
987
+ if (startToken && startToken.value in this.indentKeywords)
988
+ return this.foldingRules.rubyBlock(session, row, column, true);
989
+ };
990
+
487
991
  this.$id = "ace/mode/ruby";
992
+ this.snippetFileId = "ace/snippets/ruby";
488
993
  }).call(Mode.prototype);
489
994
 
490
995
  exports.Mode = Mode;