Skip to content

Instantly share code, notes, and snippets.

@vectorsize
Created September 25, 2012 19:36
Show Gist options
  • Save vectorsize/3783958 to your computer and use it in GitHub Desktop.
Save vectorsize/3783958 to your computer and use it in GitHub Desktop.
// Returns the absolute offset from the top of the container
function getCharacterOffsetWithin(sel, node) {
var range = sel.getRangeAt(0);
var selStr = sel.toString();
// we sanitize linebreaks and white spaces
selLen = selStr.replace(/[^A-Za-z0-9.-:\/$ ]/g, "").replace(/(\r\n|\n|\r|\s+)/gm, ' ').length;
var treeWalker = document.createTreeWalker( node, NodeFilter.SHOW_TEXT, function(node) {
var filter = NodeFilter.FILTER_REJECT
, nodeRange = rangy.createRange();
nodeRange.selectNodeContents(node);
if( nodeRange.compareBoundaryPoints( Range.END_TO_END, range ) < 1 ){
filter = NodeFilter.FILTER_ACCEPT;
}
return filter;
}, false );
var lefOffset = 0
, begining = 0
, end = 0
, prev = range.startContainer
, prevContent = prev.textContent;
while (treeWalker.nextNode()) {
lefOffset += treeWalker.currentNode.length;
}
if (prev.nodeType == 3) {
begining += lefOffset + range.startOffset;
end += lefOffset + range.endOffset;
}
// Wen we are selecting already annotated text we need to ignore the text itself in our offset
if(prevContent === selStr){
begining -= prevContent.length;
end -= prevContent.length;
}
return {'beg':begining, 'end':end};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment