ace-rails-ap 3.0.1 → 3.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (101) hide show
  1. checksums.yaml +4 -4
  2. data/lib/ace/rails/version.rb +1 -1
  3. data/vendor/assets/javascripts/ace/ace.js +210 -161
  4. data/vendor/assets/javascripts/ace/ext-beautify.js +0 -1
  5. data/vendor/assets/javascripts/ace/ext-chromevox.js +0 -1
  6. data/vendor/assets/javascripts/ace/ext-elastic_tabstops_lite.js +0 -1
  7. data/vendor/assets/javascripts/ace/ext-emmet.js +66 -48
  8. data/vendor/assets/javascripts/ace/ext-keybinding_menu.js +9 -19
  9. data/vendor/assets/javascripts/ace/ext-language_tools.js +108 -10
  10. data/vendor/assets/javascripts/ace/ext-linking.js +0 -1
  11. data/vendor/assets/javascripts/ace/ext-modelist.js +4 -1
  12. data/vendor/assets/javascripts/ace/ext-old_ie.js +23 -2
  13. data/vendor/assets/javascripts/ace/ext-searchbox.js +23 -2
  14. data/vendor/assets/javascripts/ace/ext-settings_menu.js +10 -1
  15. data/vendor/assets/javascripts/ace/ext-spellcheck.js +0 -1
  16. data/vendor/assets/javascripts/ace/ext-split.js +0 -1
  17. data/vendor/assets/javascripts/ace/ext-static_highlight.js +0 -1
  18. data/vendor/assets/javascripts/ace/ext-statusbar.js +2 -4
  19. data/vendor/assets/javascripts/ace/ext-textarea.js +0 -1
  20. data/vendor/assets/javascripts/ace/ext-themelist.js +0 -1
  21. data/vendor/assets/javascripts/ace/ext-whitespace.js +0 -1
  22. data/vendor/assets/javascripts/ace/keybinding-emacs.js +159 -50
  23. data/vendor/assets/javascripts/ace/mode-autohotkey.js +1 -1
  24. data/vendor/assets/javascripts/ace/mode-c_cpp.js +32 -14
  25. data/vendor/assets/javascripts/ace/mode-coffee.js +1 -1
  26. data/vendor/assets/javascripts/ace/mode-coldfusion.js +62 -24
  27. data/vendor/assets/javascripts/ace/mode-csharp.js +14 -8
  28. data/vendor/assets/javascripts/ace/mode-css.js +2 -2
  29. data/vendor/assets/javascripts/ace/mode-curly.js +62 -24
  30. data/vendor/assets/javascripts/ace/mode-d.js +13 -7
  31. data/vendor/assets/javascripts/ace/mode-dart.js +32 -14
  32. data/vendor/assets/javascripts/ace/mode-django.js +62 -24
  33. data/vendor/assets/javascripts/ace/mode-dockerfile.js +3 -3
  34. data/vendor/assets/javascripts/ace/mode-dot.js +12 -6
  35. data/vendor/assets/javascripts/ace/mode-ejs.js +126 -27
  36. data/vendor/assets/javascripts/ace/mode-elixir.js +493 -0
  37. data/vendor/assets/javascripts/ace/mode-elm.js +248 -0
  38. data/vendor/assets/javascripts/ace/mode-forth.js +1 -1
  39. data/vendor/assets/javascripts/ace/mode-ftl.js +20 -10
  40. data/vendor/assets/javascripts/ace/mode-gitignore.js +1 -0
  41. data/vendor/assets/javascripts/ace/mode-glsl.js +32 -14
  42. data/vendor/assets/javascripts/ace/mode-golang.js +14 -8
  43. data/vendor/assets/javascripts/ace/mode-groovy.js +22 -12
  44. data/vendor/assets/javascripts/ace/mode-haml.js +64 -3
  45. data/vendor/assets/javascripts/ace/mode-handlebars.js +72 -34
  46. data/vendor/assets/javascripts/ace/mode-haxe.js +14 -8
  47. data/vendor/assets/javascripts/ace/mode-html.js +62 -24
  48. data/vendor/assets/javascripts/ace/mode-html_ruby.js +126 -27
  49. data/vendor/assets/javascripts/ace/mode-jack.js +2 -2
  50. data/vendor/assets/javascripts/ace/mode-jade.js +21 -11
  51. data/vendor/assets/javascripts/ace/mode-java.js +22 -12
  52. data/vendor/assets/javascripts/ace/mode-javascript.js +22 -12
  53. data/vendor/assets/javascripts/ace/mode-json.js +2 -2
  54. data/vendor/assets/javascripts/ace/mode-jsoniq.js +47 -1835
  55. data/vendor/assets/javascripts/ace/mode-jsp.js +22 -12
  56. data/vendor/assets/javascripts/ace/mode-jsx.js +14 -8
  57. data/vendor/assets/javascripts/ace/mode-less.js +2 -2
  58. data/vendor/assets/javascripts/ace/mode-liquid.js +20 -10
  59. data/vendor/assets/javascripts/ace/mode-logiql.js +2 -2
  60. data/vendor/assets/javascripts/ace/mode-lsl.js +2 -2
  61. data/vendor/assets/javascripts/ace/mode-luapage.js +62 -24
  62. data/vendor/assets/javascripts/ace/mode-markdown.js +62 -24
  63. data/vendor/assets/javascripts/ace/mode-mel.js +2 -2
  64. data/vendor/assets/javascripts/ace/mode-mysql.js +12 -6
  65. data/vendor/assets/javascripts/ace/mode-nix.js +32 -14
  66. data/vendor/assets/javascripts/ace/mode-objectivec.js +30 -12
  67. data/vendor/assets/javascripts/ace/mode-pgsql.js +20 -10
  68. data/vendor/assets/javascripts/ace/mode-php.js +1126 -40
  69. data/vendor/assets/javascripts/ace/mode-powershell.js +2 -2
  70. data/vendor/assets/javascripts/ace/mode-protobuf.js +32 -14
  71. data/vendor/assets/javascripts/ace/mode-rhtml.js +62 -24
  72. data/vendor/assets/javascripts/ace/mode-ruby.js +66 -5
  73. data/vendor/assets/javascripts/ace/mode-rust.js +36 -3
  74. data/vendor/assets/javascripts/ace/mode-scad.js +14 -8
  75. data/vendor/assets/javascripts/ace/mode-scala.js +22 -12
  76. data/vendor/assets/javascripts/ace/mode-scss.js +2 -2
  77. data/vendor/assets/javascripts/ace/mode-sh.js +2 -2
  78. data/vendor/assets/javascripts/ace/mode-sjs.js +22 -12
  79. data/vendor/assets/javascripts/ace/mode-smarty.js +62 -24
  80. data/vendor/assets/javascripts/ace/mode-soy_template.js +63 -25
  81. data/vendor/assets/javascripts/ace/mode-stylus.js +4 -1
  82. data/vendor/assets/javascripts/ace/mode-svg.js +62 -24
  83. data/vendor/assets/javascripts/ace/mode-textile.js +1 -0
  84. data/vendor/assets/javascripts/ace/mode-twig.js +62 -24
  85. data/vendor/assets/javascripts/ace/mode-typescript.js +22 -12
  86. data/vendor/assets/javascripts/ace/mode-vala.js +2 -2
  87. data/vendor/assets/javascripts/ace/mode-velocity.js +62 -24
  88. data/vendor/assets/javascripts/ace/mode-xml.js +40 -12
  89. data/vendor/assets/javascripts/ace/mode-xquery.js +47 -1835
  90. data/vendor/assets/javascripts/ace/theme-cobalt.js +1 -1
  91. data/vendor/assets/javascripts/ace/theme-idle_fingers.js +1 -1
  92. data/vendor/assets/javascripts/ace/theme-tomorrow_night_bright.js +2 -2
  93. data/vendor/assets/javascripts/ace/worker-coffee.js +15 -5
  94. data/vendor/assets/javascripts/ace/worker-css.js +15 -5
  95. data/vendor/assets/javascripts/ace/worker-html.js +15 -5
  96. data/vendor/assets/javascripts/ace/worker-javascript.js +15 -5
  97. data/vendor/assets/javascripts/ace/worker-json.js +17 -6
  98. data/vendor/assets/javascripts/ace/worker-lua.js +15 -5
  99. data/vendor/assets/javascripts/ace/worker-php.js +15 -5
  100. data/vendor/assets/javascripts/ace/worker-xquery.js +15 -5
  101. metadata +4 -2
