45 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			45 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| function useCursor(input) {
 | |
|   let selectionInfo;
 | |
|   function recordCursor() {
 | |
|     if (input.value == void 0)
 | |
|       return;
 | |
|     const { selectionStart, selectionEnd, value } = input.value;
 | |
|     if (selectionStart == null || selectionEnd == null)
 | |
|       return;
 | |
|     const beforeTxt = value.slice(0, Math.max(0, selectionStart));
 | |
|     const afterTxt = value.slice(Math.max(0, selectionEnd));
 | |
|     selectionInfo = {
 | |
|       selectionStart,
 | |
|       selectionEnd,
 | |
|       value,
 | |
|       beforeTxt,
 | |
|       afterTxt
 | |
|     };
 | |
|   }
 | |
|   function setCursor() {
 | |
|     if (input.value == void 0 || selectionInfo == void 0)
 | |
|       return;
 | |
|     const { value } = input.value;
 | |
|     const { beforeTxt, afterTxt, selectionStart } = selectionInfo;
 | |
|     if (beforeTxt == void 0 || afterTxt == void 0 || selectionStart == void 0)
 | |
|       return;
 | |
|     let startPos = value.length;
 | |
|     if (value.endsWith(afterTxt)) {
 | |
|       startPos = value.length - afterTxt.length;
 | |
|     } else if (value.startsWith(beforeTxt)) {
 | |
|       startPos = beforeTxt.length;
 | |
|     } else {
 | |
|       const beforeLastChar = beforeTxt[selectionStart - 1];
 | |
|       const newIndex = value.indexOf(beforeLastChar, selectionStart - 1);
 | |
|       if (newIndex !== -1) {
 | |
|         startPos = newIndex + 1;
 | |
|       }
 | |
|     }
 | |
|     input.value.setSelectionRange(startPos, startPos);
 | |
|   }
 | |
|   return [recordCursor, setCursor];
 | |
| }
 | |
| 
 | |
| export { useCursor };
 | |
| //# sourceMappingURL=index.mjs.map
 |