@chayns-components/emoji-input 5.4.9 → 5.4.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -460,20 +460,25 @@ const unwrapIgnoreEmojiSpanAtCursor = editorElement => {
|
|
|
460
460
|
commonAncestorContainer
|
|
461
461
|
} = range;
|
|
462
462
|
const cursorOffset = range.startOffset;
|
|
463
|
+
if (!editorElement.contains(commonAncestorContainer)) {
|
|
464
|
+
return;
|
|
465
|
+
}
|
|
463
466
|
|
|
464
467
|
// Walk up the DOM tree to find if we're inside a no-emoji-convert span
|
|
465
468
|
while (commonAncestorContainer && commonAncestorContainer !== editorElement) {
|
|
466
|
-
if (commonAncestorContainer.nodeType === Node.ELEMENT_NODE && commonAncestorContainer.
|
|
469
|
+
if (commonAncestorContainer.nodeType === Node.ELEMENT_NODE && commonAncestorContainer.classList.contains('no-emoji-convert')) {
|
|
467
470
|
// We're inside a no-emoji-convert span, unwrap it
|
|
468
471
|
const span = commonAncestorContainer;
|
|
469
|
-
const
|
|
472
|
+
const {
|
|
473
|
+
parentNode
|
|
474
|
+
} = span;
|
|
470
475
|
if (!parentNode) {
|
|
471
476
|
return;
|
|
472
477
|
}
|
|
473
478
|
|
|
474
479
|
// Find which text node contains the cursor
|
|
475
480
|
let cursorNode = null;
|
|
476
|
-
|
|
481
|
+
const cursorNodeOffset = cursorOffset;
|
|
477
482
|
|
|
478
483
|
// Get all child nodes of the span
|
|
479
484
|
const childNodes = Array.from(span.childNodes);
|
|
@@ -501,7 +506,9 @@ const unwrapIgnoreEmojiSpanAtCursor = editorElement => {
|
|
|
501
506
|
}
|
|
502
507
|
break;
|
|
503
508
|
}
|
|
504
|
-
|
|
509
|
+
|
|
510
|
+
// @ts-expect-error - is needed
|
|
511
|
+
commonAncestorContainer = commonAncestorContainer.parentNode;
|
|
505
512
|
}
|
|
506
513
|
};
|
|
507
514
|
|
|
@@ -522,14 +529,21 @@ const moveCursorOutOfIgnoreEmojiSpan = editorElement => {
|
|
|
522
529
|
let {
|
|
523
530
|
commonAncestorContainer
|
|
524
531
|
} = range;
|
|
532
|
+
if (!editorElement.contains(commonAncestorContainer)) {
|
|
533
|
+
return;
|
|
534
|
+
}
|
|
525
535
|
|
|
526
536
|
// Walk up the DOM tree to find if we're inside a no-emoji-convert span
|
|
527
537
|
while (commonAncestorContainer && commonAncestorContainer !== editorElement) {
|
|
528
|
-
if (commonAncestorContainer.nodeType === Node.ELEMENT_NODE && commonAncestorContainer.
|
|
538
|
+
if (commonAncestorContainer.nodeType === Node.ELEMENT_NODE && commonAncestorContainer.classList.contains('no-emoji-convert')) {
|
|
529
539
|
// We're inside a no-emoji-convert span, move cursor to after it
|
|
530
540
|
const span = commonAncestorContainer;
|
|
531
|
-
const
|
|
532
|
-
|
|
541
|
+
const {
|
|
542
|
+
nextSibling
|
|
543
|
+
} = span;
|
|
544
|
+
const {
|
|
545
|
+
parentNode
|
|
546
|
+
} = span;
|
|
533
547
|
if (!parentNode) {
|
|
534
548
|
return;
|
|
535
549
|
}
|
|
@@ -563,7 +577,9 @@ const moveCursorOutOfIgnoreEmojiSpan = editorElement => {
|
|
|
563
577
|
selection.addRange(range);
|
|
564
578
|
break;
|
|
565
579
|
}
|
|
566
|
-
|
|
580
|
+
|
|
581
|
+
// @ts-expect-error - is needed
|
|
582
|
+
commonAncestorContainer = commonAncestorContainer.parentNode;
|
|
567
583
|
}
|
|
568
584
|
};
|
|
569
585
|
exports.moveCursorOutOfIgnoreEmojiSpan = moveCursorOutOfIgnoreEmojiSpan;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selection.js","names":["_number","require","_text","childIndex","endOffset","startOffset","saveSelection","element","shouldIgnoreEmptyTextNodes","selection","window","getSelection","anchorNode","range","getRangeAt","childNodesArray","Array","from","childNodes","filter","nodeType","nodeValue","Node","TEXT_NODE","indexOf","exports","restoreSelection","hasFoundNoJoiner","forEach","node","noJoinerIndex","replace","childNode","elementTextLength","getElementTextLength","nextSibling","charCodeAt","_childNode$parentNode","textNode","document","createTextNode","parentNode","insertBefore","length","_childNode$parentNode2","_childNode$nextSiblin","_childNode$nextSiblin2","_childNode$parentNode3","_childNode$parentNode4","createRange","clamp","setStart","setEnd","error","removeAllRanges","addRange","collapse","insertInvisibleCursorMarker","rangeCount","startContainer","offset","execCommand","span","createElement","style","display","width","height","className","parent","textContent","beforeText","slice","afterText","afterTextNode","setTimeout","newRange","setStartAfter","setEndAfter","remove","insertPseudoMarker","marker","id","insertNode","insertCursorAtMarker","ref","_ref$current","current","querySelector","moveSelectionOffset","distance","setChildIndex","index","getCharCodeThatWillBeDeleted","event","_window$getSelection","_nextSibling$nodeValu","key","_previousSibling$node","previousSibling","endContainer","findAndSelectText","editorElement","searchText","options","shouldReplaceNearCursor","_editorElement$textCo","includes","cursorPos","getCurrentCursorPosition","matches","absCounter","searchNodesForText","push","absIndex","nodeName","match","reduce","prev","curr","Math","abs","_window$getSelection2","_window","sel","call","contains","commonAncestorContainer","pre","selectNodeContents","container","appendChild","cloneContents","bbCodeUntilCursor","convertHTMLToText","innerHTML","preserveSpaces","shouldSerializeNoEmojiToBBCode","getCursorTargetByAbsIndex","position","clampedPosition","searchNodes","nodeText","nextAbsCounter","child","found","rootNode","lastTextNode","lastChild","appendedTextNode","setCursorPositionByAbsIndex","_window$getSelection3","_window2","target","unwrapIgnoreEmojiSpanAtCursor","cursorOffset","ELEMENT_NODE","cursorNode","cursorNodeOffset","clonedChild","cloneNode","removeChild","moveCursorOutOfIgnoreEmojiSpan","targetNode","walker","createTreeWalker","NodeFilter","SHOW_TEXT","firstTextNode","nextNode"],"sources":["../../../src/utils/selection.ts"],"sourcesContent":["import type { KeyboardEvent, RefObject } from 'react';\nimport { clamp } from './number';\nimport { convertHTMLToText, getElementTextLength } from './text';\n\nlet childIndex = -1;\nlet endOffset = -1;\nlet startOffset = -1;\n\ninterface SaveSelectionOptions {\n shouldIgnoreEmptyTextNodes?: boolean;\n}\n\nexport const saveSelection = (\n element: HTMLDivElement,\n { shouldIgnoreEmptyTextNodes }: SaveSelectionOptions = {},\n) => {\n const selection = window.getSelection();\n\n if (!selection) {\n return;\n }\n\n const { anchorNode } = selection;\n\n if (!anchorNode) {\n return;\n }\n\n const range = selection.getRangeAt(0);\n\n let childNodesArray = Array.from(element.childNodes);\n\n if (shouldIgnoreEmptyTextNodes) {\n childNodesArray = childNodesArray.filter(\n ({ nodeType, nodeValue }) =>\n nodeType !== Node.TEXT_NODE || (nodeValue !== '' && nodeValue !== '\\u200B'),\n );\n }\n\n childIndex = childNodesArray.indexOf(anchorNode as ChildNode);\n\n endOffset = range.endOffset;\n startOffset = range.startOffset;\n};\n\nexport const restoreSelection = (element: HTMLDivElement) => {\n // Search for \\u200C in child nodes. If found, set the childIndex, startOffset, and endOffset to the\n // position of the \\u200C character. Also remove the \\u200C character from the child node. If not found,\n // the childIndex, startOffset, and endOffset will be like before.\n const childNodesArray = Array.from(element.childNodes);\n\n let hasFoundNoJoiner = false;\n\n childNodesArray.forEach((node) => {\n if (\n !hasFoundNoJoiner &&\n node.nodeType === Node.TEXT_NODE &&\n typeof node.nodeValue === 'string'\n ) {\n const noJoinerIndex = node.nodeValue.indexOf('\\u200C');\n\n if (noJoinerIndex !== -1) {\n hasFoundNoJoiner = true;\n\n childIndex = childNodesArray.indexOf(node);\n startOffset = noJoinerIndex;\n endOffset = noJoinerIndex;\n }\n }\n });\n\n // Remove all no joiner characters from the child nodes if no joiner was found\n if (hasFoundNoJoiner) {\n childNodesArray.forEach((node) => {\n if (node.nodeType === Node.TEXT_NODE && typeof node.nodeValue === 'string') {\n // eslint-disable-next-line no-param-reassign\n node.nodeValue = node.nodeValue.replace(/\\u200C/g, '');\n }\n });\n }\n\n let childNode = element.childNodes[childIndex];\n\n const selection = window.getSelection();\n\n if (!childNode || !element || !selection) {\n return;\n }\n\n // noinspection SuspiciousTypeOfGuard\n if (typeof childNode.nodeValue !== 'string') {\n const elementTextLength = getElementTextLength(childNode as Element);\n\n if (childNode.nextSibling) {\n childNode = childNode.nextSibling;\n\n if (childNode.nodeType === Node.TEXT_NODE && childNode.nodeValue) {\n endOffset -= elementTextLength;\n startOffset -= elementTextLength;\n\n if (childNode.nodeValue.charCodeAt(endOffset) === 8203) {\n endOffset += 1;\n startOffset += 1;\n }\n } else {\n const textNode = document.createTextNode('\\u200B');\n\n childNode.parentNode?.insertBefore(textNode, childNode.nextSibling);\n\n childNode = textNode;\n\n endOffset = textNode.length;\n startOffset = textNode.length;\n }\n } else {\n const textNode = document.createTextNode('\\u200B');\n\n childNode.parentNode?.insertBefore(textNode, childNode.nextSibling);\n\n childNode = textNode;\n\n endOffset = textNode.length;\n startOffset = textNode.length;\n }\n } else if (childNode.nodeValue && endOffset > childNode.nodeValue.length) {\n if (childNode.nextSibling?.nodeValue) {\n let elementTextLength = childNode.nodeValue.length;\n\n childNode = childNode.nextSibling;\n\n // noinspection SuspiciousTypeOfGuard\n if (typeof childNode.nodeValue !== 'string') {\n elementTextLength += getElementTextLength(childNode as Element);\n\n if (childNode.nextSibling?.nodeValue) {\n childNode = childNode.nextSibling;\n\n if (childNode.nodeType === Node.TEXT_NODE && childNode.nodeValue) {\n endOffset -= elementTextLength;\n startOffset -= elementTextLength;\n\n if (childNode.nodeValue.charCodeAt(endOffset) === 8203) {\n endOffset += 1;\n startOffset += 1;\n }\n } else {\n const textNode = document.createTextNode('\\u200B');\n\n childNode.parentNode?.insertBefore(textNode, childNode.nextSibling);\n\n childNode = textNode;\n\n endOffset = textNode.length;\n startOffset = textNode.length;\n }\n } else {\n const textNode = document.createTextNode('\\u200B');\n\n childNode.parentNode?.insertBefore(textNode, childNode.nextSibling);\n\n childNode = textNode;\n\n endOffset = textNode.length;\n startOffset = textNode.length;\n }\n }\n } else {\n endOffset = childNode.nodeValue.length;\n startOffset = childNode.nodeValue.length;\n }\n }\n\n const range = document.createRange();\n\n // noinspection SuspiciousTypeOfGuard\n if (typeof childNode.nodeValue === 'string') {\n startOffset = clamp(startOffset, 0, childNode.nodeValue.length);\n endOffset = clamp(endOffset, 0, childNode.nodeValue.length);\n }\n\n try {\n range.setStart(childNode, startOffset);\n range.setEnd(childNode, endOffset);\n } catch (error) {\n // Do nothing\n }\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n range.collapse(true);\n};\n\nexport const insertInvisibleCursorMarker = (): void => {\n const selection = window.getSelection();\n\n if (!selection || selection.rangeCount === 0) {\n return;\n }\n\n const range = selection.getRangeAt(0);\n const textNode = range.startContainer;\n const offset = range.startOffset;\n\n // noinspection JSDeprecatedSymbols\n document.execCommand('delete', false);\n\n const span = document.createElement('span');\n span.style.display = 'inline-block';\n span.style.width = '0';\n span.style.height = '0';\n span.className = 'invisible-cursor-marker';\n\n const parent = textNode.parentNode;\n\n if (parent) {\n if (textNode.nodeType === Node.TEXT_NODE) {\n const textContent = textNode.textContent || '';\n const beforeText = textContent.slice(0, offset);\n const afterText = textContent.slice(offset);\n\n textNode.textContent = beforeText;\n\n parent.insertBefore(span, textNode.nextSibling);\n const afterTextNode = document.createTextNode(afterText);\n parent.insertBefore(afterTextNode, span.nextSibling);\n\n setTimeout(() => {\n // Set cursor to cursor element\n const newRange = document.createRange();\n newRange.setStartAfter(span);\n newRange.setEndAfter(span);\n selection.removeAllRanges();\n selection.addRange(newRange);\n\n // Remove cursor element\n span.remove();\n }, 10);\n }\n }\n};\n\nexport const insertPseudoMarker = () => {\n const selection = window.getSelection();\n\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n const marker = document.createElement('span');\n marker.id = 'cursor-marker';\n marker.style.display = 'inline-block';\n marker.style.width = '0';\n marker.style.height = '0';\n range.insertNode(marker);\n }\n};\n\nexport const insertCursorAtMarker = (ref: RefObject<HTMLDivElement>) => {\n const marker = ref.current?.querySelector('#cursor-marker');\n\n if (marker) {\n const selection = window.getSelection();\n const range = document.createRange();\n range.setStartAfter(marker);\n range.setEndAfter(marker);\n selection?.removeAllRanges();\n selection?.addRange(range);\n marker.remove();\n }\n};\n\nexport const moveSelectionOffset = (distance: number) => {\n endOffset += distance;\n startOffset += distance;\n};\n\nexport const setChildIndex = (index: number) => {\n childIndex = index;\n};\n\n/**\n * This function returns the code of the character that will be removed by the KeyDown event in the\n * next step, if the \"Backspace\" or \"Delete\" key was pressed and there is no selection of multiple\n * characters.\n *\n * @param event - Keyboard event from \"onKeyDown\"\n */\nexport const getCharCodeThatWillBeDeleted = (event: KeyboardEvent<HTMLDivElement>) => {\n const range = window.getSelection()?.getRangeAt(0);\n\n /**\n * At this point the function is aborted if there is no selection range, several characters have\n * been selected and therefore no single letter is removed or neither the \"Backspace\" nor the\n * \"Delete\" key has been pressed.\n */\n if (\n !range ||\n range.endOffset !== range.startOffset ||\n (event.key !== 'Backspace' && event.key !== 'Delete' && event.key !== 'Unidentified')\n ) {\n return null;\n }\n\n if (event.key === 'Backspace' || event.key === 'Unidentified') {\n const { nodeValue, previousSibling } = range.startContainer;\n\n if (range.startOffset > 0) {\n return nodeValue?.charCodeAt(range.startOffset - 1);\n }\n\n return previousSibling?.nodeValue?.charCodeAt(previousSibling.nodeValue.length - 1);\n }\n\n const { nextSibling, nodeValue } = range.endContainer;\n\n if (range.endOffset < (nodeValue?.length ?? 0)) {\n return nodeValue?.charCodeAt(range.endOffset);\n }\n\n return nextSibling?.nodeValue?.charCodeAt(0);\n};\n\nexport type ReplaceTextOptions = { shouldReplaceNearCursor?: boolean };\n\ninterface FindAndSelectTextOptions {\n editorElement: HTMLDivElement;\n searchText: string;\n options?: ReplaceTextOptions;\n}\n\nexport interface SetCursorPositionByAbsIndexOptions {\n editorElement: HTMLDivElement;\n position: number;\n}\n\ntype Match = { node: Node; offset: number; absIndex: number };\n\nexport const findAndSelectText = ({\n editorElement,\n searchText,\n options = { shouldReplaceNearCursor: true },\n}: FindAndSelectTextOptions): Range | null => {\n if (!editorElement.textContent?.includes(searchText)) {\n return null;\n }\n\n const range = document.createRange();\n\n const cursorPos = getCurrentCursorPosition(editorElement);\n\n const matches: Match[] = [];\n let absCounter = 0;\n\n const searchNodesForText = (node: Node) => {\n if (node.nodeType === Node.TEXT_NODE && node.textContent) {\n let index = node.textContent.indexOf(searchText);\n while (index !== -1) {\n matches.push({\n node,\n offset: index,\n absIndex: absCounter + index,\n });\n index = node.textContent.indexOf(searchText, index + 1);\n }\n absCounter += node.textContent.length;\n } else if (node.nodeName !== 'LC_MENTION') {\n Array.from(node.childNodes).forEach(searchNodesForText);\n }\n };\n\n searchNodesForText(editorElement);\n\n if (matches.length === 0) {\n return null;\n }\n\n let match = matches[0];\n\n if (options?.shouldReplaceNearCursor && cursorPos !== null) {\n match = matches.reduce((prev, curr) =>\n Math.abs(curr.absIndex - cursorPos) < Math.abs(prev.absIndex - cursorPos) ? curr : prev,\n );\n }\n\n if (!match) {\n return null;\n }\n\n range.setStart(match.node, match.offset);\n range.setEnd(match.node, match.offset + searchText.length);\n\n return range;\n};\n\nexport const getCurrentCursorPosition = (editorElement: HTMLDivElement | null): number | null => {\n if (!editorElement) {\n return null;\n }\n\n const sel = window.getSelection?.();\n if (!sel || sel.rangeCount === 0) {\n return null;\n }\n\n const range = sel.getRangeAt(0);\n\n if (!editorElement.contains(range.commonAncestorContainer)) {\n return null;\n }\n\n const pre = document.createRange();\n pre.selectNodeContents(editorElement);\n\n try {\n pre.setEnd(range.startContainer, range.startOffset);\n\n const container = document.createElement('div');\n container.appendChild(pre.cloneContents());\n\n const bbCodeUntilCursor = convertHTMLToText(container.innerHTML, {\n preserveSpaces: true,\n shouldSerializeNoEmojiToBBCode: false,\n });\n\n return bbCodeUntilCursor.length;\n } catch {\n return convertHTMLToText(editorElement.innerHTML, {\n shouldSerializeNoEmojiToBBCode: false,\n }).length;\n }\n};\n\ntype CursorTarget = { node: Text; offset: number };\n\nconst getCursorTargetByAbsIndex = ({\n editorElement,\n position,\n}: SetCursorPositionByAbsIndexOptions): CursorTarget | null => {\n const childNodes = Array.from(editorElement.childNodes);\n\n if (childNodes.length === 0) {\n const textNode = document.createTextNode('');\n editorElement.appendChild(textNode);\n\n return { node: textNode, offset: 0 };\n }\n\n const clampedPosition = clamp(\n position,\n 0,\n convertHTMLToText(editorElement.innerHTML, {\n shouldSerializeNoEmojiToBBCode: false,\n }).length,\n );\n\n let absCounter = 0;\n\n const searchNodes = (node: Node): CursorTarget | null => {\n if (node.nodeType === Node.TEXT_NODE) {\n const textNode = node as Text;\n const nodeText = textNode.nodeValue ?? '';\n const nextAbsCounter = absCounter + nodeText.length;\n\n if (clampedPosition <= nextAbsCounter) {\n return {\n node: textNode,\n offset: clamp(clampedPosition - absCounter, 0, nodeText.length),\n };\n }\n\n absCounter = nextAbsCounter;\n\n return null;\n }\n\n if (node.nodeName === 'LC_MENTION') {\n return null;\n }\n\n for (const child of Array.from(node.childNodes)) {\n const found = searchNodes(child);\n if (found) {\n return found;\n }\n }\n\n return null;\n };\n\n for (const rootNode of childNodes) {\n const found = searchNodes(rootNode);\n if (found) {\n return found;\n }\n }\n\n const lastTextNode = editorElement.lastChild;\n if (lastTextNode?.nodeType === Node.TEXT_NODE) {\n const textNode = lastTextNode as Text;\n return { node: textNode, offset: textNode.length };\n }\n\n const appendedTextNode = document.createTextNode('\\u200B');\n editorElement.appendChild(appendedTextNode);\n\n return { node: appendedTextNode, offset: appendedTextNode.length };\n};\n\nexport const setCursorPositionByAbsIndex = ({\n editorElement,\n position,\n}: SetCursorPositionByAbsIndexOptions): void => {\n const selection = window.getSelection?.();\n\n if (!selection) {\n return;\n }\n\n const target = getCursorTargetByAbsIndex({ editorElement, position });\n\n if (!target) {\n return;\n }\n\n const range = document.createRange();\n\n try {\n range.setStart(target.node, target.offset);\n range.setEnd(target.node, target.offset);\n } catch {\n return;\n }\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n range.collapse(true);\n};\n\n/**\n * Unwraps any no-emoji-convert span that contains the cursor.\n * This removes the span element but keeps its text content, preventing the cursor from getting stuck.\n */\nexport const unwrapIgnoreEmojiSpanAtCursor = (editorElement: HTMLDivElement | null) => {\n if (!editorElement) {\n return;\n }\n\n const selection = window.getSelection();\n\n if (!selection || !selection.rangeCount) {\n return;\n }\n\n const range = selection.getRangeAt(0);\n let { commonAncestorContainer } = range;\n const cursorOffset = range.startOffset;\n\n // Walk up the DOM tree to find if we're inside a no-emoji-convert span\n while (commonAncestorContainer && commonAncestorContainer !== editorElement) {\n if (\n commonAncestorContainer.nodeType === Node.ELEMENT_NODE &&\n (commonAncestorContainer as Element).className === 'no-emoji-convert'\n ) {\n // We're inside a no-emoji-convert span, unwrap it\n const span = commonAncestorContainer as Element;\n const parentNode = span.parentNode;\n\n if (!parentNode) {\n return;\n }\n\n // Find which text node contains the cursor\n let cursorNode: Node | null = null;\n let cursorNodeOffset = cursorOffset;\n\n // Get all child nodes of the span\n const childNodes = Array.from(span.childNodes);\n\n // Insert all children before the span and find the cursor node\n childNodes.forEach((child) => {\n const clonedChild = child.cloneNode(true);\n parentNode.insertBefore(clonedChild, span);\n\n // If this is the node that contains the cursor, track it\n if (child === range.startContainer) {\n cursorNode = clonedChild;\n }\n });\n\n // Remove the span\n parentNode.removeChild(span);\n\n // Restore cursor position in the unwrapped content\n if (cursorNode) {\n range.setStart(cursorNode, cursorNodeOffset);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n break;\n }\n\n commonAncestorContainer = commonAncestorContainer.parentNode ?? commonAncestorContainer;\n }\n};\n\n/**\n * Moves the cursor outside of any no-emoji-convert span if it's currently inside one.\n * This prevents the cursor from getting \"stuck\" inside the protection span when typing.\n */\nexport const moveCursorOutOfIgnoreEmojiSpan = (editorElement: HTMLDivElement | null) => {\n if (!editorElement) {\n return;\n }\n\n const selection = window.getSelection();\n\n if (!selection || !selection.rangeCount) {\n return;\n }\n\n const range = selection.getRangeAt(0);\n let { commonAncestorContainer } = range;\n\n // Walk up the DOM tree to find if we're inside a no-emoji-convert span\n while (commonAncestorContainer && commonAncestorContainer !== editorElement) {\n if (\n commonAncestorContainer.nodeType === Node.ELEMENT_NODE &&\n (commonAncestorContainer as Element).className === 'no-emoji-convert'\n ) {\n // We're inside a no-emoji-convert span, move cursor to after it\n const span = commonAncestorContainer as Element;\n const nextSibling = span.nextSibling;\n const parentNode = span.parentNode;\n\n if (!parentNode) {\n return;\n }\n\n // Always ensure there's a text node AFTER the span\n let targetNode: Text;\n\n if (nextSibling && nextSibling.nodeType === Node.TEXT_NODE) {\n // Next sibling is already a text node, use it\n targetNode = nextSibling as Text;\n } else if (nextSibling && nextSibling.nodeType === Node.ELEMENT_NODE) {\n // Next sibling is an element, find first text node in it\n const walker = document.createTreeWalker(nextSibling, NodeFilter.SHOW_TEXT);\n const firstTextNode = walker.nextNode() as Text;\n if (firstTextNode) {\n targetNode = firstTextNode;\n } else {\n // No text node found, create one\n targetNode = document.createTextNode('\\u200B');\n parentNode.insertBefore(targetNode, nextSibling);\n }\n } else {\n // No next sibling or it's not a text/element node, create a new text node\n targetNode = document.createTextNode('\\u200B');\n parentNode.insertBefore(targetNode, nextSibling);\n }\n\n // Place cursor at the start of the target node\n range.setStart(targetNode, 0);\n range.collapse(true);\n\n selection.removeAllRanges();\n selection.addRange(range);\n break;\n }\n\n commonAncestorContainer = commonAncestorContainer.parentNode ?? commonAncestorContainer;\n }\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"selection.js","names":["_number","require","_text","childIndex","endOffset","startOffset","saveSelection","element","shouldIgnoreEmptyTextNodes","selection","window","getSelection","anchorNode","range","getRangeAt","childNodesArray","Array","from","childNodes","filter","nodeType","nodeValue","Node","TEXT_NODE","indexOf","exports","restoreSelection","hasFoundNoJoiner","forEach","node","noJoinerIndex","replace","childNode","elementTextLength","getElementTextLength","nextSibling","charCodeAt","_childNode$parentNode","textNode","document","createTextNode","parentNode","insertBefore","length","_childNode$parentNode2","_childNode$nextSiblin","_childNode$nextSiblin2","_childNode$parentNode3","_childNode$parentNode4","createRange","clamp","setStart","setEnd","error","removeAllRanges","addRange","collapse","insertInvisibleCursorMarker","rangeCount","startContainer","offset","execCommand","span","createElement","style","display","width","height","className","parent","textContent","beforeText","slice","afterText","afterTextNode","setTimeout","newRange","setStartAfter","setEndAfter","remove","insertPseudoMarker","marker","id","insertNode","insertCursorAtMarker","ref","_ref$current","current","querySelector","moveSelectionOffset","distance","setChildIndex","index","getCharCodeThatWillBeDeleted","event","_window$getSelection","_nextSibling$nodeValu","key","_previousSibling$node","previousSibling","endContainer","findAndSelectText","editorElement","searchText","options","shouldReplaceNearCursor","_editorElement$textCo","includes","cursorPos","getCurrentCursorPosition","matches","absCounter","searchNodesForText","push","absIndex","nodeName","match","reduce","prev","curr","Math","abs","_window$getSelection2","_window","sel","call","contains","commonAncestorContainer","pre","selectNodeContents","container","appendChild","cloneContents","bbCodeUntilCursor","convertHTMLToText","innerHTML","preserveSpaces","shouldSerializeNoEmojiToBBCode","getCursorTargetByAbsIndex","position","clampedPosition","searchNodes","nodeText","nextAbsCounter","child","found","rootNode","lastTextNode","lastChild","appendedTextNode","setCursorPositionByAbsIndex","_window$getSelection3","_window2","target","unwrapIgnoreEmojiSpanAtCursor","cursorOffset","ELEMENT_NODE","classList","cursorNode","cursorNodeOffset","clonedChild","cloneNode","removeChild","moveCursorOutOfIgnoreEmojiSpan","targetNode","walker","createTreeWalker","NodeFilter","SHOW_TEXT","firstTextNode","nextNode"],"sources":["../../../src/utils/selection.ts"],"sourcesContent":["import type { KeyboardEvent, RefObject } from 'react';\nimport { clamp } from './number';\nimport { convertHTMLToText, getElementTextLength } from './text';\n\nlet childIndex = -1;\nlet endOffset = -1;\nlet startOffset = -1;\n\ninterface SaveSelectionOptions {\n shouldIgnoreEmptyTextNodes?: boolean;\n}\n\nexport const saveSelection = (\n element: HTMLDivElement,\n { shouldIgnoreEmptyTextNodes }: SaveSelectionOptions = {},\n) => {\n const selection = window.getSelection();\n\n if (!selection) {\n return;\n }\n\n const { anchorNode } = selection;\n\n if (!anchorNode) {\n return;\n }\n\n const range = selection.getRangeAt(0);\n\n let childNodesArray = Array.from(element.childNodes);\n\n if (shouldIgnoreEmptyTextNodes) {\n childNodesArray = childNodesArray.filter(\n ({ nodeType, nodeValue }) =>\n nodeType !== Node.TEXT_NODE || (nodeValue !== '' && nodeValue !== '\\u200B'),\n );\n }\n\n childIndex = childNodesArray.indexOf(anchorNode as ChildNode);\n\n endOffset = range.endOffset;\n startOffset = range.startOffset;\n};\n\nexport const restoreSelection = (element: HTMLDivElement) => {\n // Search for \\u200C in child nodes. If found, set the childIndex, startOffset, and endOffset to the\n // position of the \\u200C character. Also remove the \\u200C character from the child node. If not found,\n // the childIndex, startOffset, and endOffset will be like before.\n const childNodesArray = Array.from(element.childNodes);\n\n let hasFoundNoJoiner = false;\n\n childNodesArray.forEach((node) => {\n if (\n !hasFoundNoJoiner &&\n node.nodeType === Node.TEXT_NODE &&\n typeof node.nodeValue === 'string'\n ) {\n const noJoinerIndex = node.nodeValue.indexOf('\\u200C');\n\n if (noJoinerIndex !== -1) {\n hasFoundNoJoiner = true;\n\n childIndex = childNodesArray.indexOf(node);\n startOffset = noJoinerIndex;\n endOffset = noJoinerIndex;\n }\n }\n });\n\n // Remove all no joiner characters from the child nodes if no joiner was found\n if (hasFoundNoJoiner) {\n childNodesArray.forEach((node) => {\n if (node.nodeType === Node.TEXT_NODE && typeof node.nodeValue === 'string') {\n // eslint-disable-next-line no-param-reassign\n node.nodeValue = node.nodeValue.replace(/\\u200C/g, '');\n }\n });\n }\n\n let childNode = element.childNodes[childIndex];\n\n const selection = window.getSelection();\n\n if (!childNode || !element || !selection) {\n return;\n }\n\n // noinspection SuspiciousTypeOfGuard\n if (typeof childNode.nodeValue !== 'string') {\n const elementTextLength = getElementTextLength(childNode as Element);\n\n if (childNode.nextSibling) {\n childNode = childNode.nextSibling;\n\n if (childNode.nodeType === Node.TEXT_NODE && childNode.nodeValue) {\n endOffset -= elementTextLength;\n startOffset -= elementTextLength;\n\n if (childNode.nodeValue.charCodeAt(endOffset) === 8203) {\n endOffset += 1;\n startOffset += 1;\n }\n } else {\n const textNode = document.createTextNode('\\u200B');\n\n childNode.parentNode?.insertBefore(textNode, childNode.nextSibling);\n\n childNode = textNode;\n\n endOffset = textNode.length;\n startOffset = textNode.length;\n }\n } else {\n const textNode = document.createTextNode('\\u200B');\n\n childNode.parentNode?.insertBefore(textNode, childNode.nextSibling);\n\n childNode = textNode;\n\n endOffset = textNode.length;\n startOffset = textNode.length;\n }\n } else if (childNode.nodeValue && endOffset > childNode.nodeValue.length) {\n if (childNode.nextSibling?.nodeValue) {\n let elementTextLength = childNode.nodeValue.length;\n\n childNode = childNode.nextSibling;\n\n // noinspection SuspiciousTypeOfGuard\n if (typeof childNode.nodeValue !== 'string') {\n elementTextLength += getElementTextLength(childNode as Element);\n\n if (childNode.nextSibling?.nodeValue) {\n childNode = childNode.nextSibling;\n\n if (childNode.nodeType === Node.TEXT_NODE && childNode.nodeValue) {\n endOffset -= elementTextLength;\n startOffset -= elementTextLength;\n\n if (childNode.nodeValue.charCodeAt(endOffset) === 8203) {\n endOffset += 1;\n startOffset += 1;\n }\n } else {\n const textNode = document.createTextNode('\\u200B');\n\n childNode.parentNode?.insertBefore(textNode, childNode.nextSibling);\n\n childNode = textNode;\n\n endOffset = textNode.length;\n startOffset = textNode.length;\n }\n } else {\n const textNode = document.createTextNode('\\u200B');\n\n childNode.parentNode?.insertBefore(textNode, childNode.nextSibling);\n\n childNode = textNode;\n\n endOffset = textNode.length;\n startOffset = textNode.length;\n }\n }\n } else {\n endOffset = childNode.nodeValue.length;\n startOffset = childNode.nodeValue.length;\n }\n }\n\n const range = document.createRange();\n\n // noinspection SuspiciousTypeOfGuard\n if (typeof childNode.nodeValue === 'string') {\n startOffset = clamp(startOffset, 0, childNode.nodeValue.length);\n endOffset = clamp(endOffset, 0, childNode.nodeValue.length);\n }\n\n try {\n range.setStart(childNode, startOffset);\n range.setEnd(childNode, endOffset);\n } catch (error) {\n // Do nothing\n }\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n range.collapse(true);\n};\n\nexport const insertInvisibleCursorMarker = (): void => {\n const selection = window.getSelection();\n\n if (!selection || selection.rangeCount === 0) {\n return;\n }\n\n const range = selection.getRangeAt(0);\n const textNode = range.startContainer;\n const offset = range.startOffset;\n\n // noinspection JSDeprecatedSymbols\n document.execCommand('delete', false);\n\n const span = document.createElement('span');\n span.style.display = 'inline-block';\n span.style.width = '0';\n span.style.height = '0';\n span.className = 'invisible-cursor-marker';\n\n const parent = textNode.parentNode;\n\n if (parent) {\n if (textNode.nodeType === Node.TEXT_NODE) {\n const textContent = textNode.textContent || '';\n const beforeText = textContent.slice(0, offset);\n const afterText = textContent.slice(offset);\n\n textNode.textContent = beforeText;\n\n parent.insertBefore(span, textNode.nextSibling);\n const afterTextNode = document.createTextNode(afterText);\n parent.insertBefore(afterTextNode, span.nextSibling);\n\n setTimeout(() => {\n // Set cursor to cursor element\n const newRange = document.createRange();\n newRange.setStartAfter(span);\n newRange.setEndAfter(span);\n selection.removeAllRanges();\n selection.addRange(newRange);\n\n // Remove cursor element\n span.remove();\n }, 10);\n }\n }\n};\n\nexport const insertPseudoMarker = () => {\n const selection = window.getSelection();\n\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n const marker = document.createElement('span');\n marker.id = 'cursor-marker';\n marker.style.display = 'inline-block';\n marker.style.width = '0';\n marker.style.height = '0';\n range.insertNode(marker);\n }\n};\n\nexport const insertCursorAtMarker = (ref: RefObject<HTMLDivElement>) => {\n const marker = ref.current?.querySelector('#cursor-marker');\n\n if (marker) {\n const selection = window.getSelection();\n const range = document.createRange();\n range.setStartAfter(marker);\n range.setEndAfter(marker);\n selection?.removeAllRanges();\n selection?.addRange(range);\n marker.remove();\n }\n};\n\nexport const moveSelectionOffset = (distance: number) => {\n endOffset += distance;\n startOffset += distance;\n};\n\nexport const setChildIndex = (index: number) => {\n childIndex = index;\n};\n\n/**\n * This function returns the code of the character that will be removed by the KeyDown event in the\n * next step, if the \"Backspace\" or \"Delete\" key was pressed and there is no selection of multiple\n * characters.\n *\n * @param event - Keyboard event from \"onKeyDown\"\n */\nexport const getCharCodeThatWillBeDeleted = (event: KeyboardEvent<HTMLDivElement>) => {\n const range = window.getSelection()?.getRangeAt(0);\n\n /**\n * At this point the function is aborted if there is no selection range, several characters have\n * been selected and therefore no single letter is removed or neither the \"Backspace\" nor the\n * \"Delete\" key has been pressed.\n */\n if (\n !range ||\n range.endOffset !== range.startOffset ||\n (event.key !== 'Backspace' && event.key !== 'Delete' && event.key !== 'Unidentified')\n ) {\n return null;\n }\n\n if (event.key === 'Backspace' || event.key === 'Unidentified') {\n const { nodeValue, previousSibling } = range.startContainer;\n\n if (range.startOffset > 0) {\n return nodeValue?.charCodeAt(range.startOffset - 1);\n }\n\n return previousSibling?.nodeValue?.charCodeAt(previousSibling.nodeValue.length - 1);\n }\n\n const { nextSibling, nodeValue } = range.endContainer;\n\n if (range.endOffset < (nodeValue?.length ?? 0)) {\n return nodeValue?.charCodeAt(range.endOffset);\n }\n\n return nextSibling?.nodeValue?.charCodeAt(0);\n};\n\nexport type ReplaceTextOptions = { shouldReplaceNearCursor?: boolean };\n\ninterface FindAndSelectTextOptions {\n editorElement: HTMLDivElement;\n searchText: string;\n options?: ReplaceTextOptions;\n}\n\nexport interface SetCursorPositionByAbsIndexOptions {\n editorElement: HTMLDivElement;\n position: number;\n}\n\ntype Match = { node: Node; offset: number; absIndex: number };\n\nexport const findAndSelectText = ({\n editorElement,\n searchText,\n options = { shouldReplaceNearCursor: true },\n}: FindAndSelectTextOptions): Range | null => {\n if (!editorElement.textContent?.includes(searchText)) {\n return null;\n }\n\n const range = document.createRange();\n\n const cursorPos = getCurrentCursorPosition(editorElement);\n\n const matches: Match[] = [];\n let absCounter = 0;\n\n const searchNodesForText = (node: Node) => {\n if (node.nodeType === Node.TEXT_NODE && node.textContent) {\n let index = node.textContent.indexOf(searchText);\n while (index !== -1) {\n matches.push({\n node,\n offset: index,\n absIndex: absCounter + index,\n });\n index = node.textContent.indexOf(searchText, index + 1);\n }\n absCounter += node.textContent.length;\n } else if (node.nodeName !== 'LC_MENTION') {\n Array.from(node.childNodes).forEach(searchNodesForText);\n }\n };\n\n searchNodesForText(editorElement);\n\n if (matches.length === 0) {\n return null;\n }\n\n let match = matches[0];\n\n if (options?.shouldReplaceNearCursor && cursorPos !== null) {\n match = matches.reduce((prev, curr) =>\n Math.abs(curr.absIndex - cursorPos) < Math.abs(prev.absIndex - cursorPos) ? curr : prev,\n );\n }\n\n if (!match) {\n return null;\n }\n\n range.setStart(match.node, match.offset);\n range.setEnd(match.node, match.offset + searchText.length);\n\n return range;\n};\n\nexport const getCurrentCursorPosition = (editorElement: HTMLDivElement | null): number | null => {\n if (!editorElement) {\n return null;\n }\n\n const sel = window.getSelection?.();\n if (!sel || sel.rangeCount === 0) {\n return null;\n }\n\n const range = sel.getRangeAt(0);\n\n if (!editorElement.contains(range.commonAncestorContainer)) {\n return null;\n }\n\n const pre = document.createRange();\n pre.selectNodeContents(editorElement);\n\n try {\n pre.setEnd(range.startContainer, range.startOffset);\n\n const container = document.createElement('div');\n container.appendChild(pre.cloneContents());\n\n const bbCodeUntilCursor = convertHTMLToText(container.innerHTML, {\n preserveSpaces: true,\n shouldSerializeNoEmojiToBBCode: false,\n });\n\n return bbCodeUntilCursor.length;\n } catch {\n return convertHTMLToText(editorElement.innerHTML, {\n shouldSerializeNoEmojiToBBCode: false,\n }).length;\n }\n};\n\ntype CursorTarget = { node: Text; offset: number };\n\nconst getCursorTargetByAbsIndex = ({\n editorElement,\n position,\n}: SetCursorPositionByAbsIndexOptions): CursorTarget | null => {\n const childNodes = Array.from(editorElement.childNodes);\n\n if (childNodes.length === 0) {\n const textNode = document.createTextNode('');\n editorElement.appendChild(textNode);\n\n return { node: textNode, offset: 0 };\n }\n\n const clampedPosition = clamp(\n position,\n 0,\n convertHTMLToText(editorElement.innerHTML, {\n shouldSerializeNoEmojiToBBCode: false,\n }).length,\n );\n\n let absCounter = 0;\n\n const searchNodes = (node: Node): CursorTarget | null => {\n if (node.nodeType === Node.TEXT_NODE) {\n const textNode = node as Text;\n const nodeText = textNode.nodeValue ?? '';\n const nextAbsCounter = absCounter + nodeText.length;\n\n if (clampedPosition <= nextAbsCounter) {\n return {\n node: textNode,\n offset: clamp(clampedPosition - absCounter, 0, nodeText.length),\n };\n }\n\n absCounter = nextAbsCounter;\n\n return null;\n }\n\n if (node.nodeName === 'LC_MENTION') {\n return null;\n }\n\n for (const child of Array.from(node.childNodes)) {\n const found = searchNodes(child);\n if (found) {\n return found;\n }\n }\n\n return null;\n };\n\n for (const rootNode of childNodes) {\n const found = searchNodes(rootNode);\n if (found) {\n return found;\n }\n }\n\n const lastTextNode = editorElement.lastChild;\n if (lastTextNode?.nodeType === Node.TEXT_NODE) {\n const textNode = lastTextNode as Text;\n return { node: textNode, offset: textNode.length };\n }\n\n const appendedTextNode = document.createTextNode('\\u200B');\n editorElement.appendChild(appendedTextNode);\n\n return { node: appendedTextNode, offset: appendedTextNode.length };\n};\n\nexport const setCursorPositionByAbsIndex = ({\n editorElement,\n position,\n}: SetCursorPositionByAbsIndexOptions): void => {\n const selection = window.getSelection?.();\n\n if (!selection) {\n return;\n }\n\n const target = getCursorTargetByAbsIndex({ editorElement, position });\n\n if (!target) {\n return;\n }\n\n const range = document.createRange();\n\n try {\n range.setStart(target.node, target.offset);\n range.setEnd(target.node, target.offset);\n } catch {\n return;\n }\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n range.collapse(true);\n};\n\n/**\n * Unwraps any no-emoji-convert span that contains the cursor.\n * This removes the span element but keeps its text content, preventing the cursor from getting stuck.\n */\nexport const unwrapIgnoreEmojiSpanAtCursor = (editorElement: HTMLDivElement | null) => {\n if (!editorElement) {\n return;\n }\n\n const selection = window.getSelection();\n\n if (!selection || !selection.rangeCount) {\n return;\n }\n\n const range = selection.getRangeAt(0);\n let { commonAncestorContainer } = range;\n const cursorOffset = range.startOffset;\n\n if (!editorElement.contains(commonAncestorContainer)) {\n return;\n }\n\n // Walk up the DOM tree to find if we're inside a no-emoji-convert span\n while (commonAncestorContainer && commonAncestorContainer !== editorElement) {\n if (\n commonAncestorContainer.nodeType === Node.ELEMENT_NODE &&\n (commonAncestorContainer as Element).classList.contains('no-emoji-convert')\n ) {\n // We're inside a no-emoji-convert span, unwrap it\n const span = commonAncestorContainer as Element;\n const { parentNode } = span;\n\n if (!parentNode) {\n return;\n }\n\n // Find which text node contains the cursor\n let cursorNode: Node | null = null;\n const cursorNodeOffset = cursorOffset;\n\n // Get all child nodes of the span\n const childNodes = Array.from(span.childNodes);\n\n // Insert all children before the span and find the cursor node\n childNodes.forEach((child) => {\n const clonedChild = child.cloneNode(true);\n parentNode.insertBefore(clonedChild, span);\n\n // If this is the node that contains the cursor, track it\n if (child === range.startContainer) {\n cursorNode = clonedChild;\n }\n });\n\n // Remove the span\n parentNode.removeChild(span);\n\n // Restore cursor position in the unwrapped content\n if (cursorNode) {\n range.setStart(cursorNode, cursorNodeOffset);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n break;\n }\n\n // @ts-expect-error - is needed\n commonAncestorContainer = commonAncestorContainer.parentNode;\n }\n};\n\n/**\n * Moves the cursor outside of any no-emoji-convert span if it's currently inside one.\n * This prevents the cursor from getting \"stuck\" inside the protection span when typing.\n */\nexport const moveCursorOutOfIgnoreEmojiSpan = (editorElement: HTMLDivElement | null) => {\n if (!editorElement) {\n return;\n }\n\n const selection = window.getSelection();\n\n if (!selection || !selection.rangeCount) {\n return;\n }\n\n const range = selection.getRangeAt(0);\n let { commonAncestorContainer } = range;\n\n if (!editorElement.contains(commonAncestorContainer)) {\n return;\n }\n\n // Walk up the DOM tree to find if we're inside a no-emoji-convert span\n while (commonAncestorContainer && commonAncestorContainer !== editorElement) {\n if (\n commonAncestorContainer.nodeType === Node.ELEMENT_NODE &&\n (commonAncestorContainer as Element).classList.contains('no-emoji-convert')\n ) {\n // We're inside a no-emoji-convert span, move cursor to after it\n const span = commonAncestorContainer as Element;\n const { nextSibling } = span;\n const { parentNode } = span;\n\n if (!parentNode) {\n return;\n }\n\n // Always ensure there's a text node AFTER the span\n let targetNode: Text;\n\n if (nextSibling && nextSibling.nodeType === Node.TEXT_NODE) {\n // Next sibling is already a text node, use it\n targetNode = nextSibling as Text;\n } else if (nextSibling && nextSibling.nodeType === Node.ELEMENT_NODE) {\n // Next sibling is an element, find first text node in it\n const walker = document.createTreeWalker(nextSibling, NodeFilter.SHOW_TEXT);\n const firstTextNode = walker.nextNode() as Text;\n if (firstTextNode) {\n targetNode = firstTextNode;\n } else {\n // No text node found, create one\n targetNode = document.createTextNode('\\u200B');\n parentNode.insertBefore(targetNode, nextSibling);\n }\n } else {\n // No next sibling or it's not a text/element node, create a new text node\n targetNode = document.createTextNode('\\u200B');\n parentNode.insertBefore(targetNode, nextSibling);\n }\n\n // Place cursor at the start of the target node\n range.setStart(targetNode, 0);\n range.collapse(true);\n\n selection.removeAllRanges();\n selection.addRange(range);\n break;\n }\n\n // @ts-expect-error - is needed\n commonAncestorContainer = commonAncestorContainer.parentNode;\n }\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -431,20 +431,25 @@ export const unwrapIgnoreEmojiSpanAtCursor = editorElement => {
|
|
|
431
431
|
commonAncestorContainer
|
|
432
432
|
} = range;
|
|
433
433
|
const cursorOffset = range.startOffset;
|
|
434
|
+
if (!editorElement.contains(commonAncestorContainer)) {
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
434
437
|
|
|
435
438
|
// Walk up the DOM tree to find if we're inside a no-emoji-convert span
|
|
436
439
|
while (commonAncestorContainer && commonAncestorContainer !== editorElement) {
|
|
437
|
-
if (commonAncestorContainer.nodeType === Node.ELEMENT_NODE && commonAncestorContainer.
|
|
440
|
+
if (commonAncestorContainer.nodeType === Node.ELEMENT_NODE && commonAncestorContainer.classList.contains('no-emoji-convert')) {
|
|
438
441
|
// We're inside a no-emoji-convert span, unwrap it
|
|
439
442
|
const span = commonAncestorContainer;
|
|
440
|
-
const
|
|
443
|
+
const {
|
|
444
|
+
parentNode
|
|
445
|
+
} = span;
|
|
441
446
|
if (!parentNode) {
|
|
442
447
|
return;
|
|
443
448
|
}
|
|
444
449
|
|
|
445
450
|
// Find which text node contains the cursor
|
|
446
451
|
let cursorNode = null;
|
|
447
|
-
|
|
452
|
+
const cursorNodeOffset = cursorOffset;
|
|
448
453
|
|
|
449
454
|
// Get all child nodes of the span
|
|
450
455
|
const childNodes = Array.from(span.childNodes);
|
|
@@ -472,7 +477,9 @@ export const unwrapIgnoreEmojiSpanAtCursor = editorElement => {
|
|
|
472
477
|
}
|
|
473
478
|
break;
|
|
474
479
|
}
|
|
475
|
-
|
|
480
|
+
|
|
481
|
+
// @ts-expect-error - is needed
|
|
482
|
+
commonAncestorContainer = commonAncestorContainer.parentNode;
|
|
476
483
|
}
|
|
477
484
|
};
|
|
478
485
|
|
|
@@ -492,14 +499,21 @@ export const moveCursorOutOfIgnoreEmojiSpan = editorElement => {
|
|
|
492
499
|
let {
|
|
493
500
|
commonAncestorContainer
|
|
494
501
|
} = range;
|
|
502
|
+
if (!editorElement.contains(commonAncestorContainer)) {
|
|
503
|
+
return;
|
|
504
|
+
}
|
|
495
505
|
|
|
496
506
|
// Walk up the DOM tree to find if we're inside a no-emoji-convert span
|
|
497
507
|
while (commonAncestorContainer && commonAncestorContainer !== editorElement) {
|
|
498
|
-
if (commonAncestorContainer.nodeType === Node.ELEMENT_NODE && commonAncestorContainer.
|
|
508
|
+
if (commonAncestorContainer.nodeType === Node.ELEMENT_NODE && commonAncestorContainer.classList.contains('no-emoji-convert')) {
|
|
499
509
|
// We're inside a no-emoji-convert span, move cursor to after it
|
|
500
510
|
const span = commonAncestorContainer;
|
|
501
|
-
const
|
|
502
|
-
|
|
511
|
+
const {
|
|
512
|
+
nextSibling
|
|
513
|
+
} = span;
|
|
514
|
+
const {
|
|
515
|
+
parentNode
|
|
516
|
+
} = span;
|
|
503
517
|
if (!parentNode) {
|
|
504
518
|
return;
|
|
505
519
|
}
|
|
@@ -533,7 +547,9 @@ export const moveCursorOutOfIgnoreEmojiSpan = editorElement => {
|
|
|
533
547
|
selection.addRange(range);
|
|
534
548
|
break;
|
|
535
549
|
}
|
|
536
|
-
|
|
550
|
+
|
|
551
|
+
// @ts-expect-error - is needed
|
|
552
|
+
commonAncestorContainer = commonAncestorContainer.parentNode;
|
|
537
553
|
}
|
|
538
554
|
};
|
|
539
555
|
//# sourceMappingURL=selection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selection.js","names":["clamp","convertHTMLToText","getElementTextLength","childIndex","endOffset","startOffset","saveSelection","element","shouldIgnoreEmptyTextNodes","selection","window","getSelection","anchorNode","range","getRangeAt","childNodesArray","Array","from","childNodes","filter","nodeType","nodeValue","Node","TEXT_NODE","indexOf","restoreSelection","hasFoundNoJoiner","forEach","node","noJoinerIndex","replace","childNode","elementTextLength","nextSibling","charCodeAt","textNode","document","createTextNode","parentNode","insertBefore","length","createRange","setStart","setEnd","error","removeAllRanges","addRange","collapse","insertInvisibleCursorMarker","rangeCount","startContainer","offset","execCommand","span","createElement","style","display","width","height","className","parent","textContent","beforeText","slice","afterText","afterTextNode","setTimeout","newRange","setStartAfter","setEndAfter","remove","insertPseudoMarker","marker","id","insertNode","insertCursorAtMarker","ref","current","querySelector","moveSelectionOffset","distance","setChildIndex","index","getCharCodeThatWillBeDeleted","event","key","previousSibling","endContainer","findAndSelectText","editorElement","searchText","options","shouldReplaceNearCursor","includes","cursorPos","getCurrentCursorPosition","matches","absCounter","searchNodesForText","push","absIndex","nodeName","match","reduce","prev","curr","Math","abs","sel","contains","commonAncestorContainer","pre","selectNodeContents","container","appendChild","cloneContents","bbCodeUntilCursor","innerHTML","preserveSpaces","shouldSerializeNoEmojiToBBCode","getCursorTargetByAbsIndex","position","clampedPosition","searchNodes","nodeText","nextAbsCounter","child","found","rootNode","lastTextNode","lastChild","appendedTextNode","setCursorPositionByAbsIndex","target","unwrapIgnoreEmojiSpanAtCursor","cursorOffset","ELEMENT_NODE","cursorNode","cursorNodeOffset","clonedChild","cloneNode","removeChild","moveCursorOutOfIgnoreEmojiSpan","targetNode","walker","createTreeWalker","NodeFilter","SHOW_TEXT","firstTextNode","nextNode"],"sources":["../../../src/utils/selection.ts"],"sourcesContent":["import type { KeyboardEvent, RefObject } from 'react';\nimport { clamp } from './number';\nimport { convertHTMLToText, getElementTextLength } from './text';\n\nlet childIndex = -1;\nlet endOffset = -1;\nlet startOffset = -1;\n\ninterface SaveSelectionOptions {\n shouldIgnoreEmptyTextNodes?: boolean;\n}\n\nexport const saveSelection = (\n element: HTMLDivElement,\n { shouldIgnoreEmptyTextNodes }: SaveSelectionOptions = {},\n) => {\n const selection = window.getSelection();\n\n if (!selection) {\n return;\n }\n\n const { anchorNode } = selection;\n\n if (!anchorNode) {\n return;\n }\n\n const range = selection.getRangeAt(0);\n\n let childNodesArray = Array.from(element.childNodes);\n\n if (shouldIgnoreEmptyTextNodes) {\n childNodesArray = childNodesArray.filter(\n ({ nodeType, nodeValue }) =>\n nodeType !== Node.TEXT_NODE || (nodeValue !== '' && nodeValue !== '\\u200B'),\n );\n }\n\n childIndex = childNodesArray.indexOf(anchorNode as ChildNode);\n\n endOffset = range.endOffset;\n startOffset = range.startOffset;\n};\n\nexport const restoreSelection = (element: HTMLDivElement) => {\n // Search for \\u200C in child nodes. If found, set the childIndex, startOffset, and endOffset to the\n // position of the \\u200C character. Also remove the \\u200C character from the child node. If not found,\n // the childIndex, startOffset, and endOffset will be like before.\n const childNodesArray = Array.from(element.childNodes);\n\n let hasFoundNoJoiner = false;\n\n childNodesArray.forEach((node) => {\n if (\n !hasFoundNoJoiner &&\n node.nodeType === Node.TEXT_NODE &&\n typeof node.nodeValue === 'string'\n ) {\n const noJoinerIndex = node.nodeValue.indexOf('\\u200C');\n\n if (noJoinerIndex !== -1) {\n hasFoundNoJoiner = true;\n\n childIndex = childNodesArray.indexOf(node);\n startOffset = noJoinerIndex;\n endOffset = noJoinerIndex;\n }\n }\n });\n\n // Remove all no joiner characters from the child nodes if no joiner was found\n if (hasFoundNoJoiner) {\n childNodesArray.forEach((node) => {\n if (node.nodeType === Node.TEXT_NODE && typeof node.nodeValue === 'string') {\n // eslint-disable-next-line no-param-reassign\n node.nodeValue = node.nodeValue.replace(/\\u200C/g, '');\n }\n });\n }\n\n let childNode = element.childNodes[childIndex];\n\n const selection = window.getSelection();\n\n if (!childNode || !element || !selection) {\n return;\n }\n\n // noinspection SuspiciousTypeOfGuard\n if (typeof childNode.nodeValue !== 'string') {\n const elementTextLength = getElementTextLength(childNode as Element);\n\n if (childNode.nextSibling) {\n childNode = childNode.nextSibling;\n\n if (childNode.nodeType === Node.TEXT_NODE && childNode.nodeValue) {\n endOffset -= elementTextLength;\n startOffset -= elementTextLength;\n\n if (childNode.nodeValue.charCodeAt(endOffset) === 8203) {\n endOffset += 1;\n startOffset += 1;\n }\n } else {\n const textNode = document.createTextNode('\\u200B');\n\n childNode.parentNode?.insertBefore(textNode, childNode.nextSibling);\n\n childNode = textNode;\n\n endOffset = textNode.length;\n startOffset = textNode.length;\n }\n } else {\n const textNode = document.createTextNode('\\u200B');\n\n childNode.parentNode?.insertBefore(textNode, childNode.nextSibling);\n\n childNode = textNode;\n\n endOffset = textNode.length;\n startOffset = textNode.length;\n }\n } else if (childNode.nodeValue && endOffset > childNode.nodeValue.length) {\n if (childNode.nextSibling?.nodeValue) {\n let elementTextLength = childNode.nodeValue.length;\n\n childNode = childNode.nextSibling;\n\n // noinspection SuspiciousTypeOfGuard\n if (typeof childNode.nodeValue !== 'string') {\n elementTextLength += getElementTextLength(childNode as Element);\n\n if (childNode.nextSibling?.nodeValue) {\n childNode = childNode.nextSibling;\n\n if (childNode.nodeType === Node.TEXT_NODE && childNode.nodeValue) {\n endOffset -= elementTextLength;\n startOffset -= elementTextLength;\n\n if (childNode.nodeValue.charCodeAt(endOffset) === 8203) {\n endOffset += 1;\n startOffset += 1;\n }\n } else {\n const textNode = document.createTextNode('\\u200B');\n\n childNode.parentNode?.insertBefore(textNode, childNode.nextSibling);\n\n childNode = textNode;\n\n endOffset = textNode.length;\n startOffset = textNode.length;\n }\n } else {\n const textNode = document.createTextNode('\\u200B');\n\n childNode.parentNode?.insertBefore(textNode, childNode.nextSibling);\n\n childNode = textNode;\n\n endOffset = textNode.length;\n startOffset = textNode.length;\n }\n }\n } else {\n endOffset = childNode.nodeValue.length;\n startOffset = childNode.nodeValue.length;\n }\n }\n\n const range = document.createRange();\n\n // noinspection SuspiciousTypeOfGuard\n if (typeof childNode.nodeValue === 'string') {\n startOffset = clamp(startOffset, 0, childNode.nodeValue.length);\n endOffset = clamp(endOffset, 0, childNode.nodeValue.length);\n }\n\n try {\n range.setStart(childNode, startOffset);\n range.setEnd(childNode, endOffset);\n } catch (error) {\n // Do nothing\n }\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n range.collapse(true);\n};\n\nexport const insertInvisibleCursorMarker = (): void => {\n const selection = window.getSelection();\n\n if (!selection || selection.rangeCount === 0) {\n return;\n }\n\n const range = selection.getRangeAt(0);\n const textNode = range.startContainer;\n const offset = range.startOffset;\n\n // noinspection JSDeprecatedSymbols\n document.execCommand('delete', false);\n\n const span = document.createElement('span');\n span.style.display = 'inline-block';\n span.style.width = '0';\n span.style.height = '0';\n span.className = 'invisible-cursor-marker';\n\n const parent = textNode.parentNode;\n\n if (parent) {\n if (textNode.nodeType === Node.TEXT_NODE) {\n const textContent = textNode.textContent || '';\n const beforeText = textContent.slice(0, offset);\n const afterText = textContent.slice(offset);\n\n textNode.textContent = beforeText;\n\n parent.insertBefore(span, textNode.nextSibling);\n const afterTextNode = document.createTextNode(afterText);\n parent.insertBefore(afterTextNode, span.nextSibling);\n\n setTimeout(() => {\n // Set cursor to cursor element\n const newRange = document.createRange();\n newRange.setStartAfter(span);\n newRange.setEndAfter(span);\n selection.removeAllRanges();\n selection.addRange(newRange);\n\n // Remove cursor element\n span.remove();\n }, 10);\n }\n }\n};\n\nexport const insertPseudoMarker = () => {\n const selection = window.getSelection();\n\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n const marker = document.createElement('span');\n marker.id = 'cursor-marker';\n marker.style.display = 'inline-block';\n marker.style.width = '0';\n marker.style.height = '0';\n range.insertNode(marker);\n }\n};\n\nexport const insertCursorAtMarker = (ref: RefObject<HTMLDivElement>) => {\n const marker = ref.current?.querySelector('#cursor-marker');\n\n if (marker) {\n const selection = window.getSelection();\n const range = document.createRange();\n range.setStartAfter(marker);\n range.setEndAfter(marker);\n selection?.removeAllRanges();\n selection?.addRange(range);\n marker.remove();\n }\n};\n\nexport const moveSelectionOffset = (distance: number) => {\n endOffset += distance;\n startOffset += distance;\n};\n\nexport const setChildIndex = (index: number) => {\n childIndex = index;\n};\n\n/**\n * This function returns the code of the character that will be removed by the KeyDown event in the\n * next step, if the \"Backspace\" or \"Delete\" key was pressed and there is no selection of multiple\n * characters.\n *\n * @param event - Keyboard event from \"onKeyDown\"\n */\nexport const getCharCodeThatWillBeDeleted = (event: KeyboardEvent<HTMLDivElement>) => {\n const range = window.getSelection()?.getRangeAt(0);\n\n /**\n * At this point the function is aborted if there is no selection range, several characters have\n * been selected and therefore no single letter is removed or neither the \"Backspace\" nor the\n * \"Delete\" key has been pressed.\n */\n if (\n !range ||\n range.endOffset !== range.startOffset ||\n (event.key !== 'Backspace' && event.key !== 'Delete' && event.key !== 'Unidentified')\n ) {\n return null;\n }\n\n if (event.key === 'Backspace' || event.key === 'Unidentified') {\n const { nodeValue, previousSibling } = range.startContainer;\n\n if (range.startOffset > 0) {\n return nodeValue?.charCodeAt(range.startOffset - 1);\n }\n\n return previousSibling?.nodeValue?.charCodeAt(previousSibling.nodeValue.length - 1);\n }\n\n const { nextSibling, nodeValue } = range.endContainer;\n\n if (range.endOffset < (nodeValue?.length ?? 0)) {\n return nodeValue?.charCodeAt(range.endOffset);\n }\n\n return nextSibling?.nodeValue?.charCodeAt(0);\n};\n\nexport type ReplaceTextOptions = { shouldReplaceNearCursor?: boolean };\n\ninterface FindAndSelectTextOptions {\n editorElement: HTMLDivElement;\n searchText: string;\n options?: ReplaceTextOptions;\n}\n\nexport interface SetCursorPositionByAbsIndexOptions {\n editorElement: HTMLDivElement;\n position: number;\n}\n\ntype Match = { node: Node; offset: number; absIndex: number };\n\nexport const findAndSelectText = ({\n editorElement,\n searchText,\n options = { shouldReplaceNearCursor: true },\n}: FindAndSelectTextOptions): Range | null => {\n if (!editorElement.textContent?.includes(searchText)) {\n return null;\n }\n\n const range = document.createRange();\n\n const cursorPos = getCurrentCursorPosition(editorElement);\n\n const matches: Match[] = [];\n let absCounter = 0;\n\n const searchNodesForText = (node: Node) => {\n if (node.nodeType === Node.TEXT_NODE && node.textContent) {\n let index = node.textContent.indexOf(searchText);\n while (index !== -1) {\n matches.push({\n node,\n offset: index,\n absIndex: absCounter + index,\n });\n index = node.textContent.indexOf(searchText, index + 1);\n }\n absCounter += node.textContent.length;\n } else if (node.nodeName !== 'LC_MENTION') {\n Array.from(node.childNodes).forEach(searchNodesForText);\n }\n };\n\n searchNodesForText(editorElement);\n\n if (matches.length === 0) {\n return null;\n }\n\n let match = matches[0];\n\n if (options?.shouldReplaceNearCursor && cursorPos !== null) {\n match = matches.reduce((prev, curr) =>\n Math.abs(curr.absIndex - cursorPos) < Math.abs(prev.absIndex - cursorPos) ? curr : prev,\n );\n }\n\n if (!match) {\n return null;\n }\n\n range.setStart(match.node, match.offset);\n range.setEnd(match.node, match.offset + searchText.length);\n\n return range;\n};\n\nexport const getCurrentCursorPosition = (editorElement: HTMLDivElement | null): number | null => {\n if (!editorElement) {\n return null;\n }\n\n const sel = window.getSelection?.();\n if (!sel || sel.rangeCount === 0) {\n return null;\n }\n\n const range = sel.getRangeAt(0);\n\n if (!editorElement.contains(range.commonAncestorContainer)) {\n return null;\n }\n\n const pre = document.createRange();\n pre.selectNodeContents(editorElement);\n\n try {\n pre.setEnd(range.startContainer, range.startOffset);\n\n const container = document.createElement('div');\n container.appendChild(pre.cloneContents());\n\n const bbCodeUntilCursor = convertHTMLToText(container.innerHTML, {\n preserveSpaces: true,\n shouldSerializeNoEmojiToBBCode: false,\n });\n\n return bbCodeUntilCursor.length;\n } catch {\n return convertHTMLToText(editorElement.innerHTML, {\n shouldSerializeNoEmojiToBBCode: false,\n }).length;\n }\n};\n\ntype CursorTarget = { node: Text; offset: number };\n\nconst getCursorTargetByAbsIndex = ({\n editorElement,\n position,\n}: SetCursorPositionByAbsIndexOptions): CursorTarget | null => {\n const childNodes = Array.from(editorElement.childNodes);\n\n if (childNodes.length === 0) {\n const textNode = document.createTextNode('');\n editorElement.appendChild(textNode);\n\n return { node: textNode, offset: 0 };\n }\n\n const clampedPosition = clamp(\n position,\n 0,\n convertHTMLToText(editorElement.innerHTML, {\n shouldSerializeNoEmojiToBBCode: false,\n }).length,\n );\n\n let absCounter = 0;\n\n const searchNodes = (node: Node): CursorTarget | null => {\n if (node.nodeType === Node.TEXT_NODE) {\n const textNode = node as Text;\n const nodeText = textNode.nodeValue ?? '';\n const nextAbsCounter = absCounter + nodeText.length;\n\n if (clampedPosition <= nextAbsCounter) {\n return {\n node: textNode,\n offset: clamp(clampedPosition - absCounter, 0, nodeText.length),\n };\n }\n\n absCounter = nextAbsCounter;\n\n return null;\n }\n\n if (node.nodeName === 'LC_MENTION') {\n return null;\n }\n\n for (const child of Array.from(node.childNodes)) {\n const found = searchNodes(child);\n if (found) {\n return found;\n }\n }\n\n return null;\n };\n\n for (const rootNode of childNodes) {\n const found = searchNodes(rootNode);\n if (found) {\n return found;\n }\n }\n\n const lastTextNode = editorElement.lastChild;\n if (lastTextNode?.nodeType === Node.TEXT_NODE) {\n const textNode = lastTextNode as Text;\n return { node: textNode, offset: textNode.length };\n }\n\n const appendedTextNode = document.createTextNode('\\u200B');\n editorElement.appendChild(appendedTextNode);\n\n return { node: appendedTextNode, offset: appendedTextNode.length };\n};\n\nexport const setCursorPositionByAbsIndex = ({\n editorElement,\n position,\n}: SetCursorPositionByAbsIndexOptions): void => {\n const selection = window.getSelection?.();\n\n if (!selection) {\n return;\n }\n\n const target = getCursorTargetByAbsIndex({ editorElement, position });\n\n if (!target) {\n return;\n }\n\n const range = document.createRange();\n\n try {\n range.setStart(target.node, target.offset);\n range.setEnd(target.node, target.offset);\n } catch {\n return;\n }\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n range.collapse(true);\n};\n\n/**\n * Unwraps any no-emoji-convert span that contains the cursor.\n * This removes the span element but keeps its text content, preventing the cursor from getting stuck.\n */\nexport const unwrapIgnoreEmojiSpanAtCursor = (editorElement: HTMLDivElement | null) => {\n if (!editorElement) {\n return;\n }\n\n const selection = window.getSelection();\n\n if (!selection || !selection.rangeCount) {\n return;\n }\n\n const range = selection.getRangeAt(0);\n let { commonAncestorContainer } = range;\n const cursorOffset = range.startOffset;\n\n // Walk up the DOM tree to find if we're inside a no-emoji-convert span\n while (commonAncestorContainer && commonAncestorContainer !== editorElement) {\n if (\n commonAncestorContainer.nodeType === Node.ELEMENT_NODE &&\n (commonAncestorContainer as Element).className === 'no-emoji-convert'\n ) {\n // We're inside a no-emoji-convert span, unwrap it\n const span = commonAncestorContainer as Element;\n const parentNode = span.parentNode;\n\n if (!parentNode) {\n return;\n }\n\n // Find which text node contains the cursor\n let cursorNode: Node | null = null;\n let cursorNodeOffset = cursorOffset;\n\n // Get all child nodes of the span\n const childNodes = Array.from(span.childNodes);\n\n // Insert all children before the span and find the cursor node\n childNodes.forEach((child) => {\n const clonedChild = child.cloneNode(true);\n parentNode.insertBefore(clonedChild, span);\n\n // If this is the node that contains the cursor, track it\n if (child === range.startContainer) {\n cursorNode = clonedChild;\n }\n });\n\n // Remove the span\n parentNode.removeChild(span);\n\n // Restore cursor position in the unwrapped content\n if (cursorNode) {\n range.setStart(cursorNode, cursorNodeOffset);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n break;\n }\n\n commonAncestorContainer = commonAncestorContainer.parentNode ?? commonAncestorContainer;\n }\n};\n\n/**\n * Moves the cursor outside of any no-emoji-convert span if it's currently inside one.\n * This prevents the cursor from getting \"stuck\" inside the protection span when typing.\n */\nexport const moveCursorOutOfIgnoreEmojiSpan = (editorElement: HTMLDivElement | null) => {\n if (!editorElement) {\n return;\n }\n\n const selection = window.getSelection();\n\n if (!selection || !selection.rangeCount) {\n return;\n }\n\n const range = selection.getRangeAt(0);\n let { commonAncestorContainer } = range;\n\n // Walk up the DOM tree to find if we're inside a no-emoji-convert span\n while (commonAncestorContainer && commonAncestorContainer !== editorElement) {\n if (\n commonAncestorContainer.nodeType === Node.ELEMENT_NODE &&\n (commonAncestorContainer as Element).className === 'no-emoji-convert'\n ) {\n // We're inside a no-emoji-convert span, move cursor to after it\n const span = commonAncestorContainer as Element;\n const nextSibling = span.nextSibling;\n const parentNode = span.parentNode;\n\n if (!parentNode) {\n return;\n }\n\n // Always ensure there's a text node AFTER the span\n let targetNode: Text;\n\n if (nextSibling && nextSibling.nodeType === Node.TEXT_NODE) {\n // Next sibling is already a text node, use it\n targetNode = nextSibling as Text;\n } else if (nextSibling && nextSibling.nodeType === Node.ELEMENT_NODE) {\n // Next sibling is an element, find first text node in it\n const walker = document.createTreeWalker(nextSibling, NodeFilter.SHOW_TEXT);\n const firstTextNode = walker.nextNode() as Text;\n if (firstTextNode) {\n targetNode = firstTextNode;\n } else {\n // No text node found, create one\n targetNode = document.createTextNode('\\u200B');\n parentNode.insertBefore(targetNode, nextSibling);\n }\n } else {\n // No next sibling or it's not a text/element node, create a new text node\n targetNode = document.createTextNode('\\u200B');\n parentNode.insertBefore(targetNode, nextSibling);\n }\n\n // Place cursor at the start of the target node\n range.setStart(targetNode, 0);\n range.collapse(true);\n\n selection.removeAllRanges();\n selection.addRange(range);\n break;\n }\n\n commonAncestorContainer = commonAncestorContainer.parentNode ?? commonAncestorContainer;\n }\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"selection.js","names":["clamp","convertHTMLToText","getElementTextLength","childIndex","endOffset","startOffset","saveSelection","element","shouldIgnoreEmptyTextNodes","selection","window","getSelection","anchorNode","range","getRangeAt","childNodesArray","Array","from","childNodes","filter","nodeType","nodeValue","Node","TEXT_NODE","indexOf","restoreSelection","hasFoundNoJoiner","forEach","node","noJoinerIndex","replace","childNode","elementTextLength","nextSibling","charCodeAt","textNode","document","createTextNode","parentNode","insertBefore","length","createRange","setStart","setEnd","error","removeAllRanges","addRange","collapse","insertInvisibleCursorMarker","rangeCount","startContainer","offset","execCommand","span","createElement","style","display","width","height","className","parent","textContent","beforeText","slice","afterText","afterTextNode","setTimeout","newRange","setStartAfter","setEndAfter","remove","insertPseudoMarker","marker","id","insertNode","insertCursorAtMarker","ref","current","querySelector","moveSelectionOffset","distance","setChildIndex","index","getCharCodeThatWillBeDeleted","event","key","previousSibling","endContainer","findAndSelectText","editorElement","searchText","options","shouldReplaceNearCursor","includes","cursorPos","getCurrentCursorPosition","matches","absCounter","searchNodesForText","push","absIndex","nodeName","match","reduce","prev","curr","Math","abs","sel","contains","commonAncestorContainer","pre","selectNodeContents","container","appendChild","cloneContents","bbCodeUntilCursor","innerHTML","preserveSpaces","shouldSerializeNoEmojiToBBCode","getCursorTargetByAbsIndex","position","clampedPosition","searchNodes","nodeText","nextAbsCounter","child","found","rootNode","lastTextNode","lastChild","appendedTextNode","setCursorPositionByAbsIndex","target","unwrapIgnoreEmojiSpanAtCursor","cursorOffset","ELEMENT_NODE","classList","cursorNode","cursorNodeOffset","clonedChild","cloneNode","removeChild","moveCursorOutOfIgnoreEmojiSpan","targetNode","walker","createTreeWalker","NodeFilter","SHOW_TEXT","firstTextNode","nextNode"],"sources":["../../../src/utils/selection.ts"],"sourcesContent":["import type { KeyboardEvent, RefObject } from 'react';\nimport { clamp } from './number';\nimport { convertHTMLToText, getElementTextLength } from './text';\n\nlet childIndex = -1;\nlet endOffset = -1;\nlet startOffset = -1;\n\ninterface SaveSelectionOptions {\n shouldIgnoreEmptyTextNodes?: boolean;\n}\n\nexport const saveSelection = (\n element: HTMLDivElement,\n { shouldIgnoreEmptyTextNodes }: SaveSelectionOptions = {},\n) => {\n const selection = window.getSelection();\n\n if (!selection) {\n return;\n }\n\n const { anchorNode } = selection;\n\n if (!anchorNode) {\n return;\n }\n\n const range = selection.getRangeAt(0);\n\n let childNodesArray = Array.from(element.childNodes);\n\n if (shouldIgnoreEmptyTextNodes) {\n childNodesArray = childNodesArray.filter(\n ({ nodeType, nodeValue }) =>\n nodeType !== Node.TEXT_NODE || (nodeValue !== '' && nodeValue !== '\\u200B'),\n );\n }\n\n childIndex = childNodesArray.indexOf(anchorNode as ChildNode);\n\n endOffset = range.endOffset;\n startOffset = range.startOffset;\n};\n\nexport const restoreSelection = (element: HTMLDivElement) => {\n // Search for \\u200C in child nodes. If found, set the childIndex, startOffset, and endOffset to the\n // position of the \\u200C character. Also remove the \\u200C character from the child node. If not found,\n // the childIndex, startOffset, and endOffset will be like before.\n const childNodesArray = Array.from(element.childNodes);\n\n let hasFoundNoJoiner = false;\n\n childNodesArray.forEach((node) => {\n if (\n !hasFoundNoJoiner &&\n node.nodeType === Node.TEXT_NODE &&\n typeof node.nodeValue === 'string'\n ) {\n const noJoinerIndex = node.nodeValue.indexOf('\\u200C');\n\n if (noJoinerIndex !== -1) {\n hasFoundNoJoiner = true;\n\n childIndex = childNodesArray.indexOf(node);\n startOffset = noJoinerIndex;\n endOffset = noJoinerIndex;\n }\n }\n });\n\n // Remove all no joiner characters from the child nodes if no joiner was found\n if (hasFoundNoJoiner) {\n childNodesArray.forEach((node) => {\n if (node.nodeType === Node.TEXT_NODE && typeof node.nodeValue === 'string') {\n // eslint-disable-next-line no-param-reassign\n node.nodeValue = node.nodeValue.replace(/\\u200C/g, '');\n }\n });\n }\n\n let childNode = element.childNodes[childIndex];\n\n const selection = window.getSelection();\n\n if (!childNode || !element || !selection) {\n return;\n }\n\n // noinspection SuspiciousTypeOfGuard\n if (typeof childNode.nodeValue !== 'string') {\n const elementTextLength = getElementTextLength(childNode as Element);\n\n if (childNode.nextSibling) {\n childNode = childNode.nextSibling;\n\n if (childNode.nodeType === Node.TEXT_NODE && childNode.nodeValue) {\n endOffset -= elementTextLength;\n startOffset -= elementTextLength;\n\n if (childNode.nodeValue.charCodeAt(endOffset) === 8203) {\n endOffset += 1;\n startOffset += 1;\n }\n } else {\n const textNode = document.createTextNode('\\u200B');\n\n childNode.parentNode?.insertBefore(textNode, childNode.nextSibling);\n\n childNode = textNode;\n\n endOffset = textNode.length;\n startOffset = textNode.length;\n }\n } else {\n const textNode = document.createTextNode('\\u200B');\n\n childNode.parentNode?.insertBefore(textNode, childNode.nextSibling);\n\n childNode = textNode;\n\n endOffset = textNode.length;\n startOffset = textNode.length;\n }\n } else if (childNode.nodeValue && endOffset > childNode.nodeValue.length) {\n if (childNode.nextSibling?.nodeValue) {\n let elementTextLength = childNode.nodeValue.length;\n\n childNode = childNode.nextSibling;\n\n // noinspection SuspiciousTypeOfGuard\n if (typeof childNode.nodeValue !== 'string') {\n elementTextLength += getElementTextLength(childNode as Element);\n\n if (childNode.nextSibling?.nodeValue) {\n childNode = childNode.nextSibling;\n\n if (childNode.nodeType === Node.TEXT_NODE && childNode.nodeValue) {\n endOffset -= elementTextLength;\n startOffset -= elementTextLength;\n\n if (childNode.nodeValue.charCodeAt(endOffset) === 8203) {\n endOffset += 1;\n startOffset += 1;\n }\n } else {\n const textNode = document.createTextNode('\\u200B');\n\n childNode.parentNode?.insertBefore(textNode, childNode.nextSibling);\n\n childNode = textNode;\n\n endOffset = textNode.length;\n startOffset = textNode.length;\n }\n } else {\n const textNode = document.createTextNode('\\u200B');\n\n childNode.parentNode?.insertBefore(textNode, childNode.nextSibling);\n\n childNode = textNode;\n\n endOffset = textNode.length;\n startOffset = textNode.length;\n }\n }\n } else {\n endOffset = childNode.nodeValue.length;\n startOffset = childNode.nodeValue.length;\n }\n }\n\n const range = document.createRange();\n\n // noinspection SuspiciousTypeOfGuard\n if (typeof childNode.nodeValue === 'string') {\n startOffset = clamp(startOffset, 0, childNode.nodeValue.length);\n endOffset = clamp(endOffset, 0, childNode.nodeValue.length);\n }\n\n try {\n range.setStart(childNode, startOffset);\n range.setEnd(childNode, endOffset);\n } catch (error) {\n // Do nothing\n }\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n range.collapse(true);\n};\n\nexport const insertInvisibleCursorMarker = (): void => {\n const selection = window.getSelection();\n\n if (!selection || selection.rangeCount === 0) {\n return;\n }\n\n const range = selection.getRangeAt(0);\n const textNode = range.startContainer;\n const offset = range.startOffset;\n\n // noinspection JSDeprecatedSymbols\n document.execCommand('delete', false);\n\n const span = document.createElement('span');\n span.style.display = 'inline-block';\n span.style.width = '0';\n span.style.height = '0';\n span.className = 'invisible-cursor-marker';\n\n const parent = textNode.parentNode;\n\n if (parent) {\n if (textNode.nodeType === Node.TEXT_NODE) {\n const textContent = textNode.textContent || '';\n const beforeText = textContent.slice(0, offset);\n const afterText = textContent.slice(offset);\n\n textNode.textContent = beforeText;\n\n parent.insertBefore(span, textNode.nextSibling);\n const afterTextNode = document.createTextNode(afterText);\n parent.insertBefore(afterTextNode, span.nextSibling);\n\n setTimeout(() => {\n // Set cursor to cursor element\n const newRange = document.createRange();\n newRange.setStartAfter(span);\n newRange.setEndAfter(span);\n selection.removeAllRanges();\n selection.addRange(newRange);\n\n // Remove cursor element\n span.remove();\n }, 10);\n }\n }\n};\n\nexport const insertPseudoMarker = () => {\n const selection = window.getSelection();\n\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n const marker = document.createElement('span');\n marker.id = 'cursor-marker';\n marker.style.display = 'inline-block';\n marker.style.width = '0';\n marker.style.height = '0';\n range.insertNode(marker);\n }\n};\n\nexport const insertCursorAtMarker = (ref: RefObject<HTMLDivElement>) => {\n const marker = ref.current?.querySelector('#cursor-marker');\n\n if (marker) {\n const selection = window.getSelection();\n const range = document.createRange();\n range.setStartAfter(marker);\n range.setEndAfter(marker);\n selection?.removeAllRanges();\n selection?.addRange(range);\n marker.remove();\n }\n};\n\nexport const moveSelectionOffset = (distance: number) => {\n endOffset += distance;\n startOffset += distance;\n};\n\nexport const setChildIndex = (index: number) => {\n childIndex = index;\n};\n\n/**\n * This function returns the code of the character that will be removed by the KeyDown event in the\n * next step, if the \"Backspace\" or \"Delete\" key was pressed and there is no selection of multiple\n * characters.\n *\n * @param event - Keyboard event from \"onKeyDown\"\n */\nexport const getCharCodeThatWillBeDeleted = (event: KeyboardEvent<HTMLDivElement>) => {\n const range = window.getSelection()?.getRangeAt(0);\n\n /**\n * At this point the function is aborted if there is no selection range, several characters have\n * been selected and therefore no single letter is removed or neither the \"Backspace\" nor the\n * \"Delete\" key has been pressed.\n */\n if (\n !range ||\n range.endOffset !== range.startOffset ||\n (event.key !== 'Backspace' && event.key !== 'Delete' && event.key !== 'Unidentified')\n ) {\n return null;\n }\n\n if (event.key === 'Backspace' || event.key === 'Unidentified') {\n const { nodeValue, previousSibling } = range.startContainer;\n\n if (range.startOffset > 0) {\n return nodeValue?.charCodeAt(range.startOffset - 1);\n }\n\n return previousSibling?.nodeValue?.charCodeAt(previousSibling.nodeValue.length - 1);\n }\n\n const { nextSibling, nodeValue } = range.endContainer;\n\n if (range.endOffset < (nodeValue?.length ?? 0)) {\n return nodeValue?.charCodeAt(range.endOffset);\n }\n\n return nextSibling?.nodeValue?.charCodeAt(0);\n};\n\nexport type ReplaceTextOptions = { shouldReplaceNearCursor?: boolean };\n\ninterface FindAndSelectTextOptions {\n editorElement: HTMLDivElement;\n searchText: string;\n options?: ReplaceTextOptions;\n}\n\nexport interface SetCursorPositionByAbsIndexOptions {\n editorElement: HTMLDivElement;\n position: number;\n}\n\ntype Match = { node: Node; offset: number; absIndex: number };\n\nexport const findAndSelectText = ({\n editorElement,\n searchText,\n options = { shouldReplaceNearCursor: true },\n}: FindAndSelectTextOptions): Range | null => {\n if (!editorElement.textContent?.includes(searchText)) {\n return null;\n }\n\n const range = document.createRange();\n\n const cursorPos = getCurrentCursorPosition(editorElement);\n\n const matches: Match[] = [];\n let absCounter = 0;\n\n const searchNodesForText = (node: Node) => {\n if (node.nodeType === Node.TEXT_NODE && node.textContent) {\n let index = node.textContent.indexOf(searchText);\n while (index !== -1) {\n matches.push({\n node,\n offset: index,\n absIndex: absCounter + index,\n });\n index = node.textContent.indexOf(searchText, index + 1);\n }\n absCounter += node.textContent.length;\n } else if (node.nodeName !== 'LC_MENTION') {\n Array.from(node.childNodes).forEach(searchNodesForText);\n }\n };\n\n searchNodesForText(editorElement);\n\n if (matches.length === 0) {\n return null;\n }\n\n let match = matches[0];\n\n if (options?.shouldReplaceNearCursor && cursorPos !== null) {\n match = matches.reduce((prev, curr) =>\n Math.abs(curr.absIndex - cursorPos) < Math.abs(prev.absIndex - cursorPos) ? curr : prev,\n );\n }\n\n if (!match) {\n return null;\n }\n\n range.setStart(match.node, match.offset);\n range.setEnd(match.node, match.offset + searchText.length);\n\n return range;\n};\n\nexport const getCurrentCursorPosition = (editorElement: HTMLDivElement | null): number | null => {\n if (!editorElement) {\n return null;\n }\n\n const sel = window.getSelection?.();\n if (!sel || sel.rangeCount === 0) {\n return null;\n }\n\n const range = sel.getRangeAt(0);\n\n if (!editorElement.contains(range.commonAncestorContainer)) {\n return null;\n }\n\n const pre = document.createRange();\n pre.selectNodeContents(editorElement);\n\n try {\n pre.setEnd(range.startContainer, range.startOffset);\n\n const container = document.createElement('div');\n container.appendChild(pre.cloneContents());\n\n const bbCodeUntilCursor = convertHTMLToText(container.innerHTML, {\n preserveSpaces: true,\n shouldSerializeNoEmojiToBBCode: false,\n });\n\n return bbCodeUntilCursor.length;\n } catch {\n return convertHTMLToText(editorElement.innerHTML, {\n shouldSerializeNoEmojiToBBCode: false,\n }).length;\n }\n};\n\ntype CursorTarget = { node: Text; offset: number };\n\nconst getCursorTargetByAbsIndex = ({\n editorElement,\n position,\n}: SetCursorPositionByAbsIndexOptions): CursorTarget | null => {\n const childNodes = Array.from(editorElement.childNodes);\n\n if (childNodes.length === 0) {\n const textNode = document.createTextNode('');\n editorElement.appendChild(textNode);\n\n return { node: textNode, offset: 0 };\n }\n\n const clampedPosition = clamp(\n position,\n 0,\n convertHTMLToText(editorElement.innerHTML, {\n shouldSerializeNoEmojiToBBCode: false,\n }).length,\n );\n\n let absCounter = 0;\n\n const searchNodes = (node: Node): CursorTarget | null => {\n if (node.nodeType === Node.TEXT_NODE) {\n const textNode = node as Text;\n const nodeText = textNode.nodeValue ?? '';\n const nextAbsCounter = absCounter + nodeText.length;\n\n if (clampedPosition <= nextAbsCounter) {\n return {\n node: textNode,\n offset: clamp(clampedPosition - absCounter, 0, nodeText.length),\n };\n }\n\n absCounter = nextAbsCounter;\n\n return null;\n }\n\n if (node.nodeName === 'LC_MENTION') {\n return null;\n }\n\n for (const child of Array.from(node.childNodes)) {\n const found = searchNodes(child);\n if (found) {\n return found;\n }\n }\n\n return null;\n };\n\n for (const rootNode of childNodes) {\n const found = searchNodes(rootNode);\n if (found) {\n return found;\n }\n }\n\n const lastTextNode = editorElement.lastChild;\n if (lastTextNode?.nodeType === Node.TEXT_NODE) {\n const textNode = lastTextNode as Text;\n return { node: textNode, offset: textNode.length };\n }\n\n const appendedTextNode = document.createTextNode('\\u200B');\n editorElement.appendChild(appendedTextNode);\n\n return { node: appendedTextNode, offset: appendedTextNode.length };\n};\n\nexport const setCursorPositionByAbsIndex = ({\n editorElement,\n position,\n}: SetCursorPositionByAbsIndexOptions): void => {\n const selection = window.getSelection?.();\n\n if (!selection) {\n return;\n }\n\n const target = getCursorTargetByAbsIndex({ editorElement, position });\n\n if (!target) {\n return;\n }\n\n const range = document.createRange();\n\n try {\n range.setStart(target.node, target.offset);\n range.setEnd(target.node, target.offset);\n } catch {\n return;\n }\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n range.collapse(true);\n};\n\n/**\n * Unwraps any no-emoji-convert span that contains the cursor.\n * This removes the span element but keeps its text content, preventing the cursor from getting stuck.\n */\nexport const unwrapIgnoreEmojiSpanAtCursor = (editorElement: HTMLDivElement | null) => {\n if (!editorElement) {\n return;\n }\n\n const selection = window.getSelection();\n\n if (!selection || !selection.rangeCount) {\n return;\n }\n\n const range = selection.getRangeAt(0);\n let { commonAncestorContainer } = range;\n const cursorOffset = range.startOffset;\n\n if (!editorElement.contains(commonAncestorContainer)) {\n return;\n }\n\n // Walk up the DOM tree to find if we're inside a no-emoji-convert span\n while (commonAncestorContainer && commonAncestorContainer !== editorElement) {\n if (\n commonAncestorContainer.nodeType === Node.ELEMENT_NODE &&\n (commonAncestorContainer as Element).classList.contains('no-emoji-convert')\n ) {\n // We're inside a no-emoji-convert span, unwrap it\n const span = commonAncestorContainer as Element;\n const { parentNode } = span;\n\n if (!parentNode) {\n return;\n }\n\n // Find which text node contains the cursor\n let cursorNode: Node | null = null;\n const cursorNodeOffset = cursorOffset;\n\n // Get all child nodes of the span\n const childNodes = Array.from(span.childNodes);\n\n // Insert all children before the span and find the cursor node\n childNodes.forEach((child) => {\n const clonedChild = child.cloneNode(true);\n parentNode.insertBefore(clonedChild, span);\n\n // If this is the node that contains the cursor, track it\n if (child === range.startContainer) {\n cursorNode = clonedChild;\n }\n });\n\n // Remove the span\n parentNode.removeChild(span);\n\n // Restore cursor position in the unwrapped content\n if (cursorNode) {\n range.setStart(cursorNode, cursorNodeOffset);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n break;\n }\n\n // @ts-expect-error - is needed\n commonAncestorContainer = commonAncestorContainer.parentNode;\n }\n};\n\n/**\n * Moves the cursor outside of any no-emoji-convert span if it's currently inside one.\n * This prevents the cursor from getting \"stuck\" inside the protection span when typing.\n */\nexport const moveCursorOutOfIgnoreEmojiSpan = (editorElement: HTMLDivElement | null) => {\n if (!editorElement) {\n return;\n }\n\n const selection = window.getSelection();\n\n if (!selection || !selection.rangeCount) {\n return;\n }\n\n const range = selection.getRangeAt(0);\n let { commonAncestorContainer } = range;\n\n if (!editorElement.contains(commonAncestorContainer)) {\n return;\n }\n\n // Walk up the DOM tree to find if we're inside a no-emoji-convert span\n while (commonAncestorContainer && commonAncestorContainer !== editorElement) {\n if (\n commonAncestorContainer.nodeType === Node.ELEMENT_NODE &&\n (commonAncestorContainer as Element).classList.contains('no-emoji-convert')\n ) {\n // We're inside a no-emoji-convert span, move cursor to after it\n const span = commonAncestorContainer as Element;\n const { nextSibling } = span;\n const { parentNode } = span;\n\n if (!parentNode) {\n return;\n }\n\n // Always ensure there's a text node AFTER the span\n let targetNode: Text;\n\n if (nextSibling && nextSibling.nodeType === Node.TEXT_NODE) {\n // Next sibling is already a text node, use it\n targetNode = nextSibling as Text;\n } else if (nextSibling && nextSibling.nodeType === Node.ELEMENT_NODE) {\n // Next sibling is an element, find first text node in it\n const walker = document.createTreeWalker(nextSibling, NodeFilter.SHOW_TEXT);\n const firstTextNode = walker.nextNode() as Text;\n if (firstTextNode) {\n targetNode = firstTextNode;\n } else {\n // No text node found, create one\n targetNode = document.createTextNode('\\u200B');\n parentNode.insertBefore(targetNode, nextSibling);\n }\n } else {\n // No next sibling or it's not a text/element node, create a new text node\n targetNode = document.createTextNode('\\u200B');\n parentNode.insertBefore(targetNode, nextSibling);\n }\n\n // Place cursor at the start of the target node\n range.setStart(targetNode, 0);\n range.collapse(true);\n\n selection.removeAllRanges();\n selection.addRange(range);\n break;\n }\n\n // @ts-expect-error - is needed\n commonAncestorContainer = commonAncestorContainer.parentNode;\n }\n};\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chayns-components/emoji-input",
|
|
3
|
-
"version": "5.4.
|
|
3
|
+
"version": "5.4.11",
|
|
4
4
|
"description": "Input field that supports HTML elements and emojis",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"browserslist": [
|
|
@@ -89,5 +89,5 @@
|
|
|
89
89
|
"publishConfig": {
|
|
90
90
|
"access": "public"
|
|
91
91
|
},
|
|
92
|
-
"gitHead": "
|
|
92
|
+
"gitHead": "ce93463945ac595b45885ca964c7b7eb41f98d37"
|
|
93
93
|
}
|