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
 |