textmode: getTextSelection()

This commit is contained in:
Meir Rotstein 2018-01-18 14:35:48 +02:00
parent f5da46d2cc
commit d66d2d6e38
2 changed files with 65 additions and 22 deletions

View File

@ -389,10 +389,10 @@ textmode._updateCursorInfoDisplay = function () {
if (this.textarea) {
setTimeout(function() { //this to verify we get the most updated textarea cursor selection
var selectionRange = util.getInputSelection(me.textarea);
line = selectionRange.row;
col = selectionRange.col;
if (selectionRange.start !== selectionRange.end) {
count = selectionRange.end - selectionRange.start;
line = selectionRange.end.row;
col = selectionRange.end.column;
if (selectionRange.startIndex !== selectionRange.endIndex) {
count = selectionRange.endIndex - selectionRange.startIndex;
}
updateDisplay();
},0);
@ -644,6 +644,37 @@ textmode.validate = function () {
}
};
/**
* Get the selection details
* @returns {{start:{row:Number, column:Number},end:{row:Number, column:Number},text:String}}
*/
textmode.getTextSelection = function () {
if (this.textarea) {
var selectionRange = util.getInputSelection(this.textarea);
return {
start: selectionRange.start,
end: selectionRange.end,
text: this.textarea.value.substring(selectionRange.startIndex, selectionRange.endIndex)
}
}
if (this.aceEditor) {
var curserPos = this.aceEditor.getSelectionRange();
var selectedText = this.aceEditor.getSelectedText();
return {
start: {
row: curserPos.start.row + 1,
column: curserPos.start.column + 1
},
end: {
row: curserPos.end.row + 1,
column: curserPos.end.column + 1
},
text: selectedText
};
}
};
// define modes
module.exports = [
{

View File

@ -825,11 +825,11 @@ exports.textDiff = function textDiff(oldText, newText) {
* @return {Object} reference Object with 2 properties (start and end) with the identifier of the location of the cursor and selected text.
**/
exports.getInputSelection = function(el) {
var start = 0, end = 0, normalizedValue, range, textInputRange, len, endRange;
var startIndex = 0, endIndex = 0, normalizedValue, range, textInputRange, len, endRange;
if (typeof el.selectionStart == "number" && typeof el.selectionEnd == "number") {
start = el.selectionStart;
end = el.selectionEnd;
startIndex = el.selectionStart;
endIndex = el.selectionEnd;
} else {
range = document.selection.createRange();
@ -841,38 +841,50 @@ exports.getInputSelection = function(el) {
textInputRange = el.createTextRange();
textInputRange.moveToBookmark(range.getBookmark());
// Check if the start and end of the selection are at the very end
// Check if the startIndex and endIndex of the selection are at the very end
// of the input, since moveStart/moveEnd doesn't return what we want
// in those cases
endRange = el.createTextRange();
endRange.collapse(false);
if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) {
start = end = len;
startIndex = endIndex = len;
} else {
start = -textInputRange.moveStart("character", -len);
start += normalizedValue.slice(0, start).split("\n").length - 1;
startIndex = -textInputRange.moveStart("character", -len);
startIndex += normalizedValue.slice(0, startIndex).split("\n").length - 1;
if (textInputRange.compareEndPoints("EndToEnd", endRange) > -1) {
end = len;
endIndex = len;
} else {
end = -textInputRange.moveEnd("character", -len);
end += normalizedValue.slice(0, end).split("\n").length - 1;
endIndex = -textInputRange.moveEnd("character", -len);
endIndex += normalizedValue.slice(0, endIndex).split("\n").length - 1;
}
}
}
}
var textTillCaret = el.value.substring(0,end);
var row = (textTillCaret.match(/\n/g) || []).length + 1;
var col = textTillCaret.length - textTillCaret.lastIndexOf("\n");
return {
start: start,
end: end,
col: col,
row: row
startIndex: startIndex,
endIndex: endIndex,
start: _positionForIndex(startIndex),
end: _positionForIndex(endIndex)
};
/**
* Returns textarea row and column position for certain index
* @param {Number} index text index
* @returns {{row: Number, col: Number}}
*/
function _positionForIndex(index) {
var textTillIndex = el.value.substring(0,index);
var row = (textTillIndex.match(/\n/g) || []).length + 1;
var col = textTillIndex.length - textTillIndex.lastIndexOf("\n");
return {
row: row,
column: col
}
}
}