mirror of
https://github.com/fastmail/Squire.git
synced 2025-01-03 05:00:13 -05:00
Rewrite getSelectedText method.
Fixes #57. * Fixes bug where it could return text outside selection * Inserts new line between blocks.
This commit is contained in:
parent
e6ae25b589
commit
1c0fa1a50f
4 changed files with 84 additions and 78 deletions
|
@ -611,43 +611,6 @@ var getNodeAfter = function ( node, offset ) {
|
||||||
|
|
||||||
// ---
|
// ---
|
||||||
|
|
||||||
var forEachTextNodeInRange = function ( range, fn ) {
|
|
||||||
range = range.cloneRange();
|
|
||||||
moveRangeBoundariesDownTree( range );
|
|
||||||
|
|
||||||
var startContainer = range.startContainer,
|
|
||||||
endContainer = range.endContainer,
|
|
||||||
root = range.commonAncestorContainer,
|
|
||||||
walker = new TreeWalker(
|
|
||||||
root, SHOW_TEXT, function (/* node */) {
|
|
||||||
return true;
|
|
||||||
}, false ),
|
|
||||||
textnode = walker.currentNode = startContainer;
|
|
||||||
|
|
||||||
while ( !fn( textnode, range ) &&
|
|
||||||
textnode !== endContainer &&
|
|
||||||
( textnode = walker.nextNode() ) ) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
var getTextContentInRange = function ( range ) {
|
|
||||||
var textContent = '';
|
|
||||||
forEachTextNodeInRange( range, function ( textnode, range ) {
|
|
||||||
var value = textnode.data;
|
|
||||||
if ( value && ( /\S/.test( value ) ) ) {
|
|
||||||
if ( textnode === range.endContainer ) {
|
|
||||||
value = value.slice( 0, range.endOffset );
|
|
||||||
}
|
|
||||||
if ( textnode === range.startContainer ) {
|
|
||||||
value = value.slice( range.startOffset );
|
|
||||||
}
|
|
||||||
textContent += value;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return textContent;
|
|
||||||
};
|
|
||||||
|
|
||||||
// ---
|
|
||||||
|
|
||||||
var insertNodeInRange = function ( range, node ) {
|
var insertNodeInRange = function ( range, node ) {
|
||||||
// Insert at start.
|
// Insert at start.
|
||||||
var startContainer = range.startContainer,
|
var startContainer = range.startContainer,
|
||||||
|
@ -1392,7 +1355,47 @@ proto.getSelection = function () {
|
||||||
};
|
};
|
||||||
|
|
||||||
proto.getSelectedText = function () {
|
proto.getSelectedText = function () {
|
||||||
return getTextContentInRange( this.getSelection() );
|
var range = this.getSelection(),
|
||||||
|
walker = new TreeWalker(
|
||||||
|
range.commonAncestorContainer,
|
||||||
|
SHOW_TEXT|SHOW_ELEMENT,
|
||||||
|
function ( node ) {
|
||||||
|
return isNodeContainedInRange( range, node, true );
|
||||||
|
}
|
||||||
|
),
|
||||||
|
startContainer = range.startContainer,
|
||||||
|
endContainer = range.endContainer,
|
||||||
|
node = walker.currentNode = startContainer,
|
||||||
|
textContent = '',
|
||||||
|
addedTextInBlock = false,
|
||||||
|
value;
|
||||||
|
|
||||||
|
if ( !walker.filter( node ) ) {
|
||||||
|
node = walker.nextNode();
|
||||||
|
}
|
||||||
|
|
||||||
|
while ( node ) {
|
||||||
|
if ( node.nodeType === TEXT_NODE ) {
|
||||||
|
value = node.data;
|
||||||
|
if ( value && ( /\S/.test( value ) ) ) {
|
||||||
|
if ( node === endContainer ) {
|
||||||
|
value = value.slice( 0, range.endOffset );
|
||||||
|
}
|
||||||
|
if ( node === startContainer ) {
|
||||||
|
value = value.slice( range.startOffset );
|
||||||
|
}
|
||||||
|
textContent += value;
|
||||||
|
addedTextInBlock = true;
|
||||||
|
}
|
||||||
|
} else if ( node.nodeName === 'BR' ||
|
||||||
|
addedTextInBlock && !isInline( node ) ) {
|
||||||
|
textContent += '\n';
|
||||||
|
addedTextInBlock = false;
|
||||||
|
}
|
||||||
|
node = walker.nextNode();
|
||||||
|
}
|
||||||
|
|
||||||
|
return textContent;
|
||||||
};
|
};
|
||||||
|
|
||||||
proto.getPath = function () {
|
proto.getPath = function () {
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -302,7 +302,47 @@ proto.getSelection = function () {
|
||||||
};
|
};
|
||||||
|
|
||||||
proto.getSelectedText = function () {
|
proto.getSelectedText = function () {
|
||||||
return getTextContentInRange( this.getSelection() );
|
var range = this.getSelection(),
|
||||||
|
walker = new TreeWalker(
|
||||||
|
range.commonAncestorContainer,
|
||||||
|
SHOW_TEXT|SHOW_ELEMENT,
|
||||||
|
function ( node ) {
|
||||||
|
return isNodeContainedInRange( range, node, true );
|
||||||
|
}
|
||||||
|
),
|
||||||
|
startContainer = range.startContainer,
|
||||||
|
endContainer = range.endContainer,
|
||||||
|
node = walker.currentNode = startContainer,
|
||||||
|
textContent = '',
|
||||||
|
addedTextInBlock = false,
|
||||||
|
value;
|
||||||
|
|
||||||
|
if ( !walker.filter( node ) ) {
|
||||||
|
node = walker.nextNode();
|
||||||
|
}
|
||||||
|
|
||||||
|
while ( node ) {
|
||||||
|
if ( node.nodeType === TEXT_NODE ) {
|
||||||
|
value = node.data;
|
||||||
|
if ( value && ( /\S/.test( value ) ) ) {
|
||||||
|
if ( node === endContainer ) {
|
||||||
|
value = value.slice( 0, range.endOffset );
|
||||||
|
}
|
||||||
|
if ( node === startContainer ) {
|
||||||
|
value = value.slice( range.startOffset );
|
||||||
|
}
|
||||||
|
textContent += value;
|
||||||
|
addedTextInBlock = true;
|
||||||
|
}
|
||||||
|
} else if ( node.nodeName === 'BR' ||
|
||||||
|
addedTextInBlock && !isInline( node ) ) {
|
||||||
|
textContent += '\n';
|
||||||
|
addedTextInBlock = false;
|
||||||
|
}
|
||||||
|
node = walker.nextNode();
|
||||||
|
}
|
||||||
|
|
||||||
|
return textContent;
|
||||||
};
|
};
|
||||||
|
|
||||||
proto.getPath = function () {
|
proto.getPath = function () {
|
||||||
|
|
|
@ -27,43 +27,6 @@ var getNodeAfter = function ( node, offset ) {
|
||||||
|
|
||||||
// ---
|
// ---
|
||||||
|
|
||||||
var forEachTextNodeInRange = function ( range, fn ) {
|
|
||||||
range = range.cloneRange();
|
|
||||||
moveRangeBoundariesDownTree( range );
|
|
||||||
|
|
||||||
var startContainer = range.startContainer,
|
|
||||||
endContainer = range.endContainer,
|
|
||||||
root = range.commonAncestorContainer,
|
|
||||||
walker = new TreeWalker(
|
|
||||||
root, SHOW_TEXT, function (/* node */) {
|
|
||||||
return true;
|
|
||||||
}, false ),
|
|
||||||
textnode = walker.currentNode = startContainer;
|
|
||||||
|
|
||||||
while ( !fn( textnode, range ) &&
|
|
||||||
textnode !== endContainer &&
|
|
||||||
( textnode = walker.nextNode() ) ) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
var getTextContentInRange = function ( range ) {
|
|
||||||
var textContent = '';
|
|
||||||
forEachTextNodeInRange( range, function ( textnode, range ) {
|
|
||||||
var value = textnode.data;
|
|
||||||
if ( value && ( /\S/.test( value ) ) ) {
|
|
||||||
if ( textnode === range.endContainer ) {
|
|
||||||
value = value.slice( 0, range.endOffset );
|
|
||||||
}
|
|
||||||
if ( textnode === range.startContainer ) {
|
|
||||||
value = value.slice( range.startOffset );
|
|
||||||
}
|
|
||||||
textContent += value;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return textContent;
|
|
||||||
};
|
|
||||||
|
|
||||||
// ---
|
|
||||||
|
|
||||||
var insertNodeInRange = function ( range, node ) {
|
var insertNodeInRange = function ( range, node ) {
|
||||||
// Insert at start.
|
// Insert at start.
|
||||||
var startContainer = range.startContainer,
|
var startContainer = range.startContainer,
|
||||||
|
|
Loading…
Reference in a new issue