Created
January 14, 2024 06:12
-
-
Save doiftrue/c1beb1d4c4385602a0f08edd559606de to your computer and use it in GitHub Desktop.
[wpkama embed] https://wp-kama.com/2310 Tab Symbol (\t) in Textarea When Pressing TAB Key
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* \t (tab ⇆ tabulation) symbol in textarea when pressing tab on the keyboard. | |
* | |
* Adds initial indentation for selected text when pressing the `Tab` key. | |
* Or removes the initial indentation (4 spaces or TAB) when pressing `Shift + Tab`. | |
* | |
* @Author Kama (wp-kama.ru) | |
* @version 4.3 | |
*/ | |
document.addEventListener( 'keydown', function( event ){ | |
if( 'TEXTAREA' !== event.target.tagName ){ | |
return | |
} | |
// not tab | |
if( event.code !== 'Tab' ){ | |
return | |
} | |
event.preventDefault() | |
// Opera, FireFox, Chrome | |
let textarea = event.target | |
let selStart = textarea.selectionStart | |
let selEnd = textarea.selectionEnd | |
let before = textarea.value.substring( 0, selStart ) | |
let slection = textarea.value.substring( selStart, selEnd ) | |
let after = textarea.value.substr( selEnd ) | |
let slection_new = '' | |
// remove TAB indent | |
if( event.shiftKey ){ | |
// fix selection | |
let selectBefore = before.substr( before.lastIndexOf( '\n' ) + 1 ) | |
let isfix = /^\s/.test( selectBefore ) | |
if( isfix ){ | |
let fixed_selStart = selStart - selectBefore.length | |
before = textarea.value.substring( 0, fixed_selStart ) | |
slection = textarea.value.substring( fixed_selStart, selEnd ) | |
} | |
let once = false | |
slection_new = slection.replace( /^(\t|[ ]{2,4})/gm, ( mm )=>{ | |
if( isfix && ! once ){ | |
once = true // do it once - for first line only | |
selStart -= mm.length | |
} | |
selEnd -= mm.length | |
return '' | |
}) | |
} | |
// add TAB indent | |
else { | |
selStart++ | |
// has selection | |
if( slection.trim() ){ | |
slection_new = slection.replace( /^/gm, ()=>{ | |
selEnd++ | |
return '\t' | |
}) | |
} | |
else { | |
slection_new = '\t' | |
selEnd++ | |
} | |
} | |
textarea.value = before + slection_new + after | |
// cursor | |
textarea.setSelectionRange( selStart, selEnd ) | |
} ); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment