Update ACE Editor to version 1.2.9
The new ACE editor introduces full support for emojis (and, thereby, UTF-16 characters with high- and low-surrogates). Hence, we can remove our custom fix. Further, this update will allow emojis to be used in pair programming sessions.
This commit is contained in:
@ -243,6 +243,7 @@ var SnippetManager = function() {
|
||||
if (cursor.column < indentString.length)
|
||||
indentString = indentString.slice(0, cursor.column);
|
||||
|
||||
snippetText = snippetText.replace(/\r/g, "");
|
||||
var tokens = this.tokenizeTmSnippet(snippetText);
|
||||
tokens = this.resolveVariables(tokens, editor);
|
||||
tokens = tokens.map(function(x) {
|
||||
@ -271,14 +272,14 @@ var SnippetManager = function() {
|
||||
return;
|
||||
|
||||
var value = tokens.slice(i + 1, i1);
|
||||
var isNested = value.some(function(t) {return typeof t === "object"});
|
||||
var isNested = value.some(function(t) {return typeof t === "object";});
|
||||
if (isNested && !ts.value) {
|
||||
ts.value = value;
|
||||
} else if (value.length && (!ts.value || typeof ts.value !== "string")) {
|
||||
ts.value = value.join("");
|
||||
}
|
||||
});
|
||||
tabstops.forEach(function(ts) {ts.length = 0});
|
||||
tabstops.forEach(function(ts) {ts.length = 0;});
|
||||
var expanding = {};
|
||||
function copyValue(val) {
|
||||
var copy = [];
|
||||
@ -320,9 +321,10 @@ var SnippetManager = function() {
|
||||
var text = "";
|
||||
tokens.forEach(function(t) {
|
||||
if (typeof t === "string") {
|
||||
if (t[0] === "\n"){
|
||||
column = t.length - 1;
|
||||
row ++;
|
||||
var lines = t.split("\n");
|
||||
if (lines.length > 1){
|
||||
column = lines[lines.length - 1].length;
|
||||
row += lines.length - 1;
|
||||
} else
|
||||
column += t.length;
|
||||
text += t;
|
||||
@ -502,7 +504,10 @@ var SnippetManager = function() {
|
||||
s.guard = "\\b";
|
||||
s.trigger = lang.escapeRegExp(s.tabTrigger);
|
||||
}
|
||||
|
||||
|
||||
if (!s.trigger && !s.guard && !s.endTrigger && !s.endGuard)
|
||||
return;
|
||||
|
||||
s.startRe = guardedRegexp(s.trigger, s.guard, true);
|
||||
s.triggerRe = new RegExp(s.trigger, "", true);
|
||||
|
||||
@ -1015,7 +1020,7 @@ var AcePopup = function(parentNode) {
|
||||
if (selected)
|
||||
dom.addCssClass(selected, "ace_selected");
|
||||
});
|
||||
var hideHoverMarker = function() { setHoverMarker(-1) };
|
||||
var hideHoverMarker = function() { setHoverMarker(-1); };
|
||||
var setHoverMarker = function(row, suppressRedraw) {
|
||||
if (row !== hoverMarker.start.row) {
|
||||
hoverMarker.start.row = hoverMarker.end.row = row;
|
||||
@ -1070,7 +1075,7 @@ var AcePopup = function(parentNode) {
|
||||
var maxW = popup.renderer.$size.scrollerWidth / popup.renderer.layerConfig.characterWidth;
|
||||
var metaData = data.meta;
|
||||
if (metaData.length + data.caption.length > maxW - 2) {
|
||||
metaData = metaData.substr(0, maxW - data.caption.length - 3) + "\u2026"
|
||||
metaData = metaData.substr(0, maxW - data.caption.length - 3) + "\u2026";
|
||||
}
|
||||
tokens.push({type: "rightAlignedText", value: metaData});
|
||||
}
|
||||
@ -1086,6 +1091,7 @@ var AcePopup = function(parentNode) {
|
||||
popup.$blockScrolling = Infinity;
|
||||
popup.isOpen = false;
|
||||
popup.isTopdown = false;
|
||||
popup.autoSelect = true;
|
||||
|
||||
popup.data = [];
|
||||
popup.setData = function(list) {
|
||||
@ -1101,7 +1107,7 @@ var AcePopup = function(parentNode) {
|
||||
return selectionMarker.start.row;
|
||||
};
|
||||
popup.setRow = function(line) {
|
||||
line = Math.max(-1, Math.min(this.data.length, line));
|
||||
line = Math.max(this.autoSelect ? 0 : -1, Math.min(this.data.length, line));
|
||||
if (selectionMarker.start.row != line) {
|
||||
popup.selection.clearSelection();
|
||||
selectionMarker.start.row = selectionMarker.end.row = line || 0;
|
||||
@ -1130,12 +1136,15 @@ var AcePopup = function(parentNode) {
|
||||
var renderer = this.renderer;
|
||||
var maxH = renderer.$maxLines * lineHeight * 1.4;
|
||||
var top = pos.top + this.$borderSize;
|
||||
if (top + maxH > screenHeight - lineHeight && !topdownOnly) {
|
||||
var allowTopdown = top > screenHeight / 2 && !topdownOnly;
|
||||
if (allowTopdown && top + lineHeight + maxH > screenHeight) {
|
||||
renderer.$maxPixelHeight = top - 2 * this.$borderSize;
|
||||
el.style.top = "";
|
||||
el.style.bottom = screenHeight - top + "px";
|
||||
popup.isTopdown = false;
|
||||
} else {
|
||||
top += lineHeight;
|
||||
renderer.$maxPixelHeight = screenHeight - top - 0.2 * lineHeight;
|
||||
el.style.top = top + "px";
|
||||
el.style.bottom = "";
|
||||
popup.isTopdown = true;
|
||||
@ -1254,6 +1263,21 @@ exports.retrieveFollowingIdentifier = function(text, pos, regex) {
|
||||
return buf;
|
||||
};
|
||||
|
||||
exports.getCompletionPrefix = function (editor) {
|
||||
var pos = editor.getCursorPosition();
|
||||
var line = editor.session.getLine(pos.row);
|
||||
var prefix;
|
||||
editor.completers.forEach(function(completer) {
|
||||
if (completer.identifierRegexps) {
|
||||
completer.identifierRegexps.forEach(function(identifierRegex) {
|
||||
if (!prefix && identifierRegex)
|
||||
prefix = this.retrievePrecedingIdentifier(line, pos.column, identifierRegex);
|
||||
}.bind(this));
|
||||
}
|
||||
}.bind(this));
|
||||
return prefix || this.retrievePrecedingIdentifier(line, pos.column);
|
||||
};
|
||||
|
||||
});
|
||||
|
||||
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) {
|
||||
@ -1310,6 +1334,8 @@ var Autocomplete = function() {
|
||||
if (!this.popup)
|
||||
this.$init();
|
||||
|
||||
this.popup.autoSelect = this.autoSelect;
|
||||
|
||||
this.popup.setData(this.completions.filtered);
|
||||
|
||||
editor.keyBinding.addKeyboardHandler(this.keyboardHandler);
|
||||
@ -1369,7 +1395,7 @@ var Autocomplete = function() {
|
||||
this.blurListener = function(e) {
|
||||
var el = document.activeElement;
|
||||
var text = this.editor.textInput.getElement();
|
||||
var fromTooltip = e.relatedTarget && e.relatedTarget == this.tooltipNode;
|
||||
var fromTooltip = e.relatedTarget && this.tooltipNode && this.tooltipNode.contains(e.relatedTarget);
|
||||
var container = this.popup && this.popup.container;
|
||||
if (el != text && el.parentNode != container && !fromTooltip
|
||||
&& el != this.tooltipNode && e.relatedTarget != text
|
||||
@ -1450,8 +1476,7 @@ var Autocomplete = function() {
|
||||
var session = editor.getSession();
|
||||
var pos = editor.getCursorPosition();
|
||||
|
||||
var line = session.getLine(pos.row);
|
||||
var prefix = util.retrievePrecedingIdentifier(line, pos.column);
|
||||
var prefix = util.getCompletionPrefix(editor);
|
||||
|
||||
this.base = session.doc.createAnchor(pos.row, pos.column - prefix.length);
|
||||
this.base.$insertRight = true;
|
||||
@ -1460,12 +1485,10 @@ var Autocomplete = function() {
|
||||
var total = editor.completers.length;
|
||||
editor.completers.forEach(function(completer, i) {
|
||||
completer.getCompletions(editor, session, pos, prefix, function(err, results) {
|
||||
if (!err)
|
||||
if (!err && results)
|
||||
matches = matches.concat(results);
|
||||
var pos = editor.getCursorPosition();
|
||||
var line = session.getLine(pos.row);
|
||||
callback(null, {
|
||||
prefix: util.retrievePrecedingIdentifier(line, pos.column, results[0] && results[0].identifierRegex),
|
||||
prefix: util.getCompletionPrefix(editor),
|
||||
matches: matches,
|
||||
finished: (--total === 0)
|
||||
});
|
||||
@ -1578,6 +1601,7 @@ var Autocomplete = function() {
|
||||
this.tooltipNode.style.pointerEvents = "auto";
|
||||
this.tooltipNode.tabIndex = -1;
|
||||
this.tooltipNode.onblur = this.blurListener.bind(this);
|
||||
this.tooltipNode.onclick = this.onTooltipClick.bind(this);
|
||||
}
|
||||
|
||||
var tooltipNode = this.tooltipNode;
|
||||
@ -1614,6 +1638,18 @@ var Autocomplete = function() {
|
||||
if (el.parentNode)
|
||||
el.parentNode.removeChild(el);
|
||||
};
|
||||
|
||||
this.onTooltipClick = function(e) {
|
||||
var a = e.target;
|
||||
while (a && a != this.tooltipNode) {
|
||||
if (a.nodeName == "A" && a.href) {
|
||||
a.rel = "noreferrer";
|
||||
a.target = "_blank";
|
||||
break;
|
||||
}
|
||||
a = a.parentNode;
|
||||
}
|
||||
};
|
||||
|
||||
}).call(Autocomplete.prototype);
|
||||
|
||||
@ -1802,7 +1838,8 @@ var snippetCompleter = {
|
||||
|
||||
var completers = [snippetCompleter, textCompleter, keyWordCompleter];
|
||||
exports.setCompleters = function(val) {
|
||||
completers = val || [];
|
||||
completers.length = 0;
|
||||
if (val) completers.push.apply(completers, val);
|
||||
};
|
||||
exports.addCompleter = function(completer) {
|
||||
completers.push(completer);
|
||||
@ -1853,30 +1890,15 @@ var loadSnippetFile = function(id) {
|
||||
});
|
||||
};
|
||||
|
||||
function getCompletionPrefix(editor) {
|
||||
var pos = editor.getCursorPosition();
|
||||
var line = editor.session.getLine(pos.row);
|
||||
var prefix;
|
||||
editor.completers.forEach(function(completer) {
|
||||
if (completer.identifierRegexps) {
|
||||
completer.identifierRegexps.forEach(function(identifierRegex) {
|
||||
if (!prefix && identifierRegex)
|
||||
prefix = util.retrievePrecedingIdentifier(line, pos.column, identifierRegex);
|
||||
});
|
||||
}
|
||||
});
|
||||
return prefix || util.retrievePrecedingIdentifier(line, pos.column);
|
||||
}
|
||||
|
||||
var doLiveAutocomplete = function(e) {
|
||||
var editor = e.editor;
|
||||
var hasCompleter = editor.completer && editor.completer.activated;
|
||||
if (e.command.name === "backspace") {
|
||||
if (hasCompleter && !getCompletionPrefix(editor))
|
||||
if (hasCompleter && !util.getCompletionPrefix(editor))
|
||||
editor.completer.detach();
|
||||
}
|
||||
else if (e.command.name === "insertstring") {
|
||||
var prefix = getCompletionPrefix(editor);
|
||||
var prefix = util.getCompletionPrefix(editor);
|
||||
if (prefix && !hasCompleter) {
|
||||
if (!editor.completer) {
|
||||
editor.completer = new Autocomplete();
|
||||
|
Reference in New Issue
Block a user