ace-rails-ap 2.0.1 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (301) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -4
  3. data/lib/ace/rails/version.rb +1 -1
  4. data/vendor/assets/javascripts/ace/ace.js +14194 -13349
  5. data/vendor/assets/javascripts/ace/ext-beautify.js +335 -0
  6. data/vendor/assets/javascripts/ace/ext-chromevox.js +6 -1
  7. data/vendor/assets/javascripts/ace/ext-elastic_tabstops_lite.js +8 -33
  8. data/vendor/assets/javascripts/ace/ext-emmet.js +487 -424
  9. data/vendor/assets/javascripts/ace/ext-error_marker.js +6 -0
  10. data/vendor/assets/javascripts/ace/ext-keybinding_menu.js +45 -72
  11. data/vendor/assets/javascripts/ace/ext-language_tools.js +734 -578
  12. data/vendor/assets/javascripts/ace/ext-linking.js +53 -0
  13. data/vendor/assets/javascripts/ace/ext-modelist.js +25 -10
  14. data/vendor/assets/javascripts/ace/ext-old_ie.js +93 -120
  15. data/vendor/assets/javascripts/ace/ext-searchbox.js +8 -41
  16. data/vendor/assets/javascripts/ace/ext-settings_menu.js +229 -234
  17. data/vendor/assets/javascripts/ace/ext-spellcheck.js +7 -3
  18. data/vendor/assets/javascripts/ace/ext-split.js +13 -37
  19. data/vendor/assets/javascripts/ace/ext-static_highlight.js +16 -39
  20. data/vendor/assets/javascripts/ace/ext-statusbar.js +8 -2
  21. data/vendor/assets/javascripts/ace/ext-textarea.js +254 -99
  22. data/vendor/assets/javascripts/ace/ext-themelist.js +13 -40
  23. data/vendor/assets/javascripts/ace/ext-whitespace.js +17 -41
  24. data/vendor/assets/javascripts/ace/keybinding-emacs.js +803 -788
  25. data/vendor/assets/javascripts/ace/keybinding-vim.js +1559 -1560
  26. data/vendor/assets/javascripts/ace/mode-abap.js +52 -83
  27. data/vendor/assets/javascripts/ace/mode-actionscript.js +27 -63
  28. data/vendor/assets/javascripts/ace/mode-ada.js +27 -58
  29. data/vendor/assets/javascripts/ace/mode-apache_conf.js +310 -0
  30. data/vendor/assets/javascripts/ace/mode-applescript.js +226 -0
  31. data/vendor/assets/javascripts/ace/mode-asciidoc.js +39 -70
  32. data/vendor/assets/javascripts/ace/mode-assembly_x86.js +26 -58
  33. data/vendor/assets/javascripts/ace/mode-autohotkey.js +27 -63
  34. data/vendor/assets/javascripts/ace/mode-batchfile.js +27 -63
  35. data/vendor/assets/javascripts/ace/mode-c9search.js +92 -112
  36. data/vendor/assets/javascripts/ace/mode-c_cpp.js +224 -223
  37. data/vendor/assets/javascripts/ace/mode-cirru.js +202 -0
  38. data/vendor/assets/javascripts/ace/mode-clojure.js +98 -92
  39. data/vendor/assets/javascripts/ace/mode-cobol.js +27 -58
  40. data/vendor/assets/javascripts/ace/mode-coffee.js +90 -122
  41. data/vendor/assets/javascripts/ace/mode-coldfusion.js +1908 -1464
  42. data/vendor/assets/javascripts/ace/mode-csharp.js +291 -264
  43. data/vendor/assets/javascripts/ace/mode-css.js +266 -267
  44. data/vendor/assets/javascripts/ace/mode-curly.js +796 -815
  45. data/vendor/assets/javascripts/ace/mode-d.js +64 -95
  46. data/vendor/assets/javascripts/ace/mode-dart.js +254 -256
  47. data/vendor/assets/javascripts/ace/mode-diff.js +27 -58
  48. data/vendor/assets/javascripts/ace/mode-django.js +856 -866
  49. data/vendor/assets/javascripts/ace/mode-dockerfile.js +759 -0
  50. data/vendor/assets/javascripts/ace/mode-dot.js +106 -106
  51. data/vendor/assets/javascripts/ace/mode-eiffel.js +135 -0
  52. data/vendor/assets/javascripts/ace/mode-ejs.js +931 -938
  53. data/vendor/assets/javascripts/ace/mode-erlang.js +27 -58
  54. data/vendor/assets/javascripts/ace/mode-forth.js +27 -63
  55. data/vendor/assets/javascripts/ace/mode-ftl.js +457 -508
  56. data/vendor/assets/javascripts/ace/mode-gcode.js +85 -0
  57. data/vendor/assets/javascripts/ace/mode-gherkin.js +129 -0
  58. data/vendor/assets/javascripts/ace/mode-gitignore.js +50 -0
  59. data/vendor/assets/javascripts/ace/mode-glsl.js +252 -248
  60. data/vendor/assets/javascripts/ace/mode-golang.js +206 -179
  61. data/vendor/assets/javascripts/ace/mode-groovy.js +310 -242
  62. data/vendor/assets/javascripts/ace/mode-haml.js +156 -190
  63. data/vendor/assets/javascripts/ace/mode-handlebars.js +815 -784
  64. data/vendor/assets/javascripts/ace/mode-haskell.js +27 -63
  65. data/vendor/assets/javascripts/ace/mode-haxe.js +206 -176
  66. data/vendor/assets/javascripts/ace/mode-html.js +779 -792
  67. data/vendor/assets/javascripts/ace/mode-html_ruby.js +916 -923
  68. data/vendor/assets/javascripts/ace/mode-ini.js +27 -58
  69. data/vendor/assets/javascripts/ace/mode-io.js +201 -0
  70. data/vendor/assets/javascripts/ace/mode-jack.js +169 -170
  71. data/vendor/assets/javascripts/ace/mode-jade.js +722 -774
  72. data/vendor/assets/javascripts/ace/mode-java.js +310 -245
  73. data/vendor/assets/javascripts/ace/mode-javascript.js +285 -247
  74. data/vendor/assets/javascripts/ace/mode-json.js +183 -184
  75. data/vendor/assets/javascripts/ace/mode-jsoniq.js +3211 -1274
  76. data/vendor/assets/javascripts/ace/mode-jsp.js +481 -504
  77. data/vendor/assets/javascripts/ace/mode-jsx.js +206 -176
  78. data/vendor/assets/javascripts/ace/mode-julia.js +33 -69
  79. data/vendor/assets/javascripts/ace/mode-latex.js +74 -41
  80. data/vendor/assets/javascripts/ace/mode-less.js +250 -251
  81. data/vendor/assets/javascripts/ace/mode-liquid.js +424 -475
  82. data/vendor/assets/javascripts/ace/mode-lisp.js +24 -57
  83. data/vendor/assets/javascripts/ace/mode-livescript.js +42 -41
  84. data/vendor/assets/javascripts/ace/mode-logiql.js +229 -230
  85. data/vendor/assets/javascripts/ace/mode-lsl.js +200 -441
  86. data/vendor/assets/javascripts/ace/mode-lua.js +136 -167
  87. data/vendor/assets/javascripts/ace/mode-luapage.js +904 -884
  88. data/vendor/assets/javascripts/ace/mode-lucene.js +22 -17
  89. data/vendor/assets/javascripts/ace/mode-makefile.js +162 -137
  90. data/vendor/assets/javascripts/ace/mode-markdown.js +846 -854
  91. data/vendor/assets/javascripts/ace/mode-matlab.js +98 -72
  92. data/vendor/assets/javascripts/ace/mode-mel.js +569 -0
  93. data/vendor/assets/javascripts/ace/mode-mushcode.js +84 -115
  94. data/vendor/assets/javascripts/ace/mode-mysql.js +49 -80
  95. data/vendor/assets/javascripts/ace/mode-nix.js +252 -256
  96. data/vendor/assets/javascripts/ace/mode-objectivec.js +242 -274
  97. data/vendor/assets/javascripts/ace/mode-ocaml.js +71 -102
  98. data/vendor/assets/javascripts/ace/mode-pascal.js +32 -68
  99. data/vendor/assets/javascripts/ace/mode-perl.js +67 -98
  100. data/vendor/assets/javascripts/ace/mode-pgsql.js +990 -982
  101. data/vendor/assets/javascripts/ace/mode-php.js +1878 -1900
  102. data/vendor/assets/javascripts/ace/mode-plain_text.js +3 -34
  103. data/vendor/assets/javascripts/ace/mode-powershell.js +181 -151
  104. data/vendor/assets/javascripts/ace/mode-praat.js +418 -0
  105. data/vendor/assets/javascripts/ace/mode-prolog.js +27 -63
  106. data/vendor/assets/javascripts/ace/mode-properties.js +20 -48
  107. data/vendor/assets/javascripts/ace/mode-protobuf.js +252 -259
  108. data/vendor/assets/javascripts/ace/mode-python.js +84 -115
  109. data/vendor/assets/javascripts/ace/mode-r.js +105 -140
  110. data/vendor/assets/javascripts/ace/mode-rdoc.js +84 -89
  111. data/vendor/assets/javascripts/ace/mode-rhtml.js +892 -908
  112. data/vendor/assets/javascripts/ace/mode-ruby.js +434 -98
  113. data/vendor/assets/javascripts/ace/mode-rust.js +27 -63
  114. data/vendor/assets/javascripts/ace/mode-sass.js +75 -106
  115. data/vendor/assets/javascripts/ace/mode-scad.js +219 -220
  116. data/vendor/assets/javascripts/ace/mode-scala.js +311 -243
  117. data/vendor/assets/javascripts/ace/mode-scheme.js +24 -60
  118. data/vendor/assets/javascripts/ace/mode-scss.js +250 -251
  119. data/vendor/assets/javascripts/ace/mode-sh.js +506 -118
  120. data/vendor/assets/javascripts/ace/mode-sjs.js +314 -280
  121. data/vendor/assets/javascripts/ace/mode-smarty.js +2474 -0
  122. data/vendor/assets/javascripts/ace/mode-snippets.js +89 -89
  123. data/vendor/assets/javascripts/ace/mode-soy_template.js +792 -811
  124. data/vendor/assets/javascripts/ace/mode-space.js +22 -23
  125. data/vendor/assets/javascripts/ace/mode-sql.js +31 -58
  126. data/vendor/assets/javascripts/ace/mode-stylus.js +161 -197
  127. data/vendor/assets/javascripts/ace/mode-svg.js +906 -836
  128. data/vendor/assets/javascripts/ace/mode-tcl.js +61 -92
  129. data/vendor/assets/javascripts/ace/mode-tex.js +36 -73
  130. data/vendor/assets/javascripts/ace/mode-text.js +1 -0
  131. data/vendor/assets/javascripts/ace/mode-textile.js +41 -72
  132. data/vendor/assets/javascripts/ace/mode-toml.js +26 -62
  133. data/vendor/assets/javascripts/ace/mode-twig.js +1196 -892
  134. data/vendor/assets/javascripts/ace/mode-typescript.js +313 -277
  135. data/vendor/assets/javascripts/ace/mode-vala.js +982 -0
  136. data/vendor/assets/javascripts/ace/mode-vbscript.js +25 -62
  137. data/vendor/assets/javascripts/ace/mode-velocity.js +2251 -1242
  138. data/vendor/assets/javascripts/ace/mode-verilog.js +27 -59
  139. data/vendor/assets/javascripts/ace/mode-vhdl.js +26 -55
  140. data/vendor/assets/javascripts/ace/mode-xml.js +319 -644
  141. data/vendor/assets/javascripts/ace/mode-xquery.js +2503 -588
  142. data/vendor/assets/javascripts/ace/mode-yaml.js +56 -90
  143. data/vendor/assets/javascripts/ace/snippets/abap.js +7 -0
  144. data/vendor/assets/javascripts/ace/snippets/actionscript.js +159 -0
  145. data/vendor/assets/javascripts/ace/snippets/ada.js +7 -0
  146. data/vendor/assets/javascripts/ace/snippets/apache_conf.js +7 -0
  147. data/vendor/assets/javascripts/ace/snippets/applescript.js +7 -0
  148. data/vendor/assets/javascripts/ace/snippets/asciidoc.js +7 -0
  149. data/vendor/assets/javascripts/ace/snippets/assembly_x86.js +7 -0
  150. data/vendor/assets/javascripts/ace/snippets/autohotkey.js +7 -0
  151. data/vendor/assets/javascripts/ace/snippets/batchfile.js +7 -0
  152. data/vendor/assets/javascripts/ace/snippets/c9search.js +7 -0
  153. data/vendor/assets/javascripts/ace/snippets/c_cpp.js +138 -0
  154. data/vendor/assets/javascripts/ace/snippets/cirru.js +7 -0
  155. data/vendor/assets/javascripts/ace/snippets/clojure.js +97 -0
  156. data/vendor/assets/javascripts/ace/snippets/cobol.js +7 -0
  157. data/vendor/assets/javascripts/ace/snippets/coffee.js +102 -0
  158. data/vendor/assets/javascripts/ace/snippets/coldfusion.js +7 -0
  159. data/vendor/assets/javascripts/ace/snippets/csharp.js +7 -0
  160. data/vendor/assets/javascripts/ace/snippets/css.js +974 -0
  161. data/vendor/assets/javascripts/ace/snippets/curly.js +7 -0
  162. data/vendor/assets/javascripts/ace/snippets/d.js +7 -0
  163. data/vendor/assets/javascripts/ace/snippets/dart.js +90 -0
  164. data/vendor/assets/javascripts/ace/snippets/diff.js +18 -0
  165. data/vendor/assets/javascripts/ace/snippets/django.js +115 -0
  166. data/vendor/assets/javascripts/ace/snippets/dockerfile.js +7 -0
  167. data/vendor/assets/javascripts/ace/snippets/dot.js +7 -0
  168. data/vendor/assets/javascripts/ace/snippets/eiffel.js +7 -0
  169. data/vendor/assets/javascripts/ace/snippets/ejs.js +7 -0
  170. data/vendor/assets/javascripts/ace/snippets/erlang.js +167 -0
  171. data/vendor/assets/javascripts/ace/snippets/forth.js +7 -0
  172. data/vendor/assets/javascripts/ace/snippets/ftl.js +7 -0
  173. data/vendor/assets/javascripts/ace/snippets/gcode.js +7 -0
  174. data/vendor/assets/javascripts/ace/snippets/gherkin.js +7 -0
  175. data/vendor/assets/javascripts/ace/snippets/gitignore.js +7 -0
  176. data/vendor/assets/javascripts/ace/snippets/glsl.js +7 -0
  177. data/vendor/assets/javascripts/ace/snippets/golang.js +7 -0
  178. data/vendor/assets/javascripts/ace/snippets/groovy.js +7 -0
  179. data/vendor/assets/javascripts/ace/snippets/haml.js +27 -0
  180. data/vendor/assets/javascripts/ace/snippets/handlebars.js +7 -0
  181. data/vendor/assets/javascripts/ace/snippets/haskell.js +89 -0
  182. data/vendor/assets/javascripts/ace/snippets/haxe.js +7 -0
  183. data/vendor/assets/javascripts/ace/snippets/html.js +835 -0
  184. data/vendor/assets/javascripts/ace/snippets/html_ruby.js +7 -0
  185. data/vendor/assets/javascripts/ace/snippets/ini.js +7 -0
  186. data/vendor/assets/javascripts/ace/snippets/io.js +69 -0
  187. data/vendor/assets/javascripts/ace/snippets/jack.js +7 -0
  188. data/vendor/assets/javascripts/ace/snippets/jade.js +7 -0
  189. data/vendor/assets/javascripts/ace/snippets/java.js +241 -0
  190. data/vendor/assets/javascripts/ace/snippets/javascript.js +189 -0
  191. data/vendor/assets/javascripts/ace/snippets/json.js +7 -0
  192. data/vendor/assets/javascripts/ace/snippets/jsoniq.js +68 -0
  193. data/vendor/assets/javascripts/ace/snippets/jsp.js +106 -0
  194. data/vendor/assets/javascripts/ace/snippets/jsx.js +7 -0
  195. data/vendor/assets/javascripts/ace/snippets/julia.js +7 -0
  196. data/vendor/assets/javascripts/ace/snippets/latex.js +7 -0
  197. data/vendor/assets/javascripts/ace/snippets/less.js +7 -0
  198. data/vendor/assets/javascripts/ace/snippets/liquid.js +7 -0
  199. data/vendor/assets/javascripts/ace/snippets/lisp.js +7 -0
  200. data/vendor/assets/javascripts/ace/snippets/livescript.js +7 -0
  201. data/vendor/assets/javascripts/ace/snippets/logiql.js +7 -0
  202. data/vendor/assets/javascripts/ace/snippets/lsl.js +1073 -0
  203. data/vendor/assets/javascripts/ace/snippets/lua.js +28 -0
  204. data/vendor/assets/javascripts/ace/snippets/luapage.js +7 -0
  205. data/vendor/assets/javascripts/ace/snippets/lucene.js +7 -0
  206. data/vendor/assets/javascripts/ace/snippets/makefile.js +11 -0
  207. data/vendor/assets/javascripts/ace/snippets/markdown.js +95 -0
  208. data/vendor/assets/javascripts/ace/snippets/matlab.js +7 -0
  209. data/vendor/assets/javascripts/ace/snippets/mel.js +7 -0
  210. data/vendor/assets/javascripts/ace/snippets/mushcode.js +7 -0
  211. data/vendor/assets/javascripts/ace/snippets/mysql.js +7 -0
  212. data/vendor/assets/javascripts/ace/snippets/nix.js +7 -0
  213. data/vendor/assets/javascripts/ace/snippets/objectivec.js +7 -0
  214. data/vendor/assets/javascripts/ace/snippets/ocaml.js +7 -0
  215. data/vendor/assets/javascripts/ace/snippets/pascal.js +7 -0
  216. data/vendor/assets/javascripts/ace/snippets/perl.js +354 -0
  217. data/vendor/assets/javascripts/ace/snippets/pgsql.js +7 -0
  218. data/vendor/assets/javascripts/ace/snippets/php.js +283 -0
  219. data/vendor/assets/javascripts/ace/snippets/plain_text.js +7 -0
  220. data/vendor/assets/javascripts/ace/snippets/powershell.js +7 -0
  221. data/vendor/assets/javascripts/ace/snippets/praat.js +7 -0
  222. data/vendor/assets/javascripts/ace/snippets/prolog.js +7 -0
  223. data/vendor/assets/javascripts/ace/snippets/properties.js +7 -0
  224. data/vendor/assets/javascripts/ace/snippets/protobuf.js +7 -0
  225. data/vendor/assets/javascripts/ace/snippets/python.js +165 -0
  226. data/vendor/assets/javascripts/ace/snippets/r.js +128 -0
  227. data/vendor/assets/javascripts/ace/snippets/rdoc.js +7 -0
  228. data/vendor/assets/javascripts/ace/snippets/rhtml.js +7 -0
  229. data/vendor/assets/javascripts/ace/snippets/ruby.js +935 -0
  230. data/vendor/assets/javascripts/ace/snippets/rust.js +7 -0
  231. data/vendor/assets/javascripts/ace/snippets/sass.js +7 -0
  232. data/vendor/assets/javascripts/ace/snippets/scad.js +7 -0
  233. data/vendor/assets/javascripts/ace/snippets/scala.js +7 -0
  234. data/vendor/assets/javascripts/ace/snippets/scheme.js +7 -0
  235. data/vendor/assets/javascripts/ace/snippets/scss.js +7 -0
  236. data/vendor/assets/javascripts/ace/snippets/sh.js +90 -0
  237. data/vendor/assets/javascripts/ace/snippets/sjs.js +7 -0
  238. data/vendor/assets/javascripts/ace/snippets/smarty.js +7 -0
  239. data/vendor/assets/javascripts/ace/snippets/snippets.js +16 -0
  240. data/vendor/assets/javascripts/ace/snippets/soy_template.js +7 -0
  241. data/vendor/assets/javascripts/ace/snippets/space.js +7 -0
  242. data/vendor/assets/javascripts/ace/snippets/sql.js +33 -0
  243. data/vendor/assets/javascripts/ace/snippets/stylus.js +7 -0
  244. data/vendor/assets/javascripts/ace/snippets/svg.js +7 -0
  245. data/vendor/assets/javascripts/ace/snippets/tcl.js +99 -0
  246. data/vendor/assets/javascripts/ace/snippets/tex.js +197 -0
  247. data/vendor/assets/javascripts/ace/snippets/text.js +7 -0
  248. data/vendor/assets/javascripts/ace/snippets/textile.js +37 -0
  249. data/vendor/assets/javascripts/ace/snippets/toml.js +7 -0
  250. data/vendor/assets/javascripts/ace/snippets/twig.js +7 -0
  251. data/vendor/assets/javascripts/ace/snippets/typescript.js +7 -0
  252. data/vendor/assets/javascripts/ace/snippets/vala.js +193 -0
  253. data/vendor/assets/javascripts/ace/snippets/vbscript.js +7 -0
  254. data/vendor/assets/javascripts/ace/snippets/velocity.js +36 -0
  255. data/vendor/assets/javascripts/ace/snippets/verilog.js +7 -0
  256. data/vendor/assets/javascripts/ace/snippets/vhdl.js +7 -0
  257. data/vendor/assets/javascripts/ace/snippets/xml.js +7 -0
  258. data/vendor/assets/javascripts/ace/snippets/xquery.js +68 -0
  259. data/vendor/assets/javascripts/ace/snippets/yaml.js +7 -0
  260. data/vendor/assets/javascripts/ace/theme-ambiance.js +4 -24
  261. data/vendor/assets/javascripts/ace/theme-chaos.js +2 -25
  262. data/vendor/assets/javascripts/ace/theme-chrome.js +2 -31
  263. data/vendor/assets/javascripts/ace/theme-clouds.js +1 -31
  264. data/vendor/assets/javascripts/ace/theme-clouds_midnight.js +1 -31
  265. data/vendor/assets/javascripts/ace/theme-cobalt.js +1 -31
  266. data/vendor/assets/javascripts/ace/theme-crimson_editor.js +1 -31
  267. data/vendor/assets/javascripts/ace/theme-dawn.js +1 -31
  268. data/vendor/assets/javascripts/ace/theme-dreamweaver.js +5 -31
  269. data/vendor/assets/javascripts/ace/theme-eclipse.js +7 -33
  270. data/vendor/assets/javascripts/ace/theme-github.js +2 -35
  271. data/vendor/assets/javascripts/ace/theme-idle_fingers.js +1 -31
  272. data/vendor/assets/javascripts/ace/theme-katzenmilch.js +119 -0
  273. data/vendor/assets/javascripts/ace/theme-kr.js +1 -31
  274. data/vendor/assets/javascripts/ace/theme-kr_theme.js +57 -141
  275. data/vendor/assets/javascripts/ace/theme-kuroir.js +59 -0
  276. data/vendor/assets/javascripts/ace/theme-merbivore.js +1 -31
  277. data/vendor/assets/javascripts/ace/theme-merbivore_soft.js +1 -31
  278. data/vendor/assets/javascripts/ace/theme-mono_industrial.js +1 -31
  279. data/vendor/assets/javascripts/ace/theme-monokai.js +1 -31
  280. data/vendor/assets/javascripts/ace/theme-pastel_on_dark.js +1 -31
  281. data/vendor/assets/javascripts/ace/theme-solarized_dark.js +1 -31
  282. data/vendor/assets/javascripts/ace/theme-solarized_light.js +1 -31
  283. data/vendor/assets/javascripts/ace/theme-terminal.js +1 -31
  284. data/vendor/assets/javascripts/ace/theme-textmate.js +3 -32
  285. data/vendor/assets/javascripts/ace/theme-tomorrow.js +1 -31
  286. data/vendor/assets/javascripts/ace/theme-tomorrow_night.js +1 -31
  287. data/vendor/assets/javascripts/ace/theme-tomorrow_night_blue.js +1 -31
  288. data/vendor/assets/javascripts/ace/theme-tomorrow_night_bright.js +1 -31
  289. data/vendor/assets/javascripts/ace/theme-tomorrow_night_eighties.js +1 -31
  290. data/vendor/assets/javascripts/ace/theme-twilight.js +1 -31
  291. data/vendor/assets/javascripts/ace/theme-vibrant_ink.js +1 -31
  292. data/vendor/assets/javascripts/ace/theme-xcode.js +2 -33
  293. data/vendor/assets/javascripts/ace/worker-coffee.js +5026 -5008
  294. data/vendor/assets/javascripts/ace/worker-css.js +5489 -5134
  295. data/vendor/assets/javascripts/ace/worker-html.js +11517 -0
  296. data/vendor/assets/javascripts/ace/worker-javascript.js +9810 -9501
  297. data/vendor/assets/javascripts/ace/worker-json.js +1583 -1564
  298. data/vendor/assets/javascripts/ace/worker-lua.js +2631 -2612
  299. data/vendor/assets/javascripts/ace/worker-php.js +2385 -2341
  300. data/vendor/assets/javascripts/ace/worker-xquery.js +31643 -3993
  301. metadata +147 -11
