Jak, że było dość sporo postów o taką funkcjonalność.
Dodałem tę opcję w formie plugina, jest dołączane z zewnątrz, można wkleić do konsoli żeby zaczęło działać, na danej stronie lub w formie pluginu wtedy na każdej.
W Vue czy React raczej by to miało inną formę niż w surowym javascript.
(() => {
let d = document.createElement('div')
d.id = 'cycuj'
d.innerText = 'Cytuj'
d.setAttribute('style', 'display: none')
d.addEventListener('click', (e) => {
let cyc = document.getElementById('cycuj')
cyc.setAttribute('style', 'display: none')
let editor = document.querySelector('div.editor').querySelector('div.cm-content')
let placeholder = editor.childNodes[0].querySelector('span.cm-placeholder')
if (placeholder) {
editor.childNodes[0].remove();
}
let name = cyc.getAttribute('user')
let id = cyc.getAttribute('user-id')
let text = cyc.getAttribute('user-quote')
let quote = document.createElement('div')
quote.classList.add('highlight-quote', 'cm-line')
quote.innerHTML = `<div class="highlight-quote cm-line"><span class="ͼr">></span> <span class="ͼ10 ͼr">#####</span><span class="ͼ10"> </span><span class="ͼ10 ͼ1a ͼr">[</span><span class="ͼ10 ͼ1a">${name} napisał(a)</span><span class="ͼ10 ͼ1a ͼr">]</span><span class="ͼ10 ͼ1a ͼr">(</span><span class="ͼ10 ͼ1a ͼ1b">/Forum/${id}</span><span class="ͼ10 ͼ1a ͼr">)</span><span class="ͼ10">:</span></div>`
let quote_text = document.createElement('div')
quote_text.classList.add('highlight-quote', 'cm-line')
quote_text.innerHTML = `<span class="ͼr">></span>${text}`
let br = document.createElement('div')
br.classList.add('cm-line')
br.innerHTML = `<br>`
editor.append(quote, quote_text, br)
})
document.body.append(d)
document.addEventListener("mouseup", (e) => {
let selection = document.getSelection()
let text = selection.toString()
let cyc = document.getElementById('cycuj')
let elem = selection.anchorNode.parentElement.closest('.post-comment')
if (elem === null) {
elem = selection.anchorNode.parentElement.closest('.card-post')
}
if (text.trim() === '' || elem === null) {
cyc.setAttribute('style', 'display: none')
return
}
let author = elem.querySelector('a[data-user-id]')
let id = author.getAttribute('data-user-id')
let name = author.text
let pageX = window.scrollX
let pageY = window.scrollY
let client_rect = selection.getRangeAt(0).getBoundingClientRect()
let x_pos = client_rect.left + pageX
let y_pos = client_rect.top + pageY - 50
cyc.setAttribute('user', name)
cyc.setAttribute('user-id', id)
cyc.setAttribute('user-quote', text)
cyc.setAttribute('style', `display:block; box-shadow: 1px 1px 5px black;background-color: black; color: white; position: absolute; top: ${y_pos}px; left: ${x_pos}px; index: 9999; padding: 5px 10px 5px 10px; border: 1px; border-radius: 10px; font-weight: bold; font-size: 15px; cursor: pointer`)
})
})()
Oczywiście jest to wersja eksperymentalna, na testy nie było czasu.
Teraz opiszę jak to działa, jeśli ktoś by chciał zrozumieć.
Tworzę jeden globalny obiekt div, który działa jako popup/tooltip, na początku nie jest wyświetlany.
Dodaję tam event click.
Potem po podniesieniu przycisku myszy, sprawdzam czy zostało coś zaznaczone, czy to jest komentarz, czy post.
Jeśli nie to wychodzę przy okazji ustawiam ukryty tooltip w razie jakby był widoczny bo wcześniej było zaznaczenie.
Jeśli tak, zapamiętuję autora, id, jego treść, ustawiam tooltip odpowiednią pozycję na stronie.
I robię widzialny ten tooltip div.
Potem jak ktoś go kliknie, to odczytuje autor, id, quote.
Tworzę markdown, ale w bardzo prosty sposób i dodaje go do edytora.