Есть div contenteditable true, нужны базовые возможности - выделенный текст делать жирным, заголовком и ссылкой, эту логику реализовал таким кодом,
const setTag = (tag, linkTag = {
type: false,
url: null
}) => {
let sel, range;
if (window.getSelection) {
sel = window.getSelection();
if (sel.rangeCount) {
let DOMEleemnt;
if (linkTag.type) {
DOMEleemnt = document.createElement('a');
DOMEleemnt.setAttribute('href', linkTag.url)
} else {
DOMEleemnt = document.createElement(tag);
}
DOMEleemnt.innerText = sel.toString().trim();
range = sel.getRangeAt(0);
range.deleteContents();
range.insertNode(DOMEleemnt);
}
} else if (document.selection && document.selection.createRange) {
range = document.selection.createRange();
range.text = '';
}
}
но не получается реализовать проверка на то является ли выделенный текст уже жирным, ссылкой, заголовком, чтоб их убирать (в учет нужно брать ещё то, что выделяться текст может и с клавиатуры)