diff --git a/lib/gollum/frontend/public/javascript/gollum-editor/gollum.editor.js b/lib/gollum/frontend/public/javascript/gollum-editor/gollum.editor.js index 3491ebdb..9b359de2 100755 --- a/lib/gollum/frontend/public/javascript/gollum-editor/gollum.editor.js +++ b/lib/gollum/frontend/public/javascript/gollum-editor/gollum.editor.js @@ -510,12 +510,38 @@ start = el.selectionStart; end = el.selectionEnd; } else { - var range = document.selection.createRange(); + var range = document.selection.createRange(); var stored_range = range.duplicate(); - stored_range.moveToElementText( el ); - stored_range.setEndPoint( 'EndToEnd', range ); - start = stored_range.text.length - range.text.length; + stored_range.moveToElementText( el ); + stored_range.setEndPoint( 'EndToEnd', range ); + start = stored_range.text.length - range.text.length; end = start + range.text.length; + + // so, uh, we're close, but we need to search for line breaks and + // adjust the start/end points accordingly since IE counts them as + // 2 characters in TextRange. + var s = start; + var lb = 0; + debug('IE: start position is currently ' + s); + for ( var i=0; i < s; i++ ) + if ( el.value.charAt(i).match(/\r/) ) + ++lb; + + if ( lb ) { + debug('IE start: compensating for ' + lb + ' line breaks'); + start = start - lb; + lb = 0; + } + + var e = end; + for ( var i=0; i < e; i++ ) + if ( el.value.charAt(i).match(/\r/) ) + ++lb; + + if ( lb ) { + debug('IE end: compensating for ' + lb + ' line breaks'); + end = end - lb; + } } return {