@@ -0,0 +1,6 @@
1
+
2
+ ;
3
+ (function() {
4
+ window.require(["ace/ext/error_marker"], function() {});
5
+ })();
6
+
@@ -1,72 +1,5 @@
1
- /* ***** BEGIN LICENSE BLOCK *****
2
- * Distributed under the BSD license:
3
- *
4
- * Copyright (c) 2013 Matthew Christopher Kastor-Inare III, Atropa Inc. Intl
5
- * All rights reserved.
6
- *
7
- * Contributed to Ajax.org under the BSD license.
8
- *
9
- * Redistribution and use in source and binary forms, with or without
10
- * modification, are permitted provided that the following conditions are met:
11
- * * Redistributions of source code must retain the above copyright
12
- * notice, this list of conditions and the following disclaimer.
13
- * * Redistributions in binary form must reproduce the above copyright
14
- * notice, this list of conditions and the following disclaimer in the
15
- * documentation and/or other materials provided with the distribution.
16
- * * Neither the name of Ajax.org B.V. nor the
17
- * names of its contributors may be used to endorse or promote products
18
- * derived from this software without specific prior written permission.
19
- *
20
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
21
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23
- * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
24
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
27
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
- *
31
- * ***** END LICENSE BLOCK ***** */
32
-
33
- define('ace/ext/keybinding_menu', ['require', 'exports', 'module' , 'ace/editor', 'ace/ext/menu_tools/overlay_page', 'ace/ext/menu_tools/get_editor_keyboard_shortcuts'], function(require, exports, module) {
34
-
35
- var Editor = require("ace/editor").Editor;
36
- function showKeyboardShortcuts (editor) {
37
- if(!document.getElementById('kbshortcutmenu')) {
38
- var overlayPage = require('./menu_tools/overlay_page').overlayPage;
39
- var getEditorKeybordShortcuts = require('./menu_tools/get_editor_keyboard_shortcuts').getEditorKeybordShortcuts;
40
- var kb = getEditorKeybordShortcuts(editor);
41
- var el = document.createElement('div');
42
- var commands = kb.reduce(function(previous, current) {
43
- return previous + '<div class="ace_optionsMenuEntry"><span class="ace_optionsMenuCommand">'
44
- + current.command + '</span> : '
45
- + '<span class="ace_optionsMenuKey">' + current.key + '</span></div>';
46
- }, '');
47
-
48
- el.id = 'kbshortcutmenu';
49
- el.innerHTML = '<h1>Keyboard Shortcuts</h1>' + commands + '</div>';
50
- overlayPage(editor, el, '0', '0', '0', null);
51
- }
52
- };
53
- module.exports.init = function(editor) {
54
- Editor.prototype.showKeyboardShortcuts = function() {
55
- showKeyboardShortcuts(this);
56
- };
57
- editor.commands.addCommands([{
58
- name: "showKeyboardShortcuts",
59
- bindKey: {win: "Ctrl-Alt-h", mac: "Command-Alt-h"},
60
- exec: function(editor, line) {
61
- editor.showKeyboardShortcuts();
62
- }
63
- }]);
64
- };
65
-
66
- });
67
-
68
- define('ace/ext/menu_tools/overlay_page', ['require', 'exports', 'module' , 'ace/lib/dom'], function(require, exports, module) {
69
-
1
+ define("ace/ext/menu_tools/overlay_page",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
2
+ 'use strict';
70
3
  var dom = require("../../lib/dom");
71
4
  var cssText = "#ace_settingsmenu, #kbshortcutmenu {\
72
5
  background-color: #F7F7F7;\
@@ -166,8 +99,8 @@ module.exports.overlayPage = function overlayPage(editor, contentElement, top, r
166
99
 
167
100
  });
168
101
 
169
- define('ace/ext/menu_tools/get_editor_keyboard_shortcuts', ['require', 'exports', 'module' , 'ace/lib/keys'], function(require, exports, module) {
170
-
102
+ define("ace/ext/menu_tools/get_editor_keyboard_shortcuts",["require","exports","module","ace/lib/keys"], function(require, exports, module) {
103
+ "use strict";
171
104
  var keys = require("../../lib/keys");
172
105
  module.exports.getEditorKeybordShortcuts = function(editor) {
173
106
  var KEY_MODS = keys.KEY_MODS;
@@ -204,4 +137,44 @@ module.exports.getEditorKeybordShortcuts = function(editor) {
204
137
  return keybindings;
205
138
  };
206
139
 
207
- });
140
+ });
141
+
142
+ define("ace/ext/keybinding_menu",["require","exports","module","ace/editor","ace/ext/menu_tools/overlay_page","ace/ext/menu_tools/get_editor_keyboard_shortcuts"], function(require, exports, module) {
143
+ "use strict";
144
+ var Editor = require("ace/editor").Editor;
145
+ function showKeyboardShortcuts (editor) {
146
+ if(!document.getElementById('kbshortcutmenu')) {
147
+ var overlayPage = require('./menu_tools/overlay_page').overlayPage;
148
+ var getEditorKeybordShortcuts = require('./menu_tools/get_editor_keyboard_shortcuts').getEditorKeybordShortcuts;
149
+ var kb = getEditorKeybordShortcuts(editor);
150
+ var el = document.createElement('div');
151
+ var commands = kb.reduce(function(previous, current) {
152
+ return previous + '<div class="ace_optionsMenuEntry"><span class="ace_optionsMenuCommand">'
153
+ + current.command + '</span> : '
154
+ + '<span class="ace_optionsMenuKey">' + current.key + '</span></div>';
155
+ }, '');
156
+
157
+ el.id = 'kbshortcutmenu';
158
+ el.innerHTML = '<h1>Keyboard Shortcuts</h1>' + commands + '</div>';
159
+ overlayPage(editor, el, '0', '0', '0', null);
160
+ }
161
+ };
162
+ module.exports.init = function(editor) {
163
+ Editor.prototype.showKeyboardShortcuts = function() {
164
+ showKeyboardShortcuts(this);
165
+ };
166
+ editor.commands.addCommands([{
167
+ name: "showKeyboardShortcuts",
168
+ bindKey: {win: "Ctrl-Alt-h", mac: "Command-Alt-h"},
169
+ exec: function(editor, line) {
170
+ editor.showKeyboardShortcuts();
171
+ }
172
+ }]);
173
+ };
174
+
175
+ });
176
+ ;
177
+ (function() {
178
+ window.require(["ace/ext/keybinding_menu"], function() {});
179
+ })();
180
+
@@ -1,153 +1,10 @@
1
- /* ***** BEGIN LICENSE BLOCK *****
2
- * Distributed under the BSD license:
3
- *
4
- * Copyright (c) 2012, Ajax.org B.V.
5
- * All rights reserved.
6
- *
7
- * Redistribution and use in source and binary forms, with or without
8
- * modification, are permitted provided that the following conditions are met:
9
- * * Redistributions of source code must retain the above copyright
10
- * notice, this list of conditions and the following disclaimer.
11
- * * Redistributions in binary form must reproduce the above copyright
12
- * notice, this list of conditions and the following disclaimer in the
13
- * documentation and/or other materials provided with the distribution.
14
- * * Neither the name of Ajax.org B.V. nor the
15
- * names of its contributors may be used to endorse or promote products
16
- * derived from this software without specific prior written permission.
17
- *
18
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
- * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
22
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
- *
29
- * ***** END LICENSE BLOCK ***** */
30
-
31
- define('ace/ext/language_tools', ['require', 'exports', 'module' , 'ace/snippets', 'ace/autocomplete', 'ace/config', 'ace/autocomplete/text_completer', 'ace/editor'], function(require, exports, module) {
32
-
33
-
34
- var snippetManager = require("../snippets").snippetManager;
35
- var Autocomplete = require("../autocomplete").Autocomplete;
36
- var config = require("../config");
37
-
38
- var textCompleter = require("../autocomplete/text_completer");
39
- var keyWordCompleter = {
40
- getCompletions: function(editor, session, pos, prefix, callback) {
41
- var state = editor.session.getState(pos.row);
42
- var completions = session.$mode.getCompletions(state, session, pos, prefix);
43
- callback(null, completions);
44
- }
45
- };
46
-
47
- var snippetCompleter = {
48
- getCompletions: function(editor, session, pos, prefix, callback) {
49
- var snippetMap = snippetManager.snippetMap;
50
- var completions = [];
51
- snippetManager.getActiveScopes(editor).forEach(function(scope) {
52
- var snippets = snippetMap[scope] || [];
53
- for (var i = snippets.length; i--;) {
54
- var s = snippets[i];
55
- var caption = s.name || s.tabTrigger;
56
- if (!caption)
57
- continue;
58
- completions.push({
59
- caption: caption,
60
- snippet: s.content,
61
- meta: s.tabTrigger && !s.name ? s.tabTrigger + "\u21E5 " : "snippet"
62
- });
63
- }
64
- }, this);
65
- callback(null, completions);
66
- }
67
- };
68
-
69
- var completers = [snippetCompleter, textCompleter, keyWordCompleter];
70
- exports.addCompleter = function(completer) {
71
- completers.push(completer);
72
- };
73
-
74
- var expandSnippet = {
75
- name: "expandSnippet",
76
- exec: function(editor) {
77
- var success = snippetManager.expandWithTab(editor);
78
- if (!success)
79
- editor.execCommand("indent");
80
- },
81
- bindKey: "tab"
82
- };
83
-
84
- var onChangeMode = function(e, editor) {
85
- loadSnippetsForMode(editor.session.$mode);
86
- };
87
-
88
- var loadSnippetsForMode = function(mode) {
89
- var id = mode.$id;
90
- if (!snippetManager.files)
91
- snippetManager.files = {};
92
- loadSnippetFile(id);
93
- if (mode.modes)
94
- mode.modes.forEach(loadSnippetsForMode);
95
- };
96
-
97
- var loadSnippetFile = function(id) {
98
- if (!id || snippetManager.files[id])
99
- return;
100
- var snippetFilePath = id.replace("mode", "snippets");
101
- snippetManager.files[id] = {};
102
- config.loadModule(snippetFilePath, function(m) {
103
- if (m) {
104
- snippetManager.files[id] = m;
105
- m.snippets = snippetManager.parseSnippetFile(m.snippetText);
106
- snippetManager.register(m.snippets, m.scope);
107
- if (m.includeScopes) {
108
- snippetManager.snippetMap[m.scope].includeScopes = m.includeScopes;
109
- m.includeScopes.forEach(function(x) {
110
- loadSnippetFile("ace/mode/" + x);
111
- });
112
- }
113
- }
114
- });
115
- };
116
-
117
- var Editor = require("../editor").Editor;
118
- require("../config").defineOptions(Editor.prototype, "editor", {
119
- enableBasicAutocompletion: {
120
- set: function(val) {
121
- if (val) {
122
- this.completers = completers;
123
- this.commands.addCommand(Autocomplete.startCommand);
124
- } else {
125
- this.commands.removeCommand(Autocomplete.startCommand);
126
- }
127
- },
128
- value: false
129
- },
130
- enableSnippets: {
131
- set: function(val) {
132
- if (val) {
133
- this.commands.addCommand(expandSnippet);
134
- this.on("changeMode", onChangeMode);
135
- onChangeMode(null, this);
136
- } else {
137
- this.commands.removeCommand(expandSnippet);
138
- this.off("changeMode", onChangeMode);
139
- }
140
- },
141
- value: false
142
- }
143
- });
144
-
145
- });
146
-
147
- define('ace/snippets', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/range', 'ace/keyboard/hash_handler', 'ace/tokenizer', 'ace/lib/dom'], function(require, exports, module) {
148
-
149
- var lang = require("./lib/lang")
150
- var Range = require("./range").Range
1
+ define("ace/snippets",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/lib/lang","ace/range","ace/anchor","ace/keyboard/hash_handler","ace/tokenizer","ace/lib/dom","ace/editor"], function(require, exports, module) {
2
+ "use strict";
3
+ var oop = require("./lib/oop");
4
+ var EventEmitter = require("./lib/event_emitter").EventEmitter;
5
+ var lang = require("./lib/lang");
6
+ var Range = require("./range").Range;
7
+ var Anchor = require("./anchor").Anchor;
151
8
  var HashHandler = require("./keyboard/hash_handler").HashHandler;
152
9
  var Tokenizer = require("./tokenizer").Tokenizer;
153
10
  var comparePoints = Range.comparePoints;
@@ -158,12 +15,14 @@ var SnippetManager = function() {
158
15
  };
159
16
 
160
17
  (function() {
18
+ oop.implement(this, EventEmitter);
19
+
161
20
  this.getTokenizer = function() {
162
21
  function TabstopToken(str, _, stack) {
163
22
  str = str.substr(1);
164
23
  if (/^\d+$/.test(str) && !stack.inFormatString)
165
24
  return [{tabstopId: parseInt(str, 10)}];
166
- return [{text: str}]
25
+ return [{text: str}];
167
26
  }
168
27
  function escape(ch) {
169
28
  return "(?:[^\\\\" + ch + "]|\\\\.)";
@@ -241,7 +100,7 @@ var SnippetManager = function() {
241
100
  });
242
101
  SnippetManager.prototype.getTokenizer = function() {
243
102
  return SnippetManager.$tokenizer;
244
- }
103
+ };
245
104
  return SnippetManager.$tokenizer;
246
105
  };
247
106
 
@@ -284,7 +143,7 @@ var SnippetManager = function() {
284
143
  return s.getTabSize();
285
144
  case "FILENAME":
286
145
  case "FILEPATH":
287
- return "ace.ajax.org";
146
+ return "";
288
147
  case "FULLNAME":
289
148
  return "Ace";
290
149
  }
@@ -375,11 +234,14 @@ var SnippetManager = function() {
375
234
  return result;
376
235
  };
377
236
 
378
- this.insertSnippet = function(editor, snippetText) {
237
+ this.insertSnippetForSelection = function(editor, snippetText) {
379
238
  var cursor = editor.getCursorPosition();
380
239
  var line = editor.session.getLine(cursor.row);
381
- var indentString = line.match(/^\s*/)[0];
382
240
  var tabString = editor.session.getTabString();
241
+ var indentString = line.match(/^\s*/)[0];
242
+
243
+ if (cursor.column < indentString.length)
244
+ indentString = indentString.slice(0, cursor.column);
383
245
 
384
246
  var tokens = this.tokenizeTmSnippet(snippetText);
385
247
  tokens = this.resolveVariables(tokens, editor);
@@ -419,7 +281,7 @@ var SnippetManager = function() {
419
281
  tabstops.forEach(function(ts) {ts.length = 0});
420
282
  var expanding = {};
421
283
  function copyValue(val) {
422
- var copy = []
284
+ var copy = [];
423
285
  for (var i = 0; i < val.length; i++) {
424
286
  var p = val[i];
425
287
  if (typeof p == "object") {
@@ -438,8 +300,9 @@ var SnippetManager = function() {
438
300
  continue;
439
301
  var id = p.tabstopId;
440
302
  var i1 = tokens.indexOf(p, i + 1);
441
- if (expanding[id] == p) {
442
- expanding[id] = null;
303
+ if (expanding[id]) {
304
+ if (expanding[id] === p)
305
+ expanding[id] = null;
443
306
  continue;
444
307
  }
445
308
 
@@ -452,7 +315,7 @@ var SnippetManager = function() {
452
315
 
453
316
  if (ts.indexOf(p) === -1)
454
317
  ts.push(p);
455
- };
318
+ }
456
319
  var row = 0, column = 0;
457
320
  var text = "";
458
321
  tokens.forEach(function(t) {
@@ -474,17 +337,30 @@ var SnippetManager = function() {
474
337
  var end = editor.session.replace(range, text);
475
338
 
476
339
  var tabstopManager = new TabstopManager(editor);
477
- tabstopManager.addTabstops(tabstops, range.start, end);
478
- tabstopManager.tabNext();
340
+ var selectionId = editor.inVirtualSelectionMode && editor.selection.index;
341
+ tabstopManager.addTabstops(tabstops, range.start, end, selectionId);
342
+ };
343
+
344
+ this.insertSnippet = function(editor, snippetText) {
345
+ var self = this;
346
+ if (editor.inVirtualSelectionMode)
347
+ return self.insertSnippetForSelection(editor, snippetText);
348
+
349
+ editor.forEachSelection(function() {
350
+ self.insertSnippetForSelection(editor, snippetText);
351
+ }, null, {keepOrder: true});
352
+
353
+ if (editor.tabstopManager)
354
+ editor.tabstopManager.tabNext();
479
355
  };
480
356
 
481
357
  this.$getScope = function(editor) {
482
358
  var scope = editor.session.$mode.$id || "";
483
359
  scope = scope.split("/").pop();
484
360
  if (scope === "html" || scope === "php") {
485
- if (scope === "php")
361
+ if (scope === "php" && !editor.session.$mode.inlinePhp)
486
362
  scope = "html";
487
- var c = editor.getCursorPosition()
363
+ var c = editor.getCursorPosition();
488
364
  var state = editor.session.getState(c.row);
489
365
  if (typeof state === "object") {
490
366
  state = state[0];
@@ -513,7 +389,17 @@ var SnippetManager = function() {
513
389
  return scopes;
514
390
  };
515
391
 
516
- this.expandWithTab = function(editor) {
392
+ this.expandWithTab = function(editor, options) {
393
+ var self = this;
394
+ var result = editor.forEachSelection(function() {
395
+ return self.expandSnippetForSelection(editor, options);
396
+ }, null, {keepOrder: true});
397
+ if (result && editor.tabstopManager)
398
+ editor.tabstopManager.tabNext();
399
+ return result;
400
+ };
401
+
402
+ this.expandSnippetForSelection = function(editor, options) {
517
403
  var cursor = editor.getCursorPosition();
518
404
  var line = editor.session.getLine(cursor.row);
519
405
  var before = line.substring(0, cursor.column);
@@ -529,7 +415,8 @@ var SnippetManager = function() {
529
415
  }, this);
530
416
  if (!snippet)
531
417
  return false;
532
-
418
+ if (options && options.dryRun)
419
+ return true;
533
420
  editor.session.doc.removeInLine(cursor.row,
534
421
  cursor.column - snippet.replaceBefore.length,
535
422
  cursor.column + snippet.replaceAfter.length
@@ -537,7 +424,7 @@ var SnippetManager = function() {
537
424
 
538
425
  this.variables.M__ = snippet.matchBefore;
539
426
  this.variables.T__ = snippet.matchAfter;
540
- this.insertSnippet(editor, snippet.content);
427
+ this.insertSnippetForSelection(editor, snippet.content);
541
428
 
542
429
  this.variables.M__ = this.variables.T__ = null;
543
430
  return true;
@@ -567,9 +454,13 @@ var SnippetManager = function() {
567
454
  var snippetMap = this.snippetMap;
568
455
  var snippetNameMap = this.snippetNameMap;
569
456
  var self = this;
457
+
458
+ if (!snippets)
459
+ snippets = [];
460
+
570
461
  function wrapRegexp(src) {
571
462
  if (src && !/^\^?\(.*\)\$?$|^\\b$/.test(src))
572
- src = "(?:" + src + ")"
463
+ src = "(?:" + src + ")";
573
464
 
574
465
  return src || "";
575
466
  }
@@ -591,7 +482,7 @@ var SnippetManager = function() {
591
482
  function addSnippet(s) {
592
483
  if (!s.scope)
593
484
  s.scope = scope || "_";
594
- scope = s.scope
485
+ scope = s.scope;
595
486
  if (!snippetMap[scope]) {
596
487
  snippetMap[scope] = [];
597
488
  snippetNameMap[scope] = {};
@@ -617,12 +508,14 @@ var SnippetManager = function() {
617
508
 
618
509
  s.endRe = guardedRegexp(s.endTrigger, s.endGuard, true);
619
510
  s.endTriggerRe = new RegExp(s.endTrigger, "", true);
620
- };
511
+ }
621
512
 
622
- if (snippets.content)
513
+ if (snippets && snippets.content)
623
514
  addSnippet(snippets);
624
515
  else if (Array.isArray(snippets))
625
516
  snippets.forEach(addSnippet);
517
+
518
+ this._signal("registerSnippets", {scope: scope});
626
519
  };
627
520
  this.unregister = function(snippets, scope) {
628
521
  var snippetMap = this.snippetMap;
@@ -651,7 +544,7 @@ var SnippetManager = function() {
651
544
  while (m = re.exec(str)) {
652
545
  if (m[1]) {
653
546
  try {
654
- snippet = JSON.parse(m[1])
547
+ snippet = JSON.parse(m[1]);
655
548
  list.push(snippet);
656
549
  } catch (e) {}
657
550
  } if (m[4]) {
@@ -704,9 +597,10 @@ var TabstopManager = function(editor) {
704
597
  };
705
598
  (function() {
706
599
  this.attach = function(editor) {
707
- this.index = -1;
600
+ this.index = 0;
708
601
  this.ranges = [];
709
602
  this.tabstops = [];
603
+ this.$openTabstops = null;
710
604
  this.selectedTabstop = null;
711
605
 
712
606
  this.editor = editor;
@@ -746,7 +640,7 @@ var TabstopManager = function(editor) {
746
640
  }
747
641
  if (!this.$inChange && isRemove) {
748
642
  var ts = this.selectedTabstop;
749
- var changedOutside = !ts.some(function(r) {
643
+ var changedOutside = ts && !ts.some(function(r) {
750
644
  return comparePoints(r.start, start) <= 0 && comparePoints(r.end, end) >= 0;
751
645
  });
752
646
  if (changedOutside)
@@ -758,7 +652,7 @@ var TabstopManager = function(editor) {
758
652
  if (r.end.row < start.row)
759
653
  continue;
760
654
 
761
- if (comparePoints(start, r.start) < 0 && comparePoints(end, r.end) > 0) {
655
+ if (isRemove && comparePoints(start, r.start) < 0 && comparePoints(end, r.end) > 0) {
762
656
  this.removeRange(r);
763
657
  i--;
764
658
  continue;
@@ -781,7 +675,7 @@ var TabstopManager = function(editor) {
781
675
  };
782
676
  this.updateLinkedFields = function() {
783
677
  var ts = this.selectedTabstop;
784
- if (!ts.hasLinkedRanges)
678
+ if (!ts || !ts.hasLinkedRanges)
785
679
  return;
786
680
  this.$inChange = true;
787
681
  var session = this.editor.session;
@@ -790,7 +684,7 @@ var TabstopManager = function(editor) {
790
684
  var range = ts[i];
791
685
  if (!range.linked)
792
686
  continue;
793
- var fmt = exports.snippetManager.tmStrFormat(text, range.original)
687
+ var fmt = exports.snippetManager.tmStrFormat(text, range.original);
794
688
  session.replace(range, fmt);
795
689
  }
796
690
  this.$inChange = false;
@@ -801,7 +695,7 @@ var TabstopManager = function(editor) {
801
695
  };
802
696
  this.onChangeSelection = function() {
803
697
  if (!this.editor)
804
- return
698
+ return;
805
699
  var lead = this.editor.selection.lead;
806
700
  var anchor = this.editor.selection.anchor;
807
701
  var isEmpty = this.editor.selection.isEmpty();
@@ -819,14 +713,17 @@ var TabstopManager = function(editor) {
819
713
  this.detach();
820
714
  };
821
715
  this.tabNext = function(dir) {
822
- var max = this.tabstops.length - 1;
716
+ var max = this.tabstops.length;
823
717
  var index = this.index + (dir || 1);
824
- index = Math.min(Math.max(index, 0), max);
825
- this.selectTabstop(index);
718
+ index = Math.min(Math.max(index, 1), max);
826
719
  if (index == max)
720
+ index = 0;
721
+ this.selectTabstop(index);
722
+ if (index === 0)
827
723
  this.detach();
828
724
  };
829
725
  this.selectTabstop = function(index) {
726
+ this.$openTabstops = null;
830
727
  var ts = this.tabstops[this.index];
831
728
  if (ts)
832
729
  this.addTabstopMarkers(ts);
@@ -844,6 +741,8 @@ var TabstopManager = function(editor) {
844
741
  continue;
845
742
  sel.addRange(ts[i].clone(), true);
846
743
  }
744
+ if (sel.ranges[0])
745
+ sel.addRange(sel.ranges[0].clone());
847
746
  } else {
848
747
  this.editor.selection.setRange(ts.firstNonLinked);
849
748
  }
@@ -851,6 +750,8 @@ var TabstopManager = function(editor) {
851
750
  this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler);
852
751
  };
853
752
  this.addTabstops = function(tabstops, start, end) {
753
+ if (!this.$openTabstops)
754
+ this.$openTabstops = [];
854
755
  if (!tabstops[0]) {
855
756
  var p = Range.fromPoints(end, end);
856
757
  moveRelative(p.start, start);
@@ -860,32 +761,43 @@ var TabstopManager = function(editor) {
860
761
  }
861
762
 
862
763
  var i = this.index;
863
- var arg = [i, 0];
764
+ var arg = [i + 1, 0];
864
765
  var ranges = this.ranges;
865
- var editor = this.editor;
866
- tabstops.forEach(function(ts) {
766
+ tabstops.forEach(function(ts, index) {
767
+ var dest = this.$openTabstops[index] || ts;
768
+
867
769
  for (var i = ts.length; i--;) {
868
770
  var p = ts[i];
869
771
  var range = Range.fromPoints(p.start, p.end || p.start);
870
772
  movePoint(range.start, start);
871
773
  movePoint(range.end, start);
872
774
  range.original = p;
873
- range.tabstop = ts;
775
+ range.tabstop = dest;
874
776
  ranges.push(range);
875
- ts[i] = range;
777
+ if (dest != ts)
778
+ dest.unshift(range);
779
+ else
780
+ dest[i] = range;
876
781
  if (p.fmtString) {
877
782
  range.linked = true;
878
- ts.hasLinkedRanges = true;
879
- } else if (!ts.firstNonLinked)
880
- ts.firstNonLinked = range;
783
+ dest.hasLinkedRanges = true;
784
+ } else if (!dest.firstNonLinked)
785
+ dest.firstNonLinked = range;
881
786
  }
882
- if (!ts.firstNonLinked)
883
- ts.hasLinkedRanges = false;
884
- arg.push(ts);
885
- this.addTabstopMarkers(ts);
787
+ if (!dest.firstNonLinked)
788
+ dest.hasLinkedRanges = false;
789
+ if (dest === ts) {
790
+ arg.push(dest);
791
+ this.$openTabstops[index] = dest;
792
+ }
793
+ this.addTabstopMarkers(dest);
886
794
  }, this);
887
- arg.push(arg.splice(2, 1)[0]);
888
- this.tabstops.splice.apply(this.tabstops, arg);
795
+
796
+ if (arg.length > 2) {
797
+ if (this.tabstops.length)
798
+ arg.push(arg.splice(2, 1)[0]);
799
+ this.tabstops.splice.apply(this.tabstops, arg);
800
+ }
889
801
  };
890
802
 
891
803
  this.addTabstopMarkers = function(ts) {
@@ -908,6 +820,13 @@ var TabstopManager = function(editor) {
908
820
  i = this.ranges.indexOf(range);
909
821
  this.ranges.splice(i, 1);
910
822
  this.editor.session.removeMarker(range.markerId);
823
+ if (!range.tabstop.length) {
824
+ i = this.tabstops.indexOf(range.tabstop);
825
+ if (i != -1)
826
+ this.tabstops.splice(i, 1);
827
+ if (!this.tabstops.length)
828
+ this.detach();
829
+ }
911
830
  };
912
831
 
913
832
  this.keyboardHandler = new HashHandler();
@@ -932,6 +851,19 @@ var TabstopManager = function(editor) {
932
851
  }).call(TabstopManager.prototype);
933
852
 
934
853
 
854
+
855
+ var changeTracker = {};
856
+ changeTracker.onChange = Anchor.prototype.onChange;
857
+ changeTracker.setPosition = function(row, column) {
858
+ this.pos.row = row;
859
+ this.pos.column = column;
860
+ };
861
+ changeTracker.update = function(pos, delta, $insertRight) {
862
+ this.$insertRight = $insertRight;
863
+ this.pos = pos;
864
+ this.onChange(delta);
865
+ };
866
+
935
867
  var movePoint = function(point, diff) {
936
868
  if (point.row == 0)
937
869
  point.column += diff.column;
@@ -957,372 +889,67 @@ require("./lib/dom").importCssString("\
957
889
  exports.snippetManager = new SnippetManager();
958
890
 
959
891
 
892
+ var Editor = require("./editor").Editor;
893
+ (function() {
894
+ this.insertSnippet = function(content, options) {
895
+ return exports.snippetManager.insertSnippet(this, content, options);
896
+ };
897
+ this.expandSnippet = function(options) {
898
+ return exports.snippetManager.expandWithTab(this, options);
899
+ };
900
+ }).call(Editor.prototype);
901
+
960
902
  });
961
903
 
962
- define('ace/autocomplete', ['require', 'exports', 'module' , 'ace/keyboard/hash_handler', 'ace/autocomplete/popup', 'ace/autocomplete/util', 'ace/lib/event', 'ace/lib/lang', 'ace/snippets'], function(require, exports, module) {
904
+ define("ace/autocomplete/popup",["require","exports","module","ace/edit_session","ace/virtual_renderer","ace/editor","ace/range","ace/lib/event","ace/lib/lang","ace/lib/dom"], function(require, exports, module) {
905
+ "use strict";
963
906
 
907
+ var EditSession = require("../edit_session").EditSession;
908
+ var Renderer = require("../virtual_renderer").VirtualRenderer;
909
+ var Editor = require("../editor").Editor;
910
+ var Range = require("../range").Range;
911
+ var event = require("../lib/event");
912
+ var lang = require("../lib/lang");
913
+ var dom = require("../lib/dom");
964
914
 
965
- var HashHandler = require("./keyboard/hash_handler").HashHandler;
966
- var AcePopup = require("./autocomplete/popup").AcePopup;
967
- var util = require("./autocomplete/util");
968
- var event = require("./lib/event");
969
- var lang = require("./lib/lang");
970
- var snippetManager = require("./snippets").snippetManager;
915
+ var $singleLineEditor = function(el) {
916
+ var renderer = new Renderer(el);
971
917
 
972
- var Autocomplete = function() {
973
- this.autoInsert = true;
974
- this.keyboardHandler = new HashHandler();
975
- this.keyboardHandler.bindKeys(this.commands);
918
+ renderer.$maxLines = 4;
976
919
 
977
- this.blurListener = this.blurListener.bind(this);
978
- this.changeListener = this.changeListener.bind(this);
979
- this.mousedownListener = this.mousedownListener.bind(this);
980
- this.mousewheelListener = this.mousewheelListener.bind(this);
981
-
982
- this.changeTimer = lang.delayedCall(function() {
983
- this.updateCompletions(true);
984
- }.bind(this))
985
- };
920
+ var editor = new Editor(renderer);
986
921
 
987
- (function() {
988
- this.$init = function() {
989
- this.popup = new AcePopup(document.body || document.documentElement);
990
- this.popup.on("click", function(e) {
991
- this.insertMatch();
992
- e.stop();
993
- }.bind(this));
994
- };
922
+ editor.setHighlightActiveLine(false);
923
+ editor.setShowPrintMargin(false);
924
+ editor.renderer.setShowGutter(false);
925
+ editor.renderer.setHighlightGutterLine(false);
995
926
 
996
- this.openPopup = function(editor, prefix, keepPopupPosition) {
997
- if (!this.popup)
998
- this.$init();
927
+ editor.$mouseHandler.$focusWaitTimout = 0;
928
+ editor.$highlightTagPending = true;
999
929
 
1000
- this.popup.setData(this.completions.filtered);
930
+ return editor;
931
+ };
1001
932
 
1002
- var renderer = editor.renderer;
1003
- if (!keepPopupPosition) {
1004
- this.popup.setRow(0);
1005
- this.popup.setFontSize(editor.getFontSize());
933
+ var AcePopup = function(parentNode) {
934
+ var el = dom.createElement("div");
935
+ var popup = new $singleLineEditor(el);
1006
936
 
1007
- var lineHeight = renderer.layerConfig.lineHeight;
1008
-
1009
- var pos = renderer.$cursorLayer.getPixelPosition(this.base, true);
1010
- pos.left -= this.popup.getTextLeftOffset();
1011
-
1012
- var rect = editor.container.getBoundingClientRect();
1013
- pos.top += rect.top - renderer.layerConfig.offset;
1014
- pos.left += rect.left - editor.renderer.scrollLeft;
1015
- pos.left += renderer.$gutterLayer.gutterWidth;
937
+ if (parentNode)
938
+ parentNode.appendChild(el);
939
+ el.style.display = "none";
940
+ popup.renderer.content.style.cursor = "default";
941
+ popup.renderer.setStyle("ace_autocomplete");
1016
942
 
1017
- this.popup.show(pos, lineHeight);
1018
- }
1019
- };
943
+ popup.setOption("displayIndentGuides", false);
944
+ popup.setOption("dragDelay", 150);
1020
945
 
1021
- this.detach = function() {
1022
- this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler);
1023
- this.editor.off("changeSelection", this.changeListener);
1024
- this.editor.off("blur", this.changeListener);
1025
- this.editor.off("mousedown", this.mousedownListener);
1026
- this.editor.off("mousewheel", this.mousewheelListener);
1027
- this.changeTimer.cancel();
1028
-
1029
- if (this.popup)
1030
- this.popup.hide();
946
+ var noop = function(){};
1031
947
 
1032
- this.activated = false;
1033
- this.completions = this.base = null;
1034
- };
948
+ popup.focus = noop;
949
+ popup.$isFocused = true;
1035
950
 
1036
- this.changeListener = function(e) {
1037
- var cursor = this.editor.selection.lead;
1038
- if (cursor.row != this.base.row || cursor.column < this.base.column) {
1039
- this.detach();
1040
- }
1041
- if (this.activated)
1042
- this.changeTimer.schedule();
1043
- else
1044
- this.detach();
1045
- };
1046
-
1047
- this.blurListener = function() {
1048
- if (document.activeElement != this.editor.textInput.getElement())
1049
- this.detach();
1050
- };
1051
-
1052
- this.mousedownListener = function(e) {
1053
- this.detach();
1054
- };
1055
-
1056
- this.mousewheelListener = function(e) {
1057
- this.detach();
1058
- };
1059
-
1060
- this.goTo = function(where) {
1061
- var row = this.popup.getRow();
1062
- var max = this.popup.session.getLength() - 1;
1063
-
1064
- switch(where) {
1065
- case "up": row = row < 0 ? max : row - 1; break;
1066
- case "down": row = row >= max ? -1 : row + 1; break;
1067
- case "start": row = 0; break;
1068
- case "end": row = max; break;
1069
- }
1070
-
1071
- this.popup.setRow(row);
1072
- };
1073
-
1074
- this.insertMatch = function(data) {
1075
- if (!data)
1076
- data = this.popup.getData(this.popup.getRow());
1077
- if (!data)
1078
- return false;
1079
- if (data.completer && data.completer.insertMatch) {
1080
- data.completer.insertMatch(this.editor);
1081
- } else {
1082
- if (this.completions.filterText) {
1083
- var ranges = this.editor.selection.getAllRanges();
1084
- for (var i = 0, range; range = ranges[i]; i++) {
1085
- range.start.column -= this.completions.filterText.length;
1086
- this.editor.session.remove(range);
1087
- }
1088
- }
1089
- if (data.snippet)
1090
- snippetManager.insertSnippet(this.editor, data.snippet);
1091
- else
1092
- this.editor.execCommand("insertstring", data.value || data);
1093
- }
1094
- this.detach();
1095
- };
1096
-
1097
- this.commands = {
1098
- "Up": function(editor) { editor.completer.goTo("up"); },
1099
- "Down": function(editor) { editor.completer.goTo("down"); },
1100
- "Ctrl-Up|Ctrl-Home": function(editor) { editor.completer.goTo("start"); },
1101
- "Ctrl-Down|Ctrl-End": function(editor) { editor.completer.goTo("end"); },
1102
-
1103
- "Esc": function(editor) { editor.completer.detach(); },
1104
- "Space": function(editor) { editor.completer.detach(); editor.insert(" ");},
1105
- "Return": function(editor) { editor.completer.insertMatch(); },
1106
- "Shift-Return": function(editor) { editor.completer.insertMatch(true); },
1107
- "Tab": function(editor) { editor.completer.insertMatch(); },
1108
-
1109
- "PageUp": function(editor) { editor.completer.popup.gotoPageUp(); },
1110
- "PageDown": function(editor) { editor.completer.popup.gotoPageDown(); }
1111
- };
1112
-
1113
- this.gatherCompletions = function(editor, callback) {
1114
- var session = editor.getSession();
1115
- var pos = editor.getCursorPosition();
1116
-
1117
- var line = session.getLine(pos.row);
1118
- var prefix = util.retrievePrecedingIdentifier(line, pos.column);
1119
-
1120
- this.base = editor.getCursorPosition();
1121
- this.base.column -= prefix.length;
1122
-
1123
- var matches = [];
1124
- util.parForEach(editor.completers, function(completer, next) {
1125
- completer.getCompletions(editor, session, pos, prefix, function(err, results) {
1126
- if (!err)
1127
- matches = matches.concat(results);
1128
- next();
1129
- });
1130
- }, function() {
1131
- callback(null, {
1132
- prefix: prefix,
1133
- matches: matches
1134
- });
1135
- });
1136
- return true;
1137
- };
1138
-
1139
- this.showPopup = function(editor) {
1140
- if (this.editor)
1141
- this.detach();
1142
-
1143
- this.activated = true;
1144
-
1145
- this.editor = editor;
1146
- if (editor.completer != this) {
1147
- if (editor.completer)
1148
- editor.completer.detach();
1149
- editor.completer = this;
1150
- }
1151
-
1152
- editor.keyBinding.addKeyboardHandler(this.keyboardHandler);
1153
- editor.on("changeSelection", this.changeListener);
1154
- editor.on("blur", this.blurListener);
1155
- editor.on("mousedown", this.mousedownListener);
1156
- editor.on("mousewheel", this.mousewheelListener);
1157
-
1158
- this.updateCompletions();
1159
- };
1160
-
1161
- this.updateCompletions = function(keepPopupPosition) {
1162
- if (keepPopupPosition && this.base && this.completions) {
1163
- var pos = this.editor.getCursorPosition();
1164
- var prefix = this.editor.session.getTextRange({start: this.base, end: pos});
1165
- if (prefix == this.completions.filterText)
1166
- return;
1167
- this.completions.setFilter(prefix);
1168
- if (!this.completions.filtered.length)
1169
- return this.detach();
1170
- this.openPopup(this.editor, prefix, keepPopupPosition);
1171
- return;
1172
- }
1173
- this.gatherCompletions(this.editor, function(err, results) {
1174
- var matches = results && results.matches;
1175
- if (!matches || !matches.length)
1176
- return this.detach();
1177
-
1178
- this.completions = new FilteredList(matches);
1179
- this.completions.setFilter(results.prefix);
1180
- var filtered = this.completions.filtered;
1181
- if (!filtered.length)
1182
- return this.detach();
1183
- if (this.autoInsert && filtered.length == 1)
1184
- return this.insertMatch(filtered[0]);
1185
- this.openPopup(this.editor, results.prefix, keepPopupPosition);
1186
- }.bind(this));
1187
- };
1188
-
1189
- this.cancelContextMenu = function() {
1190
- var stop = function(e) {
1191
- this.editor.off("nativecontextmenu", stop);
1192
- if (e && e.domEvent)
1193
- event.stopEvent(e.domEvent);
1194
- }.bind(this);
1195
- setTimeout(stop, 10);
1196
- this.editor.on("nativecontextmenu", stop);
1197
- };
1198
-
1199
- }).call(Autocomplete.prototype);
1200
-
1201
- Autocomplete.startCommand = {
1202
- name: "startAutocomplete",
1203
- exec: function(editor) {
1204
- if (!editor.completer)
1205
- editor.completer = new Autocomplete();
1206
- editor.completer.showPopup(editor);
1207
- editor.completer.cancelContextMenu();
1208
- },
1209
- bindKey: "Ctrl-Space|Ctrl-Shift-Space|Alt-Space"
1210
- };
1211
-
1212
- var FilteredList = function(array, filterText, mutateData) {
1213
- this.all = array;
1214
- this.filtered = array;
1215
- this.filterText = filterText || "";
1216
- };
1217
- (function(){
1218
- this.setFilter = function(str) {
1219
- if (str.length > this.filterText && str.lastIndexOf(this.filterText, 0) === 0)
1220
- var matches = this.filtered;
1221
- else
1222
- var matches = this.all;
1223
-
1224
- this.filterText = str;
1225
- matches = this.filterCompletions(matches, this.filterText);
1226
- matches = matches.sort(function(a, b) {
1227
- return b.exactMatch - a.exactMatch || b.score - a.score;
1228
- });
1229
- var prev = null;
1230
- matches = matches.filter(function(item){
1231
- var caption = item.value || item.caption || item.snippet;
1232
- if (caption === prev) return false;
1233
- prev = caption;
1234
- return true;
1235
- });
1236
-
1237
- this.filtered = matches;
1238
- };
1239
- this.filterCompletions = function(items, needle) {
1240
- var results = [];
1241
- var upper = needle.toUpperCase();
1242
- var lower = needle.toLowerCase();
1243
- loop: for (var i = 0, item; item = items[i]; i++) {
1244
- var caption = item.value || item.caption || item.snippet;
1245
- if (!caption) continue;
1246
- var lastIndex = -1;
1247
- var matchMask = 0;
1248
- var penalty = 0;
1249
- var index, distance;
1250
- for (var j = 0; j < needle.length; j++) {
1251
- var i1 = caption.indexOf(lower[j], lastIndex + 1);
1252
- var i2 = caption.indexOf(upper[j], lastIndex + 1);
1253
- index = (i1 >= 0) ? ((i2 < 0 || i1 < i2) ? i1 : i2) : i2;
1254
- if (index < 0)
1255
- continue loop;
1256
- distance = index - lastIndex - 1;
1257
- if (distance > 0) {
1258
- if (lastIndex === -1)
1259
- penalty += 10;
1260
- penalty += distance;
1261
- }
1262
- matchMask = matchMask | (1 << index);
1263
- lastIndex = index;
1264
- }
1265
- item.matchMask = matchMask;
1266
- item.exactMatch = penalty ? 0 : 1;
1267
- item.score = (item.score || 0) - penalty;
1268
- results.push(item);
1269
- }
1270
- return results;
1271
- };
1272
- }).call(FilteredList.prototype);
1273
-
1274
- exports.Autocomplete = Autocomplete;
1275
- exports.FilteredList = FilteredList;
1276
-
1277
- });
1278
-
1279
- define('ace/autocomplete/popup', ['require', 'exports', 'module' , 'ace/edit_session', 'ace/virtual_renderer', 'ace/editor', 'ace/range', 'ace/lib/event', 'ace/lib/lang', 'ace/lib/dom'], function(require, exports, module) {
1280
-
1281
-
1282
- var EditSession = require("../edit_session").EditSession;
1283
- var Renderer = require("../virtual_renderer").VirtualRenderer;
1284
- var Editor = require("../editor").Editor;
1285
- var Range = require("../range").Range;
1286
- var event = require("../lib/event");
1287
- var lang = require("../lib/lang");
1288
- var dom = require("../lib/dom");
1289
-
1290
- var $singleLineEditor = function(el) {
1291
- var renderer = new Renderer(el);
1292
-
1293
- renderer.$maxLines = 4;
1294
-
1295
- var editor = new Editor(renderer);
1296
-
1297
- editor.setHighlightActiveLine(false);
1298
- editor.setShowPrintMargin(false);
1299
- editor.renderer.setShowGutter(false);
1300
- editor.renderer.setHighlightGutterLine(false);
1301
-
1302
- editor.$mouseHandler.$focusWaitTimout = 0;
1303
-
1304
- return editor;
1305
- };
1306
-
1307
- var AcePopup = function(parentNode) {
1308
- var el = dom.createElement("div");
1309
- var popup = new $singleLineEditor(el);
1310
-
1311
- if (parentNode)
1312
- parentNode.appendChild(el);
1313
- el.style.display = "none";
1314
- popup.renderer.content.style.cursor = "default";
1315
- popup.renderer.setStyle("ace_autocomplete");
1316
-
1317
- popup.setOption("displayIndentGuides", false);
1318
-
1319
- var noop = function(){};
1320
-
1321
- popup.focus = noop;
1322
- popup.$isFocused = true;
1323
-
1324
- popup.renderer.$cursorLayer.restartTimer = noop;
1325
- popup.renderer.$cursorLayer.element.style.opacity = 0;
951
+ popup.renderer.$cursorLayer.restartTimer = noop;
952
+ popup.renderer.$cursorLayer.element.style.opacity = 0;
1326
953
 
1327
954
  popup.renderer.$maxLines = 8;
1328
955
  popup.renderer.$keepTextAreaAtCursor = false;
@@ -1333,8 +960,7 @@ var AcePopup = function(parentNode) {
1333
960
 
1334
961
  popup.on("mousedown", function(e) {
1335
962
  var pos = e.getDocumentPosition();
1336
- popup.moveCursorToPosition(pos);
1337
- popup.selection.clearSelection();
963
+ popup.selection.moveToPosition(pos);
1338
964
  selectionMarker.start.row = selectionMarker.end.row = pos.row;
1339
965
  e.stop();
1340
966
  });
@@ -1350,7 +976,7 @@ var AcePopup = function(parentNode) {
1350
976
  popup.session.removeMarker(hoverMarker.id);
1351
977
  hoverMarker.id = null;
1352
978
  }
1353
- }
979
+ };
1354
980
  popup.setSelectOnHover(false);
1355
981
  popup.on("mousemove", function(e) {
1356
982
  if (!lastMouseEvent) {
@@ -1402,11 +1028,11 @@ var AcePopup = function(parentNode) {
1402
1028
  popup.getHoveredRow = function() {
1403
1029
  return hoverMarker.start.row;
1404
1030
  };
1405
-
1031
+
1406
1032
  event.addListener(popup.container, "mouseout", hideHoverMarker);
1407
1033
  popup.on("hide", hideHoverMarker);
1408
1034
  popup.on("changeSelection", hideHoverMarker);
1409
-
1035
+
1410
1036
  popup.session.doc.getLength = function() {
1411
1037
  return popup.data.length;
1412
1038
  };
@@ -1418,15 +1044,15 @@ var AcePopup = function(parentNode) {
1418
1044
  };
1419
1045
 
1420
1046
  var bgTokenizer = popup.session.bgTokenizer;
1421
- bgTokenizer.$tokenizeRow = function(i) {
1422
- var data = popup.data[i];
1047
+ bgTokenizer.$tokenizeRow = function(row) {
1048
+ var data = popup.data[row];
1423
1049
  var tokens = [];
1424
1050
  if (!data)
1425
1051
  return tokens;
1426
1052
  if (typeof data == "string")
1427
1053
  data = {value: data};
1428
1054
  if (!data.caption)
1429
- data.caption = data.value;
1055
+ data.caption = data.value || data.name;
1430
1056
 
1431
1057
  var last = -1;
1432
1058
  var flag, c;
@@ -1450,13 +1076,13 @@ var AcePopup = function(parentNode) {
1450
1076
  };
1451
1077
  bgTokenizer.$updateOnChange = noop;
1452
1078
  bgTokenizer.start = noop;
1453
-
1079
+
1454
1080
  popup.session.$computeWidth = function() {
1455
1081
  return this.screenWidth = 0;
1456
- }
1082
+ };
1457
1083
  popup.isOpen = false;
1458
1084
  popup.isTopdown = false;
1459
-
1085
+
1460
1086
  popup.data = [];
1461
1087
  popup.setData = function(list) {
1462
1088
  popup.data = list || [];
@@ -1481,7 +1107,7 @@ var AcePopup = function(parentNode) {
1481
1107
  popup._signal("select");
1482
1108
  }
1483
1109
  };
1484
-
1110
+
1485
1111
  popup.on("changeSelection", function() {
1486
1112
  if (popup.isOpen)
1487
1113
  popup.setRow(popup.selection.lead.row);
@@ -1512,22 +1138,22 @@ var AcePopup = function(parentNode) {
1512
1138
 
1513
1139
  el.style.display = "";
1514
1140
  this.renderer.$textLayer.checkForSizeChanges();
1515
-
1141
+
1516
1142
  var left = pos.left;
1517
1143
  if (left + el.offsetWidth > screenWidth)
1518
1144
  left = screenWidth - el.offsetWidth;
1519
-
1145
+
1520
1146
  el.style.left = left + "px";
1521
-
1147
+
1522
1148
  this._signal("show");
1523
1149
  lastMouseEvent = null;
1524
1150
  popup.isOpen = true;
1525
1151
  };
1526
-
1152
+
1527
1153
  popup.getTextLeftOffset = function() {
1528
1154
  return this.$borderSize + this.renderer.$padding + this.$imageSize;
1529
1155
  };
1530
-
1156
+
1531
1157
  popup.$imageSize = 0;
1532
1158
  popup.$borderSize = 1;
1533
1159
 
@@ -1535,19 +1161,24 @@ var AcePopup = function(parentNode) {
1535
1161
  };
1536
1162
 
1537
1163
  dom.importCssString("\
1538
- .ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {\
1164
+ .ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line {\
1539
1165
  background-color: #CAD6FA;\
1540
1166
  z-index: 1;\
1541
1167
  }\
1542
- .ace_autocomplete.ace-tm .ace_line-hover {\
1168
+ .ace_editor.ace_autocomplete .ace_line-hover {\
1543
1169
  border: 1px solid #abbffe;\
1544
1170
  margin-top: -1px;\
1545
1171
  background: rgba(233,233,253,0.4);\
1546
1172
  }\
1547
- .ace_autocomplete .ace_line-hover {\
1173
+ .ace_editor.ace_autocomplete .ace_line-hover {\
1548
1174
  position: absolute;\
1549
1175
  z-index: 2;\
1550
1176
  }\
1177
+ .ace_editor.ace_autocomplete .ace_scroller {\
1178
+ background: none;\
1179
+ border: none;\
1180
+ box-shadow: none;\
1181
+ }\
1551
1182
  .ace_rightAlignedText {\
1552
1183
  color: gray;\
1553
1184
  display: inline-block;\
@@ -1556,11 +1187,11 @@ dom.importCssString("\
1556
1187
  text-align: right;\
1557
1188
  z-index: -1;\
1558
1189
  }\
1559
- .ace_autocomplete .ace_completion-highlight{\
1190
+ .ace_editor.ace_autocomplete .ace_completion-highlight{\
1560
1191
  color: #000;\
1561
1192
  text-shadow: 0 0 0.01em;\
1562
1193
  }\
1563
- .ace_autocomplete {\
1194
+ .ace_editor.ace_autocomplete {\
1564
1195
  width: 280px;\
1565
1196
  z-index: 200000;\
1566
1197
  background: #fbfbfb;\
@@ -1575,8 +1206,8 @@ exports.AcePopup = AcePopup;
1575
1206
 
1576
1207
  });
1577
1208
 
1578
- define('ace/autocomplete/util', ['require', 'exports', 'module' ], function(require, exports, module) {
1579
-
1209
+ define("ace/autocomplete/util",["require","exports","module"], function(require, exports, module) {
1210
+ "use strict";
1580
1211
 
1581
1212
  exports.parForEach = function(array, fn, callback) {
1582
1213
  var completed = 0;
@@ -1590,9 +1221,9 @@ exports.parForEach = function(array, fn, callback) {
1590
1221
  callback(result, err);
1591
1222
  });
1592
1223
  }
1593
- }
1224
+ };
1594
1225
 
1595
- var ID_REGEX = /[a-zA-Z_0-9\$-]/;
1226
+ var ID_REGEX = /[a-zA-Z_0-9\$\-\u00A2-\uFFFF]/;
1596
1227
 
1597
1228
  exports.retrievePrecedingIdentifier = function(text, pos, regex) {
1598
1229
  regex = regex || ID_REGEX;
@@ -1604,7 +1235,7 @@ exports.retrievePrecedingIdentifier = function(text, pos, regex) {
1604
1235
  break;
1605
1236
  }
1606
1237
  return buf.reverse().join("");
1607
- }
1238
+ };
1608
1239
 
1609
1240
  exports.retrieveFollowingIdentifier = function(text, pos, regex) {
1610
1241
  regex = regex || ID_REGEX;
@@ -1616,14 +1247,365 @@ exports.retrieveFollowingIdentifier = function(text, pos, regex) {
1616
1247
  break;
1617
1248
  }
1618
1249
  return buf;
1619
- }
1250
+ };
1251
+
1252
+ });
1253
+
1254
+ define("ace/autocomplete",["require","exports","module","ace/keyboard/hash_handler","ace/autocomplete/popup","ace/autocomplete/util","ace/lib/event","ace/lib/lang","ace/snippets"], function(require, exports, module) {
1255
+ "use strict";
1256
+
1257
+ var HashHandler = require("./keyboard/hash_handler").HashHandler;
1258
+ var AcePopup = require("./autocomplete/popup").AcePopup;
1259
+ var util = require("./autocomplete/util");
1260
+ var event = require("./lib/event");
1261
+ var lang = require("./lib/lang");
1262
+ var snippetManager = require("./snippets").snippetManager;
1263
+
1264
+ var Autocomplete = function() {
1265
+ this.autoInsert = true;
1266
+ this.autoSelect = true;
1267
+ this.keyboardHandler = new HashHandler();
1268
+ this.keyboardHandler.bindKeys(this.commands);
1269
+
1270
+ this.blurListener = this.blurListener.bind(this);
1271
+ this.changeListener = this.changeListener.bind(this);
1272
+ this.mousedownListener = this.mousedownListener.bind(this);
1273
+ this.mousewheelListener = this.mousewheelListener.bind(this);
1274
+
1275
+ this.changeTimer = lang.delayedCall(function() {
1276
+ this.updateCompletions(true);
1277
+ }.bind(this));
1278
+ };
1279
+
1280
+ (function() {
1281
+ this.gatherCompletionsId = 0;
1282
+
1283
+ this.$init = function() {
1284
+ this.popup = new AcePopup(document.body || document.documentElement);
1285
+ this.popup.on("click", function(e) {
1286
+ this.insertMatch();
1287
+ e.stop();
1288
+ }.bind(this));
1289
+ this.popup.focus = this.editor.focus.bind(this.editor);
1290
+ };
1291
+
1292
+ this.openPopup = function(editor, prefix, keepPopupPosition) {
1293
+ if (!this.popup)
1294
+ this.$init();
1295
+
1296
+ this.popup.setData(this.completions.filtered);
1297
+
1298
+ var renderer = editor.renderer;
1299
+ this.popup.setRow(this.autoSelect ? 0 : -1);
1300
+ if (!keepPopupPosition) {
1301
+ this.popup.setTheme(editor.getTheme());
1302
+ this.popup.setFontSize(editor.getFontSize());
1303
+
1304
+ var lineHeight = renderer.layerConfig.lineHeight;
1305
+
1306
+ var pos = renderer.$cursorLayer.getPixelPosition(this.base, true);
1307
+ pos.left -= this.popup.getTextLeftOffset();
1308
+
1309
+ var rect = editor.container.getBoundingClientRect();
1310
+ pos.top += rect.top - renderer.layerConfig.offset;
1311
+ pos.left += rect.left - editor.renderer.scrollLeft;
1312
+ pos.left += renderer.$gutterLayer.gutterWidth;
1313
+
1314
+ this.popup.show(pos, lineHeight);
1315
+ } else if (keepPopupPosition && !prefix) {
1316
+ this.detach();
1317
+ }
1318
+ };
1319
+
1320
+ this.detach = function() {
1321
+ this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler);
1322
+ this.editor.off("changeSelection", this.changeListener);
1323
+ this.editor.off("blur", this.blurListener);
1324
+ this.editor.off("mousedown", this.mousedownListener);
1325
+ this.editor.off("mousewheel", this.mousewheelListener);
1326
+ this.changeTimer.cancel();
1327
+
1328
+ if (this.popup && this.popup.isOpen) {
1329
+ this.gatherCompletionsId += 1;
1330
+ this.popup.hide();
1331
+ }
1332
+
1333
+ if (this.base)
1334
+ this.base.detach();
1335
+ this.activated = false;
1336
+ this.completions = this.base = null;
1337
+ };
1338
+
1339
+ this.changeListener = function(e) {
1340
+ var cursor = this.editor.selection.lead;
1341
+ if (cursor.row != this.base.row || cursor.column < this.base.column) {
1342
+ this.detach();
1343
+ }
1344
+ if (this.activated)
1345
+ this.changeTimer.schedule();
1346
+ else
1347
+ this.detach();
1348
+ };
1349
+
1350
+ this.blurListener = function() {
1351
+ var el = document.activeElement;
1352
+ if (el != this.editor.textInput.getElement() && el.parentNode != this.popup.container)
1353
+ this.detach();
1354
+ };
1355
+
1356
+ this.mousedownListener = function(e) {
1357
+ this.detach();
1358
+ };
1359
+
1360
+ this.mousewheelListener = function(e) {
1361
+ this.detach();
1362
+ };
1363
+
1364
+ this.goTo = function(where) {
1365
+ var row = this.popup.getRow();
1366
+ var max = this.popup.session.getLength() - 1;
1367
+
1368
+ switch(where) {
1369
+ case "up": row = row <= 0 ? max : row - 1; break;
1370
+ case "down": row = row >= max ? -1 : row + 1; break;
1371
+ case "start": row = 0; break;
1372
+ case "end": row = max; break;
1373
+ }
1374
+
1375
+ this.popup.setRow(row);
1376
+ };
1377
+
1378
+ this.insertMatch = function(data) {
1379
+ if (!data)
1380
+ data = this.popup.getData(this.popup.getRow());
1381
+ if (!data)
1382
+ return false;
1383
+
1384
+ if (data.completer && data.completer.insertMatch) {
1385
+ data.completer.insertMatch(this.editor);
1386
+ } else {
1387
+ if (this.completions.filterText) {
1388
+ var ranges = this.editor.selection.getAllRanges();
1389
+ for (var i = 0, range; range = ranges[i]; i++) {
1390
+ range.start.column -= this.completions.filterText.length;
1391
+ this.editor.session.remove(range);
1392
+ }
1393
+ }
1394
+ if (data.snippet)
1395
+ snippetManager.insertSnippet(this.editor, data.snippet);
1396
+ else
1397
+ this.editor.execCommand("insertstring", data.value || data);
1398
+ }
1399
+ this.detach();
1400
+ };
1401
+
1402
+ this.commands = {
1403
+ "Up": function(editor) { editor.completer.goTo("up"); },
1404
+ "Down": function(editor) { editor.completer.goTo("down"); },
1405
+ "Ctrl-Up|Ctrl-Home": function(editor) { editor.completer.goTo("start"); },
1406
+ "Ctrl-Down|Ctrl-End": function(editor) { editor.completer.goTo("end"); },
1407
+
1408
+ "Esc": function(editor) { editor.completer.detach(); },
1409
+ "Space": function(editor) { editor.completer.detach(); editor.insert(" ");},
1410
+ "Return": function(editor) { return editor.completer.insertMatch(); },
1411
+ "Shift-Return": function(editor) { editor.completer.insertMatch(true); },
1412
+ "Tab": function(editor) {
1413
+ var result = editor.completer.insertMatch();
1414
+ if (!result && !editor.tabstopManager)
1415
+ editor.completer.goTo("down");
1416
+ else
1417
+ return result;
1418
+ },
1419
+
1420
+ "PageUp": function(editor) { editor.completer.popup.gotoPageUp(); },
1421
+ "PageDown": function(editor) { editor.completer.popup.gotoPageDown(); }
1422
+ };
1423
+
1424
+ this.gatherCompletions = function(editor, callback) {
1425
+ var session = editor.getSession();
1426
+ var pos = editor.getCursorPosition();
1427
+
1428
+ var line = session.getLine(pos.row);
1429
+ var prefix = util.retrievePrecedingIdentifier(line, pos.column);
1430
+
1431
+ this.base = session.doc.createAnchor(pos.row, pos.column - prefix.length);
1432
+ this.base.$insertRight = true;
1433
+
1434
+ var matches = [];
1435
+ var total = editor.completers.length;
1436
+ editor.completers.forEach(function(completer, i) {
1437
+ completer.getCompletions(editor, session, pos, prefix, function(err, results) {
1438
+ if (!err)
1439
+ matches = matches.concat(results);
1440
+ var pos = editor.getCursorPosition();
1441
+ var line = session.getLine(pos.row);
1442
+ callback(null, {
1443
+ prefix: util.retrievePrecedingIdentifier(line, pos.column, results[0] && results[0].identifierRegex),
1444
+ matches: matches,
1445
+ finished: (--total === 0)
1446
+ });
1447
+ });
1448
+ });
1449
+ return true;
1450
+ };
1451
+
1452
+ this.showPopup = function(editor) {
1453
+ if (this.editor)
1454
+ this.detach();
1455
+
1456
+ this.activated = true;
1457
+
1458
+ this.editor = editor;
1459
+ if (editor.completer != this) {
1460
+ if (editor.completer)
1461
+ editor.completer.detach();
1462
+ editor.completer = this;
1463
+ }
1464
+
1465
+ editor.keyBinding.addKeyboardHandler(this.keyboardHandler);
1466
+ editor.on("changeSelection", this.changeListener);
1467
+ editor.on("blur", this.blurListener);
1468
+ editor.on("mousedown", this.mousedownListener);
1469
+ editor.on("mousewheel", this.mousewheelListener);
1470
+
1471
+ this.updateCompletions();
1472
+ };
1473
+
1474
+ this.updateCompletions = function(keepPopupPosition) {
1475
+ if (keepPopupPosition && this.base && this.completions) {
1476
+ var pos = this.editor.getCursorPosition();
1477
+ var prefix = this.editor.session.getTextRange({start: this.base, end: pos});
1478
+ if (prefix == this.completions.filterText)
1479
+ return;
1480
+ this.completions.setFilter(prefix);
1481
+ if (!this.completions.filtered.length)
1482
+ return this.detach();
1483
+ if (this.completions.filtered.length == 1
1484
+ && this.completions.filtered[0].value == prefix
1485
+ && !this.completions.filtered[0].snippet)
1486
+ return this.detach();
1487
+ this.openPopup(this.editor, prefix, keepPopupPosition);
1488
+ return;
1489
+ }
1490
+ var _id = this.gatherCompletionsId;
1491
+ this.gatherCompletions(this.editor, function(err, results) {
1492
+ var detachIfFinished = function() {
1493
+ if (!results.finished) return;
1494
+ return this.detach();
1495
+ }.bind(this);
1496
+
1497
+ var prefix = results.prefix;
1498
+ var matches = results && results.matches;
1499
+
1500
+ if (!matches || !matches.length)
1501
+ return detachIfFinished();
1502
+ if (prefix.indexOf(results.prefix) !== 0 || _id != this.gatherCompletionsId)
1503
+ return;
1504
+
1505
+ this.completions = new FilteredList(matches);
1506
+ this.completions.setFilter(prefix);
1507
+ var filtered = this.completions.filtered;
1508
+ if (!filtered.length)
1509
+ return detachIfFinished();
1510
+ if (filtered.length == 1 && filtered[0].value == prefix && !filtered[0].snippet)
1511
+ return detachIfFinished();
1512
+ if (this.autoInsert && filtered.length == 1 && results.finished)
1513
+ return this.insertMatch(filtered[0]);
1514
+
1515
+ this.openPopup(this.editor, prefix, keepPopupPosition);
1516
+ }.bind(this));
1517
+ };
1518
+
1519
+ this.cancelContextMenu = function() {
1520
+ this.editor.$mouseHandler.cancelContextMenu();
1521
+ };
1522
+
1523
+ }).call(Autocomplete.prototype);
1524
+
1525
+ Autocomplete.startCommand = {
1526
+ name: "startAutocomplete",
1527
+ exec: function(editor) {
1528
+ if (!editor.completer)
1529
+ editor.completer = new Autocomplete();
1530
+ editor.completer.autoInsert =
1531
+ editor.completer.autoSelect = true;
1532
+ editor.completer.showPopup(editor);
1533
+ editor.completer.cancelContextMenu();
1534
+ },
1535
+ bindKey: "Ctrl-Space|Ctrl-Shift-Space|Alt-Space"
1536
+ };
1537
+
1538
+ var FilteredList = function(array, filterText, mutateData) {
1539
+ this.all = array;
1540
+ this.filtered = array;
1541
+ this.filterText = filterText || "";
1542
+ };
1543
+ (function(){
1544
+ this.setFilter = function(str) {
1545
+ if (str.length > this.filterText && str.lastIndexOf(this.filterText, 0) === 0)
1546
+ var matches = this.filtered;
1547
+ else
1548
+ var matches = this.all;
1549
+
1550
+ this.filterText = str;
1551
+ matches = this.filterCompletions(matches, this.filterText);
1552
+ matches = matches.sort(function(a, b) {
1553
+ return b.exactMatch - a.exactMatch || b.score - a.score;
1554
+ });
1555
+ var prev = null;
1556
+ matches = matches.filter(function(item){
1557
+ var caption = item.snippet || item.caption || item.value;
1558
+ if (caption === prev) return false;
1559
+ prev = caption;
1560
+ return true;
1561
+ });
1562
+
1563
+ this.filtered = matches;
1564
+ };
1565
+ this.filterCompletions = function(items, needle) {
1566
+ var results = [];
1567
+ var upper = needle.toUpperCase();
1568
+ var lower = needle.toLowerCase();
1569
+ loop: for (var i = 0, item; item = items[i]; i++) {
1570
+ var caption = item.value || item.caption || item.snippet;
1571
+ if (!caption) continue;
1572
+ var lastIndex = -1;
1573
+ var matchMask = 0;
1574
+ var penalty = 0;
1575
+ var index, distance;
1576
+ for (var j = 0; j < needle.length; j++) {
1577
+ var i1 = caption.indexOf(lower[j], lastIndex + 1);
1578
+ var i2 = caption.indexOf(upper[j], lastIndex + 1);
1579
+ index = (i1 >= 0) ? ((i2 < 0 || i1 < i2) ? i1 : i2) : i2;
1580
+ if (index < 0)
1581
+ continue loop;
1582
+ distance = index - lastIndex - 1;
1583
+ if (distance > 0) {
1584
+ if (lastIndex === -1)
1585
+ penalty += 10;
1586
+ penalty += distance;
1587
+ }
1588
+ matchMask = matchMask | (1 << index);
1589
+ lastIndex = index;
1590
+ }
1591
+ item.matchMask = matchMask;
1592
+ item.exactMatch = penalty ? 0 : 1;
1593
+ item.score = (item.score || 0) - penalty;
1594
+ results.push(item);
1595
+ }
1596
+ return results;
1597
+ };
1598
+ }).call(FilteredList.prototype);
1599
+
1600
+ exports.Autocomplete = Autocomplete;
1601
+ exports.FilteredList = FilteredList;
1620
1602
 
1621
1603
  });
1622
1604
 
1623
- define('ace/autocomplete/text_completer', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {
1624
- var Range = require("ace/range").Range;
1605
+ define("ace/autocomplete/text_completer",["require","exports","module","ace/range"], function(require, exports, module) {
1606
+ var Range = require("../range").Range;
1625
1607
 
1626
- var splitRegex = /[^a-zA-Z_0-9\$\-]+/;
1608
+ var splitRegex = /[^a-zA-Z_0-9\$\-\u00C0-\u1FFF\u2C00-\uD7FF\w]+/;
1627
1609
 
1628
1610
  function getWordIndex(doc, pos) {
1629
1611
  var textBefore = doc.getTextRange(Range.fromPoints({row: 0, column:0}, pos));
@@ -1655,11 +1637,185 @@ define('ace/autocomplete/text_completer', ['require', 'exports', 'module' , 'ace
1655
1637
  var wordList = Object.keys(wordScore);
1656
1638
  callback(null, wordList.map(function(word) {
1657
1639
  return {
1658
- name: word,
1640
+ caption: word,
1659
1641
  value: word,
1660
1642
  score: wordScore[word],
1661
1643
  meta: "local"
1662
1644
  };
1663
1645
  }));
1664
1646
  };
1665
- });
1647
+ });
1648
+
1649
+ define("ace/ext/language_tools",["require","exports","module","ace/snippets","ace/autocomplete","ace/config","ace/autocomplete/util","ace/autocomplete/text_completer","ace/editor","ace/config"], function(require, exports, module) {
1650
+ "use strict";
1651
+
1652
+ var snippetManager = require("../snippets").snippetManager;
1653
+ var Autocomplete = require("../autocomplete").Autocomplete;
1654
+ var config = require("../config");
1655
+ var util = require("../autocomplete/util");
1656
+
1657
+ var textCompleter = require("../autocomplete/text_completer");
1658
+ var keyWordCompleter = {
1659
+ getCompletions: function(editor, session, pos, prefix, callback) {
1660
+ var state = editor.session.getState(pos.row);
1661
+ var completions = session.$mode.getCompletions(state, session, pos, prefix);
1662
+ callback(null, completions);
1663
+ }
1664
+ };
1665
+
1666
+ var snippetCompleter = {
1667
+ getCompletions: function(editor, session, pos, prefix, callback) {
1668
+ var snippetMap = snippetManager.snippetMap;
1669
+ var completions = [];
1670
+ snippetManager.getActiveScopes(editor).forEach(function(scope) {
1671
+ var snippets = snippetMap[scope] || [];
1672
+ for (var i = snippets.length; i--;) {
1673
+ var s = snippets[i];
1674
+ var caption = s.name || s.tabTrigger;
1675
+ if (!caption)
1676
+ continue;
1677
+ completions.push({
1678
+ caption: caption,
1679
+ snippet: s.content,
1680
+ meta: s.tabTrigger && !s.name ? s.tabTrigger + "\u21E5 " : "snippet"
1681
+ });
1682
+ }
1683
+ }, this);
1684
+ callback(null, completions);
1685
+ }
1686
+ };
1687
+
1688
+ var completers = [snippetCompleter, textCompleter, keyWordCompleter];
1689
+ exports.addCompleter = function(completer) {
1690
+ completers.push(completer);
1691
+ };
1692
+ exports.textCompleter = textCompleter;
1693
+ exports.keyWordCompleter = keyWordCompleter;
1694
+ exports.snippetCompleter = snippetCompleter;
1695
+
1696
+ var expandSnippet = {
1697
+ name: "expandSnippet",
1698
+ exec: function(editor) {
1699
+ var success = snippetManager.expandWithTab(editor);
1700
+ if (!success)
1701
+ editor.execCommand("indent");
1702
+ },
1703
+ bindKey: "Tab"
1704
+ };
1705
+
1706
+ var onChangeMode = function(e, editor) {
1707
+ loadSnippetsForMode(editor.session.$mode);
1708
+ };
1709
+
1710
+ var loadSnippetsForMode = function(mode) {
1711
+ var id = mode.$id;
1712
+ if (!snippetManager.files)
1713
+ snippetManager.files = {};
1714
+ loadSnippetFile(id);
1715
+ if (mode.modes)
1716
+ mode.modes.forEach(loadSnippetsForMode);
1717
+ };
1718
+
1719
+ var loadSnippetFile = function(id) {
1720
+ if (!id || snippetManager.files[id])
1721
+ return;
1722
+ var snippetFilePath = id.replace("mode", "snippets");
1723
+ snippetManager.files[id] = {};
1724
+ config.loadModule(snippetFilePath, function(m) {
1725
+ if (m) {
1726
+ snippetManager.files[id] = m;
1727
+ if (!m.snippets && m.snippetText)
1728
+ m.snippets = snippetManager.parseSnippetFile(m.snippetText);
1729
+ snippetManager.register(m.snippets || [], m.scope);
1730
+ if (m.includeScopes) {
1731
+ snippetManager.snippetMap[m.scope].includeScopes = m.includeScopes;
1732
+ m.includeScopes.forEach(function(x) {
1733
+ loadSnippetFile("ace/mode/" + x);
1734
+ });
1735
+ }
1736
+ }
1737
+ });
1738
+ };
1739
+
1740
+ function getCompletionPrefix(editor) {
1741
+ var pos = editor.getCursorPosition();
1742
+ var line = editor.session.getLine(pos.row);
1743
+ var prefix = util.retrievePrecedingIdentifier(line, pos.column);
1744
+ editor.completers.forEach(function(completer) {
1745
+ if (completer.identifierRegexps) {
1746
+ completer.identifierRegexps.forEach(function(identifierRegex) {
1747
+ if (!prefix && identifierRegex)
1748
+ prefix = util.retrievePrecedingIdentifier(line, pos.column, identifierRegex);
1749
+ });
1750
+ }
1751
+ });
1752
+ return prefix;
1753
+ }
1754
+
1755
+ var doLiveAutocomplete = function(e) {
1756
+ var editor = e.editor;
1757
+ var text = e.args || "";
1758
+ var hasCompleter = editor.completer && editor.completer.activated;
1759
+ if (e.command.name === "backspace") {
1760
+ if (hasCompleter && !getCompletionPrefix(editor))
1761
+ editor.completer.detach();
1762
+ }
1763
+ else if (e.command.name === "insertstring") {
1764
+ var prefix = getCompletionPrefix(editor);
1765
+ if (prefix && !hasCompleter) {
1766
+ if (!editor.completer) {
1767
+ editor.completer = new Autocomplete();
1768
+ }
1769
+ editor.completer.autoSelect = false;
1770
+ editor.completer.autoInsert = false;
1771
+ editor.completer.showPopup(editor);
1772
+ }
1773
+ }
1774
+ };
1775
+
1776
+ var Editor = require("../editor").Editor;
1777
+ require("../config").defineOptions(Editor.prototype, "editor", {
1778
+ enableBasicAutocompletion: {
1779
+ set: function(val) {
1780
+ if (val) {
1781
+ if (!this.completers)
1782
+ this.completers = Array.isArray(val)? val: completers;
1783
+ this.commands.addCommand(Autocomplete.startCommand);
1784
+ } else {
1785
+ this.commands.removeCommand(Autocomplete.startCommand);
1786
+ }
1787
+ },
1788
+ value: false
1789
+ },
1790
+ enableLiveAutocompletion: {
1791
+ set: function(val) {
1792
+ if (val) {
1793
+ if (!this.completers)
1794
+ this.completers = Array.isArray(val)? val: completers;
1795
+ this.commands.on('afterExec', doLiveAutocomplete);
1796
+ } else {
1797
+ this.commands.removeListener('afterExec', doLiveAutocomplete);
1798
+ }
1799
+ },
1800
+ value: false
1801
+ },
1802
+ enableSnippets: {
1803
+ set: function(val) {
1804
+ if (val) {
1805
+ this.commands.addCommand(expandSnippet);
1806
+ this.on("changeMode", onChangeMode);
1807
+ onChangeMode(null, this);
1808
+ } else {
1809
+ this.commands.removeCommand(expandSnippet);
1810
+ this.off("changeMode", onChangeMode);
1811
+ }
1812
+ },
1813
+ value: false
1814
+ }
1815
+ });
1816
+ });
1817
+ ;
1818
+ (function() {
1819
+ window.require(["ace/ext/language_tools"], function() {});
1820
+ })();
1821
+