JSFiddle - React, Tailwind, and code Playground
HTML
<p>Das hier ist ein langer Text, in dem auch ab und zu <strong>kursiv</strong> geschrieben wird.<br>
<strong>Hier</strong> und <strong>dort</strong> auch mal mit vielen kursiven Wörtern hintereinander.<br>
Dann kommt noch ein weiter Absatz der auch vielleicht <strong>kursive</strong> Elstrongents hat.<br>
Oder auch mal ohne kursives Zeug.</p>
<output></output>
CSS
output {
font-weight: bolder;
font-size: 1.5em;
color: Crimson;
}
JavaScript
var WordUnderCursor = {
getFullWord : function(event) {
var i, begin, end, range, textNode, offset;
// Internet Explorer
if (document.body.createTextRange) {
try {
range = document.body.createTextRange();
range.moveToPoint(event.clientX, event.clientY);
range.select();
range = WordUnderCursor.getTextRangeBoundaryPosition(range, true);
textNode = range.node;
offset = range.offset;
} catch (e) {
return ''; // Sigh, IE
}
}
// Firefox, Safari
else if (document.caretPositionFromPoint) {
range = document.caretPositionFromPoint(event.clientX, event.clientY);
textNode = range.offsetNode;
offset = range.offset;
}
// Chrome
else if (document.caretRangeFromPoint) {
range = document.caretRangeFromPoint(event.clientX, event.clientY);
textNode = range.startContainer;
offset = range.startOffset;
}
if (!textNode || textNode.nodeType !== Node.TEXT_NODE) {return ''}
var data = textNode.textContent;
if (offset >= data.length) {offset = data.length - 1}
if (WordUnderCursor.isW(data[offset])) {return ''}
i = begin = end = offset;
while (i > 0 && !WordUnderCursor.isW(data[i - 1])) {i--}
begin = i;
i = offset;
while (i < data.length - 1 && !WordUnderCursor.isW(data[i + 1])) {i++}
end = i;
var word = data.substring(begin, end + 1);
if (end === data.length - 1 || begin === 0) {
var nextNode = WordUnderCursor.getNextNode(textNode),
prevNode = WordUnderCursor.getPrevNode(textNode);
if (end == data.length - 1 && nextNode) {
var nextText = nextNode.textContent;
i = 0;
while (i < nextText.length && !WordUnderCursor.isW(nextText[i])) {word += nextText[i++]}
}
else if (begin === 0 && prevNode) {
var prevText...