@huridocs/react-text-selection-handler
Version:
React pdf handler allows to render a PDF and handle text selection and highlights.
46 lines • 1.88 kB
JavaScript
const isElementOnNextLine = (firstElement, secondElement) => {
var _a, _b;
if (!firstElement || !secondElement)
return false;
const left1 = (_a = firstElement === null || firstElement === void 0 ? void 0 : firstElement.style) === null || _a === void 0 ? void 0 : _a.left;
const left2 = (_b = secondElement === null || secondElement === void 0 ? void 0 : secondElement.style) === null || _b === void 0 ? void 0 : _b.left;
return parseFloat(left1) > parseFloat(left2);
};
const prepareSelectedElements = () => {
const selection = window.getSelection();
if (!selection || !selection.rangeCount)
return [];
const range = selection.getRangeAt(0);
const selectedContent = range.cloneContents();
const selectedElements = Array.from(selectedContent.querySelectorAll('*')).filter(element => !element.children.length);
const elements = [];
selectedElements.forEach((element, idx) => {
const previousElement = selectedElements[idx - 1];
if (previousElement) {
if (isElementOnNextLine(previousElement, element)) {
const spacer = document.createElement('span');
spacer.innerText = ' ';
elements.push(spacer);
}
}
elements.push(element);
});
return elements;
};
export const getSelectedText = () => {
const elementsSelected = prepareSelectedElements();
if (elementsSelected.length <= 1) {
const selection = window.getSelection();
return (selection && selection.toString()) || '';
}
const selectedText = elementsSelected.reduce((acc, el) => {
let newText = acc;
newText += el.innerText;
if (el.tagName === 'BR') {
newText += '\n';
}
return newText;
}, '');
return selectedText;
};
//# sourceMappingURL=getSelectedText.js.map