@@ -328,7 +328,6 @@ exports.commands = [{
328
328
  }]
329
329
 
330
330
  });
331
- ;
332
331
  (function() {
333
332
  window.require(["ace/ext/beautify"], function() {});
334
333
  })();
@@ -535,7 +535,6 @@ require('../config').defineOptions(Editor.prototype, 'editor', {
535
535
  });
536
536
 
537
537
  });
538
- ;
539
538
  (function() {
540
539
  window.require(["ace/ext/chromevox"], function() {});
541
540
  })();
@@ -269,7 +269,6 @@ require("../config").defineOptions(Editor.prototype, "editor", {
269
269
  });
270
270
 
271
271
  });
272
- ;
273
272
  (function() {
274
273
  window.require(["ace/ext/elastic_tabstops_lite"], function() {});
275
274
  })();
@@ -901,21 +901,13 @@ var Editor = require("./editor").Editor;
901
901
 
902
902
  });
903
903
 
904
- define("ace/ext/emmet",["require","exports","module","ace/keyboard/hash_handler","ace/editor","ace/snippets","ace/range","resources","resources","range","tabStops","resources","utils","actions","ace/config"], function(require, exports, module) {
904
+ define("ace/ext/emmet",["require","exports","module","ace/keyboard/hash_handler","ace/editor","ace/snippets","ace/range","resources","resources","range","tabStops","resources","utils","actions","ace/config","ace/config"], function(require, exports, module) {
905
905
  "use strict";
906
906
  var HashHandler = require("ace/keyboard/hash_handler").HashHandler;
907
907
  var Editor = require("ace/editor").Editor;
908
908
  var snippetManager = require("ace/snippets").snippetManager;
909
909
  var Range = require("ace/range").Range;
910
- var emmet;
911
-
912
- Editor.prototype.indexToPosition = function(index) {
913
- return this.session.doc.indexToPosition(index);
914
- };
915
-
916
- Editor.prototype.positionToIndex = function(pos) {
917
- return this.session.doc.positionToIndex(pos);
918
- };
910
+ var emmet, emmetPath;
919
911
  function AceEmmetEditor() {}
920
912
 
921
913
  AceEmmetEditor.prototype = {
@@ -930,21 +922,24 @@ AceEmmetEditor.prototype = {
930
922
  },
931
923
  getSelectionRange: function() {
932
924
  var range = this.ace.getSelectionRange();
925
+ var doc = this.ace.session.doc;
933
926
  return {
934
- start: this.ace.positionToIndex(range.start),
935
- end: this.ace.positionToIndex(range.end)
927
+ start: doc.positionToIndex(range.start),
928
+ end: doc.positionToIndex(range.end)
936
929
  };
937
930
  },
938
931
  createSelection: function(start, end) {
932
+ var doc = this.ace.session.doc;
939
933
  this.ace.selection.setRange({
940
- start: this.ace.indexToPosition(start),
941
- end: this.ace.indexToPosition(end)
934
+ start: doc.indexToPosition(start),
935
+ end: doc.indexToPosition(end)
942
936
  });
943
937
  },
944
938
  getCurrentLineRange: function() {
945
- var row = this.ace.getCursorPosition().row;
946
- var lineLength = this.ace.session.getLine(row).length;
947
- var index = this.ace.positionToIndex({row: row, column: 0});
939
+ var ace = this.ace;
940
+ var row = ace.getCursorPosition().row;
941
+ var lineLength = ace.session.getLine(row).length;
942
+ var index = ace.session.doc.positionToIndex({row: row, column: 0});
948
943
  return {
949
944
  start: index,
950
945
  end: index + lineLength
@@ -952,10 +947,10 @@ AceEmmetEditor.prototype = {
952
947
  },
953
948
  getCaretPos: function(){
954
949
  var pos = this.ace.getCursorPosition();
955
- return this.ace.positionToIndex(pos);
950
+ return this.ace.session.doc.positionToIndex(pos);
956
951
  },
957
952
  setCaretPos: function(index){
958
- var pos = this.ace.indexToPosition(index);
953
+ var pos = this.ace.session.doc.indexToPosition(index);
959
954
  this.ace.selection.moveToPosition(pos);
960
955
  },
961
956
  getCurrentLine: function() {
@@ -969,13 +964,14 @@ AceEmmetEditor.prototype = {
969
964
  start = 0;
970
965
 
971
966
  var editor = this.ace;
972
- var range = Range.fromPoints(editor.indexToPosition(start), editor.indexToPosition(end));
967
+ var doc = editor.session.doc;
968
+ var range = Range.fromPoints(doc.indexToPosition(start), doc.indexToPosition(end));
973
969
  editor.session.remove(range);
974
970
 
975
971
  range.end = range.start;
976
972
 
977
973
  value = this.$updateTabstops(value);
978
- snippetManager.insertSnippet(editor, value)
974
+ snippetManager.insertSnippet(editor, value);
979
975
  },
980
976
  getContent: function(){
981
977
  return this.ace.getValue();
@@ -1049,7 +1045,7 @@ AceEmmetEditor.prototype = {
1049
1045
  lastZero = range.create(data.start, result);
1050
1046
  }
1051
1047
 
1052
- return result
1048
+ return result;
1053
1049
  },
1054
1050
  escape: function(ch) {
1055
1051
  if (ch == '$') return '\\$';
@@ -1100,28 +1096,33 @@ var keymap = {
1100
1096
  var editorProxy = new AceEmmetEditor();
1101
1097
  exports.commands = new HashHandler();
1102
1098
  exports.runEmmetCommand = function(editor) {
1103
- editorProxy.setupContext(editor);
1104
- if (editorProxy.getSyntax() == "php")
1105
- return false;
1106
- var actions = emmet.require("actions");
1107
-
1108
- if (this.action == "expand_abbreviation_with_tab") {
1109
- if (!editor.selection.isEmpty())
1099
+ try {
1100
+ editorProxy.setupContext(editor);
1101
+ if (editorProxy.getSyntax() == "php")
1110
1102
  return false;
1111
- }
1103
+ var actions = emmet.require("actions");
1112
1104
 
1113
- if (this.action == "wrap_with_abbreviation") {
1114
- return setTimeout(function() {
1115
- actions.run("wrap_with_abbreviation", editorProxy);
1116
- }, 0);
1117
- }
1118
-
1119
- try {
1105
+ if (this.action == "expand_abbreviation_with_tab") {
1106
+ if (!editor.selection.isEmpty())
1107
+ return false;
1108
+ }
1109
+
1110
+ if (this.action == "wrap_with_abbreviation") {
1111
+ return setTimeout(function() {
1112
+ actions.run("wrap_with_abbreviation", editorProxy);
1113
+ }, 0);
1114
+ }
1115
+
1116
+ var pos = editor.selection.lead;
1117
+ var token = editor.session.getTokenAt(pos.row, pos.column);
1118
+ if (token && /\btag\b/.test(token.type))
1119
+ return false;
1120
+
1120
1121
  var result = actions.run(this.action, editorProxy);
1121
1122
  } catch(e) {
1122
1123
  editor._signal("changeStatus", typeof e == "string" ? e : e.message);
1123
1124
  console.log(e);
1124
- result = false
1125
+ result = false;
1125
1126
  }
1126
1127
  return result;
1127
1128
  };
@@ -1136,21 +1137,35 @@ for (var command in keymap) {
1136
1137
  });
1137
1138
  }
1138
1139
 
1140
+ exports.updateCommands = function(editor, enabled) {
1141
+ if (enabled) {
1142
+ editor.keyBinding.addKeyboardHandler(exports.commands);
1143
+ } else {
1144
+ editor.keyBinding.removeKeyboardHandler(exports.commands);
1145
+ }
1146
+ };
1147
+
1148
+ exports.isSupportedMode = function(modeId) {
1149
+ return modeId && /css|less|scss|sass|stylus|html|php|twig|ejs/.test(modeId);
1150
+ };
1151
+
1139
1152
  var onChangeMode = function(e, target) {
1140
1153
  var editor = target;
1141
1154
  if (!editor)
1142
1155
  return;
1143
- var modeId = editor.session.$modeId;
1144
- var enabled = modeId && /css|less|scss|sass|stylus|html|php/.test(modeId);
1156
+ var enabled = exports.isSupportedMode(editor.session.$modeId);
1145
1157
  if (e.enableEmmet === false)
1146
1158
  enabled = false;
1147
- if (enabled)
1148
- editor.keyBinding.addKeyboardHandler(exports.commands);
1149
- else
1150
- editor.keyBinding.removeKeyboardHandler(exports.commands);
1159
+ if (enabled) {
1160
+ if (typeof emmetPath == "string") {
1161
+ require("ace/config").loadModule(emmetPath, function() {
1162
+ emmetPath = null;
1163
+ });
1164
+ }
1165
+ }
1166
+ exports.updateCommands(editor, enabled);
1151
1167
  };
1152
1168
 
1153
-
1154
1169
  exports.AceEmmetEditor = AceEmmetEditor;
1155
1170
  require("ace/config").defineOptions(Editor.prototype, "editor", {
1156
1171
  enableEmmet: {
@@ -1162,10 +1177,13 @@ require("ace/config").defineOptions(Editor.prototype, "editor", {
1162
1177
  }
1163
1178
  });
1164
1179
 
1165
-
1166
- exports.setCore = function(e) {emmet = e;};
1180
+ exports.setCore = function(e) {
1181
+ if (typeof e == "string")
1182
+ emmetPath = e;
1183
+ else
1184
+ emmet = e;
1185
+ };
1167
1186
  });
1168
- ;
1169
1187
  (function() {
1170
1188
  window.require(["ace/ext/emmet"], function() {});
1171
1189
  })();
@@ -109,29 +109,20 @@ module.exports.getEditorKeybordShortcuts = function(editor) {
109
109
  editor.keyBinding.$handlers.forEach(function(handler) {
110
110
  var ckb = handler.commandKeyBinding;
111
111
  for (var i in ckb) {
112
- var modifier = parseInt(i);
113
- if (modifier == -1) {
114
- modifier = "";
115
- } else if(isNaN(modifier)) {
116
- modifier = i;
117
- } else {
118
- modifier = "" +
119
- (modifier & KEY_MODS.command ? "Cmd-" : "") +
120
- (modifier & KEY_MODS.ctrl ? "Ctrl-" : "") +
121
- (modifier & KEY_MODS.alt ? "Alt-" : "") +
122
- (modifier & KEY_MODS.shift ? "Shift-" : "");
123
- }
124
- for (var key in ckb[i]) {
125
- var command = ckb[i][key]
112
+ var key = i.replace(/(^|-)\w/g, function(x) { return x.toUpperCase(); });
113
+ var commands = ckb[i];
114
+ if (!Array.isArray(commands))
115
+ commands = [commands];
116
+ commands.forEach(function(command) {
126
117
  if (typeof command != "string")
127
118
  command = command.name
128
119
  if (commandMap[command]) {
129
- commandMap[command].key += "|" + modifier + key;
120
+ commandMap[command].key += "|" + key;
130
121
  } else {
131
- commandMap[command] = {key: modifier+key, command: command};
122
+ commandMap[command] = {key: key, command: command};
132
123
  keybindings.push(commandMap[command]);
133
- }
134
- }
124
+ }
125
+ });
135
126
  }
136
127
  });
137
128
  return keybindings;
@@ -173,7 +164,6 @@ define("ace/ext/keybinding_menu",["require","exports","module","ace/editor","ace
173
164
  };
174
165
 
175
166
  });
176
- ;
177
167
  (function() {
178
168
  window.require(["ace/ext/keybinding_menu"], function() {});
179
169
  })();
@@ -1251,7 +1251,7 @@ exports.retrieveFollowingIdentifier = function(text, pos, regex) {
1251
1251
 
1252
1252
  });
1253
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) {
1254
+ define("ace/autocomplete",["require","exports","module","ace/keyboard/hash_handler","ace/autocomplete/popup","ace/autocomplete/util","ace/lib/event","ace/lib/lang","ace/lib/dom","ace/snippets"], function(require, exports, module) {
1255
1255
  "use strict";
1256
1256
 
1257
1257
  var HashHandler = require("./keyboard/hash_handler").HashHandler;
@@ -1259,6 +1259,7 @@ var AcePopup = require("./autocomplete/popup").AcePopup;
1259
1259
  var util = require("./autocomplete/util");
1260
1260
  var event = require("./lib/event");
1261
1261
  var lang = require("./lib/lang");
1262
+ var dom = require("./lib/dom");
1262
1263
  var snippetManager = require("./snippets").snippetManager;
1263
1264
 
1264
1265
  var Autocomplete = function() {
@@ -1275,6 +1276,8 @@ var Autocomplete = function() {
1275
1276
  this.changeTimer = lang.delayedCall(function() {
1276
1277
  this.updateCompletions(true);
1277
1278
  }.bind(this));
1279
+
1280
+ this.tooltipTimer = lang.delayedCall(this.updateDocTooltip.bind(this), 50);
1278
1281
  };
1279
1282
 
1280
1283
  (function() {
@@ -1287,6 +1290,14 @@ var Autocomplete = function() {
1287
1290
  e.stop();
1288
1291
  }.bind(this));
1289
1292
  this.popup.focus = this.editor.focus.bind(this.editor);
1293
+ this.popup.on("show", this.tooltipTimer.bind(null, null));
1294
+ this.popup.on("select", this.tooltipTimer.bind(null, null));
1295
+ this.popup.on("changeHoverMarker", this.tooltipTimer.bind(null, null));
1296
+ return this.popup;
1297
+ };
1298
+
1299
+ this.getPopup = function() {
1300
+ return this.popup || this.$init();
1290
1301
  };
1291
1302
 
1292
1303
  this.openPopup = function(editor, prefix, keepPopupPosition) {
@@ -1324,6 +1335,7 @@ var Autocomplete = function() {
1324
1335
  this.editor.off("mousedown", this.mousedownListener);
1325
1336
  this.editor.off("mousewheel", this.mousewheelListener);
1326
1337
  this.changeTimer.cancel();
1338
+ this.hideDocTooltip();
1327
1339
 
1328
1340
  if (this.popup && this.popup.isOpen) {
1329
1341
  this.gatherCompletionsId += 1;
@@ -1347,10 +1359,15 @@ var Autocomplete = function() {
1347
1359
  this.detach();
1348
1360
  };
1349
1361
 
1350
- this.blurListener = function() {
1362
+ this.blurListener = function(e) {
1351
1363
  var el = document.activeElement;
1352
- if (el != this.editor.textInput.getElement() && el.parentNode != this.popup.container)
1364
+ var text = this.editor.textInput.getElement()
1365
+ if (el != text && el.parentNode != this.popup.container
1366
+ && el != this.tooltipNode && e.relatedTarget != this.tooltipNode
1367
+ && e.relatedTarget != text
1368
+ ) {
1353
1369
  this.detach();
1370
+ }
1354
1371
  };
1355
1372
 
1356
1373
  this.mousedownListener = function(e) {
@@ -1382,7 +1399,7 @@ var Autocomplete = function() {
1382
1399
  return false;
1383
1400
 
1384
1401
  if (data.completer && data.completer.insertMatch) {
1385
- data.completer.insertMatch(this.editor);
1402
+ data.completer.insertMatch(this.editor, data);
1386
1403
  } else {
1387
1404
  if (this.completions.filterText) {
1388
1405
  var ranges = this.editor.selection.getAllRanges();
@@ -1399,6 +1416,7 @@ var Autocomplete = function() {
1399
1416
  this.detach();
1400
1417
  };
1401
1418
 
1419
+
1402
1420
  this.commands = {
1403
1421
  "Up": function(editor) { editor.completer.goTo("up"); },
1404
1422
  "Down": function(editor) { editor.completer.goTo("down"); },
@@ -1519,6 +1537,73 @@ var Autocomplete = function() {
1519
1537
  this.cancelContextMenu = function() {
1520
1538
  this.editor.$mouseHandler.cancelContextMenu();
1521
1539
  };
1540
+
1541
+ this.updateDocTooltip = function() {
1542
+ var popup = this.popup;
1543
+ var all = popup.data;
1544
+ var selected = all && (all[popup.getHoveredRow()] || all[popup.getRow()]);
1545
+ var doc = null;
1546
+ if (!selected || !this.editor || !this.popup.isOpen)
1547
+ return this.hideDocTooltip();
1548
+ this.editor.completers.some(function(completer) {
1549
+ if (completer.getDocTooltip)
1550
+ doc = completer.getDocTooltip(selected);
1551
+ return doc;
1552
+ });
1553
+ if (!doc)
1554
+ doc = selected;
1555
+
1556
+ if (typeof doc == "string")
1557
+ doc = {docText: doc}
1558
+ if (!doc || !(doc.docHTML || doc.docText))
1559
+ return this.hideDocTooltip();
1560
+ this.showDocTooltip(doc);
1561
+ };
1562
+
1563
+ this.showDocTooltip = function(item) {
1564
+ if (!this.tooltipNode) {
1565
+ this.tooltipNode = dom.createElement("div");
1566
+ this.tooltipNode.className = "ace_tooltip ace_doc-tooltip";
1567
+ this.tooltipNode.style.margin = 0;
1568
+ this.tooltipNode.style.pointerEvents = "auto";
1569
+ this.tooltipNode.tabIndex = -1;
1570
+ this.tooltipNode.onblur = this.blurListener.bind(this);
1571
+ }
1572
+
1573
+ var tooltipNode = this.tooltipNode;
1574
+ if (item.docHTML) {
1575
+ tooltipNode.innerHTML = item.docHTML;
1576
+ } else if (item.docText) {
1577
+ tooltipNode.textContent = item.docText;
1578
+ }
1579
+
1580
+ if (!tooltipNode.parentNode)
1581
+ document.body.appendChild(tooltipNode);
1582
+ var popup = this.popup;
1583
+ var rect = popup.container.getBoundingClientRect();
1584
+ tooltipNode.style.top = popup.container.style.top;
1585
+ tooltipNode.style.bottom = popup.container.style.bottom;
1586
+
1587
+ if (window.innerWidth - rect.right < 320) {
1588
+ tooltipNode.style.right = window.innerWidth - rect.left + "px";
1589
+ tooltipNode.style.left = "";
1590
+ } else {
1591
+ tooltipNode.style.left = (rect.right + 1) + "px";
1592
+ tooltipNode.style.right = "";
1593
+ }
1594
+ tooltipNode.style.display = "block";
1595
+ };
1596
+
1597
+ this.hideDocTooltip = function() {
1598
+ this.tooltipTimer.cancel();
1599
+ if (!this.tooltipNode) return;
1600
+ var el = this.tooltipNode;
1601
+ if (!this.editor.isFocused() && document.activeElement == el)
1602
+ this.editor.focus();
1603
+ this.tooltipNode = null;
1604
+ if (el.parentNode)
1605
+ el.parentNode.removeChild(el);
1606
+ };
1522
1607
 
1523
1608
  }).call(Autocomplete.prototype);
1524
1609
 
@@ -1646,17 +1731,21 @@ define("ace/autocomplete/text_completer",["require","exports","module","ace/rang
1646
1731
  };
1647
1732
  });
1648
1733
 
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) {
1734
+ define("ace/ext/language_tools",["require","exports","module","ace/snippets","ace/autocomplete","ace/config","ace/lib/lang","ace/autocomplete/util","ace/autocomplete/text_completer","ace/editor","ace/config"], function(require, exports, module) {
1650
1735
  "use strict";
1651
1736
 
1652
1737
  var snippetManager = require("../snippets").snippetManager;
1653
1738
  var Autocomplete = require("../autocomplete").Autocomplete;
1654
1739
  var config = require("../config");
1740
+ var lang = require("../lib/lang");
1655
1741
  var util = require("../autocomplete/util");
1656
1742
 
1657
1743
  var textCompleter = require("../autocomplete/text_completer");
1658
1744
  var keyWordCompleter = {
1659
1745
  getCompletions: function(editor, session, pos, prefix, callback) {
1746
+ if (session.$mode.completer) {
1747
+ return session.$mode.completer.getCompletions(editor, session, pos, prefix, callback);
1748
+ }
1660
1749
  var state = editor.session.getState(pos.row);
1661
1750
  var completions = session.$mode.getCompletions(state, session, pos, prefix);
1662
1751
  callback(null, completions);
@@ -1677,15 +1766,27 @@ var snippetCompleter = {
1677
1766
  completions.push({
1678
1767
  caption: caption,
1679
1768
  snippet: s.content,
1680
- meta: s.tabTrigger && !s.name ? s.tabTrigger + "\u21E5 " : "snippet"
1769
+ meta: s.tabTrigger && !s.name ? s.tabTrigger + "\u21E5 " : "snippet",
1770
+ type: "snippet"
1681
1771
  });
1682
1772
  }
1683
1773
  }, this);
1684
1774
  callback(null, completions);
1775
+ },
1776
+ getDocTooltip: function(item) {
1777
+ if (item.type == "snippet" && !item.docHTML) {
1778
+ item.docHTML = [
1779
+ "<b>", lang.escapeHTML(item.caption), "</b>", "<hr></hr>",
1780
+ lang.escapeHTML(item.snippet)
1781
+ ].join("");
1782
+ }
1685
1783
  }
1686
1784
  };
1687
1785
 
1688
1786
  var completers = [snippetCompleter, textCompleter, keyWordCompleter];
1787
+ exports.setCompleters = function(val) {
1788
+ completers = val || [];
1789
+ };
1689
1790
  exports.addCompleter = function(completer) {
1690
1791
  completers.push(completer);
1691
1792
  };
@@ -1696,9 +1797,7 @@ exports.snippetCompleter = snippetCompleter;
1696
1797
  var expandSnippet = {
1697
1798
  name: "expandSnippet",
1698
1799
  exec: function(editor) {
1699
- var success = snippetManager.expandWithTab(editor);
1700
- if (!success)
1701
- editor.execCommand("indent");
1800
+ return snippetManager.expandWithTab(editor);
1702
1801
  },
1703
1802
  bindKey: "Tab"
1704
1803
  };
@@ -1814,7 +1913,6 @@ require("../config").defineOptions(Editor.prototype, "editor", {
1814
1913
  }
1815
1914
  });
1816
1915
  });
1817
- ;
1818
1916
  (function() {
1819
1917
  window.require(["ace/ext/language_tools"], function() {});
1820
1918
  })();