ace-rails-ap 2.0.1 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
+