in lib/ace/keyboard/textinput.js [293:363]
var sendText = function(value, fromInput) {
if (afterContextMenu)
afterContextMenu = false;
if (pasted) {
resetSelection();
if (value)
host.onPaste(value);
pasted = false;
return "";
} else {
var selectionStart = text.selectionStart;
var selectionEnd = text.selectionEnd;
var extendLeft = lastSelectionStart;
var extendRight = lastValue.length - lastSelectionEnd;
var inserted = value;
var restoreStart = value.length - selectionStart;
var restoreEnd = value.length - selectionEnd;
var i = 0;
while (extendLeft > 0 && lastValue[i] == value[i]) {
i++;
extendLeft--;
}
inserted = inserted.slice(i);
i = 1;
while (extendRight > 0 && lastValue.length - i > lastSelectionStart - 1 && lastValue[lastValue.length - i] == value[value.length - i]) {
i++;
extendRight--;
}
restoreStart -= i-1;
restoreEnd -= i-1;
var endIndex = inserted.length - i + 1;
if (endIndex < 0) {
extendLeft = -endIndex;
endIndex = 0;
}
inserted = inserted.slice(0, endIndex);
// composition update can be called without any change
if (!fromInput && !inserted && !restoreStart && !extendLeft && !extendRight && !restoreEnd)
return "";
sendingText = true;
// some android keyboards converts two spaces into sentence end, which is not useful for code
var shouldReset = false;
if (useragent.isAndroid && inserted == ". ") {
inserted = " ";
shouldReset = true;
}
if (inserted && !extendLeft && !extendRight && !restoreStart && !restoreEnd || commandMode) {
host.onTextInput(inserted);
} else {
host.onTextInput(inserted, {
extendLeft: extendLeft,
extendRight: extendRight,
restoreStart: restoreStart,
restoreEnd: restoreEnd
});
}
sendingText = false;
lastValue = value;
lastSelectionStart = selectionStart;
lastSelectionEnd = selectionEnd;
lastRestoreEnd = restoreEnd;
return shouldReset ? "\n" : inserted;
}
};